feat: add error boundary

This commit is contained in:
GyDi
2022-11-19 01:22:19 +08:00
parent f33c419ed9
commit 9d2017e598
5 changed files with 54 additions and 20 deletions

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

View File

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