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