diff --git a/public/assets/PageError.png b/public/assets/PageError.png new file mode 100644 index 00000000..8b332c7e Binary files /dev/null and b/public/assets/PageError.png differ diff --git a/public/assets/UnknownError.png b/public/assets/UnknownError.png new file mode 100644 index 00000000..fdc6d156 Binary files /dev/null and b/public/assets/UnknownError.png differ diff --git a/src/App.tsx b/src/App.tsx index 95eaf21f..59f8eb5f 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,7 +1,9 @@ import { Outlet } from 'react-router-dom'; +import { ErrorBoundary } from '@suspensive/react'; import clsx from 'clsx'; import { useRouteData, useTheme } from '@/core/hooks'; import { Navbar } from './shared/Navbar'; +import { UnknownFallback } from './shared/ErrorBoundary'; import 'swiper/css'; import 'swiper/css/bundle'; @@ -16,11 +18,13 @@ const App = () => { 'bg-light-main': theme !== 'dark' })} > -
- -
+ }> +
+ +
- {navBarRequired && } + {navBarRequired && } +
); }; diff --git a/src/main.tsx b/src/main.tsx index 6197fc3e..a214f3c9 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -17,7 +17,15 @@ const setupMSW = async () => { return worker.start(); }; -const queryClient = new QueryClient(); +const queryClient = new QueryClient({ + defaultOptions: { + queries: { + retry: 1, + refetchOnReconnect: false, + refetchOnWindowFocus: false + } + } +}); setupMSW().then(() => { ReactDOM.createRoot(document.getElementById('root')!).render( diff --git a/src/pages/RoomSettingPage.tsx b/src/pages/RoomSettingPage.tsx index 49002ea5..fdc03d74 100644 --- a/src/pages/RoomSettingPage.tsx +++ b/src/pages/RoomSettingPage.tsx @@ -1,6 +1,6 @@ import { Suspense } from 'react'; -import { ErrorBoundary } from '@suspensive/react'; import { useRouteData } from '@/core/hooks'; +import { QueryErrorBoundary, NetworkFallback } from '@/shared/ErrorBoundary'; import { Header } from '@/shared/Header'; import { Tab, TabItem } from '@/shared/Tab'; import { RoomTab, MemberTab, RemoveTab, LoadingFallback } from '@/RoomSetting'; @@ -13,7 +13,7 @@ const RoomSettingPage = () => { <>
- Error Occured in RoomSettingPage!}> + }> { - + ); }; diff --git a/src/shared/ErrorBoundary/components/NetworkFallback.tsx b/src/shared/ErrorBoundary/components/NetworkFallback.tsx new file mode 100644 index 00000000..c7d127c3 --- /dev/null +++ b/src/shared/ErrorBoundary/components/NetworkFallback.tsx @@ -0,0 +1,26 @@ +import { useErrorBoundaryFallbackProps } from '@suspensive/react'; + +const NetworkFallback = () => { + const { reset } = useErrorBoundaryFallbackProps(); + + return ( +
+ 오류 +

오류 발생

+

+ 정보를 불러올 수 없어요. +

+ +
+ ); +}; + +export default NetworkFallback; diff --git a/src/shared/ErrorBoundary/components/QueryErrorBoundary.tsx b/src/shared/ErrorBoundary/components/QueryErrorBoundary.tsx new file mode 100644 index 00000000..c5a9ca64 --- /dev/null +++ b/src/shared/ErrorBoundary/components/QueryErrorBoundary.tsx @@ -0,0 +1,33 @@ +import { FunctionComponent, ReactNode, PropsWithChildren } from 'react'; +import { ErrorBoundary, ErrorBoundaryFallbackProps } from '@suspensive/react'; +import { useQueryErrorResetBoundary } from '@tanstack/react-query'; + +interface QueryErrorBoundaryProps { + fallback: + | FunctionComponent> + | NonNullable; +} + +/** + * QueryErrorBoundary를 래핑한 ErrorBoundary 컴포넌트입니다. + * 쿼리 에러가 발생했을 때, 쿼리를 리셋하는 함수를 담고 fallback을 렌더링합니다. + * @param fallback - 오류 발생 시 렌더링할 컴포넌트. + * @param children - 성공 시 렌더링할 컴포넌트. + */ +const QueryErrorBoundary = ({ + fallback, + children +}: PropsWithChildren) => { + const { reset } = useQueryErrorResetBoundary(); + + return ( + + {children} + + ); +}; + +export default QueryErrorBoundary; diff --git a/src/shared/ErrorBoundary/components/UnknownFallback.tsx b/src/shared/ErrorBoundary/components/UnknownFallback.tsx new file mode 100644 index 00000000..11d8c6e5 --- /dev/null +++ b/src/shared/ErrorBoundary/components/UnknownFallback.tsx @@ -0,0 +1,24 @@ +import { Link } from 'react-router-dom'; + +const UnknownFallback = () => { + return ( +
+ 오류 +

오류 발생

+

+ 내부적인 문제로 오류가 발생했어요. +

+ + 홈으로 + +
+ ); +}; + +export default UnknownFallback; diff --git a/src/shared/ErrorBoundary/index.ts b/src/shared/ErrorBoundary/index.ts new file mode 100644 index 00000000..77ea07ee --- /dev/null +++ b/src/shared/ErrorBoundary/index.ts @@ -0,0 +1,3 @@ +export { default as QueryErrorBoundary } from './components/QueryErrorBoundary'; +export { default as NetworkFallback } from './components/NetworkFallback'; +export { default as UnknownFallback } from './components/UnknownFallback';