import React, { useState } from 'react'; import { Upload, FileText, CheckCircle, Loader2, Settings } from 'lucide-react'; import api from '../api/client'; import { usePipelineStore } from '../store/pipelineStore'; const STRATEGIES = [ { value: 'fixed', label: 'Fixed Size' }, { value: 'token', label: 'Token Based' }, { value: 'sentence', label: 'Sentence Split' }, { value: 'paragraph', label: 'Paragraph' }, { value: 'recursive', label: 'Recursive' }, { value: 'sliding_window', label: 'Sliding Window' }, ]; export default function FileUpload() { const [file, setFile] = useState(null); const { setIngesting, isIngesting, setActiveJob, clearSteps } = usePipelineStore(); const [status, setStatus] = useState('idle'); // idle | loading | success | error const [errorMsg, setErrorMsg] = useState(''); // Chunking controls const [strategy, setStrategy] = useState('fixed'); const [chunkSize, setChunkSize] = useState(512); const [overlap, setOverlap] = useState(64); const handleUpload = async () => { if (!file) return; setIngesting(true); setStatus('loading'); setErrorMsg(''); const formData = new FormData(); formData.append('file', file); formData.append('chunk_size', chunkSize); formData.append('overlap', overlap); formData.append('strategy', strategy); try { clearSteps(); const { data } = await api.post('/ingest/upload', formData); setActiveJob(data.job_id); setStatus('success'); setTimeout(() => { setStatus('idle'); setFile(null); }, 3000); } catch (error) { console.error('Upload failed', error); setErrorMsg(error?.response?.data?.detail || 'Upload failed'); setStatus('error'); setTimeout(() => setStatus('idle'), 5000); } finally { setIngesting(false); } }; return (

Document Ingestion

{/* File Drop Zone */}
setFile(e.target.files[0])} />
{/* Chunking Controls */}
Chunking Configuration
{/* Strategy Selector */}
{/* Size & Overlap */}
setChunkSize(parseInt(e.target.value) || 256)} min={64} max={4096} className="w-full input-field text-sm" />
setOverlap(parseInt(e.target.value) || 0)} min={0} max={512} className="w-full input-field text-sm" />
{/* Live Preview */}
Strategy: {strategy}
Size: {chunkSize} chars | Overlap: {overlap} chars
{/* Error Message */} {status === 'error' && (
{errorMsg}
)} {/* Upload Button */}
); }