ai-chatbot/app/(chat)/page.tsx
Your Name 3f3523f1bb
Some checks failed
Lint / build (20) (push) Has been cancelled
Playwright Tests / test (push) Has been cancelled
新版首页支持弹窗登录并接入Google后台配置
2026-02-14 00:39:46 +08:00

112 lines
3.3 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { cookies } from "next/headers";
import { redirect } from "next/navigation";
import { Suspense } from "react";
import { Chat } from "@/components/chat";
import { DataStreamHandler } from "@/components/data-stream-handler";
import { LovartHome } from "@/components/home/lovart-home";
import { generateUUID } from "@/lib/utils";
import { auth } from "../(auth)/auth";
import {
getDefaultAiModel,
getEnabledAiModelsWithProvider,
getSiteSettings,
getSystemSetting,
} from "@/lib/db/queries";
import { isAiModelAgentAuto } from "@/lib/db/ai-model-flags";
export default function Page() {
return (
<Suspense fallback={<div className="flex h-dvh" />}>
<NewChatPage />
</Suspense>
);
}
async function NewChatPage() {
const id = generateUUID();
const [session, cookieStore, siteSettings, homeVariantSetting, surpriseCategoriesSetting] =
await Promise.all([
auth(),
cookies(),
getSiteSettings(),
getSystemSetting({ key: "home_variant" }).catch(() => undefined),
getSystemSetting({ key: "home_surprise_categories" }).catch(() => undefined),
]);
const homeVariant = homeVariantSetting?.value === "lovart" ? "lovart" : "classic";
const surpriseCategories = Array.isArray(surpriseCategoriesSetting?.value)
? surpriseCategoriesSetting?.value
.map((item: unknown) => String(item || "").trim())
.filter(Boolean)
: ["全部", "惊喜"];
if (!session?.user && homeVariant !== "lovart") {
redirect("/login");
}
if (homeVariant === "lovart") {
return (
<LovartHome
user={
session?.user
? {
id: session.user.id,
email: session.user.email,
name: session.user.name,
type: session.user.type,
}
: null
}
isAuthenticated={Boolean(session?.user)}
siteName={siteSettings.siteName || "AI Chatbot"}
siteLogo={siteSettings.siteLogo || siteSettings.siteLogoDark || ""}
surpriseCategories={surpriseCategories}
heroPromoText={siteSettings.lovartPromoText}
heroPromoActionText={siteSettings.lovartPromoActionText}
heroTitleText={siteSettings.lovartHeroTitle}
heroSubtitleText={siteSettings.lovartHeroSubtitle}
/>
);
}
const modelIdFromCookie = cookieStore.get("chat-model");
// 如果没有保存的模型 ID,从数据库获取默认模型
let initialModelId = modelIdFromCookie?.value;
if (!initialModelId) {
// 尝试获取默认模型
const defaultModel = await getDefaultAiModel();
if (defaultModel && !isAiModelAgentAuto(defaultModel)) {
initialModelId = defaultModel.id;
} else {
// 如果没有设置默认模型,获取第一个启用的模型
const enabledModels = await getEnabledAiModelsWithProvider();
const visibleModels = enabledModels.filter(
({ model }) => !isAiModelAgentAuto(model)
);
if (visibleModels.length > 0) {
initialModelId = visibleModels[0].model.id;
}
}
}
return (
<>
<Chat
autoResume={false}
id={id}
initialChatModel={initialModelId || ""}
initialMessages={[]}
initialVisibilityType="private"
isReadonly={false}
key={id}
userType={session?.user?.type}
/>
<DataStreamHandler />
</>
);
}