"use client"; import { useEffect, useState } from "react"; import Modal from "@/components/Modal"; import StaffDeleteFields from "@/components/StaffDeleteFields"; 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 ? ( { setDeleteType(value); setErr(""); if (value !== "other") setReason(""); }} reason={reason} onReasonChange={(value) => { setReason(value); setErr(""); }} reasonId="cmt-delete-reason" reasonPlaceholder="向读者说明删除原因(将展示在占位中)" typeHint="选「其他」时需补充理由;其余类型直接按标签展示给读者。" reasonHint="将公开显示在评论占位旁。" /> ) : ( <>