import { useState } from 'react'; import type { PageRecord, Task } from '../services/api'; import { PageParseAPI, API_BASE_URL } from '../services/api'; import { History, FileText, X, Calendar, Clock, Copy, Check, Sparkles, Download } from 'lucide-react'; interface PageHistoryProps { pages: PageRecord[]; tasks: Task[]; onPagesChanged?: () => void; onSelectPage?: (page: PageRecord) => void; } export const PageHistory = ({ pages, tasks, onPagesChanged, onSelectPage }: PageHistoryProps) => { const [selectedPage, setSelectedPage] = useState(null); const [showCleaned, setShowCleaned] = useState(true); const [copiedRaw, setCopiedRaw] = useState(false); const [copiedTasks, setCopiedTasks] = useState(false); const [copiedJSON, setCopiedJSON] = useState(false); const [isSummarizing, setIsSummarizing] = useState(false); const openModal = (page: PageRecord) => { if (onSelectPage) { onSelectPage(page); return; } setSelectedPage(page); setShowCleaned(true); }; const pageTasks = selectedPage ? tasks.filter(t => t.page_id === selectedPage.id || t.source_id === selectedPage.id) : []; const handleSummarize = async () => { if (!selectedPage) return; setIsSummarizing(true); try { const summary = await PageParseAPI.summarizePage(selectedPage.id); setSelectedPage({ ...selectedPage, summary }); onPagesChanged?.(); } catch (err) { console.error(err); } finally { setIsSummarizing(false); } }; return (

Ingestion History

{pages.length} sources
{pages.length === 0 ? (
No pages ingested yet. Upload a file to get started.
) : ( pages.map(page => (
openModal(page)}>
{page.filename}
{page.captured_date || new Date(page.created_at).toLocaleDateString()}
{page.summary && }
)) )}
{/* MODAL */} {selectedPage && !onSelectPage && (
setSelectedPage(null)}>
e.stopPropagation()}>

{selectedPage.filename}

View
{(showCleaned && selectedPage.cleaned_image_path) ? ( Cleaned ) : selectedPage.image_path ? ( Original ) : (
No preview
)}
Captured: {selectedPage.captured_date || '—'}
Ingested: {new Date(selectedPage.created_at).toLocaleDateString()}
{/* Summary */}
AI Summary
{selectedPage.summary ? (

{selectedPage.summary}

) : (

Click Generate to run local AI summarization (Qwen2.5-1.5B).

)}
{/* Tasks */}
Extracted Records ({pageTasks.length}) {pageTasks.length > 0 && ( )}
{pageTasks.length === 0 ? (

No records extracted.

) : (
{pageTasks.map(t => (
{t.task} {(t.ocr_confidence * 100).toFixed(0)}% {t.priority && {t.priority}}
))}
)}
{/* Raw Text */}
Raw Extract
{(selectedPage.raw_ocr_text || selectedPage.raw_text || 'No text.').slice(0, 1500)}
)}
); };