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};