diff --git a/services/web/frontend/js/features/project-list/components/project-list-root.tsx b/services/web/frontend/js/features/project-list/components/project-list-root.tsx index b3d38ed69b..cd2bc4b0c9 100644 --- a/services/web/frontend/js/features/project-list/components/project-list-root.tsx +++ b/services/web/frontend/js/features/project-list/components/project-list-root.tsx @@ -25,6 +25,8 @@ import LoadMore from './load-more' import { useEffect } from 'react' import getMeta from '../../../utils/meta' import WelcomeMessageNew from './welcome-message-new' +import withErrorBoundary from '../../../infrastructure/error-boundary' +import { GenericErrorBoundaryFallback } from '../../../shared/components/generic-error-boundary-fallback' function ProjectListRoot() { const { isReady } = useWaitForI18n() @@ -191,4 +193,4 @@ function DashApiError() { ) } -export default ProjectListRoot +export default withErrorBoundary(ProjectListRoot, GenericErrorBoundaryFallback) diff --git a/services/web/frontend/js/shared/components/default-message.tsx b/services/web/frontend/js/shared/components/default-message.tsx new file mode 100644 index 0000000000..63b992fac5 --- /dev/null +++ b/services/web/frontend/js/shared/components/default-message.tsx @@ -0,0 +1,17 @@ +import { useTranslation } from 'react-i18next' + +type DefaultMessageProps = { + className?: string + style?: React.CSSProperties +} + +export function DefaultMessage({ className, style }: DefaultMessageProps) { + const { t } = useTranslation() + + return ( + <> + {`${t('generic_something_went_wrong')}. `} + {`${t('please_refresh')}`} + > + ) +} diff --git a/services/web/frontend/js/shared/components/error-boundary-fallback.tsx b/services/web/frontend/js/shared/components/error-boundary-fallback.tsx index 14b9dc183b..7cfd9b7fe8 100644 --- a/services/web/frontend/js/shared/components/error-boundary-fallback.tsx +++ b/services/web/frontend/js/shared/components/error-boundary-fallback.tsx @@ -1,6 +1,6 @@ import { FC, ReactNode } from 'react' import { Alert } from 'react-bootstrap' -import { useTranslation } from 'react-i18next' +import { DefaultMessage } from './default-message' export const ErrorBoundaryFallback: FC<{ modal?: ReactNode }> = ({ children, @@ -8,14 +8,8 @@ export const ErrorBoundaryFallback: FC<{ modal?: ReactNode }> = ({ }) => { return (
{`${t('generic_something_went_wrong')}. ${t('please_refresh')}`}
-} diff --git a/services/web/frontend/js/shared/components/generic-error-boundary-fallback.tsx b/services/web/frontend/js/shared/components/generic-error-boundary-fallback.tsx new file mode 100644 index 0000000000..682eac67ce --- /dev/null +++ b/services/web/frontend/js/shared/components/generic-error-boundary-fallback.tsx @@ -0,0 +1,33 @@ +import { FC } from 'react' +import { useTranslation } from 'react-i18next' +import Icon from './icon' +import { Button } from 'react-bootstrap' +import { useLocation } from '../hooks/use-location' +import { DefaultMessage } from './default-message' + +export const GenericErrorBoundaryFallback: FC = ({ children }) => { + const { t } = useTranslation() + const { reload: handleClick } = useLocation() + + return ( +