/* 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 (

Nouveau dossier CMR

Déposez les documents — l'IA extrait, vous validez.
{phase === "idle" && (
{/* Upload */}

Téléverser des documents

PDF, JPG, PNG · max 25 Mo
onPick(e.target.files)} />
{ e.preventDefault(); setOver(true); }} onDragLeave={() => setOver(false)} onDrop={(e) => { e.preventDefault(); setOver(false); onPick(e.dataTransfer.files); }} >
Déposez vos documents ici
Factures, bons de livraison, photos de paperasse…
Astuce — vous pouvez aussi transférer un email à ops+cargonote@atlas-maghreb.ma
{/* Simulate email (demo) */}

Simuler un email transféré

Démo
Corps
{`Bonjour, Veuillez trouver ci-joint les documents pour l'expédition de demain : facture commerciale, liste de colisage et photo du BL signé. — Enlèvement : 24/05/2026 au port de Casablanca — Livraison : entrepôt Vallecas, Madrid (RDV — M. Martínez, +34 911 22 88 31) — Tarif : franco, 2 850 € forfait porte-à-porte (cf. devis DV-2026-118) Merci de confirmer la prise en charge. Cordialement, H. El Khattabi — Service logistique, SOREMED Industries`}
Pièces jointes
{sampleFiles.map((f) => (
{f.name} {f.size}
))}
)} {phase === "processing" && (
État
Extraction en cours…
{(files.length ? files : sampleFiles).map((f) => (
{f.name} {f.size}
))}
Le modèle de vision lit vos documents — cela prend quelques secondes.
    {steps.map((s, i) => { const done = i < step; const active = i === step; return (
  1. {done ? "✓" : active ? "" : i + 1} {s}
  2. ); })}
)}
); }; const Mailfield = ({ label, v }) => (
{label}
{v}
); window.IngestView = IngestView;