import React, { useRef, useState } from 'react'; import { Menu, MenuList, MenuItem, Box, useOutsideClick, MenuButton, MenuItemProps } from '@chakra-ui/react'; import MyIcon from '../Icon'; import MyDivider from '../MyDivider'; type MenuItemType = 'primary' | 'danger'; export type Props = { width?: number | string; offset?: [number, number]; Button: React.ReactNode; trigger?: 'hover' | 'click'; menuList: { label?: string; children: { isActive?: boolean; type?: MenuItemType; icon?: string; label: string | React.ReactNode; onClick: () => any; }[]; }[]; }; const MyMenu = ({ width = 'auto', trigger = 'hover', offset = [0, 5], Button, menuList }: Props) => { const typeMapStyle: Record = { primary: { _hover: { backgroundColor: 'primary.50', color: 'primary.600' } }, danger: { _hover: { color: 'red.600', background: 'red.1' } } }; const menuItemStyles: MenuItemProps = { borderRadius: 'sm', py: 2, px: 3, display: 'flex', alignItems: 'center', fontSize: 'sm' }; const ref = useRef(null); const closeTimer = useRef(); const [isOpen, setIsOpen] = useState(false); useOutsideClick({ ref: ref, handler: () => { setIsOpen(false); } }); return ( { if (trigger === 'hover') { setIsOpen(true); } clearTimeout(closeTimer.current); }} onMouseLeave={() => { if (trigger === 'hover') { closeTimer.current = setTimeout(() => { setIsOpen(false); }, 100); } }} > { if (trigger === 'click') { setIsOpen(!isOpen); } }} > {Button} {menuList.map((item, i) => { return ( {item.label && {item.label}} {i !== 0 && } {item.children.map((child, index) => ( { e.stopPropagation(); setIsOpen(false); child.onClick && child.onClick(); }} color={child.isActive ? 'primary.700' : 'myGray.600'} whiteSpace={'pre-wrap'} _notLast={{ mb: 0.5 }} > {!!child.icon && } {child.label} ))} ); })} ); }; export default React.memo(MyMenu);