"use client"; import { useMemo, useState } from "react"; import Link from "next/link"; import { Plus, Pencil, Trash2, Loader2, ExternalLink, FileText, } from "lucide-react"; import { apiAdminDeleteSitePage, type SitePage, } from "@/lib/api"; import { formatRelative } from "@/lib/format"; import { toast } from "@/lib/toast"; import ConfirmDialog from "@/components/ConfirmDialog"; import { AdminEmpty, AdminIconButton, AdminPageHeader, AdminSegmented, AdminSettingsPage, AdminStatusChip, } from "@/components/admin"; type StatusFilter = "all" | "published" | "draft"; export default function PagesAdmin({ initial, initError, }: { initial: SitePage[]; initError: string; }) { const [list, setList] = useState(initial); const [loadError, setLoadError] = useState(initError); const [statusFilter, setStatusFilter] = useState("all"); const [deletingId, setDeletingId] = useState(null); const [deleteTarget, setDeleteTarget] = useState(null); const publishedCount = useMemo(() => list.filter((p) => p.published).length, [list]); const draftCount = useMemo(() => list.filter((p) => !p.published).length, [list]); const filtered = useMemo(() => { if (statusFilter === "published") return list.filter((p) => p.published); if (statusFilter === "draft") return list.filter((p) => !p.published); return list; }, [list, statusFilter]); async function remove(p: SitePage) { setDeletingId(p.id); try { await apiAdminDeleteSitePage(p.id); setList((l) => l.filter((x) => x.id !== p.id)); toast("页面已删除", "ok"); } catch (e) { toast(e instanceof Error ? e.message : "删除失败"); } finally { setDeletingId(null); setDeleteTarget(null); } } return ( 新建单页 } />
ariaLabel="单页状态筛选" size="sm" value={statusFilter} onChange={setStatusFilter} options={[ { key: "all", label: "全部", count: list.length }, { key: "published", label: "已发布", count: publishedCount }, { key: "draft", label: "草稿", count: draftCount }, ]} />
单页列表 共 {filtered.length} 条
{loadError ? (

{loadError}

) : filtered.length === 0 ? ( } title={list.length === 0 ? "还没有单页" : "该状态下暂无单页"} description={list.length === 0 ? "创建关于本站等内容页" : "试试切换筛选条件"} /> ) : ( filtered.map((p, idx) => (

{p.title}

/{p.slug} {p.published ? "已发布" : "草稿"} {p.show_in_sidebar ? ( 侧栏 ) : null} 排序 {p.sort_order} · {formatRelative(p.updated_at || p.created_at)}
{p.excerpt ? (

{p.excerpt}

) : null}
{p.published ? ( ) : null} setDeleteTarget(p)} > {deletingId === p.id ? ( ) : ( )}
)) )} {list.length === 0 && !loadError ? (
新建第一页
) : null}
deletingId == null && setDeleteTarget(null)} onConfirm={() => { if (deleteTarget) void remove(deleteTarget); }} />
); }