import { useState, useEffect } from 'react'; import { History, Check, X, AlertTriangle, Download, ChevronDown, ChevronUp } from 'lucide-react'; import { getFeedback, exportFeedbackCSV, FeedbackEntry, FeedbackStats, getFeedbackStats } from '../lib/api'; interface SessionHistoryProps { sessionId: string; onSelectEntry?: (entry: FeedbackEntry) => void; refreshTrigger?: number; // Increment to trigger refresh } export function SessionHistory({ sessionId, onSelectEntry, refreshTrigger }: SessionHistoryProps) { const [entries, setEntries] = useState([]); const [stats, setStats] = useState(null); const [isExpanded, setIsExpanded] = useState(false); const [isLoading, setIsLoading] = useState(false); useEffect(() => { loadData(); }, [sessionId, refreshTrigger]); const loadData = async () => { if (!sessionId) return; setIsLoading(true); try { const [feedbackData, statsData] = await Promise.all([ getFeedback(sessionId), getFeedbackStats(sessionId) ]); setEntries(feedbackData); setStats(statsData); } catch (error) { console.error('Failed to load session data:', error); } finally { setIsLoading(false); } }; const handleExport = async () => { try { await exportFeedbackCSV(sessionId); } catch (error) { console.error('Failed to export:', error); } }; if (entries.length === 0 && !isLoading) { return null; // Don't show anything if no entries } return (
{/* Header - always visible */} {/* Expanded content */} {isExpanded && (
{/* Export button */} {entries.length > 0 && (
)} {/* Entry list */}
{isLoading ? (
Loading...
) : entries.length === 0 ? (
No feedback recorded yet
) : ( entries.map((entry) => (
onSelectEntry?.(entry)} className={`px-3 py-2 border-b border-border/50 last:border-b-0 hover:bg-surface cursor-pointer transition-colors`} >
{entry.filename} {entry.is_correct ? ( ) : ( )}
{entry.is_correct ? ( entry.predicted_label ) : ( {entry.predicted_label} {' → '} {entry.correct_label} )}
= 70 ? 'text-green-600' : entry.predicted_confidence >= 50 ? 'text-yellow-600' : 'text-red-500' }`}> {entry.predicted_confidence}% {entry.predicted_confidence < 70 && ( )}
)) )}
)}
); }