import { useEffect, useMemo, useState } from "react"; import type { FeedbackCenterRecord, FeedbackCenterReviewStatus, FeedbackReasonCandidate, } from "@/api/feedbackCenter"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Textarea } from "@/components/ui/textarea"; interface ReasonPickerProps { record: FeedbackCenterRecord | null; catalog: FeedbackReasonCandidate[]; isPending: boolean; onSubmit: (payload: { review_status: Exclude; reason_code?: string; reason_text?: string; }) => Promise | void; } export function ReasonPicker({ record, catalog, isPending, onSubmit }: ReasonPickerProps) { const [selectedReason, setSelectedReason] = useState(""); const [reasonText, setReasonText] = useState(""); const [targetStatus, setTargetStatus] = useState>("accepted"); const candidates = useMemo(() => { if (!record) return []; const base = Array.isArray(record.reason_candidates) ? record.reason_candidates : []; const merged = [...base]; catalog.forEach((item) => { if (merged.some((candidate) => candidate.code === item.code)) return; merged.push(item); }); return merged; }, [catalog, record]); useEffect(() => { setSelectedReason(record?.reason_code || ""); setReasonText(record?.reason_text || ""); if (record?.review_status === "reviewed" || record?.review_status === "rejected") { setTargetStatus(record.review_status); return; } setTargetStatus("accepted"); }, [record?.id, record?.reason_code, record?.reason_text, record?.review_status]); if (!record) { return (
选择左侧记录后,这里会显示候选原因与学习确认操作。
); } return (

Review Action

确认学习原因

AI 已经先给出候选原因,人只需要确认、修正,或拒绝纳入学习。

{(["reviewed", "accepted", "rejected"] as const).map((status) => ( ))}

候选原因

{candidates.map((candidate) => { const active = selectedReason === candidate.code; return ( ); })}
{!candidates.length && ( 当前没有自动候选,请手工补充原因 )}

补充备注