|
| 1 | +import PageContainer from 'components/page-container' |
| 2 | +import Sidebar from 'components/sidebar/sidebar' |
| 3 | +import componentsSidebar from 'configs/components.sidebar.json' |
| 4 | +import gettingStartedSidebar from 'configs/getting-started.sidebar.json' |
| 5 | +import hooksSidebar from 'configs/hooks.sidebar.json' |
| 6 | +import styledSystemSidebar from 'configs/styled-system.sidebar.json' |
| 7 | +import tutorialSidebar from 'configs/tutorial.sidebar.json' |
| 8 | +import communitySidebar from 'configs/community.sidebar.json' |
| 9 | +import semverRSort from 'semver/functions/rsort' |
| 10 | +import { ReactNode } from 'react' |
| 11 | +import { RouteItem } from 'utils/get-route-context' |
| 12 | +import { Frontmatter } from 'src/types/frontmatter' |
| 13 | +import { List, ListItem } from '@chakra-ui/react' |
| 14 | +import SidebarLink from 'components/sidebar/sidebar-link' |
| 15 | +import { allChangelogs } from 'contentlayer/generated' |
| 16 | +import TocNav from 'components/toc-nav' |
| 17 | +import { t } from 'utils/i18n' |
| 18 | + |
| 19 | +export function getRoutes(slug: string): RouteItem[] { |
| 20 | + // for home page, use docs sidebar |
| 21 | + if (slug === '/') { |
| 22 | + return gettingStartedSidebar.routes as RouteItem[] |
| 23 | + } |
| 24 | + |
| 25 | + const configMap = { |
| 26 | + '/getting-started': gettingStartedSidebar, |
| 27 | + '/docs/styled-system': styledSystemSidebar, |
| 28 | + '/docs/hooks': hooksSidebar, |
| 29 | + '/docs/components': componentsSidebar, |
| 30 | + '/tutorial': tutorialSidebar, |
| 31 | + '/community': communitySidebar, |
| 32 | + } |
| 33 | + |
| 34 | + const [, sidebar] = |
| 35 | + Object.entries(configMap).find(([path]) => slug.startsWith(path)) ?? [] |
| 36 | + |
| 37 | + const routes = sidebar?.routes ?? [] |
| 38 | + return routes as RouteItem[] |
| 39 | +} |
| 40 | + |
| 41 | +export function getVersions(): RouteItem[] { |
| 42 | + return semverRSort( |
| 43 | + allChangelogs |
| 44 | + .filter(({ version }) => version.startsWith('2.')) |
| 45 | + .map(({ version }) => version), |
| 46 | + ).map((version) => ({ |
| 47 | + title: `v${version}`, |
| 48 | + path: `/changelog/${version}`, |
| 49 | + })) |
| 50 | +} |
| 51 | + |
| 52 | +interface MDXLayoutProps { |
| 53 | + frontmatter: Frontmatter |
| 54 | + children: ReactNode |
| 55 | + hideToc?: boolean |
| 56 | + maxWidth?: string |
| 57 | +} |
| 58 | + |
| 59 | +export default function MDXLayout(props: MDXLayoutProps) { |
| 60 | + const { frontmatter, children, maxWidth } = props |
| 61 | + |
| 62 | + const routes = getRoutes(frontmatter.slug) |
| 63 | + const versions = getVersions() |
| 64 | + |
| 65 | + return ( |
| 66 | + <PageContainer |
| 67 | + hideToc={true} |
| 68 | + maxWidth={maxWidth} |
| 69 | + frontmatter={frontmatter} |
| 70 | + leftSidebar={<Sidebar routes={routes} />} |
| 71 | + rightSidebar={ |
| 72 | + <TocNav title={t('component.table-of-content.versions')}> |
| 73 | + <List mt={2}> |
| 74 | + {versions.map(({ title, path }) => ( |
| 75 | + <ListItem key={path}> |
| 76 | + <SidebarLink href={path}>{title}</SidebarLink> |
| 77 | + </ListItem> |
| 78 | + ))} |
| 79 | + </List> |
| 80 | + </TocNav> |
| 81 | + } |
| 82 | + > |
| 83 | + {children} |
| 84 | + </PageContainer> |
| 85 | + ) |
| 86 | +} |
0 commit comments