1import "~/styles/globals.css";
2
3import { type Metadata } from "next";
4import { Geist } from "next/font/google";
5
6import { TRPCReactProvider } from "~/trpc/react";
7import { HydrateClient } from "~/trpc/server";
8import { Toaster } from "~/components/ui/sonner";
9import {
10 validateSessionToken,
11 validateSessionTokenCookie,
12} from "~/server/auth/validate";
13import { AuthUserProvider } from "./_components/authUserProvider";
14import { cookies } from "next/headers";
15
16export const metadata: Metadata = {
17 title: "Create T3 App",
18 description: "Generated by create-t3-app",
19 icons: [{ rel: "icon", url: "/favicon.ico" }],
20};
21
22const geist = Geist({
23 subsets: ["latin"],
24 variable: "--font-geist-sans",
25});
26
27export default async function RootLayout({
28 children,
29}: Readonly<{ children: React.ReactNode }>) {
30 const authUser = await validateSessionTokenCookie();
31 const cookie = await cookies();
32
33 return (
34 <html lang="en" className={`${geist.variable}`}>
35 <body>
36 <TRPCReactProvider>
37 <HydrateClient>
38 <AuthUserProvider
39 user={
40 authUser
41 ? {
42 ...authUser,
43 sessionToken: cookie.get("rrSessionToken")!.value,
44 }
45 : null
46 }
47 >
48 {children}
49 </AuthUserProvider>
50 </HydrateClient>
51 </TRPCReactProvider>
52 <Toaster />
53 </body>
54 </html>
55 );
56}