import React, { useState, useEffect } from "react"; import { Card, Group, Text, Stack, Image, Badge, Button, Box, Flex } from "@mantine/core"; import { Dropzone, MIME_TYPES } from "@mantine/dropzone"; import { GlobalWorkerOptions, getDocument, version as pdfjsVersion } from "pdfjs-dist"; GlobalWorkerOptions.workerSrc = `${process.env.PUBLIC_URL}/pdf.worker.js`; function getFileDate(file) { if (file.lastModified) { return new Date(file.lastModified).toLocaleString(); } return "Unknown"; } function getFileSize(file) { if (!file.size) return "Unknown"; if (file.size < 1024) return `${file.size} B`; if (file.size < 1024 * 1024) return `${(file.size / 1024).toFixed(1)} KB`; return `${(file.size / (1024 * 1024)).toFixed(2)} MB`; } function usePdfThumbnail(file) { const [thumb, setThumb] = useState(null); useEffect(() => { let cancelled = false; async function generate() { if (!file) return; try { const arrayBuffer = await file.arrayBuffer(); const pdf = await getDocument({ data: arrayBuffer }).promise; const page = await pdf.getPage(1); const viewport = page.getViewport({ scale: 0.5 }); const canvas = document.createElement("canvas"); canvas.width = viewport.width; canvas.height = viewport.height; const context = canvas.getContext("2d"); await page.render({ canvasContext: context, viewport }).promise; if (!cancelled) setThumb(canvas.toDataURL()); } catch { if (!cancelled) setThumb(null); } } generate(); return () => { cancelled = true; }; }, [file]); return thumb; } function FileCard({ file, onRemove, onDoubleClick }) { const thumb = usePdfThumbnail(file); return ( {thumb ? ( PDF thumbnail ) : ( PDF )} {file.name} {getFileSize(file)} {getFileDate(file)} ); } export default function FileManager({ files = [], setFiles, allowMultiple = true, setPdfFile, setCurrentView }) { const handleDrop = (uploadedFiles) => { setFiles((prevFiles) => (allowMultiple ? [...prevFiles, ...uploadedFiles] : uploadedFiles)); }; const handleRemoveFile = (index) => { setFiles((prevFiles) => prevFiles.filter((_, i) => i !== index)); }; return (
Drag PDF files here or click to select {files.length === 0 ? ( No files uploaded yet. ) : ( {files.map((file, idx) => ( handleRemoveFile(idx)} onDoubleClick={() => { const fileObj = file.file || file; // handle wrapped or raw File setPdfFile && setPdfFile({ file: fileObj, url: URL.createObjectURL(fileObj), }); setCurrentView && setCurrentView("viewer"); }} /> ))} )}
); }