import React, { useMemo, type FC } from 'react'; import { useRouteMeta, useSidebarData, useLocation, NavLink } from 'dumi'; import { Show, Hide, Box, Text, Stack, Heading, Drawer, DrawerBody, DrawerCloseButton, DrawerContent, DrawerOverlay, chakra, useColorModeValue } from '@chakra-ui/react'; import Toc from '../Toc'; export type SidebarConfig = { isOpen: boolean; onClose: () => void; }; export type SideBarDataGroup = ReturnType[0]; export type SideBarData = Omit & { children: (SideBarDataGroup['children'][0] & { toc: boolean })[]; }; export const Nav = chakra(NavLink) as typeof NavLink; const SideBarMenu: FC<{ menu: SideBarData[]; }> = ({ menu }) => { const groupBorderColor = useColorModeValue('whiteAlpha.500', 'gray.700'); const activeLinkColor = useColorModeValue('brand.500', 'brand.300'); const { pathname } = useLocation(); return ( {menu.map(({ title, children }, index) => ( {title} {children.map(({ link, title: childTitle, toc }) => ( {toc && } {link === pathname && !toc && ( )} ))} ))} ); }; const SideBar: FC = ({ isOpen, onClose }) => { const sidebar = useSidebarData(); const { pathname } = useLocation(); const meta = useRouteMeta(); const withTocSidebar = useMemo(() => { return sidebar ? sidebar.map((v) => ({ ...v, children: v.children.map((c) => ({ ...c, toc: c.link === pathname && meta.frontmatter.toc === 'menu' })) })) : []; }, [meta, sidebar, pathname]); if (!sidebar) return null; return ( <> ); }; export default SideBar;