import { Button } from '@heroui/button'; import { Image } from '@heroui/image'; import { useLocalStorage } from '@uidotdev/usehooks'; import clsx from 'clsx'; import React from 'react'; import { matchPath, useLocation, useNavigate } from 'react-router-dom'; import key from '@/const/key'; import type { MenuItem } from '@/config/site'; const renderItems = (items: MenuItem[], children = false) => { return items?.map((item) => { const navigate = useNavigate(); const locate = useLocation(); const [open, setOpen] = React.useState(!!item.autoOpen); const canOpen = React.useMemo( () => item.items && item.items.length > 0, [item.items] ); const [b64img] = useLocalStorage(key.backgroundImage, ''); const [customIcons] = useLocalStorage>( key.customIcons, {} ); const isActive = React.useMemo(() => { if (item.href) { return !!matchPath(item.href, locate.pathname); } return false; }, [item.href, locate.pathname]); const goTo = (href: string) => { navigate(href); }; React.useEffect(() => { if (item.items) { const shouldOpen = item.items.some( (item) => item?.href && !!matchPath(item.href, locate.pathname) ); if (shouldOpen) setOpen(true); } }, [item.items, locate.pathname]); const panelRef = React.useRef(null); return (
{item.items && renderItems(item.items, true)}
); }); }; interface MenusProps { items: MenuItem[] } const Menus: React.FC = (props) => { const { items } = props; return (
{renderItems(items)}
); }; export default Menus;