import PropTypes from 'prop-types'; import React, { useEffect, useState, useMemo, useRef } from 'react'; import { useLocation, useNavigate } from 'react-router-dom'; // material-ui import { styled, useTheme } from '@mui/material/styles'; import { Box, Collapse, ClickAwayListener, List, ListItemButton, ListItemIcon, ListItemText, Paper, Popper, Typography, useMediaQuery } from '@mui/material'; // project import import NavItem from './NavItem'; import Dot from 'components/@extended/Dot'; import SimpleBar from 'components/third-party/SimpleBar'; import Transitions from 'components/@extended/Transitions'; import useConfig from 'hooks/useConfig'; import { dispatch, useSelector } from 'store'; import { activeItem } from 'store/reducers/menu'; import { MenuOrientation, ThemeMode } from 'config'; // assets import { BorderOutlined, DownOutlined, UpOutlined, RightOutlined } from '@ant-design/icons'; // mini-menu - wrapper const PopperStyled = styled(Popper)(({ 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, backgroundColor: theme.palette.primary.main, transform: 'translateY(-50%) rotate(45deg)', zIndex: 120, borderLeft: `1px solid ${theme.palette.grey.A800}`, borderBottom: `1px solid ${theme.palette.grey.A800}` } })); // ==============================|| NAVIGATION - LIST COLLAPSE ||============================== // const NavCollapse = ({ menu, level, parentId, setSelectedItems, selectedItems, setSelectedLevel, selectedLevel }) => { const theme = useTheme(); const downLG = useMediaQuery(theme.breakpoints.down('lg')); const menuState = useSelector((state) => state.menu); const { drawerOpen } = menuState; const { menuOrientation } = useConfig(); const navigation = useNavigate(); const [open, setOpen] = useState(false); const [selected, setSelected] = useState(null); const [anchorEl, setAnchorEl] = useState(null); const handleClick = (event) => { 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); } }; const handlerIconLink = () => { if (!drawerOpen) { if (menu.url) navigation(`${menu.url}`); setSelected(menu.id); } }; const handleHover = (event) => { setAnchorEl(event?.currentTarget); if (!drawerOpen) { setSelected(menu.id); } }; const miniMenuOpened = Boolean(anchorEl); const handleClose = () => { setOpen(false); if (!miniMenuOpened) { if (!menu.url) { setSelected(null); } } setAnchorEl(null); }; useMemo(() => { if (selected === selectedItems) { if (level === 1) { setOpen(true); } } else { if (level === selectedLevel) { // setOpen(false); if (!miniMenuOpened && !drawerOpen && !selected) { setSelected(null); } if (drawerOpen) { setSelected(null); } } } }, [selectedItems, level, selected, miniMenuOpened, drawerOpen, selectedLevel]); const { pathname } = useLocation(); useEffect(() => { if (pathname === menu.url) { setSelected(menu.id); } // eslint-disable-next-line }, [pathname]); const checkOpenForParent = (child, id) => { child.forEach((item) => { if (item.url === pathname) { setOpen(true); setSelected(id); } }); }; useEffect(() => { // setOpen(false); if (!miniMenuOpened) { setSelected(null); } if (miniMenuOpened) setAnchorEl(null); if (menu.children) { menu.children.forEach((item) => { if (item.children?.length) { checkOpenForParent(item.children, menu.id); } if (pathname && pathname.includes('product-details')) { if (item.url && item.url.includes('product-details')) { setSelected(menu.id); setOpen(true); } } if (item.url === pathname) { setSelected(menu.id); setOpen(true); } }); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [pathname, menu.children]); useEffect(() => { if (menu.url === pathname) { dispatch(activeItem({ openItem: [menu.id] })); setSelected(menu.id); setAnchorEl(null); setOpen(true); } }, [pathname, menu]); const navCollapse = menu.children?.map((item) => { 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 === ThemeMode.DARK ? 'grey.400' : 'text.primary'; // const iconSelectedColor = theme.palette.mode === ThemeMode.DARK && drawerOpen ? theme.palette.text.primary : theme.palette.primary.main; const popperId = miniMenuOpened ? `collapse-pop-${menu.id}` : undefined; const FlexBox = { display: 'flex', justifyContent: 'space-between', alignItems: 'center', width: '100%' }; const textColor = 'white'; const iconSelectedColor = 'white'; // const isSelected = true; return ( <> {menuOrientation === MenuOrientation.VERTICAL || downLG ? ( <> { handleClick(); if (open == true) { setOpen(false); } }} sx={{ pl: drawerOpen ? `${level * 28}px` : 1.5, py: !drawerOpen && level === 1 ? 1.25 : 1, ...(drawerOpen && { '&:hover': { // bgcolor: theme.palette.mode === ThemeMode.DARK ? 'divider' : 'primary.lighter' bgcolor: theme.palette.mode === ThemeMode.DARK ? 'divider' : '#7b1fa2' }, '&.Mui-selected': { bgcolor: 'transparent', color: iconSelectedColor, '&:hover': { color: iconSelectedColor, bgcolor: theme.palette.mode === ThemeMode.DARK ? 'divider' : 'transparent' } } }), ...(!drawerOpen && { '&:hover': { bgcolor: 'transparent' }, '&.Mui-selected': { '&:hover': { bgcolor: 'transparent' }, bgcolor: 'transparent' } }) }} > {menuIcon && ( {menuIcon} )} {(drawerOpen || (!drawerOpen && level !== 1)) && ( {menu.title} } secondary={ menu.caption && ( {menu.caption} ) } /> )} {(drawerOpen || (!drawerOpen && level !== 1)) && (miniMenuOpened || open ? ( ) : ( ))} {!drawerOpen && ( {({ TransitionProps }) => ( {navCollapse} )} )} {drawerOpen && ( {navCollapse} )} ) : ( <> {menuIcon && ( {menuIcon} )} {!menuIcon && level !== 1 && ( )} {menu.title} } /> {miniMenuOpened ? : } {anchorEl && ( {({ TransitionProps }) => ( {navCollapse} )} )} )} ); }; NavCollapse.propTypes = { menu: PropTypes.object, level: PropTypes.number, parentId: PropTypes.string, setSelectedItems: PropTypes.func, selectedItems: PropTypes.string, setSelectedLevel: PropTypes.func, selectedLevel: PropTypes.number }; export default NavCollapse;