import { useState } from 'react' import { X, Check, SkipForward, Sparkles, ChevronDown, ChevronUp } from 'lucide-react' import { cn } from '@/lib/utils' import type { AIFixProposal } from '@/types' interface AIFixReviewModalProps { fixes: AIFixProposal[] onApply: (fix: AIFixProposal) => void onApplyAll: () => void onClose: () => void } export function AIFixReviewModal({ fixes, onApply, onApplyAll, onClose }: AIFixReviewModalProps) { const [appliedIds, setAppliedIds] = useState>(new Set()) const [skippedIds, setSkippedIds] = useState>(new Set()) const [expandedIds, setExpandedIds] = useState>(new Set(fixes.map(f => f.target_node_id))) const handleApply = (fix: AIFixProposal) => { onApply(fix) setAppliedIds(prev => new Set(prev).add(fix.target_node_id)) } const handleSkip = (fix: AIFixProposal) => { setSkippedIds(prev => new Set(prev).add(fix.target_node_id)) } const toggleExpanded = (id: string) => { setExpandedIds(prev => { const next = new Set(prev) if (next.has(id)) next.delete(id) else next.add(id) return next }) } const pendingFixes = fixes.filter( f => !appliedIds.has(f.target_node_id) && !skippedIds.has(f.target_node_id) ) const allHandled = pendingFixes.length === 0 return (
{/* Header */}

AI Fix Proposals ({fixes.length})

{/* Body */}
{fixes.map((fix) => { const isApplied = appliedIds.has(fix.target_node_id) const isSkipped = skippedIds.has(fix.target_node_id) const isExpanded = expandedIds.has(fix.target_node_id) return (
{/* Fix header */}

{fix.error_message}

{fix.description}

Node: {fix.target_node_id}

{isApplied && ( Applied )} {isSkipped && ( Skipped )}
{/* Expand/collapse detail */} {!isApplied && !isSkipped && ( <> {isExpanded && (

Before

                            {JSON.stringify(fix.original_node, null, 2)}
                          

After

                            {JSON.stringify(fix.fixed_node, null, 2)}
                          
)} {/* Action buttons */}
)}
) })}
{/* Footer */}
{!allHandled && ( )}
) }