import React, { useState, useCallback, useRef } from 'react'; import { Stack, Button, Text, Center } from '@mantine/core'; import { Dropzone } from '@mantine/dropzone'; import UploadFileIcon from '@mui/icons-material/UploadFile'; import { useTranslation } from 'react-i18next'; import FilePickerModal from './FilePickerModal'; interface FileUploadSelectorProps { // Appearance title?: string; subtitle?: string; showDropzone?: boolean; // File handling sharedFiles?: any[]; onFileSelect?: (file: File) => void; onFilesSelect: (files: File[]) => void; accept?: string[]; // Loading state loading?: boolean; disabled?: boolean; } const FileUploadSelector = ({ title, subtitle, showDropzone = true, sharedFiles = [], onFileSelect, onFilesSelect, accept = ["application/pdf"], loading = false, disabled = false, }: FileUploadSelectorProps) => { const { t } = useTranslation(); const [showFilePickerModal, setShowFilePickerModal] = useState(false); const fileInputRef = useRef(null); const handleFileUpload = useCallback((uploadedFiles: File[]) => { if (uploadedFiles.length === 0) return; if (onFilesSelect) { onFilesSelect(uploadedFiles); } else if (onFileSelect) { onFileSelect(uploadedFiles[0]); } }, [onFileSelect, onFilesSelect]); const handleFileInputChange = useCallback((event: React.ChangeEvent) => { const files = event.target.files; if (files && files.length > 0) { const fileArray = Array.from(files); console.log('File input change:', fileArray.length, 'files'); handleFileUpload(fileArray); } // Reset input if (fileInputRef.current) { fileInputRef.current.value = ''; } }, [handleFileUpload]); const openFileDialog = useCallback(() => { fileInputRef.current?.click(); }, []); const handleStorageSelection = useCallback((selectedFiles: File[]) => { if (selectedFiles.length === 0) return; if (onFilesSelect) { onFilesSelect(selectedFiles); } else if (onFileSelect) { onFileSelect(selectedFiles[0]); } }, [onFileSelect, onFilesSelect]); // Get default title and subtitle from translations if not provided const displayTitle = title || t("fileUpload.selectFiles", "Select files"); const displaySubtitle = subtitle || t("fileUpload.chooseFromStorageMultiple", "Choose files from storage or upload new PDFs"); return ( <> {/* Title and description */} {displayTitle} {displaySubtitle} {/* Action buttons */} {t("fileUpload.or", "or")} {showDropzone ? (
{t("fileUpload.dropFilesHere", "Drop files here or click to upload")} {accept.includes('application/pdf') ? t("fileUpload.pdfFilesOnly", "PDF files only") : t("fileUpload.supportedFileTypes", "Supported file types") }
) : ( {/* Manual file input as backup */} )}
{/* File Picker Modal */} setShowFilePickerModal(false)} storedFiles={sharedFiles} onSelectFiles={handleStorageSelection} /> ); }; export default FileUploadSelector;