import { useLocalization } from '@/utils/hooks/useLocalization' import React, { useCallback, useState } from 'react' import { FaUpload, FaFile, FaTimes, FaRegCircle } from 'react-icons/fa' interface FileUploadAreaProps { onFileUpload: (file: File) => void loading?: boolean acceptedFormats?: string[] maxSize?: number // in MB } export const FileUploadArea: React.FC = ({ onFileUpload, loading = false, acceptedFormats = ['.xlsx', '.xls', '.csv'], maxSize = 10, }) => { const [dragActive, setDragActive] = useState(false) const [selectedFile, setSelectedFile] = useState(null) const [error, setError] = useState(null) const { translate } = useLocalization() const validateFile = (file: File): boolean => { setError(null) // Check file size if (file.size > maxSize * 1024 * 1024) { setError(`File size must be less than ${maxSize}MB`) return false } // Check file type const fileExtension = '.' + file.name.split('.').pop()?.toLowerCase() if (!acceptedFormats.includes(fileExtension)) { setError( translate('::App.Listforms.ImportManager.FileTypeError') + `${acceptedFormats.join(', ')}`, ) return false } return true } const handleFile = (file: File) => { if (validateFile(file)) { setSelectedFile(file) setError(null) } } const handleDrag = useCallback((e: React.DragEvent) => { e.preventDefault() e.stopPropagation() if (e.type === 'dragenter' || e.type === 'dragover') { setDragActive(true) } else if (e.type === 'dragleave') { setDragActive(false) } }, []) const handleDrop = useCallback((e: React.DragEvent) => { e.preventDefault() e.stopPropagation() setDragActive(false) if (e.dataTransfer.files && e.dataTransfer.files[0]) { handleFile(e.dataTransfer.files[0]) } }, []) const handleChange = (e: React.ChangeEvent) => { e.preventDefault() if (e.target.files && e.target.files[0]) { handleFile(e.target.files[0]) } } const clearFile = () => { setSelectedFile(null) setError(null) } const uploadFile = () => { if (selectedFile) { onFileUpload(selectedFile) } } const formatFileSize = (bytes: number): string => { if (bytes === 0) return '0 Bytes' const k = 1024 const sizes = ['Bytes', 'KB', 'MB', 'GB'] const i = Math.floor(Math.log(bytes) / Math.log(k)) return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i] } return (
{!selectedFile ? (
{dragActive ? translate('::App.Listforms.ImportManager.DropHere') : translate('::App.Listforms.ImportManager.UploadYourFile')}

{translate('::App.Listforms.ImportManager.DragOrClick')}

{translate('::App.Listforms.ImportManager.SupportedFormats')}{' '} {acceptedFormats.join(', ')} • Max size: {maxSize}MB
) : (
{selectedFile.name}
{formatFileSize(selectedFile.size)}
)} {error && (
{error}
)} {selectedFile && !error && ( )}
) }