feat: add error boundary

This commit is contained in:
GyDi 2022-11-19 01:22:19 +08:00
parent f33c419ed9
commit 9d2017e598
No known key found for this signature in database
GPG Key ID: 9C3AD40F1F99880A
5 changed files with 54 additions and 20 deletions

View File

@ -31,6 +31,7 @@
"monaco-editor": "^0.34.1", "monaco-editor": "^0.34.1",
"react": "^17.0.2", "react": "^17.0.2",
"react-dom": "^17.0.2", "react-dom": "^17.0.2",
"react-error-boundary": "^3.1.4",
"react-i18next": "^12.0.0", "react-i18next": "^12.0.0",
"react-router-dom": "^6.4.3", "react-router-dom": "^6.4.3",
"react-virtuoso": "^3.1.3", "react-virtuoso": "^3.1.3",

View File

@ -0,0 +1,20 @@
import { ErrorBoundary, FallbackProps } from "react-error-boundary";
function ErrorFallback({ error }: FallbackProps) {
return (
<div role="alert">
<p>Something went wrong:(</p>
<pre>{error.message}</pre>
</div>
);
}
const BaseErrorBoundary: React.FC = (props) => {
return (
<ErrorBoundary FallbackComponent={ErrorFallback}>
{props.children}
</ErrorBoundary>
);
};
export default BaseErrorBoundary;

View File

@ -1,5 +1,6 @@
import { Typography } from "@mui/material";
import React from "react"; import React from "react";
import { Typography } from "@mui/material";
import BaseErrorBoundary from "./base-error-boundary";
interface Props { interface Props {
title?: React.ReactNode; // the page title title?: React.ReactNode; // the page title
@ -11,21 +12,23 @@ const BasePage: React.FC<Props> = (props) => {
const { title, header, contentStyle, children } = props; const { title, header, contentStyle, children } = props;
return ( return (
<div className="base-page" data-windrag> <BaseErrorBoundary>
<header data-windrag style={{ userSelect: "none" }}> <div className="base-page" data-windrag>
<Typography variant="h4" component="h1" data-windrag> <header data-windrag style={{ userSelect: "none" }}>
{title} <Typography variant="h4" component="h1" data-windrag>
</Typography> {title}
</Typography>
{header} {header}
</header> </header>
<section> <section>
<div className="base-content" style={contentStyle} data-windrag> <div className="base-content" style={contentStyle} data-windrag>
{children} {children}
</div> </div>
</section> </section>
</div> </div>
</BaseErrorBoundary>
); );
}; };

View File

@ -20,6 +20,7 @@ import LayoutControl from "@/components/layout/layout-control";
import LayoutTraffic from "@/components/layout/layout-traffic"; import LayoutTraffic from "@/components/layout/layout-traffic";
import UpdateButton from "@/components/layout/update-button"; import UpdateButton from "@/components/layout/update-button";
import useCustomTheme from "@/components/layout/use-custom-theme"; import useCustomTheme from "@/components/layout/use-custom-theme";
import BaseErrorBoundary from "@/components/base/base-error-boundary";
import getSystem from "@/utils/get-system"; import getSystem from "@/utils/get-system";
import "dayjs/locale/zh-cn"; import "dayjs/locale/zh-cn";
@ -137,11 +138,13 @@ const Layout = () => {
)} )}
<div className="the-content"> <div className="the-content">
<Routes> <BaseErrorBoundary>
{routers.map(({ label, link, ele: Ele }) => ( <Routes>
<Route key={label} path={link} element={<Ele />} /> {routers.map(({ label, link, ele: Ele }) => (
))} <Route key={label} path={link} element={<Ele />} />
</Routes> ))}
</Routes>
</BaseErrorBoundary>
</div> </div>
</div> </div>
</Paper> </Paper>

View File

@ -971,7 +971,7 @@ ahooks-v3-count@^1.0.0:
resolved "https://registry.yarnpkg.com/ahooks-v3-count/-/ahooks-v3-count-1.0.0.tgz#ddeb392e009ad6e748905b3cbf63a9fd8262ca80" resolved "https://registry.yarnpkg.com/ahooks-v3-count/-/ahooks-v3-count-1.0.0.tgz#ddeb392e009ad6e748905b3cbf63a9fd8262ca80"
integrity sha512-V7uUvAwnimu6eh/PED4mCDjE7tokeZQLKlxg9lCTMPhN+NjsSbtdacByVlR1oluXQzD3MOw55wylDmQo4+S9ZQ== integrity sha512-V7uUvAwnimu6eh/PED4mCDjE7tokeZQLKlxg9lCTMPhN+NjsSbtdacByVlR1oluXQzD3MOw55wylDmQo4+S9ZQ==
ahooks@3.7.2: ahooks@^3.7.2:
version "3.7.2" version "3.7.2"
resolved "https://registry.npmmirror.com/ahooks/-/ahooks-3.7.2.tgz#0afa42625e77ae1cc4b60b19c45cf12a8cf29b56" resolved "https://registry.npmmirror.com/ahooks/-/ahooks-3.7.2.tgz#0afa42625e77ae1cc4b60b19c45cf12a8cf29b56"
integrity sha512-nJPsQJcmJnGaNXiqgZdfO7UMs+o926LQg6VyDYt2vzKhXU8Ze/U87NsA/FeIvlIZB0rQr/j7uotFb1bGPp627A== integrity sha512-nJPsQJcmJnGaNXiqgZdfO7UMs+o926LQg6VyDYt2vzKhXU8Ze/U87NsA/FeIvlIZB0rQr/j7uotFb1bGPp627A==
@ -1976,6 +1976,13 @@ react-dom@^17.0.2:
object-assign "^4.1.1" object-assign "^4.1.1"
scheduler "^0.20.2" scheduler "^0.20.2"
react-error-boundary@^3.1.4:
version "3.1.4"
resolved "https://registry.npmmirror.com/react-error-boundary/-/react-error-boundary-3.1.4.tgz#255db92b23197108757a888b01e5b729919abde0"
integrity sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==
dependencies:
"@babel/runtime" "^7.12.5"
react-i18next@^12.0.0: react-i18next@^12.0.0:
version "12.0.0" version "12.0.0"
resolved "https://registry.npmmirror.com/react-i18next/-/react-i18next-12.0.0.tgz#634015a2c035779c5736ae4c2e5c34c1659753b1" resolved "https://registry.npmmirror.com/react-i18next/-/react-i18next-12.0.0.tgz#634015a2c035779c5736ae4c2e5c34c1659753b1"