/* Ingest screen — real file upload (drag-and-drop / browse) + simulated email demo. Real files are sent to the backend, which runs the extraction pipeline. */ const IngestView = ({ onProcessed }) => { const [over, setOver] = React.useState(false); const [phase, setPhase] = React.useState("idle"); // idle | processing const [step, setStep] = React.useState(0); const [files, setFiles] = React.useState([]); const inputRef = React.useRef(null); const sampleFiles = [ { name: "Facture INV-2026-77231.pdf", size: "248 Ko", kind: "pdf" }, { name: "Liste de colisage PKL-77231.pdf", size: "117 Ko", kind: "pdf" }, { name: "IMG_8842.jpg — BL manuscrit", size: "2.8 Mo", kind: "image" }, ]; const steps = [ "Téléversement des documents", "Rastérisation des PDF en images", "Lecture par le modèle de vision (GPT-4o)", "Extraction des 24 boîtes CMR", "Croisement des sources & scores de confiance", "Brouillon prêt pour validation", ]; // Cosmetic stepper while the real extraction request is in flight. React.useEffect(() => { if (phase !== "processing") return; const t = setTimeout(() => setStep((s) => Math.min(s + 1, steps.length - 1)), 1100); return () => clearTimeout(t); }, [phase, step]); const kindOf = (name) => /\.(png|jpe?g|webp|tiff?|heic)$/i.test(name) ? "image" : /\.pdf$/i.test(name) ? "pdf" : "file"; const fmtSize = (b) => b > 1e6 ? `${(b / 1e6).toFixed(1)} Mo` : `${Math.max(1, Math.round(b / 1e3))} Ko`; const submit = (fileList) => { setPhase("processing"); setStep(0); onProcessed(fileList); // App runs extraction (or the demo) and navigates away }; const onPick = (fileList) => { const arr = Array.from(fileList || []); if (!arr.length) return; setFiles(arr.map((f) => ({ name: f.name, size: fmtSize(f.size), kind: kindOf(f.name) }))); submit(arr); }; return (