import React, { useState, useEffect, useRef } from "react"; import { motion } from "framer-motion"; import { FileText, ZoomIn, ZoomOut, RotateCw, Maximize2 } from "lucide-react"; import { Button } from "@/components/ui/button"; export default function DocumentPreview({ file, isProcessing }) { const [previewUrls, setPreviewUrls] = useState([]); const [zoom, setZoom] = useState(100); const [rotation, setRotation] = useState(0); const objectUrlsRef = useRef([]); useEffect(() => { if (!file) { // Cleanup previous URLs objectUrlsRef.current.forEach((url) => { if (url && url.startsWith("blob:")) { URL.revokeObjectURL(url); } }); objectUrlsRef.current = []; setPreviewUrls([]); return; } const loadPreview = async () => { const urls = []; const newObjectUrls = []; // Check if it's a PDF if (file.type === "application/pdf" || file.name?.toLowerCase().endsWith(".pdf")) { try { // Use pdf.js to render PDF pages const pdfjsLib = await import("pdfjs-dist"); // Configure worker - use jsdelivr CDN which is more reliable // This will use the same version as the installed package const version = pdfjsLib.version || "4.0.379"; pdfjsLib.GlobalWorkerOptions.workerSrc = `https://cdn.jsdelivr.net/npm/pdfjs-dist@${version}/build/pdf.worker.min.mjs`; const arrayBuffer = await file.arrayBuffer(); const pdf = await pdfjsLib.getDocument({ data: arrayBuffer }).promise; const numPages = pdf.numPages; for (let pageNum = 1; pageNum <= numPages; pageNum++) { const page = await pdf.getPage(pageNum); const viewport = page.getViewport({ scale: 2.0 }); const canvas = document.createElement("canvas"); const context = canvas.getContext("2d"); canvas.height = viewport.height; canvas.width = viewport.width; await page.render({ canvasContext: context, viewport: viewport, }).promise; urls.push(canvas.toDataURL("image/jpeg", 0.95)); } } catch (error) { console.error("Error loading PDF:", error); // Fallback: show error message urls.push(null); } } else { // For images, create object URL const url = URL.createObjectURL(file); urls.push(url); newObjectUrls.push(url); } // Cleanup old object URLs objectUrlsRef.current.forEach((url) => { if (url && url.startsWith("blob:")) { URL.revokeObjectURL(url); } }); objectUrlsRef.current = newObjectUrls; setPreviewUrls(urls); }; loadPreview(); // Cleanup function - revoke object URLs when component unmounts or file changes return () => { objectUrlsRef.current.forEach((url) => { if (url && url.startsWith("blob:")) { URL.revokeObjectURL(url); } }); objectUrlsRef.current = []; }; }, [file]); return (
{file?.name || "No file selected"}
Upload a document to preview
Loading preview...
Unable to load preview