import { AutoComplete, Box, Option, Options, Chip, AutoCompleteProps } from '@rocket.chat/fuselage'; import { useDebouncedValue } from '@rocket.chat/fuselage-hooks'; import React, { FC, memo, useCallback, useMemo, useState } from 'react'; import UserAvatar from '../../../components/avatar/UserAvatar'; import { useEndpointData } from '../../../hooks/useEndpointData'; type UsersInputProps = { value: unknown[]; onChange: (value: unknown, action: 'remove' | undefined) => void; }; type AutocompleteData = [AutoCompleteProps['options'], { [key: string]: string | undefined }]; const useUsersAutoComplete = (term: string): AutocompleteData => { const params = useMemo( () => ({ selector: JSON.stringify({ term }), }), [term], ); const { value: data } = useEndpointData('users.autocomplete', params); return useMemo(() => { if (!data) { return [[], {}]; } const options = data.items.map((user) => ({ label: user.name ?? '', value: user._id ?? '', })) || []; const labelData = Object.fromEntries(data.items.map((user) => [user._id, user.username]) || []); return [options, labelData]; }, [data]); }; const UsersInput: FC = ({ onChange, ...props }) => { const [filter, setFilter] = useState(''); const [options, labelData] = useUsersAutoComplete(useDebouncedValue(filter, 1000)); const onClickSelected = useCallback( (e) => { e.stopPropagation(); e.preventDefault(); onChange(e.currentTarget.value, 'remove'); }, [onChange], ); const renderSelected = useCallback>( ({ value: selected }) => ( <> {selected?.map((value) => ( {labelData[value]} ))} ), [onClickSelected, props, labelData], ); const renderItem = useCallback>( ({ value, ...props }) => (