frontend/middleware.ts (view raw)
1import {getToken} from 'next-auth/jwt';
2import {NextRequest, NextResponse} from 'next/server';
3import {
4 ProfileDocument,
5 Enum_Userspermissionsuser_Lang as SupportedLocales,
6} from './generated/graphql';
7import {initializeApollo} from './lib/apolloClient';
8import {getCookie} from './lib/cookies';
9
10const PUBLIC_FILE = /\.(.*)$/;
11const DEFAULT_LOCALE = process.env.DEFAULT_LOCALE || 'share';
12
13export async function middleware(req: NextRequest) {
14 if (
15 req.nextUrl.pathname.startsWith('/_next') ||
16 req.nextUrl.pathname.includes('/api/') ||
17 req.nextUrl.pathname === '/graphql' ||
18 PUBLIC_FILE.test(req.nextUrl.pathname)
19 ) {
20 return;
21 }
22
23 if (req.nextUrl.locale === DEFAULT_LOCALE) {
24 const registeredUserLanguage = await getRegisteredUserLanguage(req);
25 const NEXT_LOCALE = getCookie('NEXT_LOCALE', req.headers.get('cookie'));
26 const browserPreferredSupportedLanguage =
27 getBrowserPreferredSupportedLanguage(req);
28
29 const locale =
30 registeredUserLanguage ||
31 NEXT_LOCALE ||
32 browserPreferredSupportedLanguage ||
33 'fr';
34
35 return NextResponse.redirect(
36 new URL(`/${locale}${req.nextUrl.pathname}`, req.url)
37 );
38 }
39}
40
41const getRegisteredUserLanguage = async req => {
42 const token = await getToken({
43 req,
44 secret: process.env.NEXTAUTH_SECRET,
45 });
46
47 if (token?.jwt) {
48 const {STRAPI_URL = 'http://localhost:1337'} = process.env;
49 const apolloClient = initializeApollo(
50 `${STRAPI_URL}/graphql`,
51 token.jwt as string
52 );
53
54 const {data} = await apolloClient.query({
55 query: ProfileDocument,
56 });
57
58 return data?.me?.profile?.lang;
59 }
60};
61
62const getBrowserPreferredSupportedLanguage = req => {
63 const browserAcceptedLanguages = req.headers
64 .get('accept-language')
65 ?.split(',');
66 let browserPreferredSupportedLanguage = null;
67 browserAcceptedLanguages?.every(locale => {
68 const lang = locale.split('-')?.[0].toLowerCase();
69
70 if (Object.keys(SupportedLocales).includes(lang)) {
71 browserPreferredSupportedLanguage = lang;
72 } else {
73 return false;
74 }
75 });
76 return browserPreferredSupportedLanguage;
77};