import { RefObject, useEffect, useMemo, useRef, useState } from 'react'; import { MdEdit, MdKeyboardArrowDown, MdKeyboardArrowUp } from 'react-icons/md'; import { SelectList, SelectListModel } from '@/components/select/SelectList'; import { isNullOrUndefined } from '@/utils/validator'; import { Button, Flex, HStack, Input } from '@/ui'; export type SelectMultipleProps = { options?: object[]; values?: (number | string)[]; onChange?: (value: (number | string)[] | undefined) => void; keyKey?: string; keyValue?: string; ref?: RefObject; // if set add capability to add the search item onCreate?: (data: string) => void; // if a suggestion exist at the auto compleat suggestion?: string; }; export const SelectMultiple = ({ options, onChange, values, ref, keyKey = 'id', keyValue = keyKey, suggestion, onCreate, }: SelectMultipleProps) => { const [showList, setShowList] = useState(false); const transformedOption = useMemo(() => { return options?.map((element) => { return { id: element[keyKey], name: element[keyValue], } as SelectListModel; }); }, [options, keyKey, keyValue]); const [hasSuggestion, setHasSuggestion] = useState( onCreate && suggestion ? true : false ); const [currentSearch, setCurrentSearch] = useState( onCreate ? suggestion : undefined ); useEffect(() => { if (suggestion) { setCurrentSearch(suggestion); setHasSuggestion(true); } }, [suggestion]); const refFocus = ref ?? useRef(null); const selectedOptions = useMemo(() => { if (isNullOrUndefined(values) || !transformedOption) { return []; } return transformedOption.filter((element) => { return values.includes(element[keyKey]); }); }, [values, transformedOption]); const selectValue = (data: SelectListModel) => { 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 <>;// TODO: ; } const onChangeInput = (value: string): void => { setHasSuggestion(false); if (value === '') { setCurrentSearch(undefined); } else { setCurrentSearch(value); } }; const onOpenClose = () => { if (!showList) { refFocus?.current?.focus(); return; } }; const createNewItem = !onCreate ? undefined : (data: string) => { onCreate(data); setCurrentSearch(undefined); }; return ( {selectedOptions && ( {selectedOptions.map((data) => ( {/* {data[keyValue] ?? `id=${data[keyKey]}`} selectValue(data)} /> */} ))} )} onChangeInput(e.target.value)} //onSubmit={onSubmit} // TODO: onFocus={() => setShowList(true)} // TODO: onBlur={() => setTimeout(() => setShowList(false), 200)} value={showList ? (currentSearch ?? '') : hasSuggestion ? `suggest: ${currentSearch}` : ''} /> {showList && ( )} ); };