all repos — caroster @ f61da4df34a45c277877046b84e0b909930ea292

[Octree] Group carpool to your event https://caroster.io

frontend/lib/pageUtils.ts (view raw)

 1import {ApolloClient} from '@apollo/client';
 2import {getSession} from 'next-auth/react';
 3import {ProfileDocument, SettingDocument} from '../generated/graphql';
 4import {initializeApollo, APOLLO_STATE_PROP_NAME} from './apolloClient';
 5import {getCookie, hashText} from './cookies';
 6
 7type ServerSideExtension = (
 8  context: any,
 9  apolloClient: ApolloClient<any>
10) => Promise<ExtensionResult | void>;
11
12type ExtensionResult = {
13  props?: Object;
14  notFound?: boolean;
15};
16
17const getServerSideProps =
18  (extension?: ServerSideExtension) => async (context: any) => {
19    const session = await getSession(context);
20    const lang = context.req.cookies['NEXT_LOCALE'];
21    const {STRAPI_URL = 'http://localhost:1337'} = process.env;
22
23    const jwt = session?.token?.jwt;
24    const apolloClient = initializeApollo(`${STRAPI_URL}/graphql`, jwt);
25    const locale = lang || session?.user?.lang || 'fr';
26
27    try {
28      const {
29        data: {setting = {}},
30      } = await apolloClient.query({
31        query: SettingDocument,
32        variables: {locale},
33      });
34      let announcement = setting?.data?.attributes?.announcement || '';
35
36      if (!announcement) announcement = null;
37      else {
38        const lastAnnouncementSeen = getCookie(
39          'lastAnnouncementSeen',
40          context.req.headers.cookie
41        );
42        const hashedAnnouncement = hashText(announcement);
43        if (hashedAnnouncement === lastAnnouncementSeen) {
44          announcement = null;
45        }
46      }
47
48      if (session)
49        await apolloClient.query({
50          query: ProfileDocument,
51        });
52
53      let extensionProps = {};
54      if (extension) {
55        const extensionReturn = await extension(context, apolloClient);
56        extensionProps = extensionReturn?.props || {};
57        if (extensionReturn?.notFound) {
58          return {
59            notFound: true,
60          };
61        }
62      }
63
64      return {
65        props: {
66          session,
67          announcement,
68          [APOLLO_STATE_PROP_NAME]: apolloClient.cache.extract(),
69          ...extensionProps,
70        },
71      };
72    } catch (error) {
73      console.error(error);
74      return {
75        props: {session},
76      };
77    }
78  };
79
80export default {
81  getServerSideProps,
82};