import React, { useEffect, useState, useRef } from 'react'; import Watermark from '../Watermark'; import { renderPdfPage } from '../../helpers/pdf'; import { PageWrapper, PdfCanvas, AnnotationLayer, TextLayer, WatermarkLayer, } from './styled'; type Props = { pageNum: number; renderingState?: RenderingStateType; getPage?: () => Promise; viewport: ViewportType; rotation?: number; scale: number; annotations?: React.ReactNode[]; drawing?: React.ReactNode[]; watermark?: WatermarkType; setTextDivs: (pageNum: number, elements: HTMLElement[]) => void; currentPage: number; }; const PageView: React.FC = ({ pageNum, getPage, viewport, renderingState = 'PAUSED', rotation, scale, annotations = [], watermark = {}, currentPage, setTextDivs, }: Props) => { const rootEle = useRef(null); const [pdfPage, setPdfPage] = useState(null); const [renderTask, setRenderTask] = useState(null); const renderPage = async (): Promise => { if (getPage) { getPage().then(obj => { setPdfPage(obj); const setTextDivsWithPage = (elements: HTMLElement[]) => { if (currentPage === pageNum) { setTextDivs(pageNum, elements); } }; if (rootEle.current) { renderPdfPage({ rootEle: rootEle.current, pdfPage: obj, viewport, setRenderTask, setTextDivs: setTextDivsWithPage, }); } }); } }; useEffect(() => { if (pdfPage) { pdfPage.cleanup(); } if (renderTask) { renderTask.cancel(); } if (renderingState === 'RENDERING') { renderPage(); } }, [currentPage, renderingState, viewport]); return ( {renderingState === 'LOADING' ? ( <> ) : ( <> {watermark.text || watermark.imagepath ? ( ) : ( '' )} {annotations} )} ); }; export default PageView;