frontend/pages/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 {print} from 'graphql/language/printer';
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
36 return NextResponse.redirect(
37 new URL(`/${locale}${req.nextUrl.pathname}`, req.url)
38 );
39 }
40}
41
42const getRegisteredUserLanguage = async req => {
43 const token = await getToken({
44 req,
45 secret: process.env.NEXTAUTH_SECRET,
46 });
47
48 const {STRAPI_URL = 'http://localhost:1337'} = process.env;
49 return fetch(`${STRAPI_URL}/graphql`, {
50 method: 'POST',
51 headers: {
52 'Content-Type': 'application/json',
53 authorization: token?.jwt ? `Bearer ${token.jwt}` : '',
54 },
55 body: JSON.stringify({query: print(ProfileDocument)}),
56 })
57 .then(async response => {
58 const {data} = await response.json();
59 return data?.me?.profile?.lang;
60 })
61 .catch(console.error);
62};
63
64const getBrowserPreferredSupportedLanguage = req => {
65 const browserAcceptedLanguages = req.headers
66 .get('accept-language')
67 ?.split(',');
68 let browserPreferredSupportedLanguage = null;
69 browserAcceptedLanguages?.every(locale => {
70 const lang = locale.split('-')?.[0].toLowerCase();
71
72 if (Object.keys(SupportedLocales).includes(lang)) {
73 browserPreferredSupportedLanguage = lang;
74 } else {
75 return false;
76 }
77 });
78 return browserPreferredSupportedLanguage;
79};