import { useRef, useState, useEffect } from 'react'; import { useFileService } from '../hooks/useFileService'; import { validateFile, formatFileSize } from '../utils/fileValidation'; import { generateFilePreview } from '../utils/filePreview'; import type { FileServiceConfig, FilePreview, ImportOptions, ValidationResult } from '../types'; interface FileImporterProps { config?: FileServiceConfig; onImportSuccess?: (fileId: string, options?: ImportOptions) => void; onImportError?: (error: string) => void; className?: string; accept?: string; showPreview?: boolean; allowSelectiveImport?: boolean; } export function FileImporter({ config, onImportSuccess, onImportError, className = '', accept, showPreview = true, allowSelectiveImport = true, }: FileImporterProps) { const fileInputRef = useRef(null); const [selectedFile, setSelectedFile] = useState(null); const [preview, setPreview] = useState(null); const [validation, setValidation] = useState(null); const [importOptions, setImportOptions] = useState({}); const [dragActive, setDragActive] = useState(false); const [previewLoading, setPreviewLoading] = useState(false); const [filePreviewUrl, setFilePreviewUrl] = useState(null); const { uploadFile, loading, error } = useFileService(config); useEffect(() => { if (selectedFile) { // Create object URL for file preview const url = URL.createObjectURL(selectedFile); setFilePreviewUrl(url); return () => { URL.revokeObjectURL(url); }; } else { setFilePreviewUrl(null); } }, [selectedFile]); useEffect(() => { if (selectedFile && showPreview) { setPreviewLoading(true); generateFilePreview(selectedFile) .then((previewData) => { setPreview(previewData); setPreviewLoading(false); }) .catch((err) => { console.error('Preview generation failed:', err); setPreviewLoading(false); }); } }, [selectedFile, showPreview]); useEffect(() => { if (selectedFile) { // Create object URL for file preview const url = URL.createObjectURL(selectedFile); setFilePreviewUrl(url); return () => { URL.revokeObjectURL(url); }; } else { setFilePreviewUrl(null); } }, [selectedFile]); const handleFileSelect = (file: File) => { const validationResult = validateFile(file, config); setValidation(validationResult); setSelectedFile(file); if (!validationResult.valid) { onImportError?.(validationResult.errors.join(', ')); return; } }; const handleImport = async () => { if (!selectedFile || !validation?.valid) { onImportError?.('Please select a valid file'); return; } try { const result = await uploadFile(selectedFile); if (result.success && result.file) { onImportSuccess?.(result.file.id, importOptions); // Reset state setSelectedFile(null); setPreview(null); setImportOptions({}); if (fileInputRef.current) { fileInputRef.current.value = ''; } } else { onImportError?.(result.error || 'Import failed'); } } catch (err) { const errorMessage = err instanceof Error ? err.message : 'Import failed'; onImportError?.(errorMessage); } }; const handleDrop = (e: React.DragEvent) => { e.preventDefault(); e.stopPropagation(); setDragActive(false); if (e.dataTransfer.files && e.dataTransfer.files.length > 0) { handleFileSelect(e.dataTransfer.files[0]); } }; const handleDrag = (e: React.DragEvent) => { e.preventDefault(); e.stopPropagation(); if (e.type === 'dragenter' || e.type === 'dragover') { setDragActive(true); } else if (e.type === 'dragleave') { setDragActive(false); } }; const handleChange = (e: React.ChangeEvent) => { if (e.target.files && e.target.files.length > 0) { handleFileSelect(e.target.files[0]); } }; const renderPreview = () => { if (!preview || !selectedFile) return null; return (

File Preview: {selectedFile.name}

Name: {selectedFile.name}

Size: {formatFileSize(selectedFile.size)}

Type: {preview.type}

{preview.pages && (

Total Pages: {preview.pages}

)} {preview.sheets && preview.sheets.length > 0 && (

Sheets:

    {preview.sheets.map((sheet) => (
  • {sheet}
  • ))}
)}
{preview.type === 'pdf' && filePreviewUrl && (