"use client"; import { FileSignature, Save, Send, Trash2 } from "lucide-react"; import { useCallback, useEffect, useState } from "react"; import { adminApi, errMessage, type Draft } from "@/lib/admin-api"; import { Badge, Button, Card, EmptyState, ErrorState, LoadingBlock, Pagination, TextInput, cn, formatTime, statusTone, useToast, } from "@/components/admin/ui"; function draftKey(draft: Draft) { return String(draft.draft_id ?? draft.id ?? ""); } export function DraftsSection() { const toast = useToast(); const [items, setItems] = useState([]); const [total, setTotal] = useState(0); const [totalPages, setTotalPages] = useState(0); const [page, setPage] = useState(1); const [loading, setLoading] = useState(true); const [error, setError] = useState(""); const [activeKey, setActiveKey] = useState(""); const [title, setTitle] = useState(""); const [content, setContent] = useState(""); const [dirty, setDirty] = useState(false); const [busy, setBusy] = useState(false); const load = useCallback(async () => { setLoading(true); setError(""); try { const result = await adminApi.drafts({ page, page_size: 20 }); setItems(result.items ?? []); setTotal(result.total ?? 0); setTotalPages(result.total_pages ?? 0); } catch (e) { setError(errMessage(e, "草稿列表加载失败")); } finally { setLoading(false); } }, [page]); useEffect(() => { void load(); }, [load]); async function choose(draft: Draft) { if (dirty && !window.confirm("当前草稿有未保存的修改,确认切换?")) return; setBusy(true); try { const detail = await adminApi.draft(draftKey(draft)); setActiveKey(draftKey(draft)); setTitle(detail.title ?? ""); setContent(detail.content ?? ""); setDirty(false); } catch (e) { toast(errMessage(e, "草稿详情加载失败"), "error"); } finally { setBusy(false); } } async function run(action: "save" | "send" | "discard") { if (!activeKey) return; if (action === "send" && !window.confirm("确认发送该草稿?发送后将进入终审并触达客户。")) return; if (action === "discard" && !window.confirm("确认废弃该草稿?废弃后不可恢复。")) return; setBusy(true); try { if (action === "save") await adminApi.saveDraft(activeKey, { title, content: content }); if (action === "send") await adminApi.sendDraft(activeKey); if (action === "discard") await adminApi.discardDraft(activeKey); toast(action === "save" ? "草稿已保存" : action === "send" ? "草稿已发送" : "草稿已废弃"); setDirty(false); if (action !== "save") { setActiveKey(""); setTitle(""); setContent(""); } await load(); } catch (e) { toast(errMessage(e, "操作失败"), "error"); } finally { setBusy(false); } } return (
{loading ? ( ) : error ? ( void load()} /> ) : items.length === 0 ? ( ) : ( <>
    {items.map((draft) => (
  • ))}
)}
) : undefined } > {!activeKey ? ( ) : (
{ setTitle(event.target.value); setDirty(true); }} placeholder="请输入草稿标题" />