import { useEffect } from 'react'; import { useQuery } from '@tanstack/react-query'; import { X, Check, AlertTriangle, Loader2 } from 'lucide-react'; import { api } from '../api/client'; import type { ArchiveComparison } from '../api/client'; import { Button } from './Button'; interface CompareArchivesModalProps { archiveIds: number[]; onClose: () => void; } export function CompareArchivesModal({ archiveIds, onClose }: CompareArchivesModalProps) { // Close on Escape key useEffect(() => { const handleKeyDown = (e: KeyboardEvent) => { if (e.key === 'Escape') onClose(); }; window.addEventListener('keydown', handleKeyDown); return () => window.removeEventListener('keydown', handleKeyDown); }, [onClose]); const { data: comparison, isLoading, error } = useQuery({ queryKey: ['archive-comparison', archiveIds], queryFn: () => api.compareArchives(archiveIds), }); return (
e.stopPropagation()}> {/* Header */}

Compare Archives ({archiveIds.length})

{/* Content */}
{isLoading ? (
) : error ? (

Failed to load comparison

{error instanceof Error ? error.message : 'Unknown error'}

) : comparison ? ( ) : null}
{/* Footer */}
); } function ComparisonContent({ comparison }: { comparison: ArchiveComparison }) { return (
{/* Archive Headers */}
{comparison.archives.map((archive) => ( ))} {comparison.comparison.map((field) => ( {field.values.map((value, idx) => ( ))} ))}
Setting
{archive.print_name}
{archive.status}
{field.has_difference && ( )} {field.label}
{value ?? -} {field.unit && value !== null && ( {field.unit} )}
{/* Differences Summary */} {comparison.differences.length > 0 && (

{comparison.differences.length} Difference{comparison.differences.length > 1 ? 's' : ''} Found

)} {/* Success Correlation */} {comparison.success_correlation.has_both_outcomes ? (

Success/Failure Analysis

{comparison.success_correlation.successful_count} successful {comparison.success_correlation.failed_count} failed
{comparison.success_correlation.insights && comparison.success_correlation.insights.length > 0 ? (
{comparison.success_correlation.insights.map((insight) => (
{insight.label}:{' '} {insight.insight}
))}
) : (

No clear correlations found between settings and outcomes.

)}
) : (

{comparison.success_correlation.message || 'Need both successful and failed prints for correlation analysis.'}

)}
); }