From 76e23434ede02f8c65ea3604d467520095d53847 Mon Sep 17 00:00:00 2001 From: David <33458145+davidmcpowell@users.noreply.github.com> Date: Thu, 21 Aug 2025 11:49:38 +0100 Subject: [PATCH] Merge pull request #28037 from overleaf/dp-additional-error-states Add additional pdf error states in new editor GitOrigin-RevId: a7e08652cb5ff23d2139106629f13aad20bd32a0 --- .../compile-timeout-error-state.tsx} | 135 +---------------- .../pdf-error-state/error-state.tsx | 60 ++++++++ .../pdf-error-state/general-error-state.tsx | 30 ++++ .../pdf-error-state/pdf-error-state.tsx | 139 ++++++++++++++++++ .../components/pdf-preview-pane.tsx | 2 +- .../stories/pdf-error-state.stories.tsx | 5 +- 6 files changed, 237 insertions(+), 134 deletions(-) rename services/web/frontend/js/features/ide-redesign/components/pdf-preview/{pdf-error-state.tsx => pdf-error-state/compile-timeout-error-state.tsx} (51%) create mode 100644 services/web/frontend/js/features/ide-redesign/components/pdf-preview/pdf-error-state/error-state.tsx create mode 100644 services/web/frontend/js/features/ide-redesign/components/pdf-preview/pdf-error-state/general-error-state.tsx create mode 100644 services/web/frontend/js/features/ide-redesign/components/pdf-preview/pdf-error-state/pdf-error-state.tsx diff --git a/services/web/frontend/js/features/ide-redesign/components/pdf-preview/pdf-error-state.tsx b/services/web/frontend/js/features/ide-redesign/components/pdf-preview/pdf-error-state/compile-timeout-error-state.tsx similarity index 51% rename from services/web/frontend/js/features/ide-redesign/components/pdf-preview/pdf-error-state.tsx rename to services/web/frontend/js/features/ide-redesign/components/pdf-preview/pdf-error-state/compile-timeout-error-state.tsx index 444e778442..5269e0fbb8 100644 --- a/services/web/frontend/js/features/ide-redesign/components/pdf-preview/pdf-error-state.tsx +++ b/services/web/frontend/js/features/ide-redesign/components/pdf-preview/pdf-error-state/compile-timeout-error-state.tsx @@ -1,103 +1,13 @@ import OLButton from '@/shared/components/ol/ol-button' import MaterialIcon from '@/shared/components/material-icon' import { Trans, useTranslation } from 'react-i18next' -import { useRailContext } from '../../contexts/rail-context' -import { usePdfPreviewContext } from '@/features/pdf-preview/components/pdf-preview-provider' import { useDetachCompileContext as useCompileContext } from '@/shared/context/detach-compile-context' -import { useIsNewEditorEnabled } from '../../utils/new-editor-utils' import { upgradePlan } from '@/main/account-upgrade' -import classNames from 'classnames' import { useStopOnFirstError } from '@/shared/hooks/use-stop-on-first-error' import { useCallback } from 'react' +import ErrorState from './error-state' -// AvailableStates -// - rendering-error-expected -// - rendering-error -// - clsi-maintenance -// - clsi-unavailable -// - too-recently-compiled -// - terminated -// - rate-limited -// - compile-in-progress -// - autocompile-disabled -// - project-too-large -// - timedout -// - failure -// - clear-cache -// - pdf-viewer-loading-error -// - validation-problems -function PdfErrorState() { - const { loadingError } = usePdfPreviewContext() - // TODO ide-redesign-cleanup: rename showLogs to something else and check usages - const { hasShortCompileTimeout, error, showLogs } = useCompileContext() - const newEditor = useIsNewEditorEnabled() - const { t } = useTranslation() - - if (!newEditor || (!loadingError && !showLogs)) { - return null - } - - switch (error) { - case 'timedout': { - if (hasShortCompileTimeout) { - return - } else { - return - } - } - case 'compile-in-progress': - return ( - - ) - default: - return - } -} - -const GeneralErrorState = () => { - const { t } = useTranslation() - const { openTab: openRailTab } = useRailContext() - - return ( - { - openRailTab('errors') - }} - > - {t('check_logs')} - - } - extraContent={ -
-
- - {t('why_might_this_happen')} -
-
-
    -
  • {t('there_is_an_unrecoverable_latex_error_check_logs')}
  • -
  • {t('the_document_environment_contains_no_content')}
  • -
  • {t('this_project_contains_a_file_called_output')}
  • -
-
-
- } - /> - ) -} - -const CompileTimeoutErrorState = () => { +export const ShortCompileTimeoutErrorState = () => { const { t } = useTranslation() return ( @@ -118,7 +28,7 @@ const CompileTimeoutErrorState = () => { ) } -const LongCompileTimeoutErrorState = () => { +export const LongCompileTimeoutErrorState = () => { const { t } = useTranslation() const { enableStopOnFirstError } = useStopOnFirstError({ @@ -196,42 +106,3 @@ const LongCompileTimeoutErrorState = () => { /> ) } - -const ErrorState = ({ - title, - description, - iconType, - actions, - iconClassName, - extraContent, -}: { - title: string - description: string - iconType: string - actions?: React.ReactNode - iconClassName?: string - extraContent?: React.ReactNode -}) => { - return ( -
-
-
- -
-
-

{title}

-

{description}

-
- {actions} -
- {extraContent} -
- ) -} -export default PdfErrorState diff --git a/services/web/frontend/js/features/ide-redesign/components/pdf-preview/pdf-error-state/error-state.tsx b/services/web/frontend/js/features/ide-redesign/components/pdf-preview/pdf-error-state/error-state.tsx new file mode 100644 index 0000000000..eb90635a18 --- /dev/null +++ b/services/web/frontend/js/features/ide-redesign/components/pdf-preview/pdf-error-state/error-state.tsx @@ -0,0 +1,60 @@ +import { useRailContext } from '@/features/ide-redesign/contexts/rail-context' +import MaterialIcon from '@/shared/components/material-icon' +import OLButton from '@/shared/components/ol/ol-button' +import classNames from 'classnames' +import { useTranslation } from 'react-i18next' + +export default function ErrorState({ + title, + description, + iconType = 'warning', + actions, + iconClassName, + extraContent, +}: { + title: string + description: React.ReactNode + iconType?: string + actions?: React.ReactNode + iconClassName?: string + extraContent?: React.ReactNode +}) { + return ( +
+
+
+ +
+
+

{title}

+

{description}

+
+ {actions} +
+ {extraContent} +
+ ) +} + +export const CheckLogsButton = () => { + const { t } = useTranslation() + const { openTab: openRailTab } = useRailContext() + + return ( + { + openRailTab('errors') + }} + > + {t('check_logs')} + + ) +} diff --git a/services/web/frontend/js/features/ide-redesign/components/pdf-preview/pdf-error-state/general-error-state.tsx b/services/web/frontend/js/features/ide-redesign/components/pdf-preview/pdf-error-state/general-error-state.tsx new file mode 100644 index 0000000000..2a51f4ff87 --- /dev/null +++ b/services/web/frontend/js/features/ide-redesign/components/pdf-preview/pdf-error-state/general-error-state.tsx @@ -0,0 +1,30 @@ +import { useTranslation } from 'react-i18next' +import ErrorState, { CheckLogsButton } from './error-state' +import MaterialIcon from '@/shared/components/material-icon' + +export default function GeneralErrorState() { + const { t } = useTranslation() + + return ( + } + extraContent={ +
+
+ + {t('why_might_this_happen')} +
+
+
    +
  • {t('there_is_an_unrecoverable_latex_error_check_logs')}
  • +
  • {t('the_document_environment_contains_no_content')}
  • +
  • {t('this_project_contains_a_file_called_output')}
  • +
+
+
+ } + /> + ) +} diff --git a/services/web/frontend/js/features/ide-redesign/components/pdf-preview/pdf-error-state/pdf-error-state.tsx b/services/web/frontend/js/features/ide-redesign/components/pdf-preview/pdf-error-state/pdf-error-state.tsx new file mode 100644 index 0000000000..a7c0d09e9b --- /dev/null +++ b/services/web/frontend/js/features/ide-redesign/components/pdf-preview/pdf-error-state/pdf-error-state.tsx @@ -0,0 +1,139 @@ +import { Trans, useTranslation } from 'react-i18next' +import { usePdfPreviewContext } from '@/features/pdf-preview/components/pdf-preview-provider' +import { useDetachCompileContext as useCompileContext } from '@/shared/context/detach-compile-context' +import { useIsNewEditorEnabled } from '../../../utils/new-editor-utils' +import ErrorState, { CheckLogsButton } from './error-state' +import { + LongCompileTimeoutErrorState, + ShortCompileTimeoutErrorState, +} from './compile-timeout-error-state' +import GeneralErrorState from './general-error-state' + +// AvailableStates +// - rendering-error-expected +// - rendering-error +// - clsi-maintenance +// - clsi-unavailable +// - too-recently-compiled +// - terminated +// - rate-limited +// - compile-in-progress +// - autocompile-disabled +// - project-too-large +// - timedout +// - failure +// - clear-cache +// - pdf-viewer-loading-error +// - validation-problems +function PdfErrorState() { + const { loadingError } = usePdfPreviewContext() + // TODO ide-redesign-cleanup: rename showLogs to something else and check usages + const { hasShortCompileTimeout, error, showLogs } = useCompileContext() + const newEditor = useIsNewEditorEnabled() + const { t } = useTranslation() + + if (!newEditor || (!loadingError && !showLogs)) { + return null + } + + switch (error) { + case 'timedout': { + if (hasShortCompileTimeout) { + return + } else { + return + } + } + case 'compile-in-progress': + return ( + + ) + case 'clsi-maintenance': + return ( + + ) + case 'clsi-unavailable': + return ( + + ) + case 'too-recently-compiled': + return ( + + ) + case 'terminated': + return ( + } + /> + ) + case 'rate-limited': + return ( + + ) + case 'autocompile-disabled': + return ( + + ) + case 'project-too-large': + return ( + + ) + case 'clear-cache': + return ( + + ) + case 'pdf-viewer-loading-error': + return ( + , + // eslint-disable-next-line jsx-a11y/anchor-has-content + , + // eslint-disable-next-line jsx-a11y/anchor-has-content + , + ]} + /> + } + /> + ) + default: + return + } +} + +export default PdfErrorState diff --git a/services/web/frontend/js/features/pdf-preview/components/pdf-preview-pane.tsx b/services/web/frontend/js/features/pdf-preview/components/pdf-preview-pane.tsx index 82f2946d63..9533d6f8ba 100644 --- a/services/web/frontend/js/features/pdf-preview/components/pdf-preview-pane.tsx +++ b/services/web/frontend/js/features/pdf-preview/components/pdf-preview-pane.tsx @@ -9,7 +9,7 @@ import { PdfPreviewMessages } from './pdf-preview-messages' import CompileTimeWarningUpgradePrompt from './compile-time-warning-upgrade-prompt' import { PdfPreviewProvider } from './pdf-preview-provider' import PdfPreviewHybridToolbarNew from '@/features/ide-redesign/components/pdf-preview/pdf-preview-hybrid-toolbar' -import PdfErrorState from '@/features/ide-redesign/components/pdf-preview/pdf-error-state' +import PdfErrorState from '@/features/ide-redesign/components/pdf-preview/pdf-error-state/pdf-error-state' import { useIsNewEditorEnabled } from '@/features/ide-redesign/utils/new-editor-utils' import importOverleafModules from '../../../../macros/import-overleaf-module.macro' import PdfCodeCheckFailedBanner from '@/features/ide-redesign/components/pdf-preview/pdf-code-check-failed-banner' diff --git a/services/web/frontend/stories/pdf-error-state.stories.tsx b/services/web/frontend/stories/pdf-error-state.stories.tsx index 4e61768788..e6a77cc61d 100644 --- a/services/web/frontend/stories/pdf-error-state.stories.tsx +++ b/services/web/frontend/stories/pdf-error-state.stories.tsx @@ -1,7 +1,7 @@ import useFetchMock from './hooks/use-fetch-mock' import { mockCompile } from './fixtures/compile' import { ScopeDecorator, user } from './decorators/scope' -import PdfErrorState from '@/features/ide-redesign/components/pdf-preview/pdf-error-state' +import PdfErrorState from '@/features/ide-redesign/components/pdf-preview/pdf-error-state/pdf-error-state' import { useDetachCompileContext as useCompileContext } from '@/shared/context/detach-compile-context' import { useEffect } from 'react' import PdfPreview from '@/features/pdf-preview/components/pdf-preview' @@ -12,13 +12,16 @@ export default { } const compileErrors = [ + 'autocompile-disabled', 'autocompile-backoff', 'clear-cache', 'clsi-maintenance', + 'clsi-unavailable', 'compile-in-progress', 'exited', 'failure', 'generic', + 'pdf-viewer-loading-error', 'project-too-large', 'rate-limited', 'success',