| import React, { useEffect } from 'react'; |
| import clsx from 'clsx'; |
| import ErrorBoundary from '@docusaurus/ErrorBoundary'; |
| import { PageMetadata, SkipToContentFallbackId, ThemeClassNames } from '@docusaurus/theme-common'; |
| import { useKeyboardNavigation } from '@docusaurus/theme-common/internal'; |
| import SkipToContent from '@theme/SkipToContent'; |
| import AnnouncementBar from '@theme/AnnouncementBar'; |
| import Navbar from '@theme/Navbar'; |
| import Footer from '@theme/Footer'; |
| import LayoutProvider from '@theme/Layout/Provider'; |
| import ErrorPageContent from '@theme/ErrorPageContent'; |
| import type { Props } from '@theme/Layout'; |
| import styles from './styles.module.css'; |
| import { useHistory } from '@docusaurus/router'; |
| |
| export default function Layout(props: Props): JSX.Element { |
| const { |
| children, |
| noFooter, |
| wrapperClassName, |
| // Not really layout-related, but kept for convenience/retro-compatibility |
| title, |
| description, |
| } = props; |
| const history = useHistory(); |
| useKeyboardNavigation(); |
| |
| useEffect(() => { |
| if ( |
| history.location.pathname?.length > 1 && |
| history.location.pathname[history.location.pathname.length - 1] === '/' |
| ) |
| history.replace(history.location.pathname.slice(0, -1)); |
| }, []); |
| |
| return ( |
| <LayoutProvider> |
| <PageMetadata title={title} description={description} /> |
| |
| <SkipToContent /> |
| |
| <AnnouncementBar /> |
| |
| <Navbar /> |
| |
| <div |
| id={SkipToContentFallbackId} |
| className={clsx(ThemeClassNames.wrapper.main, styles.mainWrapper, wrapperClassName)} |
| > |
| <ErrorBoundary fallback={params => <ErrorPageContent {...params} />}>{children}</ErrorBoundary> |
| </div> |
| |
| {!noFooter && <Footer />} |
| </LayoutProvider> |
| ); |
| } |