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} from './cookies';
6
7type ServerSideExtension = (
8 context: any,
9 apolloClient: ApolloClient<any>
10) => Promise<Object | void>;
11
12const getServerSideProps =
13 (extension?: ServerSideExtension) => async (context: any) => {
14 const session = await getSession(context);
15 const {STRAPI_URL = 'http://localhost:1337'} = process.env;
16 const apolloClient = initializeApollo(`${STRAPI_URL}/graphql`, session);
17 const locale = session?.user?.lang || 'fr';
18
19 try {
20 const {
21 data: {setting = {}},
22 } = await apolloClient.query({
23 query: SettingDocument,
24 variables: {locale},
25 });
26 let announcement = setting?.data?.attributes?.announcement || '';
27 const lastAnnouncementSeen = getCookie(
28 'lastAnnouncementSeen',
29 context.req.headers.cookie
30 );
31
32 if (!announcement || announcement === lastAnnouncementSeen)
33 announcement = null;
34
35 if (session)
36 await apolloClient.query({
37 query: ProfileDocument,
38 });
39
40 let extensionProps = {};
41 if (extension)
42 extensionProps = (await extension(context, apolloClient)) || {};
43
44 return {
45 props: {
46 session,
47 announcement,
48 [APOLLO_STATE_PROP_NAME]: apolloClient.cache.extract(),
49 ...extensionProps,
50 },
51 };
52 } catch (error) {
53 console.error(error);
54 return {
55 props: {session},
56 };
57 }
58 };
59
60export default {
61 getServerSideProps,
62};