12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
- import {useEffect} from 'react';
- import {RouteComponentProps} from 'react-router';
- import * as Sentry from '@sentry/react';
- import NotFound from 'sentry/components/errors/notFound';
- import Footer from 'sentry/components/footer';
- import * as Layout from 'sentry/components/layouts/thirds';
- import SentryDocumentTitle from 'sentry/components/sentryDocumentTitle';
- import Sidebar from 'sentry/components/sidebar';
- import {t} from 'sentry/locale';
- type Props = RouteComponentProps<{}, {}>;
- function RouteNotFound({router, location}: Props) {
- const {pathname, search, hash} = location;
- const isMissingSlash = pathname[pathname.length - 1] !== '/';
- useEffect(() => {
- // Attempt to fix trailing slashes first
- if (isMissingSlash) {
- router.replace(`${pathname}/${search}${hash}`);
- return;
- }
- Sentry.withScope(scope => {
- scope.setFingerprint(['RouteNotFound']);
- Sentry.captureException(new Error('Route not found'));
- });
- }, [pathname, search, hash, isMissingSlash, router]);
- if (isMissingSlash) {
- return null;
- }
- return (
- <SentryDocumentTitle title={t('Page Not Found')}>
- <div className="app">
- <Sidebar location={location} />
- <Layout.Page withPadding>
- <NotFound />
- </Layout.Page>
- <Footer />
- </div>
- </SentryDocumentTitle>
- );
- }
- export default RouteNotFound;
|