import React, { useEffect, useState } from "react"; import { Paper, Stack, Text, ScrollArea, Loader, Center, Button, Group } from "@mantine/core"; import { getDocument, GlobalWorkerOptions } from "pdfjs-dist"; GlobalWorkerOptions.workerSrc = `${process.env.PUBLIC_URL}/pdf.worker.js`; export interface ViewerProps { pdfFile: { file: File; url: string } | null; setPdfFile: (file: { file: File; url: string } | null) => void; } const Viewer: React.FC = ({ pdfFile, setPdfFile }) => { const [numPages, setNumPages] = useState(0); const [pageImages, setPageImages] = useState([]); const [loading, setLoading] = useState(false); useEffect(() => { let cancelled = false; async function renderPages() { if (!pdfFile || !pdfFile.url) { setNumPages(0); setPageImages([]); return; } setLoading(true); try { const pdf = await getDocument(pdfFile.url).promise; setNumPages(pdf.numPages); const images: string[] = []; for (let i = 1; i <= pdf.numPages; i++) { const page = await pdf.getPage(i); const viewport = page.getViewport({ scale: 1.2 }); const canvas = document.createElement("canvas"); canvas.width = viewport.width; canvas.height = viewport.height; const ctx = canvas.getContext("2d"); if (ctx) { await page.render({ canvasContext: ctx, viewport }).promise; images.push(canvas.toDataURL()); } } if (!cancelled) setPageImages(images); } catch { if (!cancelled) setPageImages([]); } if (!cancelled) setLoading(false); } renderPages(); return () => { cancelled = true; }; }, [pdfFile]); return ( {!pdfFile ? (
No PDF loaded. Click to upload a PDF.
) : loading ? (
) : ( {pageImages.length === 0 && ( No pages to display. )} {pageImages.map((img, idx) => ( {`Page ))} )} {pdfFile && ( )}
); }; export default Viewer;