|
|
@@ -33,15 +33,19 @@ function PdfJsViewer({ url }) {
|
|
|
|
|
|
// create the viewer when the container is mounted
|
|
|
const handleContainer = useCallback(parent => {
|
|
|
- setPdfJsWrapper(parent ? new PDFJSWrapper(parent.firstChild) : undefined)
|
|
|
+ if (parent) {
|
|
|
+ const viewer = new PDFJSWrapper(parent.firstChild)
|
|
|
+ setPdfJsWrapper(viewer)
|
|
|
+ return () => viewer.destroy()
|
|
|
+ }
|
|
|
}, [])
|
|
|
|
|
|
// listen for initialize event
|
|
|
useEffect(() => {
|
|
|
if (pdfJsWrapper) {
|
|
|
- pdfJsWrapper.eventBus.on('pagesinit', () => {
|
|
|
- setInitialised(true)
|
|
|
- })
|
|
|
+ const handlePagesinit = () => setInitialised(true)
|
|
|
+ pdfJsWrapper.eventBus.on('pagesinit', handlePagesinit)
|
|
|
+ return () => pdfJsWrapper.eventBus.off('pagesinit', handlePagesinit)
|
|
|
}
|
|
|
}, [pdfJsWrapper])
|
|
|
|
|
|
@@ -53,6 +57,7 @@ function PdfJsViewer({ url }) {
|
|
|
// TODO: anything else to be reset?
|
|
|
|
|
|
pdfJsWrapper.loadDocument(url).catch(error => setError(error))
|
|
|
+ return () => pdfJsWrapper.abortDocumentLoading()
|
|
|
}
|
|
|
}, [pdfJsWrapper, url])
|
|
|
|
|
|
@@ -73,21 +78,22 @@ function PdfJsViewer({ url }) {
|
|
|
|
|
|
// listen for scroll events
|
|
|
useEffect(() => {
|
|
|
- if (pdfJsWrapper) {
|
|
|
+ if (initialised && pdfJsWrapper) {
|
|
|
// store the scroll position in localStorage, for the synctex button
|
|
|
const storePosition = debounce(pdfViewer => {
|
|
|
// set position for "sync to code" button
|
|
|
try {
|
|
|
setPosition(pdfViewer.currentPosition)
|
|
|
} catch (error) {
|
|
|
- // console.error(error) // TODO
|
|
|
+ // TODO
|
|
|
+ console.error(error)
|
|
|
}
|
|
|
}, 500)
|
|
|
|
|
|
// store the scroll position in localStorage, for use when reloading
|
|
|
const storeScrollTop = debounce(pdfViewer => {
|
|
|
// set position for "sync to code" button
|
|
|
- setScrollTop(pdfJsWrapper.container.scrollTop)
|
|
|
+ setScrollTop(pdfViewer.container.scrollTop)
|
|
|
}, 500)
|
|
|
|
|
|
storePosition(pdfJsWrapper)
|
|
|
@@ -100,15 +106,17 @@ function PdfJsViewer({ url }) {
|
|
|
pdfJsWrapper.container.addEventListener('scroll', scrollListener)
|
|
|
|
|
|
return () => {
|
|
|
+ storePosition.cancel()
|
|
|
+ storeScrollTop.cancel()
|
|
|
pdfJsWrapper.container.removeEventListener('scroll', scrollListener)
|
|
|
}
|
|
|
}
|
|
|
- }, [setPosition, setScrollTop, pdfJsWrapper])
|
|
|
+ }, [setPosition, setScrollTop, pdfJsWrapper, initialised])
|
|
|
|
|
|
// listen for double-click events
|
|
|
useEffect(() => {
|
|
|
if (pdfJsWrapper) {
|
|
|
- pdfJsWrapper.eventBus.on('textlayerrendered', textLayer => {
|
|
|
+ const handleTextlayerrendered = textLayer => {
|
|
|
const pageElement = textLayer.source.textLayerDiv.closest('.page')
|
|
|
|
|
|
const doubleClickListener = event => {
|
|
|
@@ -120,7 +128,11 @@ function PdfJsViewer({ url }) {
|
|
|
}
|
|
|
|
|
|
pageElement.addEventListener('dblclick', doubleClickListener)
|
|
|
- })
|
|
|
+ }
|
|
|
+
|
|
|
+ pdfJsWrapper.eventBus.on('textlayerrendered', handleTextlayerrendered)
|
|
|
+ return () =>
|
|
|
+ pdfJsWrapper.eventBus.off('textlayerrendered', handleTextlayerrendered)
|
|
|
}
|
|
|
}, [pdfJsWrapper])
|
|
|
|