"use client"; import React, { useCallback, useState } from "react"; import { useGridStore } from "@/store/use-grid-store"; import { parseArrowStream } from "@/lib/arrow-client"; import { Upload, FileSpreadsheet, Loader2, AlertCircle } from "lucide-react"; import { cn } from "@/lib/utils"; import { getApiUrl } from "@/lib/api-config"; export function FileUploader() { const { setLoading, setData, setError, isLoading } = useGridStore(); const [isDragging, setIsDragging] = useState(false); const handleFile = async (file: File) => { console.log("=== UPLOAD START ===", file.name, file.size); setLoading(true); const formData = new FormData(); formData.append("file", file); try { console.log("Fetching:", getApiUrl("/upload")); const response = await fetch(getApiUrl("/upload"), { method: "POST", body: formData, }); console.log("Response status:", response.status); if (!response.ok) { if (response.status === 404) throw new Error("Backend non trouvé (404). Vérifiez l'URL."); if (response.status === 500) throw new Error("Erreur interne du serveur."); throw new Error(await response.text()); } const metadataStr = response.headers.get("X-Column-Metadata"); console.log("Metadata:", metadataStr); const metadata = metadataStr ? JSON.parse(metadataStr) : []; console.log("Parsing Arrow..."); const data = await parseArrowStream(response); console.log("Data parsed, rows:", data.length); setData(data, metadata); console.log("=== UPLOAD SUCCESS ==="); } catch (err: any) { console.error("Upload Error:", err); // Check for network error (Failed to fetch) if (err.message === "Failed to fetch") { setError("Impossible de contacter le serveur. Le backend est-il lancé sur le port 8000 ?"); } else { setError(err.message || "Échec de l'upload"); } } finally { setLoading(false); } }; const onDragOver = (e: React.DragEvent) => { e.preventDefault(); setIsDragging(true); }; const onDragLeave = () => setIsDragging(false); const onDrop = (e: React.DragEvent) => { e.preventDefault(); setIsDragging(false); const file = e.dataTransfer.files?.[0]; if (file) handleFile(file); }; return (
Excel (.xlsx) ou CSV. Max 50MB