add error page

This commit is contained in:
Athou
2022-08-14 21:05:22 +02:00
parent ee89b34ab8
commit d2eac62273
5 changed files with 117 additions and 1 deletions

View File

@@ -9,6 +9,7 @@ import { redirectTo } from "app/slices/redirect"
import { reloadServerInfos } from "app/slices/server" import { reloadServerInfos } from "app/slices/server"
import { useAppDispatch, useAppSelector } from "app/store" import { useAppDispatch, useAppSelector } from "app/store"
import { categoryUnreadCount } from "app/utils" import { categoryUnreadCount } from "app/utils"
import { ErrorBoundary } from "components/ErrorBoundary"
import { Header } from "components/header/Header" import { Header } from "components/header/Header"
import { Tree } from "components/sidebar/Tree" import { Tree } from "components/sidebar/Tree"
import { useI18n } from "i18n" import { useI18n } from "i18n"
@@ -48,7 +49,7 @@ function Providers(props: { children: React.ReactNode }) {
> >
<ModalsProvider> <ModalsProvider>
<NotificationsProvider position="top-center" zIndex={9999}> <NotificationsProvider position="top-center" zIndex={9999}>
{props.children} <ErrorBoundary>{props.children}</ErrorBoundary>
</NotificationsProvider> </NotificationsProvider>
</ModalsProvider> </ModalsProvider>
</MantineProvider> </MantineProvider>

View File

@@ -0,0 +1,26 @@
import { ErrorPage } from "pages/ErrorPage"
import React, { ReactNode } from "react"
interface ErrorBoundaryProps {
children?: ReactNode
}
interface ErrorBoundaryState {
error?: Error
}
export class ErrorBoundary extends React.Component<ErrorBoundaryProps, ErrorBoundaryState> {
constructor(props: ErrorBoundaryProps) {
super(props)
this.state = {}
}
componentDidCatch(error: Error) {
this.setState({ error })
}
render() {
if (this.state.error) return <ErrorPage error={this.state.error} />
return this.props.children
}
}

View File

@@ -323,6 +323,10 @@ msgstr "Mark all as read"
msgid "Mark all entries as read" msgid "Mark all entries as read"
msgstr "Mark all entries as read" msgstr "Mark all entries as read"
#: src/components/header/ProfileMenu.tsx
msgid "Metrics"
msgstr "Metrics"
#: src/components/RelativeDate.tsx #: src/components/RelativeDate.tsx
#: src/pages/app/FeedDetailsPage.tsx #: src/pages/app/FeedDetailsPage.tsx
msgid "N/A" msgid "N/A"
@@ -368,6 +372,10 @@ msgstr "OPML export"
msgid "OPML file" msgid "OPML file"
msgstr "OPML file" msgstr "OPML file"
#: src/pages/ErrorPage.tsx
msgid "Oops!"
msgstr "Oops!"
#: src/components/content/FeedEntryFooter.tsx #: src/components/content/FeedEntryFooter.tsx
msgid "Open link" msgid "Open link"
msgstr "Open link" msgstr "Open link"
@@ -446,6 +454,10 @@ msgstr "Settings saved."
msgid "Sign up" msgid "Sign up"
msgstr "Sign up" msgstr "Sign up"
#: src/pages/ErrorPage.tsx
msgid "Something bad just happened..."
msgstr "Something bad just happened..."
#: src/components/content/add/Subscribe.tsx #: src/components/content/add/Subscribe.tsx
#: src/components/content/add/Subscribe.tsx #: src/components/content/add/Subscribe.tsx
#: src/pages/app/AddPage.tsx #: src/pages/app/AddPage.tsx

View File

@@ -323,6 +323,10 @@ msgstr "Tout marquer comme lu"
msgid "Mark all entries as read" msgid "Mark all entries as read"
msgstr "Marquer toutes les entrées comme lues" msgstr "Marquer toutes les entrées comme lues"
#: src/components/header/ProfileMenu.tsx
msgid "Metrics"
msgstr "Métriques"
#: src/components/RelativeDate.tsx #: src/components/RelativeDate.tsx
#: src/pages/app/FeedDetailsPage.tsx #: src/pages/app/FeedDetailsPage.tsx
msgid "N/A" msgid "N/A"
@@ -368,6 +372,10 @@ msgstr "Export du fichier OPML"
msgid "OPML file" msgid "OPML file"
msgstr "Fichier OPML" msgstr "Fichier OPML"
#: src/pages/ErrorPage.tsx
msgid "Oops!"
msgstr "Oups !"
#: src/components/content/FeedEntryFooter.tsx #: src/components/content/FeedEntryFooter.tsx
msgid "Open link" msgid "Open link"
msgstr "Ouvrir le lien" msgstr "Ouvrir le lien"
@@ -446,6 +454,10 @@ msgstr "Réglages enregistrés."
msgid "Sign up" msgid "Sign up"
msgstr "Créer un compte" msgstr "Créer un compte"
#: src/pages/ErrorPage.tsx
msgid "Something bad just happened..."
msgstr "Quelque chose s'est mal passé..."
#: src/components/content/add/Subscribe.tsx #: src/components/content/add/Subscribe.tsx
#: src/components/content/add/Subscribe.tsx #: src/components/content/add/Subscribe.tsx
#: src/pages/app/AddPage.tsx #: src/pages/app/AddPage.tsx

View File

@@ -0,0 +1,65 @@
import { Trans } from "@lingui/macro"
import { Box, Button, Center, Container, createStyles, Group, Stack, Text, Title } from "@mantine/core"
import { Logo } from "components/Logo"
import { TbRefresh } from "react-icons/tb"
const useStyles = createStyles(theme => ({
root: {
paddingTop: 80,
},
label: {
textAlign: "center",
fontWeight: "bold",
fontSize: 120,
lineHeight: 1,
marginBottom: theme.spacing.xl * 1.5,
color: theme.colors[theme.primaryColor][3],
},
title: {
textAlign: "center",
fontWeight: "bold",
fontSize: 32,
},
description: {
maxWidth: 540,
margin: "auto",
marginTop: theme.spacing.xl,
marginBottom: theme.spacing.xl * 1.5,
},
}))
export function ErrorPage(props: { error: Error }) {
const { classes } = useStyles()
return (
<div className={classes.root}>
<Container>
<Stack>
<Center my="xl">
<Logo size={48} />
<Title order={1} ml="md">
CommaFeed
</Title>
</Center>
</Stack>
<Box className={classes.label}>
<Trans>Oops!</Trans>
</Box>
<Title className={classes.title}>
<Trans>Something bad just happened...</Trans>
</Title>
<Text size="lg" align="center" className={classes.description}>
{props.error.message}
</Text>
<Group position="center">
<Button size="md" onClick={() => window.location.reload()} leftIcon={<TbRefresh size={18} />}>
Refresh the page
</Button>
</Group>
</Container>
</div>
)
}