import { useGetChunkHighlights, useGetDocumentUrl, } from '@/hooks/document-hooks'; import { IReferenceChunk } from '@/interfaces/database/chat'; import { IChunk } from '@/interfaces/database/knowledge'; import FileError from '@/pages/document-viewer/file-error'; import { Skeleton } from 'antd'; import { useEffect, useRef, useState } from 'react'; import { AreaHighlight, Highlight, IHighlight, PdfHighlighter, PdfLoader, Popup, } from 'react-pdf-highlighter'; import { useCatchDocumentError } from './hooks'; import styles from './index.less'; interface IProps { chunk: IChunk | IReferenceChunk; documentId: string; visible: boolean; } const HighlightPopup = ({ comment, }: { comment: { text: string; emoji: string }; }) => comment.text ? (
{comment.emoji} {comment.text}
) : null; const DocumentPreviewer = ({ chunk, documentId, visible }: IProps) => { const getDocumentUrl = useGetDocumentUrl(documentId); const { highlights: state, setWidthAndHeight } = useGetChunkHighlights(chunk); const ref = useRef<(highlight: IHighlight) => void>(() => {}); const [loaded, setLoaded] = useState(false); const url = getDocumentUrl(); const error = useCatchDocumentError(url); const resetHash = () => {}; useEffect(() => { setLoaded(visible); }, [visible]); useEffect(() => { if (state.length > 0 && loaded) { setLoaded(false); ref.current(state[0]); } }, [state, loaded]); 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; setLoaded(true); }} 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 DocumentPreviewer;