From 04900349e6951267d75cfaa0ab40d8f570f3a7d0 Mon Sep 17 00:00:00 2001 From: Alf Eaton Date: Thu, 28 Sep 2023 10:56:45 +0100 Subject: [PATCH] Add PdfPreviewProvider and preserve PDF viewer loading error (#14970) GitOrigin-RevId: ac305633c7c0bc13f5f670b71890cfd30a3cbffd --- .../pdf-preview/components/pdf-js-viewer.js | 7 ++-- .../pdf-preview/components/pdf-logs-viewer.js | 11 +++++- .../components/pdf-preview-pane.js | 33 ++++++++++-------- .../components/pdf-preview-provider.tsx | 34 +++++++++++++++++++ .../pdf-preview/pdf-js-viewer.spec.tsx | 33 +++++++++++------- 5 files changed, 88 insertions(+), 30 deletions(-) create mode 100644 services/web/frontend/js/features/pdf-preview/components/pdf-preview-provider.tsx diff --git a/services/web/frontend/js/features/pdf-preview/components/pdf-js-viewer.js b/services/web/frontend/js/features/pdf-preview/components/pdf-js-viewer.js index 6232f4bb70..be01b1378e 100644 --- a/services/web/frontend/js/features/pdf-preview/components/pdf-js-viewer.js +++ b/services/web/frontend/js/features/pdf-preview/components/pdf-js-viewer.js @@ -13,6 +13,7 @@ import { captureException } from '../../../infrastructure/error-reporter' import * as eventTracking from '../../../infrastructure/event-tracking' import { getPdfCachingMetrics } from '../util/metrics' import { debugConsole } from '@/utils/debugging' +import { usePdfPreviewContext } from '@/features/pdf-preview/components/pdf-preview-provider' function PdfJsViewer({ url, pdfFile }) { const { _id: projectId } = useProjectContext() @@ -20,6 +21,8 @@ function PdfJsViewer({ url, pdfFile }) { const { setError, firstRenderDone, highlights, position, setPosition } = useCompileContext() + const { setLoadingError } = usePdfPreviewContext() + // state values persisted in localStorage to restore on load const [scale, setScale] = usePersistedState( `pdf-viewer-scale:${projectId}`, @@ -41,7 +44,7 @@ function PdfJsViewer({ url, pdfFile }) { setPdfJsWrapper(wrapper) }) .catch(error => { - setError('pdf-viewer-loading-error') + setLoadingError(true) captureException(error) }) @@ -51,7 +54,7 @@ function PdfJsViewer({ url, pdfFile }) { } } }, - [setError] + [setLoadingError] ) const [startFetch, setStartFetch] = useState(0) diff --git a/services/web/frontend/js/features/pdf-preview/components/pdf-logs-viewer.js b/services/web/frontend/js/features/pdf-preview/components/pdf-logs-viewer.js index fd85958ea8..47e652a143 100644 --- a/services/web/frontend/js/features/pdf-preview/components/pdf-logs-viewer.js +++ b/services/web/frontend/js/features/pdf-preview/components/pdf-logs-viewer.js @@ -14,6 +14,7 @@ import PdfPreviewErrorBoundaryFallback from './pdf-preview-error-boundary-fallba import PdfCodeCheckFailedNotice from './pdf-code-check-failed-notice' import { useDetachCompileContext as useCompileContext } from '../../../shared/context/detach-compile-context' import PdfLogEntry from './pdf-log-entry' +import { usePdfPreviewContext } from '@/features/pdf-preview/components/pdf-preview-provider' function PdfLogsViewer() { const { @@ -27,15 +28,23 @@ function PdfLogsViewer() { showNewCompileTimeoutUI, } = useCompileContext() + const { loadingError } = usePdfPreviewContext() + const { t } = useTranslation() return ( -
+
{codeCheckFailed && } {stoppedOnFirstError && } + {loadingError && } + {showNewCompileTimeoutUI && error === 'timedout' ? ( ) : ( diff --git a/services/web/frontend/js/features/pdf-preview/components/pdf-preview-pane.js b/services/web/frontend/js/features/pdf-preview/components/pdf-preview-pane.js index 1c038bc810..67678b5385 100644 --- a/services/web/frontend/js/features/pdf-preview/components/pdf-preview-pane.js +++ b/services/web/frontend/js/features/pdf-preview/components/pdf-preview-pane.js @@ -9,6 +9,7 @@ import FasterCompilesFeedback from './faster-compiles-feedback' import { PdfPreviewMessages } from './pdf-preview-messages' import CompileTimeWarning from './compile-time-warning' import CompileTimeoutMessages from './compile-timeout-messages' +import { PdfPreviewProvider } from './pdf-preview-provider' function PdfPreviewPane() { const { pdfUrl, showNewCompileTimeoutUI } = useCompileContext() @@ -17,21 +18,23 @@ function PdfPreviewPane() { }) return (
- - - {showNewCompileTimeoutUI ? ( - - ) : ( - - )} - - }> -
- - -
-
- + + + + {showNewCompileTimeoutUI ? ( + + ) : ( + + )} + + }> +
+ + +
+
+ +
) } diff --git a/services/web/frontend/js/features/pdf-preview/components/pdf-preview-provider.tsx b/services/web/frontend/js/features/pdf-preview/components/pdf-preview-provider.tsx new file mode 100644 index 0000000000..38d5bb79bc --- /dev/null +++ b/services/web/frontend/js/features/pdf-preview/components/pdf-preview-provider.tsx @@ -0,0 +1,34 @@ +import { createContext, FC, useContext, useMemo, useState } from 'react' + +const PdfPreviewContext = createContext< + | { + loadingError: boolean + setLoadingError: (value: boolean) => void + } + | undefined +>(undefined) + +export const usePdfPreviewContext = () => { + const context = useContext(PdfPreviewContext) + if (!context) { + throw new Error( + 'usePdfPreviewContext is only avalable inside PdfPreviewProvider' + ) + } + return context +} + +export const PdfPreviewProvider: FC = ({ children }) => { + const [loadingError, setLoadingError] = useState(false) + + const value = useMemo( + () => ({ loadingError, setLoadingError }), + [loadingError] + ) + + return ( + + {children} + + ) +} diff --git a/services/web/test/frontend/components/pdf-preview/pdf-js-viewer.spec.tsx b/services/web/test/frontend/components/pdf-preview/pdf-js-viewer.spec.tsx index 7c83f15bca..ab68364fb6 100644 --- a/services/web/test/frontend/components/pdf-preview/pdf-js-viewer.spec.tsx +++ b/services/web/test/frontend/components/pdf-preview/pdf-js-viewer.spec.tsx @@ -3,6 +3,7 @@ import PdfJsViewer from '../../../../frontend/js/features/pdf-preview/components import { mockScope } from './scope' import { getContainerEl } from 'cypress/react' import { unmountComponentAtNode } from 'react-dom' +import { PdfPreviewProvider } from '../../../../frontend/js/features/pdf-preview/components/pdf-preview-provider' describe('', function () { beforeEach(function () { @@ -16,9 +17,11 @@ describe('', function () { cy.mount( -
- -
+ +
+ +
+
) @@ -39,9 +42,11 @@ describe('', function () { cy.mount( -
- -
+ +
+ +
+
) @@ -57,9 +62,11 @@ describe('', function () { cy.mount( -
- -
+ +
+ +
+
) @@ -75,9 +82,11 @@ describe('', function () { cy.mount( -
- -
+ +
+ +
+
)