"use client"; import { useState, useRef, useCallback } from "react"; import { Upload, File as FileIcon, X, Loader2 } from "lucide-react"; /** 文件上传组件 — 支持拖拽 + 点击上传。 */ export function FileUploader({ onParsed }: { onParsed: (result: any) => void }) { const [dragging, setDragging] = useState(false); const [uploading, setUploading] = useState(false); const [file, setFile] = useState(null); const inputRef = useRef(null); const allowedTypes = [".xlsx", ".xls", ".pdf", ".txt", ".md", ".csv"]; const handleFile = useCallback(async (f: File) => { const ext = f.name.match(/\.[^.]+$/)?.[0]?.toLowerCase() || ""; if (!allowedTypes.includes(ext)) { return; } setFile(f); setUploading(true); try { const formData = new FormData(); formData.append("file", f); const token = localStorage.getItem("token"); const resp = await fetch("/api/v1/reports/upload", { method: "POST", headers: { Authorization: `Bearer ${token}` }, body: formData, }); const data = await resp.json(); onParsed(data.data); } catch { // ignore } finally { setUploading(false); } }, [onParsed]); return (
{ e.preventDefault(); setDragging(true); }} onDragLeave={() => setDragging(false)} onDrop={(e) => { e.preventDefault(); setDragging(false); if (e.dataTransfer.files[0]) handleFile(e.dataTransfer.files[0]); }} style={dragging ? { borderColor: "var(--investor-primary)", background: "var(--investor-primary)/5" } : {}} > {file ? (
{file.name}
{uploading && }
) : ( )} { if (e.target.files?.[0]) handleFile(e.target.files[0]); }} />
); }