import type { NavigationTree } from '@/@types/navigation' import { Direction, NavMode } from '@/@types/theme' import { PermissionCheck } from '@/components/shared' import Menu from '@/components/ui/Menu' import { themeConfig } from '@/configs/theme.config' import { NAV_ITEM_TYPE_COLLAPSE, NAV_ITEM_TYPE_ITEM, NAV_ITEM_TYPE_TITLE, } from '@/constants/navigation.constant' import useMenuActive from '@/utils/hooks/useMenuActive' import { useEffect, useState } from 'react' import { Link, useLocation } from 'react-router-dom' import VerticalCollapsedMenuItem from './VerticalCollapsedMenuItem' import VerticalSingleMenuItem from './VerticalSingleMenuItem' import MenuCollapse from '@/components/ui/Menu/MenuCollapse' import VerticalMenuIcon from './VerticalMenuIcon' import { MenuItem } from '@/components/ui' export interface VerticalMenuContentProps { navMode: NavMode collapsed?: boolean routeKey: string navigationTree?: NavigationTree[] userAuthority: string[] onMenuItemClick?: () => void direction?: Direction } const { MenuGroup } = Menu const VerticalMenuContent = (props: VerticalMenuContentProps) => { const { pathname } = useLocation() const { navMode = themeConfig.navMode, collapsed, routeKey, navigationTree = [], userAuthority = [], onMenuItemClick, direction = themeConfig.direction, } = props const [defaultExpandedKeys, setDefaultExpandedKeys] = useState([]) const [defaultActiveKeys, setDefaultActiveKeys] = useState([]) const { activedRoute } = useMenuActive(navigationTree, routeKey, pathname) useEffect(() => { const expandedKeys = [ activedRoute.route?.parentKey, activedRoute.parentRoute?.parentKey, ].filter(Boolean) const activeKeys = [ activedRoute.route?.key, activedRoute.route?.parentKey, activedRoute.parentRoute?.parentKey, ].filter(Boolean) setDefaultActiveKeys(activeKeys as string[]) setDefaultExpandedKeys(expandedKeys as string[]) }, [activedRoute]) const handleLinkClick = () => { onMenuItemClick?.() } const getNavItem = (nav: NavigationTree) => { if (nav.subMenu.length === 0 && nav.type === NAV_ITEM_TYPE_ITEM) { return ( ) } if (nav.subMenu.length > 0 && nav.type === NAV_ITEM_TYPE_COLLAPSE) { return ( ) } if (nav.type === NAV_ITEM_TYPE_TITLE) { if (nav.subMenu.length > 0) { return ( {nav.title} } eventKey={nav.key} expanded={false} > {nav.subMenu.map((subNav) => subNav.subMenu.length > 0 ? ( ) : ( ), )} ) } else { return } } } return ( {navigationTree.map((nav) => getNavItem(nav))} ) } export default VerticalMenuContent