From d1d92c63e8705e9730431b14f6e9c16a27b77e52 Mon Sep 17 00:00:00 2001 From: ilnaz <237x237@gmail.com> Date: Sat, 16 Nov 2024 20:09:02 +0300 Subject: [PATCH] feat: add ErrorBoundary page (#23) --- locales/ru.json | 6 +- src/app.tsx | 9 ++- .../ErrorBoundary/ErrorBoundary.tsx | 64 +++++++++++++++++++ src/components/ErrorBoundary/index.ts | 1 + 4 files changed, 75 insertions(+), 5 deletions(-) create mode 100644 src/components/ErrorBoundary/ErrorBoundary.tsx create mode 100644 src/components/ErrorBoundary/index.ts diff --git a/locales/ru.json b/locales/ru.json index 6f5e671..8646704 100644 --- a/locales/ru.json +++ b/locales/ru.json @@ -28,6 +28,8 @@ "dry-wash.arm.master.drawer.button.cancel": "Отменить", "dry-wash.arm.master.sideBar.title": " Сухой мастер", "dry-wash.arm.master.sideBar.title.master": "Мастера", - "dry-wash.arm.master.sideBar.title.orders": "Заказы" - + "dry-wash.arm.master.sideBar.title.orders": "Заказы", + "dry-wash.errorBoundary.title":"Что-то пошло не так", + "dry-wash.errorBoundary.description": " Мы уже работаем над исправлением проблемы", + "dry-wash.errorBoundary.button.reload": "Перезагрузить страницу" } diff --git a/src/app.tsx b/src/app.tsx index ff29f4a..37cb4f4 100644 --- a/src/app.tsx +++ b/src/app.tsx @@ -2,13 +2,16 @@ import React from 'react'; import { BrowserRouter } from 'react-router-dom'; import Routers from './routes'; import { ChakraProvider, theme as chakraTheme } from '@chakra-ui/react'; +import ErrorBoundary from './components/ErrorBoundary'; const App = () => { return ( - - - + + + + + ); }; diff --git a/src/components/ErrorBoundary/ErrorBoundary.tsx b/src/components/ErrorBoundary/ErrorBoundary.tsx new file mode 100644 index 0000000..63b1be2 --- /dev/null +++ b/src/components/ErrorBoundary/ErrorBoundary.tsx @@ -0,0 +1,64 @@ +import React, { Component, ErrorInfo, ReactNode } from 'react'; +import { Heading, Text, Button, Center, VStack } from '@chakra-ui/react'; +import i18next from 'i18next'; + +interface ErrorBoundaryState { + hasError: boolean; + error: Error | null; + errorInfo: ErrorInfo | null; +} + +interface ErrorBoundaryProps { + children: ReactNode; +} + +class ErrorBoundary extends Component { + constructor(props: ErrorBoundaryProps) { + super(props); + this.state = { + hasError: false, + error: null, + errorInfo: null, + }; + } + + static getDerivedStateFromError(): Partial { + return { hasError: true }; + } + + componentDidCatch(error: Error, errorInfo: ErrorInfo): void { + console.error('Error caught by ErrorBoundary:', error, errorInfo); + this.setState({ error, errorInfo }); + } + + render() { + const { hasError } = this.state; + //TODO: добавить анимацию после залива 404 страницы + if (hasError) { + return ( +
+ + + {i18next.t('dry-wash.errorBoundary.title')} + + + {i18next.t('dry-wash.errorBoundary.description')} + + + +
+ ); + } + + return this.props.children; + } +} + +export default ErrorBoundary; diff --git a/src/components/ErrorBoundary/index.ts b/src/components/ErrorBoundary/index.ts new file mode 100644 index 0000000..257f6a2 --- /dev/null +++ b/src/components/ErrorBoundary/index.ts @@ -0,0 +1 @@ +export { default } from './ErrorBoundary';