all repos — caroster @ 69286a3200b2ea5b881bf0d5e08cb8f106b85949

[Octree] Group carpool to your event https://caroster.io

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