import React, { useRef, useState } from 'react'; import { Menu, MenuList, MenuItem, Box, useOutsideClick, MenuButton, MenuItemProps } from '@chakra-ui/react'; import MyIcon from '../Icon'; type MenuItemType = 'primary' | 'danger'; export type Props = { width?: number | string; offset?: [number, number]; Button: React.ReactNode; trigger?: 'hover' | 'click'; menuList: { isActive?: boolean; label: string | React.ReactNode; icon?: string; type?: MenuItemType; 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: 3, display: 'flex', alignItems: 'center' }; 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) => ( { e.stopPropagation(); setIsOpen(false); item.onClick && item.onClick(); }} color={item.isActive ? 'primary.700' : 'myGray.600'} whiteSpace={'pre-wrap'} > {!!item.icon && } {item.label} ))} ); }; export default React.memo(MyMenu);