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 {STRAPI_URL = 'http://localhost:1337'} = process.env;
21 const apolloClient = initializeApollo(`${STRAPI_URL}/graphql`, session);
22 const locale = session?.user?.lang || 'fr';
23
24 try {
25 const {
26 data: {setting = {}},
27 } = await apolloClient.query({
28 query: SettingDocument,
29 variables: {locale},
30 });
31 let announcement = setting?.data?.attributes?.announcement || '';
32
33 if (!announcement) announcement = null;
34 else {
35 const lastAnnouncementSeen = getCookie(
36 'lastAnnouncementSeen',
37 context.req.headers.cookie
38 );
39 const hashedAnnouncement = hashText(announcement);
40 if (hashedAnnouncement === lastAnnouncementSeen) {
41 announcement = null;
42 }
43 }
44
45 if (session)
46 await apolloClient.query({
47 query: ProfileDocument,
48 });
49
50 let extensionProps = {};
51 if (extension) {
52 const extensionReturn = await extension(context, apolloClient);
53 extensionProps = extensionReturn?.props || {};
54 if (extensionReturn?.notFound) {
55 return {
56 notFound: true,
57 };
58 }
59 }
60
61 return {
62 props: {
63 session,
64 announcement,
65 [APOLLO_STATE_PROP_NAME]: apolloClient.cache.extract(),
66 ...extensionProps,
67 },
68 };
69 } catch (error) {
70 console.error(error);
71 return {
72 props: {session},
73 };
74 }
75 };
76
77export default {
78 getServerSideProps,
79};