import { NavItem } from './NavItem'; import { Dot, Transitions } from '@/components/@extended'; import { useMenuConfig } from '@/components/Layout/MenuProvider'; import { useLayoutMediaState } from '@/components/Layout/Provider'; import { BorderOutlined, DownOutlined, RightOutlined, UpOutlined } from '@ant-design/icons'; import { Box, ClickAwayListener, Collapse, List, ListItemButton, ListItemIcon, ListItemText, Paper, Popper, Theme, Typography } from '@mui/material'; import { styled, useTheme } from '@mui/material/styles'; import { useEffect, useMemo, useState } from 'react'; import { useLocation, useNavigate } from 'react-router-dom'; const PopperStyled = styled(Popper)(({ theme }: { theme: Theme }) => ({ overflow: 'visible', zIndex: 1202, minWidth: 180, '&:before': { content: '""', display: 'block', position: 'absolute', top: 38, left: -5, width: 10, height: 10, backgroundColor: theme.palette.background.paper, transform: 'translateY(-50%) rotate(45deg)', zIndex: 120, borderLeft: `1px solid ${theme.palette.divider}`, borderBottom: `1px solid ${theme.palette.divider}` } })); type NavCollapseProps = { menu: any; level: number; parentId: string; setSelectedItems: (value: string) => void; selectedItems: string; setSelectedLevel: (value: number) => void; selectedLevel: number; onItemClick?: () => void; }; function NavCollapse({ menu, level, parentId, setSelectedItems, selectedItems, setSelectedLevel, selectedLevel, onItemClick }: NavCollapseProps) { const theme = useTheme(); const { activeItem } = useMenuConfig(); const { horizontal } = useLayoutMediaState(); const { drawerOpen } = useMenuConfig(); const Navigation = useNavigate(); const [open, setOpen] = useState(false); const [selected, setSelected] = useState(null); const [anchorEl, setAnchorEl] = useState(null); function handleClick(event: any) { setAnchorEl(null); setSelectedLevel(level); if (drawerOpen) { setOpen(!open); setSelected(!selected ? menu.id : null); setSelectedItems(!selected ? menu.id : ''); if (menu.url) Navigation(`${menu.url}`); } else { setAnchorEl(event?.currentTarget); } } function handlerIconLink() { if (!drawerOpen) { if (menu.url) Navigation(`${menu.url}`); } } function handleHover(event: any) { setAnchorEl(event?.currentTarget); } function handleClose() { setOpen(false); setSelected(null); setAnchorEl(null); } const handleItemClick = onItemClick ? () => { handleClose(); onItemClick(); } : undefined; useMemo(() => { if (selected === selectedItems) { if (level === 1) { setOpen(true); } } else { if (level === selectedLevel) { setOpen(false); setSelected(null); } } }, [selectedItems, level, selected, selectedLevel]); const { pathname } = useLocation(); const openMini = Boolean(anchorEl); function checkOpenForParent(child: any, id: any) { child.forEach((item: any) => { if (item.url === pathname) { setOpen(true); setSelected(id); } }); } useEffect(() => { setOpen(false); setSelected(null); if (openMini) setAnchorEl(null); if (menu.children) { menu.children.forEach((item: any) => { if (item.children?.length) { checkOpenForParent(item.children, menu.id); } if (item.url === pathname) { setSelected(menu.id); setOpen(true); } if (pathname.includes(item.url)) { setSelected(menu.id); setOpen(true); } }); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [pathname, menu.children]); useEffect(() => { if (menu.url === pathname && selected !== menu.id) { activeItem([menu.id]); setSelected(menu.id); setAnchorEl(null); setOpen(true); } }, [pathname, menu, selected, activeItem]); const navCollapse = menu.children?.map((item: any) => { switch (item.type) { case 'collapse': return ( ); case 'item': return ; default: return ( Fix - Collapse or Item ); } }); const isSelected = selected === menu.id; const borderIcon = level === 1 ? : false; const Icon = menu.icon; const menuIcon = menu.icon ? : borderIcon; const textColor = theme.palette.mode === 'dark' ? 'grey.400' : 'text.primary'; const iconSelectedColor = theme.palette.mode === 'dark' && drawerOpen ? theme.palette.text.primary : theme.palette.primary.main; const popperId = openMini ? `collapse-pop-${menu.id}` : undefined; const FlexBox = { display: 'flex', justifyContent: 'space-between', alignItems: 'center', width: '100%' }; return ( <> {!horizontal ? ( <> {menuIcon ? ( {menuIcon} ) : null} {drawerOpen || (!drawerOpen && level !== 1) ? ( {menu.title} } secondary={ menu.caption ? ( {menu.caption} ) : null } /> ) : null} {drawerOpen || (!drawerOpen && level !== 1) ? ( openMini || open ? ( ) : ( ) ) : null} {!drawerOpen && ( {({ TransitionProps }) => ( // @ts-ignore {navCollapse} )} )} {drawerOpen ? ( {navCollapse} ) : null} ) : ( <> {menuIcon ? ( {menuIcon} ) : null} {!menuIcon && level !== 1 && ( )} {menu.title} } /> {openMini ? : } {anchorEl ? ( {({ TransitionProps }) => ( // @ts-ignore {navCollapse} )} ) : null} )} ); } export { NavCollapse };