"use client"; import { useCallback, useState } from "react"; import { useDropzone } from "react-dropzone"; import { useMutation, useQueryClient } from "@tanstack/react-query"; import { Upload, FileText, X, Loader2 } from "lucide-react"; import { toast } from "sonner"; import { api } from "@/lib/api"; import type { Document } from "@/lib/types"; interface DocumentUploadProps { caseId: string; } export function DocumentUpload({ caseId }: DocumentUploadProps) { const [files, setFiles] = useState([]); const queryClient = useQueryClient(); const uploadMutation = useMutation({ mutationFn: async (file: File) => { const formData = new FormData(); formData.append("file", file); formData.append("title", file.name); return api.postFormData(`/cases/${caseId}/documents`, formData); }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["case-documents", caseId] }); queryClient.invalidateQueries({ queryKey: ["case", caseId] }); }, }); const onDrop = useCallback((acceptedFiles: File[]) => { setFiles((prev) => [...prev, ...acceptedFiles]); }, []); const { getRootProps, getInputProps, isDragActive } = useDropzone({ onDrop, disabled: uploadMutation.isPending, }); function removeFile(index: number) { setFiles((prev) => prev.filter((_, i) => i !== index)); } async function handleUpload() { if (files.length === 0) return; let successCount = 0; for (const file of files) { try { await uploadMutation.mutateAsync(file); successCount++; } catch (err) { const msg = err && typeof err === "object" && "error" in err ? (err as { error: string }).error : file.name; toast.error(`Fehler beim Hochladen: ${msg}`); } } if (successCount > 0) { toast.success( successCount === 1 ? "Dokument hochgeladen" : `${successCount} Dokumente hochgeladen`, ); setFiles([]); } } return (

Dateien hierher ziehen oder{" "} durchsuchen

Max. 50 MB pro Datei

{files.length > 0 && (
{files.map((file, i) => (

{file.name}

{formatFileSize(file.size)}

))}
)}
); } function formatFileSize(bytes: number): string { if (bytes < 1024) return `${bytes} B`; if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(0)} KB`; return `${(bytes / (1024 * 1024)).toFixed(1)} MB`; }