import { Box, Button, ButtonProps, Flex, Menu, MenuButton, MenuItem, MenuItemProps, MenuList, useDisclosure, useOutsideClick } from '@chakra-ui/react'; import React, { useRef } from 'react'; import { useTranslation } from 'next-i18next'; import MyTag from '../Tag/index'; import MyIcon from '../Icon'; export type SelectProps = { value: T[]; placeholder?: string; list: { icon?: string; label: string | React.ReactNode; value: T; }[]; maxH?: number; onSelect: (val: T[]) => void; } & Omit; const MultipleSelect = ({ value = [], placeholder, list = [], width = '100%', maxH = 400, onSelect, ...props }: SelectProps) => { const { t } = useTranslation(); const ref = useRef(null); const { isOpen, onOpen, onClose } = useDisclosure(); const menuItemStyles: MenuItemProps = { borderRadius: 'sm', py: 2, display: 'flex', alignItems: 'center', _hover: { backgroundColor: 'myGray.100' }, _notLast: { mb: 2 } }; const onclickItem = (val: T) => { if (value.includes(val)) { onSelect(value.filter((i) => i !== val)); } else { onSelect([...value, val]); } }; return ( {value.length === 0 && placeholder ? ( {placeholder} ) : ( {value.map((item, i) => { const listItem = list.find((i) => i.value === item); if (!listItem) return null; return ( {listItem.label} {/* { console.log(111); e.stopPropagation(); onclickItem(item); }} /> */} ); })} )} { const w = ref.current?.clientWidth; if (w) { return `${w}px !important`; } return Array.isArray(width) ? width.map((item) => `${item} !important`) : `${width} !important`; })()} w={'auto'} px={'6px'} py={'6px'} border={'1px solid #fff'} boxShadow={ '0px 2px 4px rgba(161, 167, 179, 0.25), 0px 0px 1px rgba(121, 141, 159, 0.25);' } zIndex={99} maxH={'40vh'} overflowY={'auto'} > {list.map((item, i) => ( onclickItem(item.value)} whiteSpace={'pre-wrap'} fontSize={'sm'} gap={2} > {value.includes(item.value) && } {item.label} ))} ); }; export default MultipleSelect;