import { useState, useRef, useCallback } from 'react' import { Upload, FileText, Zap, CheckCircle, AlertTriangle } from 'lucide-react' import { api } from '../api' import type { UploadResponse, BuildGraphResponse, AppSettings } from '../types' interface Props { settings: AppSettings onDocumentReady: (id: string) => void } export function UploadPanel({ settings, onDocumentReady }: Props) { const [uploadResult, setUploadResult] = useState(null) const [buildResult, setBuildResult] = useState(null) const [uploading, setUploading] = useState(false) const [building, setBuilding] = useState(false) const [error, setError] = useState(null) const [dragging, setDragging] = useState(false) const inputRef = useRef(null) const handleFile = async (file: File) => { setError(null) setUploading(true) try { const res = await api.upload(file) setUploadResult(res) setBuildResult(null) } catch (e: any) { setError(String(e.message)) } finally { setUploading(false) } } const handleSample = async () => { setError(null) setUploading(true) try { const res = await api.loadSample() setUploadResult(res) setBuildResult(null) } catch (e: any) { setError(String(e.message)) } finally { setUploading(false) } } const handleBuild = async () => { if (!uploadResult) return setError(null) setBuilding(true) try { const res = await api.buildGraph(uploadResult.document_id, settings) setBuildResult(res) onDocumentReady(uploadResult.document_id) } catch (e: any) { setError(String(e.message)) } finally { setBuilding(false) } } const onDragOver = useCallback((e: React.DragEvent) => { e.preventDefault() setDragging(true) }, []) const onDragLeave = useCallback((e: React.DragEvent) => { e.preventDefault() setDragging(false) }, []) const onDrop = useCallback((e: React.DragEvent) => { e.preventDefault() setDragging(false) const file = e.dataTransfer.files[0] if (file) handleFile(file) }, []) return (
Document
e.target.files?.[0] && handleFile(e.target.files[0])} />

{dragging ? 'Drop to upload' : 'Accepts .txt, .md, .pdf — or drag & drop here'}

{uploading &&
}
{error &&
{error}
} {uploadResult && (
{uploadResult.filename} {uploadResult.char_count.toLocaleString()} chars
{uploadResult.text_preview}
)} {buildResult && (
Graph Built
{[ ['Chunks', buildResult.chunks], ['Triples', buildResult.triples], ['Nodes', buildResult.nodes], ['Edges', buildResult.edges], ['Cycles', buildResult.cycles.length], ].map(([k, v]) => (
{v}
{k}
))}
{buildResult.warnings.map((w, i) => (
{w}
))}
)}
) }