'use client'; import { useCallback, useRef, useState } from 'react'; import { useRouter } from 'next/navigation'; import { Upload } from 'lucide-react'; import { uploadFile } from '@kit/module-builder/actions/file-actions'; import { Button } from '@kit/ui/button'; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger, } from '@kit/ui/dialog'; import { useActionWithToast } from '@kit/ui/use-action-with-toast'; interface FileUploadDialogProps { accountId: string; } const MAX_FILE_SIZE = 10 * 1024 * 1024; // 10 MB const ACCEPTED_TYPES = [ 'image/*', 'application/pdf', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'text/csv', 'text/plain', 'application/zip', ].join(','); function formatFileSize(bytes: number): string { if (bytes >= 1024 * 1024) { return `${(bytes / 1024 / 1024).toFixed(1)} MB`; } return `${(bytes / 1024).toFixed(1)} KB`; } export function FileUploadDialog({ accountId }: FileUploadDialogProps) { const router = useRouter(); const fileInputRef = useRef(null); const [open, setOpen] = useState(false); const [selectedFile, setSelectedFile] = useState<{ name: string; type: string; size: number; base64: string; } | null>(null); const [error, setError] = useState(null); const { execute, isPending } = useActionWithToast(uploadFile, { successMessage: 'Datei hochgeladen', onSuccess: () => { setOpen(false); setSelectedFile(null); setError(null); router.refresh(); }, }); const handleFileSelect = useCallback( (e: React.ChangeEvent) => { setError(null); const file = e.target.files?.[0]; if (!file) { setSelectedFile(null); return; } if (file.size > MAX_FILE_SIZE) { setError('Die Datei darf maximal 10 MB groß sein.'); setSelectedFile(null); return; } const reader = new FileReader(); reader.onload = () => { const result = reader.result as string; // Remove the data:...;base64, prefix const base64 = result.split(',')[1] ?? ''; setSelectedFile({ name: file.name, type: file.type || 'application/octet-stream', size: file.size, base64, }); }; reader.onerror = () => { setError('Fehler beim Lesen der Datei.'); setSelectedFile(null); }; reader.readAsDataURL(file); }, [], ); const handleUpload = useCallback(() => { if (!selectedFile) return; execute({ accountId, fileName: selectedFile.name, fileType: selectedFile.type, fileSize: selectedFile.size, base64: selectedFile.base64, }); }, [accountId, execute, selectedFile]); const handleOpenChange = useCallback( (isOpen: boolean) => { if (!isPending) { setOpen(isOpen); if (!isOpen) { setSelectedFile(null); setError(null); } } }, [isPending], ); return ( Datei hochladen } /> Datei hochladen Wählen Sie eine Datei aus (max. 10 MB).
{error &&

{error}

} {selectedFile && (

{selectedFile.name}

{selectedFile.type} · {formatFileSize(selectedFile.size)}

)}
); }