"use client"; import { Loader2, Save } from "lucide-react"; import { useState } from "react"; import { AdminField, AdminSection } from "@/components/admin"; import { apiUpdateSiteSettings, type PublicSettings } from "@/lib/api"; import { BRAND_LIMITS, siteDocumentTitle } from "@/lib/brand"; import { toast } from "@/lib/toast"; export default function BasicIdentityPanel({ initial, onSaved, }: { initial: PublicSettings; onSaved?: (next: PublicSettings) => void; }) { const [name, setName] = useState(initial.site_name); const [wordmark, setWordmark] = useState(initial.site_wordmark); const [slogan, setSlogan] = useState(initial.site_slogan); const [desc, setDesc] = useState(initial.site_description); const [saved, setSaved] = useState({ name: initial.site_name, wordmark: initial.site_wordmark, slogan: initial.site_slogan, desc: initial.site_description, }); const [saving, setSaving] = useState(false); const dirty = name.trim() !== saved.name || wordmark.trim() !== saved.wordmark || slogan.trim() !== saved.slogan || desc.trim() !== saved.desc; const preview = siteDocumentTitle(name, slogan); const save = async () => { if (saving) return; const nextName = name.trim(); if (!nextName) { toast("显示名称不能为空"); return; } setSaving(true); try { const res = await apiUpdateSiteSettings({ site_name: nextName, site_wordmark: wordmark.trim(), site_slogan: slogan.trim(), site_description: desc.trim(), }); setName(res.site_name); setWordmark(res.site_wordmark); setSlogan(res.site_slogan); setDesc(res.site_description); setSaved({ name: res.site_name, wordmark: res.site_wordmark, slogan: res.site_slogan, desc: res.site_description, }); onSaved?.(res); toast("基本信息已保存", "ok"); } catch (e) { toast(e instanceof Error ? e.message : "保存失败"); } finally { setSaving(false); } }; return (
标题预览:{preview}