import React, { useEffect, useState, useRef } from 'react'; import Watermark from '../Watermark'; import { renderPdfPage } from '../../helpers/pdf'; import { renderMatches } from '../../helpers/search'; import { PageWrapper, PdfCanvas, AnnotationLayer, TextLayer, WatermarkLayer, Inner, } from './styled'; type Props = { pageNum: number; renderingState?: RenderingStateType; getPage?: () => Promise; viewport: ViewportType; rotation?: number; scale: number; annotations?: React.ReactNode[]; drawing?: React.ReactNode[]; watermark?: WatermarkType; currentPage: number; queryString: string; matchesMap: MatchType[]; }; const PageView: React.FC = ({ pageNum, getPage, viewport, renderingState = 'PAUSED', rotation, scale, annotations = [], watermark = {}, currentPage, queryString, matchesMap, }: 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 (matchesMap.length) { matchesMap.forEach(item => { if (item.page === currentPage) { const id = `${item.page}_${item.index}`; renderMatches(elements, getPage, item.index, queryString, id); } }); } }; if (rootEle.current) { renderPdfPage({ rootEle: rootEle.current, pdfPage: obj, viewport, setRenderTask, setTextDivs: setTextDivsWithPage, }); } }); } }; useEffect(() => { if (renderingState === 'LOADING' && pdfPage) { pdfPage.cleanup(); } if (renderingState === 'RENDERING' && renderTask) { renderTask.cancel(); } if (renderingState === 'RENDERING') { renderPage(); } }, [currentPage, renderingState, viewport]); useEffect(() => { if (queryString === '' && !matchesMap.length) { renderPage(); } }, [queryString, matchesMap]); return ( {renderingState === 'LOADING' ? ( 載入中... ) : ( <> {watermark.text || watermark.imagepath ? ( ) : ( '' )} {annotations} )} ); }; export default PageView;