lobe-chat

Форк
0
/
layout.tsx 
66 строк · 1.9 Кб
1
import { SpeedInsights } from '@vercel/speed-insights/next';
2
import { ResolvingViewport } from 'next';
3
import dynamic from 'next/dynamic';
4
import { cookies } from 'next/headers';
5
import { ReactNode } from 'react';
6
import { isRtlLang } from 'rtl-detect';
7

8
import Analytics from '@/components/Analytics';
9
import { DEFAULT_LANG, LOBE_LOCALE_COOKIE } from '@/const/locale';
10
import AuthProvider from '@/layout/AuthProvider';
11
import GlobalProvider from '@/layout/GlobalProvider';
12
import { isMobileDevice } from '@/utils/responsive';
13

14
const PWAInstall = dynamic(() => import('@/features/PWAInstall'), { ssr: false });
15
const inVercel = process.env.VERCEL === '1';
16

17
type RootLayoutProps = {
18
  children: ReactNode;
19
  modal: ReactNode;
20
};
21

22
const RootLayout = async ({ children, modal }: RootLayoutProps) => {
23
  const cookieStore = cookies();
24

25
  const lang = cookieStore.get(LOBE_LOCALE_COOKIE);
26
  const direction = isRtlLang(lang?.value || DEFAULT_LANG) ? 'rtl' : 'ltr';
27
  const mobile = isMobileDevice();
28

29
  return (
30
    <html dir={direction} lang={lang?.value || DEFAULT_LANG} suppressHydrationWarning>
31
      <body>
32
        <GlobalProvider>
33
          <AuthProvider>
34
            {children}
35
            {!mobile && modal}
36
          </AuthProvider>
37
          <PWAInstall />
38
        </GlobalProvider>
39
        <Analytics />
40
        {inVercel && <SpeedInsights />}
41
      </body>
42
    </html>
43
  );
44
};
45

46
export default RootLayout;
47

48
export { generateMetadata } from './metadata';
49

50
export const generateViewport = async (): ResolvingViewport => {
51
  const isMobile = isMobileDevice();
52

53
  const dynamicScale = isMobile ? { maximumScale: 1, userScalable: false } : {};
54

55
  return {
56
    ...dynamicScale,
57
    initialScale: 1,
58
    minimumScale: 1,
59
    themeColor: [
60
      { color: '#f8f8f8', media: '(prefers-color-scheme: light)' },
61
      { color: '#000', media: '(prefers-color-scheme: dark)' },
62
    ],
63
    viewportFit: 'cover',
64
    width: 'device-width',
65
  };
66
};
67

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.