import { AutoComplete, Box, Option, OptionAvatar, OptionContent, Chip } from '@rocket.chat/fuselage'; import { useMutableCallback, useDebouncedValue } from '@rocket.chat/fuselage-hooks'; import React, { ComponentProps, memo, ReactElement, useMemo, useState } from 'react'; import { useEndpointData } from '../../hooks/useEndpointData'; import UserAvatar from '../avatar/UserAvatar'; const query = ( term = '', ): { selector: string; } => ({ selector: JSON.stringify({ term }) }); type UserAutoCompleteMultipleProps = Omit, 'value' | 'filter' | 'onChange'> & Omit, 'value' | 'is' | 'className' | 'onChange'> & { onChange: (value: any, action: 'remove' | undefined) => void; value: any; filter?: string; }; const UserAutoCompleteMultiple = ({ onChange, ...props }: UserAutoCompleteMultipleProps): ReactElement => { const [filter, setFilter] = useState(''); const debouncedFilter = useDebouncedValue(filter, 1000); const { value: data } = useEndpointData( '/v1/users.autocomplete', useMemo(() => query(debouncedFilter), [debouncedFilter]), ); const options = useMemo(() => data?.items.map((user) => ({ value: user.username, label: user.name })) || [], [data]); const onClickRemove = useMutableCallback((e) => { e.stopPropagation(); e.preventDefault(); onChange?.(e.currentTarget.value, 'remove'); }); return ( selected?.map((value: any) => ( {value} )) } renderItem={({ value, label, ...props }): ReactElement => ( )} options={options} /> ); }; export default memo(UserAutoCompleteMultiple);