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 };