import { useCallback } from 'react'; import { UploadIcon } from 'lucide-react'; import { useDropzone } from 'react-dropzone'; import type { FileRejection } from 'react-dropzone'; import { useTranslation } from '#hooks'; import { cn } from '#utils'; export type FileDropzoneProps = { acceptedFileTypes: { [key: string]: string[]; }; className?: string; description?: string; file: File | null; setFile: (file: File) => void; titles?: { dragActive: string; dragInactive: string; }; }; export const FileDropzone = ({ acceptedFileTypes, className, description, file, setFile, titles }: FileDropzoneProps) => { const { t } = useTranslation(); const handleDrop = useCallback( (acceptedFiles: File[], rejectedFiles: FileRejection[]) => { for (const { errors, file } of rejectedFiles) { console.error(errors, file); } setFile(acceptedFiles[0]!); }, [setFile] ); const { getInputProps, getRootProps, isDragActive } = useDropzone({ accept: acceptedFileTypes, maxFiles: 1, onDrop: handleDrop }); const dragActiveTitle = titles?.dragActive ?? t({ en: 'File to upload', fr: 'fichier à télécharger' }); const dragInactiveTitle = titles?.dragInactive ?? t({ en: 'Drag and drop files or click on box to upload', fr: 'Glissez-déposez les fichiers ou cliquez sur la case pour les télécharger' }); return (
{description}
}