import { useState, useEffect } from 'react'; import { useFileService } from '../hooks/useFileService'; import type { FileServiceConfig, FileMetadata, ExportOptions, FilePreview } from '../types'; import { generateFilePreview } from '../utils/filePreview'; interface FileExporterProps { fileId: string; config?: FileServiceConfig; onExportSuccess?: (blob: Blob, fileName: string) => void; onExportError?: (error: string) => void; className?: string; allowSelectiveExport?: boolean; } export function FileExporter({ fileId, config, onExportSuccess, onExportError, className = '', allowSelectiveExport = true, }: FileExporterProps) { const { getFileMetadata, getFile, loading, error } = useFileService(config); const [fileMetadata, setFileMetadata] = useState(null); const [preview, setPreview] = useState(null); const [exportOptions, setExportOptions] = useState({ format: 'original', }); useEffect(() => { const loadFile = async () => { if (!fileId) return; const metadata = await getFileMetadata(fileId); if (metadata) { setFileMetadata(metadata); // Generate preview for selective export try { const fileBlob = await getFile(fileId); if (fileBlob) { const file = new File([fileBlob], metadata.fileName, { type: `application/${metadata.fileExtension.slice(1)}`, }); const previewData = await generateFilePreview(file); setPreview(previewData); } } catch (err) { console.warn('Could not generate preview:', err); } } }; loadFile(); }, [fileId, getFileMetadata, getFile]); const handleExport = async () => { if (!fileMetadata) { onExportError?.('File metadata not available'); return; } try { const fileBlob = await getFile(fileId); if (!fileBlob) { onExportError?.('Failed to download file'); return; } // Convert blob based on export options let exportBlob: Blob = fileBlob; let exportFileName = fileMetadata.fileName; if (exportOptions.format !== 'original') { // In a real implementation, you would use libraries like: // - PDF.js for PDF conversion // - xlsx for Excel conversion // - mammoth.js for Word conversion // For now, we'll just return the original file console.warn('Format conversion not yet implemented, exporting original file'); } // Apply selective export if needed if (allowSelectiveExport && exportOptions.selectPages && exportOptions.selectPages.length > 0) { // In a real implementation, you would extract specific pages console.warn('Selective page export not yet implemented, exporting all pages'); } if (allowSelectiveExport && exportOptions.selectSheets && exportOptions.selectSheets.length > 0) { // In a real implementation, you would extract specific sheets console.warn('Selective sheet export not yet implemented, exporting all sheets'); } if (exportOptions.fileName) { exportFileName = exportOptions.fileName; } onExportSuccess?.(exportBlob, exportFileName); } catch (err) { const errorMessage = err instanceof Error ? err.message : 'Export failed'; onExportError?.(errorMessage); } }; const downloadFile = (blob: Blob, fileName: string) => { const url = URL.createObjectURL(blob); const link = document.createElement('a'); link.href = url; link.download = fileName; document.body.appendChild(link); link.click(); document.body.removeChild(link); URL.revokeObjectURL(url); }; const handleExportAndDownload = async () => { await handleExport(); if (fileMetadata) { const fileBlob = await getFile(fileId); if (fileBlob) { downloadFile(fileBlob, exportOptions.fileName || fileMetadata.fileName); } } }; if (loading && !fileMetadata) { return
Loading file...
; } if (error) { return
Error: {error}
; } if (!fileMetadata) { return
No file to export
; } const fileExtension = fileMetadata.fileExtension.toLowerCase(); const isPdf = fileExtension === '.pdf'; const isExcel = fileExtension === '.xlsx' || fileExtension === '.xls'; const isWord = fileExtension === '.docx' || fileExtension === '.doc'; return (

Export: {fileMetadata.fileName}

{allowSelectiveExport && ( <> {(isPdf || isWord) && preview?.pages && preview.pages > 1 && (
{exportOptions.selectPages !== undefined && (
{Array.from({ length: preview.pages }, (_, i) => i + 1).map((pageNum) => ( ))}
)}
)} {isExcel && preview?.sheets && preview.sheets.length > 1 && (
{exportOptions.selectSheets !== undefined && (
{preview.sheets.map((sheet) => ( ))}
)}
)} )}
{error &&
{error}
}
); }