import { useCallback, useState } from 'react' import { useNavigate } from 'react-router-dom' import { api } from './api' import { useStore } from './store' import logoUrl from './assets/ai-toolstack-logo.svg' const BRAND = { dark: '#1F2937', blue: '#2563EB', teal: '#008080', } as const export function UploadPage() { const navigate = useNavigate() const setSession = useStore((s) => s.setSession) const [loading, setLoading] = useState(false) const [error, setError] = useState(null) const [files, setFiles] = useState([]) const [dragOver, setDragOver] = useState(false) const handleFiles = useCallback((incoming: FileList | null) => { if (!incoming) return const pdfs = Array.from(incoming).filter((f) => f.name.toLowerCase().endsWith('.pdf')) setFiles((prev) => { const names = new Set(prev.map((f) => f.name)) return [...prev, ...pdfs.filter((f) => !names.has(f.name))] }) }, []) const removeFile = (name: string) => setFiles((prev) => prev.filter((f) => f.name !== name)) const handleSubmit = async () => { if (!files.length) return setLoading(true) setError(null) try { const resp = await api.processDocuments(files) const sessionData = await api.getSession(resp.session_id) setSession(sessionData) navigate(`/session/${resp.session_id}`) } catch (err: unknown) { const msg = err instanceof Error ? err.message : 'An unknown error occurred.' setError(msg) setLoading(false) } } return (
{/* ── Top nav ─────────────────────────────────────────────────── */}
AI Tool Stack Beta
{/* ── Hero ────────────────────────────────────────────────────── */}
{/* Title */}

PolicyTrace

Upload UK motor insurance PDFs — the pipeline classifies, extracts, and merges them into a verified Golden Record with full field-level provenance.

{/* Drop zone */}
{ e.preventDefault(); setDragOver(true) }} onDragLeave={() => setDragOver(false)} onDrop={(e) => { e.preventDefault() setDragOver(false) handleFiles(e.dataTransfer.files) }} onClick={() => document.getElementById('file-input')?.click()} className="rounded-2xl border-2 border-dashed p-10 text-center cursor-pointer transition-all" style={{ borderColor: dragOver ? BRAND.blue : '#d1d5db', backgroundColor: dragOver ? '#eff6ff' : '#ffffff', }} >

Drop PDF files here, or{' '} click to browse

Schedule · Certificate · Statement of Fact · Policy Booklet

handleFiles(e.target.files)} />
{/* File list */} {files.length > 0 && (
    {files.map((f) => (
  • PDF {f.name}
  • ))}
)} {/* Error */} {error && (
{error}
)} {/* CTA */} {loading && (

Classifying documents · Masking PII · Calling Groq LLM · Building provenance index

)}
{/* ── Footer ──────────────────────────────────────────────────── */}
) }