From fc28de377611b62ef297b59ee854cbefdb7d3995 Mon Sep 17 00:00:00 2001 From: Samuel Seng Date: Sun, 29 Jan 2023 12:09:23 -0500 Subject: [PATCH] Fix race condition: Render last requested page Test Plan: Copy into local project and quickly change pages. Ensure that the correct page gets rendered. --- package.json | 1 + packages/react-pdf-js/src/index.tsx | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 9a062b92..738bd9f3 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "trailingComma": "es5" }, "devDependencies": { + "eslint": "^8.33.0", "prettier": "2.7.1", "turbo": "1.4.7", "typescript": "4.8.3" diff --git a/packages/react-pdf-js/src/index.tsx b/packages/react-pdf-js/src/index.tsx index d40239ce..933d3616 100644 --- a/packages/react-pdf-js/src/index.tsx +++ b/packages/react-pdf-js/src/index.tsx @@ -52,6 +52,7 @@ export const usePdf = ({ const [pdfDocument, setPdfDocument] = useState(); const [pdfPage, setPdfPage] = useState(); const renderTask = useRef(null); + const lastPageRequestedRenderRef = useRef(null); const onDocumentLoadSuccessRef = useRef(onDocumentLoadSuccess); const onDocumentLoadFailRef = useRef(onDocumentLoadFail); const onPageLoadSuccessRef = useRef(onPageLoadSuccess); @@ -137,6 +138,7 @@ export const usePdf = ({ // if previous render isn't done yet, we cancel it if (renderTask.current) { + lastPageRequestedRenderRef.current = page; renderTask.current.cancel(); return; } @@ -158,7 +160,9 @@ export const usePdf = ({ renderTask.current = null; if (reason && reason.name === 'RenderingCancelledException') { - drawPDF(page); + const lastPageRequestedRender = lastPageRequestedRenderRef.current ?? page; + lastPageRequestedRenderRef.current = null; + drawPDF(lastPageRequestedRender); } else if (isFunction(onPageRenderFailRef.current)) { onPageRenderFailRef.current(); }