import React, {useState, useRef} from 'react'; import {useLocation, useNavigate} from "react-router-dom"; import { IoMdMenu } from "react-icons/io"; import {MdOutlineKeyboardArrowDown,MdOutlineKeyboardArrowRight} from "react-icons/md"; import { useMediaQuery, CssBaseline, Box, Toolbar, List, ListItem, ListItemButton, ListItemIcon, ListItemText, Divider, IconButton, Collapse, Popover } from "@mui/material"; import { useTheme,} from '@mui/material/styles'; import { Appbar, DrawerHeader, StyleDrawer } from './styles'; import { checkIfAnyActiveChild, hasChildren } from "./utils"; interface SidebarProps { variant:'permanent', anchor: 'left', sx?:any, sidedata?:Array, appbar?:boolean, drawerheader?:boolean, handlecallback?:any, drawerWidth?:any, openDrawer?:boolean, ROUTE_MAPPER ?: { [key : string] : string }, } interface UrlLink{ id : string, label ?: string, url ?: string, isSubLinks ?: boolean, sublinks ?: Array, shouldOpenNewTab ?: boolean } export interface NavLink extends UrlLink{ icon ?: React.ReactNode, navigate ?: () => void } const MenuItem = ({item, open, location, isDesktop, anchorEl, setAnchorEl, navigate = () => {}, openchild, setOpenchild}:any) => { const menuRef = useRef(null); const popoverRef = useRef(null); const [subChildOpen, setSubChildOpen] = useState(null); const hasSubLinks = hasChildren(item); const isSelected = hasSubLinks ? checkIfAnyActiveChild(item?.sublinks, location) : item.url === location?.pathname; const openPopup = menuRef.current && anchorEl?.contains(menuRef?.current); const handlePopoverOpen = (event: React.MouseEvent) => { !open && setAnchorEl(event.currentTarget); event.stopPropagation(); event.preventDefault(); } const handleClick = (id: string) => { if(openchild == id){ setOpenchild(null) } else{ setOpenchild(id) } } const handleNavigateClick = () => { if(hasSubLinks) return; if(!(item?.sublinks) && (item?.shouldOpenNewTab)){ window.open(item?.url, "_blank"); } else{ navigate(item?.url as string) } } return <> open && isDesktop && hasSubLinks ? handleClick(item?.id) : {}} aria-owns={openPopup ? 'mouse-over-popover' : undefined} aria-haspopup="true" ref={menuRef} onMouseEnter={handlePopoverOpen} sx={{ backgroundColor:'transparent', "& .Mui-selected": { color:'#1c84ee', backgroundColor:'transparent', ':hover':{ backgroundColor: 'white' }, } }}> {item.icon} {hasSubLinks && <> {openchild == item?.id ? : } } {item?.sublinks?.map((child:any, key:any) => ( ))} {!open && openPopup && menuRef.current && {hasSubLinks ? {item?.sublinks?.map((child:string, key:any) => ( ))} : } } }; const Sidebar = ({ sidedata, appbar, drawerWidth = 300, openDrawer = true, drawerheader, handlecallback = () => {}, ROUTE_MAPPER, ...other } : SidebarProps) => { const theme = useTheme(); const location = useLocation(); const navigate = useNavigate(); const isDesktop = useMediaQuery('(min-width:600px)'); const [open, setOpen] = useState(false); const [openchild, setOpenchild] = useState(null); const [anchorEl, setAnchorEl] = useState(null); React.useEffect(()=>{ setOpen(!open) },[openDrawer]) const onDrawerHandler = (value: boolean) => () => setOpen(value); return ( {appbar && } { drawerheader && {theme.direction === 'ltr' && } } {sidedata?.map((item, key) => )} ); } export default Sidebar;