import { memo, useEffect, useRef } from 'react'; import { AreaHighlight, Highlight, IHighlight, PdfHighlighter, PdfLoader, Popup, } from 'react-pdf-highlighter'; import { Spin } from '@/components/ui/spin'; // import FileError from '@/pages/document-viewer/file-error'; import { Authorization } from '@/constants/authorization'; import { cn } from '@/lib/utils'; import FileError from '@/pages/document-viewer/file-error'; import { getAuthorization } from '@/utils/authorization-util'; import { useCatchDocumentError } from './hooks'; type PdfLoaderProps = React.ComponentProps & { httpHeaders?: Record; }; const Loader = PdfLoader as React.ComponentType; export interface IProps { highlights?: IHighlight[]; setWidthAndHeight?: (width: number, height: number) => void; url: string; className?: string; } const HighlightPopup = ({ comment, }: { comment: { text: string; emoji: string }; }) => comment.text ? (
{comment.emoji} {comment.text}
) : null; // TODO: merge with DocumentPreviewer const PdfPreview = ({ highlights: state, setWidthAndHeight, url, className, }: IProps) => { // const url = useGetDocumentUrl(); const ref = useRef<(highlight: IHighlight) => void>(() => {}); const error = useCatchDocumentError(url); const resetHash = () => {}; useEffect(() => { let timer = null; if (state?.length && state?.length > 0) { timer = setTimeout(() => { ref?.current(state[0]); }, 100); } return () => { if (timer) clearTimeout(timer); }; }, [state]); const httpHeaders = { [Authorization]: getAuthorization(), }; return (
} workerSrc="/pdfjs-dist/pdf.worker.min.js" errorMessage={{error}} > {(pdfDocument) => { pdfDocument.getPage(1).then((page) => { const viewport = page.getViewport({ scale: 1 }); const width = viewport.width; const height = viewport.height; setWidthAndHeight?.(width, height); }); return ( event.altKey} onScrollChange={resetHash} scrollRef={(scrollTo) => { ref.current = scrollTo; }} onSelectionFinished={() => null} highlightTransform={( highlight, index, setTip, hideTip, viewportToScaled, screenshot, isScrolledTo, ) => { const isTextHighlight = !Boolean( highlight.content && highlight.content.image, ); const component = isTextHighlight ? ( ) : ( {}} /> ); return ( } onMouseOver={(popupContent) => setTip(highlight, () => popupContent) } onMouseOut={hideTip} key={index} > {component} ); }} highlights={state || []} /> ); }} ); }; export default memo(PdfPreview); export { PdfPreview };