import { useMemo, useState } from 'react'; import { Flex, Input, InputGroup, InputRightElement, Spinner, Tag, TagCloseButton, TagLabel, Wrap, WrapItem, } from '@chakra-ui/react'; import { MdSearch } from 'react-icons/md'; import { FormSelectList, SelectMultipleValueDisplayType, } from '@/components/form/FormSelectList'; import { isNullOrUndefined } from '@/utils/validator'; export type SelectMultipleProps = { options?: object[]; values?: (number | string)[]; onChange?: (value: (number | string)[] | undefined) => void; keyKey?: string; keyValue?: string; }; export const SelectMultiple = ({ options, onChange, values, keyKey = 'id', keyValue = keyKey, }: SelectMultipleProps) => { const [showList, setShowList] = useState(false); const transformedOption = useMemo(() => { return options?.map((element) => { return { id: element[keyKey], name: element[keyValue], isSelected: false, } as SelectMultipleValueDisplayType; }); }, [options, keyKey, keyValue]); const [currentSearch, setCurrentSearch] = useState( undefined ); const selectedOptions = useMemo(() => { if (isNullOrUndefined(values) || !transformedOption) { return []; } return transformedOption.filter((element) => { return values.includes(element[keyKey]); }); }, [values, transformedOption]); const selectValue = (data: SelectMultipleValueDisplayType) => { const newValues = values?.includes(data.id) ? values.filter((elem) => data.id === elem) : [...(values ?? []), data.id]; setShowList(false); if (onChange) { if (newValues.length == 0) { onChange(undefined); } else { onChange(newValues); } } }; if (!options) { return ; } function onChangeInput(value: string): void { if (value === '') { setCurrentSearch(undefined); } else { setCurrentSearch(value); } } return ( {selectedOptions && ( {selectedOptions.map((data) => ( {data[keyValue] ?? `id=${data[keyKey]}`} selectValue(data)} /> ))} )} onChangeInput(e.target.value)} //onSubmit={onSubmit} onFocus={() => setShowList(true)} onBlur={() => setTimeout(() => setShowList(false), 200)} /> {showList && ( )} ); };