Files
wr.do/app/layout.tsx
2025-10-20 11:34:05 +08:00

58 lines
1.9 KiB
TypeScript

import "@/styles/globals.scss";
import { fontHeading, fontSans, fontSatoshi } from "@/assets/fonts";
import { SessionProvider } from "next-auth/react";
import { NextIntlClientProvider } from "next-intl";
import { getLocale, getMessages } from "next-intl/server";
import { ThemeProvider } from "next-themes";
import { ViewTransitions } from "next-view-transitions";
import { cn, constructMetadata } from "@/lib/utils";
import { Toaster } from "@/components/ui/sonner";
import ModalProvider from "@/components/modals/providers";
import GoogleAnalytics from "@/components/shared/GoogleAnalytics";
import UmamiAnalytics from "@/components/shared/UmamiAnalytics";
import { TailwindIndicator } from "@/components/tailwind-indicator";
interface RootLayoutProps {
children: React.ReactNode;
}
export const metadata = constructMetadata();
export default async function RootLayout({ children }: RootLayoutProps) {
const locale = await getLocale();
const messages = await getMessages();
return (
<ViewTransitions>
<html lang={locale} suppressHydrationWarning>
<body
className={cn(
"min-h-screen bg-background font-sans antialiased",
fontSans.variable,
fontHeading.variable,
fontSatoshi.variable,
)}
>
<NextIntlClientProvider messages={messages}>
<SessionProvider>
<ThemeProvider
attribute="class"
defaultTheme="light"
enableSystem
disableTransitionOnChange
>
<ModalProvider>{children}</ModalProvider>
<Toaster richColors closeButton position="bottom-right" />
<TailwindIndicator />
</ThemeProvider>
</SessionProvider>
</NextIntlClientProvider>
<GoogleAnalytics />
<UmamiAnalytics />
</body>
</html>
</ViewTransitions>
);
}