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 {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 const isIgnoredPath =
15 req.nextUrl.pathname.startsWith('/_next') ||
16 req.nextUrl.pathname.includes('/api/') ||
17 req.nextUrl.pathname.startsWith('/graphql') ||
18 PUBLIC_FILE.test(req.nextUrl.pathname);
19
20 if (!isIgnoredPath && req.nextUrl.locale === DEFAULT_LOCALE) {
21 const registeredUserLanguage = await getRegisteredUserLanguage(req);
22 const NEXT_LOCALE = getCookie('NEXT_LOCALE', req.headers.get('cookie'));
23 const browserPreferredSupportedLanguage =
24 getBrowserPreferredSupportedLanguage(req);
25
26 const locale =
27 registeredUserLanguage ||
28 NEXT_LOCALE ||
29 browserPreferredSupportedLanguage ||
30 'fr';
31
32 return NextResponse.redirect(
33 new URL(
34 `/${locale}${req.nextUrl.pathname}${req.nextUrl.search || ''}`,
35 req.url
36 )
37 );
38 }
39}
40
41const getRegisteredUserLanguage = async req => {
42 const token = await getToken({
43 req,
44 secret: process.env.NEXTAUTH_SECRET,
45 });
46
47 const {STRAPI_URL = 'http://localhost:1337'} = process.env;
48 return fetch(`${STRAPI_URL}/graphql/`, {
49 method: 'POST',
50 headers: {
51 'Content-Type': 'application/json',
52 authorization: token?.jwt ? `Bearer ${token.jwt}` : '',
53 },
54 body: JSON.stringify({query: print(ProfileDocument)}),
55 })
56 .then(async response => {
57 const {data} = await response.json();
58 return data?.me?.profile?.lang;
59 })
60 .catch(console.error);
61};
62
63const getBrowserPreferredSupportedLanguage = req => {
64 const browserAcceptedLanguages = req.headers
65 .get('accept-language')
66 ?.split(',');
67 let browserPreferredSupportedLanguage = null;
68 browserAcceptedLanguages?.every(locale => {
69 const lang = locale.split('-')?.[0].toLowerCase();
70
71 if (Object.keys(SupportedLocales).includes(lang)) {
72 browserPreferredSupportedLanguage = lang;
73 } else {
74 return false;
75 }
76 });
77 return browserPreferredSupportedLanguage;
78};