import "./TaskReviewTab.css"; import type { Task, TaskDetail } from "@fusion/core"; import { useMemo, useState } from "react"; import { refreshTaskReview, reviseTaskReviewItems } from "../api"; import type { ToastType } from "../hooks/useToast"; interface Props { task: Task | TaskDetail; projectId?: string; onTaskUpdated?: (task: Task) => void; addToast: (message: string, type?: ToastType) => void; } export function TaskReviewTab({ task, projectId, onTaskUpdated, addToast }: Props) { const [selected, setSelected] = useState(task.review?.selectedItemIds ?? []); const review = task.review; const canRevise = selected.length > 0; const summaryText = useMemo(() => { if (!review) return "No review feedback captured yet."; return review.summary ?? `${review.items.length} review item(s)`; }, [review]); const decisionLabel = review?.decision ? review.decision.replace("-", " ") : undefined; const toggleSelected = (id: string) => { setSelected((prev) => (prev.includes(id) ? prev.filter((value) => value !== id) : [...prev, id])); }; const onRefresh = async () => { try { const result = await refreshTaskReview(task.id, projectId); onTaskUpdated?.({ ...task, review: result.review } as Task); addToast("Review refreshed", "success"); } catch (error) { addToast(error instanceof Error ? error.message : "Failed to refresh review", "error"); } }; const onRevise = async () => { try { const result = await reviseTaskReviewItems(task.id, selected, projectId); onTaskUpdated?.({ ...result.task, review: result.review } as Task); addToast("Queued same-task revision", "success"); } catch (error) { addToast(error instanceof Error ? error.message : "Failed to queue revision", "error"); } }; return (

{summaryText}

{decisionLabel ? ( {decisionLabel} ) : null}
{review?.items?.length ? ( ) : (
No review items yet.
)}
); }