all repos — caroster @ a39140195ebca61d87447a3caac3d6e1ec49104f

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

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