47 lines
1.5 KiB
TypeScript
47 lines
1.5 KiB
TypeScript
|
|
import { cookies } from "next/headers";
|
||
|
|
import { Suspense } from "react";
|
||
|
|
import { Toaster } from "sonner";
|
||
|
|
import { AppSidebar } from "@/components/chat/app-sidebar";
|
||
|
|
import { DataStreamProvider } from "@/components/chat/data-stream-provider";
|
||
|
|
import { ChatShell } from "@/components/chat/shell";
|
||
|
|
import { SidebarInset, SidebarProvider } from "@/components/ui/sidebar";
|
||
|
|
import { ActiveChatProvider } from "@/hooks/use-active-chat";
|
||
|
|
import { auth } from "../(auth)/auth";
|
||
|
|
|
||
|
|
export default function Layout({ children }: { children: React.ReactNode }) {
|
||
|
|
return (
|
||
|
|
<DataStreamProvider>
|
||
|
|
<Suspense fallback={<div className="flex h-dvh bg-sidebar" />}>
|
||
|
|
<SidebarShell>{children}</SidebarShell>
|
||
|
|
</Suspense>
|
||
|
|
</DataStreamProvider>
|
||
|
|
);
|
||
|
|
}
|
||
|
|
|
||
|
|
async function SidebarShell({ children }: { children: React.ReactNode }) {
|
||
|
|
const [session, cookieStore] = await Promise.all([auth(), cookies()]);
|
||
|
|
const isCollapsed = cookieStore.get("sidebar_state")?.value !== "true";
|
||
|
|
|
||
|
|
return (
|
||
|
|
<SidebarProvider defaultOpen={!isCollapsed}>
|
||
|
|
<AppSidebar user={session?.user} />
|
||
|
|
<SidebarInset>
|
||
|
|
<Toaster
|
||
|
|
position="top-center"
|
||
|
|
theme="system"
|
||
|
|
toastOptions={{
|
||
|
|
className:
|
||
|
|
"!bg-card !text-foreground !border-border/50 !shadow-[var(--shadow-float)]",
|
||
|
|
}}
|
||
|
|
/>
|
||
|
|
<Suspense fallback={<div className="flex h-dvh" />}>
|
||
|
|
<ActiveChatProvider>
|
||
|
|
<ChatShell />
|
||
|
|
</ActiveChatProvider>
|
||
|
|
</Suspense>
|
||
|
|
{children}
|
||
|
|
</SidebarInset>
|
||
|
|
</SidebarProvider>
|
||
|
|
);
|
||
|
|
}
|