"use client"; import { useEffect, useState } from "react"; import Modal from "@/components/Modal"; import { POST_DELETE_TYPES } from "@/lib/api"; export type DeleteCommentPayload = { delete_type: string; delete_reason: string; }; /** * 评论软删弹窗: * - 评论者自删:必填理由(仅管理可见) * - 管理删:必选类型;仅「其他」须填理由 */ export default function DeleteCommentModal({ open, mode, busy, onClose, onConfirm, }: { open: boolean; /** self=评论者自删;staff=版主/后台删除 */ mode: "self" | "staff"; busy?: boolean; onClose: () => void; onConfirm: (opts: DeleteCommentPayload) => void; }) { const [deleteType, setDeleteType] = useState("spam"); const [reason, setReason] = useState(""); const [err, setErr] = useState(""); useEffect(() => { if (open) { setDeleteType("spam"); setReason(""); setErr(""); } }, [open]); if (!open) return null; const isStaff = mode === "staff"; const reasonRequired = !isStaff || deleteType === "other"; const submit = () => { const r = reason.trim(); if (reasonRequired) { if (!r) { setErr("请填写删除理由"); return; } if ([...r].length > 200) { setErr("删除理由不能超过 200 字"); return; } } onConfirm({ delete_type: isStaff ? deleteType : "", delete_reason: reasonRequired ? r : "", }); }; return ( } > {isStaff ? ( <>

删除类型

{POST_DELETE_TYPES.map((t) => { const active = deleteType === t.value; return ( ); })}

选「其他」时需补充理由;其余类型直接按标签展示给读者。

) : null} {reasonRequired ? ( <>