From 86d366db76add0ad07eb921290b9444b211e2c4f Mon Sep 17 00:00:00 2001 From: Innei Date: Tue, 6 Aug 2024 12:33:55 +0800 Subject: [PATCH] fix: add page error boundary Signed-off-by: Innei --- .../src/components/common/ErrorElement.tsx | 40 ++++++++++------ .../src/components/errors/ModalError.tsx | 18 +------ .../src/components/errors/PageError.tsx | 47 +++++++++++++++++++ src/renderer/src/components/errors/index.ts | 6 ++- .../src/modules/entry-column/date-item.tsx | 6 ++- src/renderer/src/pages/(main)/layout.tsx | 6 ++- 6 files changed, 88 insertions(+), 35 deletions(-) create mode 100644 src/renderer/src/components/errors/PageError.tsx diff --git a/src/renderer/src/components/common/ErrorElement.tsx b/src/renderer/src/components/common/ErrorElement.tsx index 27ab5e41d..cddf7115e 100644 --- a/src/renderer/src/components/common/ErrorElement.tsx +++ b/src/renderer/src/components/common/ErrorElement.tsx @@ -83,21 +83,7 @@ export function ErrorElement() { -

- Still having this issue? Please give feedback in Github, thanks! - - Submit Issue - -

+
Powered by @@ -116,3 +102,27 @@ export function ErrorElement() {
) } + +export const FallbackIssue = ({ + message, + stack, +}: { + message: string + stack: string | null | undefined +}) => ( +

+ Still having this issue? Please give feedback in Github, thanks! + + Submit Issue + +

+) diff --git a/src/renderer/src/components/errors/ModalError.tsx b/src/renderer/src/components/errors/ModalError.tsx index 5d9e5228a..b67b37953 100644 --- a/src/renderer/src/components/errors/ModalError.tsx +++ b/src/renderer/src/components/errors/ModalError.tsx @@ -1,8 +1,8 @@ import { attachOpenInEditor } from "@renderer/lib/dev" -import { getNewIssueUrl } from "@renderer/lib/issues" import type { FallbackRender } from "@sentry/react" import type { FC } from "react" +import { FallbackIssue } from "../common/ErrorElement" import { m } from "../common/Motion" import { StyledButton } from "../ui/button" import { useCurrentModal } from "../ui/modal" @@ -49,21 +49,7 @@ export const ModalErrorFallback: FC[0]> = ( -

- Still having this issue? Please give feedback in Github, thanks! - - Submit Issue - -

+ ) diff --git a/src/renderer/src/components/errors/PageError.tsx b/src/renderer/src/components/errors/PageError.tsx new file mode 100644 index 000000000..14d1cbc16 --- /dev/null +++ b/src/renderer/src/components/errors/PageError.tsx @@ -0,0 +1,47 @@ +import { attachOpenInEditor } from "@renderer/lib/dev" +import type { FallbackRender } from "@sentry/react" +import type { FC } from "react" + +import { FallbackIssue } from "../common/ErrorElement" +import { StyledButton } from "../ui/button" +import { parseError } from "./helper" + +export const PageErrorFallback: FC[0]> = (props) => { + const { message, stack } = parseError(props.error) + + return ( +
+
+
+ +
+
{message}
+ {import.meta.env.DEV && stack ? ( +
+ {attachOpenInEditor(stack)} +
+ ) : null} + +

+ The App has a temporary problem, click the button below to try + reloading the app or another solution? +

+ +
+ props.resetError()} variant="primary"> + Reset + + + window.location.reload()} + variant="outline" + > + Reload + +
+ + +
+
+ ) +} diff --git a/src/renderer/src/components/errors/index.ts b/src/renderer/src/components/errors/index.ts index b22a88301..3945d397b 100644 --- a/src/renderer/src/components/errors/index.ts +++ b/src/renderer/src/components/errors/index.ts @@ -1,11 +1,15 @@ import { ModalErrorFallback } from "./ModalError" +import { PageErrorFallback } from "./PageError" export enum ErrorComponentType { Modal = "Modal", + Page = "Page", } export const ErrorFallbackMap = { [ErrorComponentType.Modal]: ModalErrorFallback, + [ErrorComponentType.Page]: PageErrorFallback, } -export const getErrorFallback = (type: ErrorComponentType) => ErrorFallbackMap[type] +export const getErrorFallback = (type: ErrorComponentType) => + ErrorFallbackMap[type] diff --git a/src/renderer/src/modules/entry-column/date-item.tsx b/src/renderer/src/modules/entry-column/date-item.tsx index deb891374..0b41ab618 100644 --- a/src/renderer/src/modules/entry-column/date-item.tsx +++ b/src/renderer/src/modules/entry-column/date-item.tsx @@ -1,10 +1,11 @@ import { FeedViewType } from "@renderer/lib/enum" import { cn } from "@renderer/lib/utils" +import { memo } from "react" import { MarkAllButton } from "./mark-all-button" import { SocialMediaDateItem } from "./social-media-item" -export const DateItem = ({ +export const DateItem = memo(({ date, view, isFirst, @@ -36,4 +37,5 @@ export const DateItem = ({ {dateString} ) -} +}, +) diff --git a/src/renderer/src/pages/(main)/layout.tsx b/src/renderer/src/pages/(main)/layout.tsx index f48e0e721..217831406 100644 --- a/src/renderer/src/pages/(main)/layout.tsx +++ b/src/renderer/src/pages/(main)/layout.tsx @@ -3,6 +3,8 @@ import { useFeedColumnShow } from "@renderer/atoms/app" import { setMainContainerElement } from "@renderer/atoms/dom" import { getUISettings, setUISetting } from "@renderer/atoms/settings/ui" import { useLoginModalShow, useMe } from "@renderer/atoms/user" +import { AppErrorBoundary } from "@renderer/components/common/AppErrorBoundary" +import { ErrorComponentType } from "@renderer/components/errors" import { PanelSplitter } from "@renderer/components/ui/divider" import { DeclarativeModal } from "@renderer/components/ui/modal/stacked/declarative-modal" import { NoopChildren } from "@renderer/components/ui/modal/stacked/utils" @@ -80,7 +82,9 @@ export function Component() { // NOTE: tabIndex for main element can get by `document.activeElement` tabIndex={-1} > - + + +