import Link from "next/link"; import { notFound } from "next/navigation"; import { CharacterIdentityCard } from "@/components/characters/CharacterIdentityCard"; import { CovenantPanel } from "@/components/characters/CovenantPanel"; import { FormStudio } from "@/components/xingyi/FormStudio"; import { CharacterLifecycleBar } from "@/components/characters/CharacterLifecycleBar"; import { ModelPolicyEditForm } from "@/components/characters/ModelPolicyEditForm"; import { ProfileEditForm } from "@/components/characters/ProfileEditForm"; import { PageContainer } from "@/components/layout/PageContainer"; import { ErrorState } from "@/components/shared/StateViews"; import { CharacterStatusBadge } from "@/components/ui/StatusBadge"; import { serverApi } from "@/lib/api/server-client"; import { describeError } from "@/lib/utils/error"; import { formatDateTime } from "@/lib/utils/format"; import type { Covenant } from "@/lib/api/covenants"; import type { FormAnchorData, FormData, VoiceProfileData, } from "@/lib/api/xingyi"; import type { Character } from "@/types/api"; export const dynamic = "force-dynamic"; /** * 人物详情页:生命周期操作 + 档案编辑 + 模型策略编辑。 * Server Component 预取 getCharacter;写操作后 router.refresh() 重新拉取,以服务端数据为准。 */ export default async function CharacterDetailPage({ params, }: { params: Promise<{ characterId: string }>; }) { const { characterId } = await params; let character = null; let covenant: Covenant | null = null; let error: string | null = null; try { character = await serverApi.get(`/characters/${characterId}`); } catch (e) { error = describeError(e); } // 缘契独立拉取,失败静默(无缘契是合法状态) try { covenant = await serverApi.get( `/covenants/by-character/${characterId}`, ); } catch { covenant = null; } // 形仪三区独立拉取,失败静默(无形仪是合法状态——启镜只需最小形仪) let anchor: FormAnchorData = { character_id: characterId, features: {}, age_presentation: "adult", permissions: {}, mutable_scope: {}, }; let forms: FormData[] = []; let voices: VoiceProfileData[] = []; let primary: FormData | null = null; try { [anchor, forms, voices, primary] = await Promise.all([ serverApi.get(`/characters/${characterId}/form-anchor`), serverApi.get(`/characters/${characterId}/forms`), serverApi.get(`/characters/${characterId}/voices`), serverApi.get( `/characters/${characterId}/forms/primary`, ), ]); } catch { /* 空态合法 */ } if (error) { return ( ); } if (!character) return notFound(); return (
资料与沉淀 →
); }