import { useEffect, useState, useRef, useCallback } from "react"; import * as PDFJS from "pdfjs-dist"; import clsx from "clsx"; import { useApp } from "../../../hooks"; interface Props { file: any; className?: string; fileName?: any; editing?: boolean; canDownload?: boolean; onRemoveFile?: () => void; size?: { height?: number; width?: number; }; scale?: number; } export default function PdfViewer({ className, file, onRemoveFile, fileName = "", editing = false, canDownload = true, size, scale = 0.49 }: Props) { const { t } = useApp(); const canvasRef = useRef(null); PDFJS.GlobalWorkerOptions.workerSrc = "https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.9.359/pdf.worker.min.js"; const [pdfRef, setPdfRef] = useState(); const [currentPage, setCurrentPage] = useState(1); const [pageCount, setPageCount] = useState(0); const [error, setError] = useState(""); function downloadPdf() { const downloadLink = document.createElement("a"); const name = (fileName ?? "document") + ".pdf"; downloadLink.href = file; downloadLink.download = name; downloadLink.click(); } const renderPage = useCallback( (pageNum: number, pdf = pdfRef) => { if (pdf) { setPageCount(pdf.numPages); pdf.getPage(pageNum).then(function (page: any) { const viewport = page.getViewport({ scale }); const canvas = canvasRef.current; if (canvas) { canvas.height = size?.height ?? viewport.height; canvas.width = size?.width ?? viewport.width; const renderContext = { canvasContext: canvas.getContext("2d"), viewport: viewport, }; page.render(renderContext); } }); } }, // eslint-disable-next-line react-hooks/exhaustive-deps [pdfRef] ); useEffect(() => { renderPage(currentPage, pdfRef); }, [pdfRef, currentPage, renderPage]); useEffect(() => { const loadingTask = PDFJS.getDocument(file); loadingTask.promise.then( (loadedPdf) => { setPdfRef(loadedPdf); }, (error: any) => { setError(error.message); } ); }, [file]); const nextPage = () => { pdfRef && currentPage < pdfRef.numPages && setCurrentPage(currentPage + 1); }; const prevPage = () => { currentPage > 1 && setCurrentPage(currentPage - 1); }; return (
{error ? (
{error}
) : !pdfRef ? (
) : ( <>
{ e.preventDefault(); }} className="left-0 top-0 ml-1 mt-1 flex origin-top-left cursor-default items-center space-x-2" > {currentPage} / {pageCount}
{canDownload && ( )}
{editing && ( )}
)}
); }