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';
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';
14
const PWAInstall = dynamic(() => import('@/features/PWAInstall'), { ssr: false });
15
const inVercel = process.env.VERCEL === '1';
17
type RootLayoutProps = {
22
const RootLayout = async ({ children, modal }: RootLayoutProps) => {
23
const cookieStore = cookies();
25
const lang = cookieStore.get(LOBE_LOCALE_COOKIE);
26
const direction = isRtlLang(lang?.value || DEFAULT_LANG) ? 'rtl' : 'ltr';
27
const mobile = isMobileDevice();
30
<html dir={direction} lang={lang?.value || DEFAULT_LANG} suppressHydrationWarning>
40
{inVercel && <SpeedInsights />}
46
export default RootLayout;
48
export { generateMetadata } from './metadata';
50
export const generateViewport = async (): ResolvingViewport => {
51
const isMobile = isMobileDevice();
53
const dynamicScale = isMobile ? { maximumScale: 1, userScalable: false } : {};
60
{ color: '#f8f8f8', media: '(prefers-color-scheme: light)' },
61
{ color: '#000', media: '(prefers-color-scheme: dark)' },
64
width: 'device-width',