80 lines
2.5 KiB
TypeScript
80 lines
2.5 KiB
TypeScript
import { cookies } from "next/headers";
|
|
import Script from "next/script";
|
|
import { Suspense } from "react";
|
|
import { ChatShell } from "@/components/chat-shell";
|
|
import { DataStreamProvider } from "@/components/data-stream-provider";
|
|
import { auth } from "../(auth)/auth";
|
|
import {
|
|
getNavLinks,
|
|
getSiteSettings,
|
|
getSystemSetting,
|
|
getTutorialVideos,
|
|
} from "@/lib/db/queries";
|
|
|
|
export default function Layout({ children }: { children: React.ReactNode }) {
|
|
return (
|
|
<>
|
|
<Script
|
|
src="https://cdn.jsdelivr.net/pyodide/v0.23.4/full/pyodide.js"
|
|
strategy="beforeInteractive"
|
|
/>
|
|
<DataStreamProvider>
|
|
<Suspense fallback={<div className="flex h-dvh" />}>
|
|
<SidebarWrapper>{children}</SidebarWrapper>
|
|
</Suspense>
|
|
</DataStreamProvider>
|
|
</>
|
|
);
|
|
}
|
|
|
|
async function SidebarWrapper({ children }: { children: React.ReactNode }) {
|
|
const [session, cookieStore, siteSettings, navLinks, tutorialVideos, homeVariantSetting] =
|
|
await Promise.all([
|
|
auth(),
|
|
cookies(),
|
|
getSiteSettings(),
|
|
getNavLinks(),
|
|
getTutorialVideos(),
|
|
getSystemSetting({ key: "home_variant" }).catch(() => undefined),
|
|
]);
|
|
const isCollapsed = cookieStore.get("sidebar_state")?.value !== "true";
|
|
const homeVariant =
|
|
homeVariantSetting?.value === "lovart" ? "lovart" : "classic";
|
|
|
|
return (
|
|
<ChatShell
|
|
user={session?.user}
|
|
isCollapsed={isCollapsed}
|
|
homeVariant={homeVariant}
|
|
siteName={siteSettings.siteName}
|
|
siteLogo={siteSettings.siteLogo || undefined}
|
|
siteLogoDark={siteSettings.siteLogoDark || undefined}
|
|
isAdmin={session?.user?.type === "admin"}
|
|
customLinks={navLinks.map((link) => ({
|
|
id: link.id,
|
|
name: link.name,
|
|
url: link.url,
|
|
order: link.order,
|
|
toolboxGroup: link.toolboxGroup || 1,
|
|
}))}
|
|
toolbox1Name={siteSettings.toolbox1Name || "工具箱"}
|
|
toolbox1Enabled={siteSettings.toolbox1Enabled ?? true}
|
|
toolbox2Name={siteSettings.toolbox2Name || "工具箱2"}
|
|
toolbox2Enabled={siteSettings.toolbox2Enabled ?? false}
|
|
tutorialVideos={tutorialVideos.map((v) => ({
|
|
id: v.id,
|
|
title: v.title,
|
|
videoUrl: v.videoUrl,
|
|
coverUrl: v.coverUrl,
|
|
description: v.description,
|
|
order: v.order,
|
|
}))}
|
|
tutorialEnabled={siteSettings.tutorialEnabled ?? false}
|
|
rankingEnabled={siteSettings.rankingEnabled ?? true}
|
|
agentEnabled={(siteSettings as any).agentEnabled ?? true}
|
|
>
|
|
{children}
|
|
</ChatShell>
|
|
);
|
|
}
|