import { useEffect, useRef, useState } from "react"; import type { PDFDocumentProxy } from "pdfjs-dist"; import type { Theme } from "@mui/material/styles"; import { Box, CircularProgress } from "@mui/material"; type PdfPageRendererProps = { pdf: PDFDocumentProxy; currentPage: number; scale: number; theme: { myTheme: Theme }; styleConfig?: { containerStyle?: React.CSSProperties; }; }; const PdfPageRenderer: React.FC = ({ pdf, currentPage, scale, theme, styleConfig }) => { const canvasRef = useRef(null); const [isRendering, setIsRendering] = useState(false); useEffect(() => { let cancelled = false; const renderPdf = async () => { setIsRendering(true); const pdfPage = await pdf.getPage(currentPage); if (cancelled) return; const viewport = pdfPage.getViewport({ scale }); const outputScale = window.devicePixelRatio || 1; const canvas = canvasRef.current; if (!canvas || cancelled) return; const context = canvas.getContext("2d"); if (!context || cancelled) return; canvas.width = viewport.width * outputScale; canvas.height = viewport.height * outputScale; canvas.style.width = `${viewport.width}px`; canvas.style.height = `${viewport.height}px`; const transform = outputScale !== 1 ? [outputScale, 0, 0, outputScale, 0, 0] : undefined; await pdfPage.render({ canvasContext: context, canvas, transform, viewport, }).promise; if (!cancelled) { setIsRendering(false); } }; renderPdf().catch(() => { if (!cancelled) setIsRendering(false); }); return () => { cancelled = true; }; }, [pdf, currentPage, scale]); return ( {isRendering && ( )} ); }; export default PdfPageRenderer;