import { type RoomType, isDirectMessageRoom } from '@rocket.chat/core-typings'; import { AutoComplete, Box, Option, OptionAvatar, OptionContent, Chip } from '@rocket.chat/fuselage'; import { useDebouncedValue } from '@rocket.chat/fuselage-hooks'; import { escapeRegExp } from '@rocket.chat/string-helpers'; import { RoomAvatar } from '@rocket.chat/ui-avatar'; import { useUser, useUserSubscriptions } from '@rocket.chat/ui-contexts'; import type { ComponentProps, ReactElement } from 'react'; import { memo, useMemo, useState } from 'react'; import { roomCoordinator } from '../../lib/rooms/roomCoordinator'; import { Rooms } from '../../stores'; type UserAndRoomAutoCompleteMultipleProps = Omit, 'filter'> & { limit?: number; }; type OptionType = { value: string; label: { name: string | undefined; avatarETag: string | undefined; type: RoomType; }; }[]; const UserAndRoomAutoCompleteMultiple = ({ value, onChange, limit, ...props }: UserAndRoomAutoCompleteMultipleProps) => { const user = useUser(); const [filter, setFilter] = useState(''); const debouncedFilter = useDebouncedValue(filter, 1000); const rooms = useUserSubscriptions( ...useMemo>( () => [ { open: { $ne: false }, $or: [ { lowerCaseFName: new RegExp(escapeRegExp(debouncedFilter), 'i') }, { lowerCaseName: new RegExp(escapeRegExp(debouncedFilter), 'i') }, ], }, // We are using a higher limit here to take advantage of the amount that // will be filtered below into a smaller set respecting the limit prop. { limit: 100 }, ], [debouncedFilter], ), ); const options = useMemo( () => rooms.reduce((acc, room) => { if (acc.length === limit) return acc; if (isDirectMessageRoom(room) && (room.blocked || room.blocker)) { return acc; } if (roomCoordinator.readOnly(Rooms.state.get(room.rid), user)) return acc; return [ ...acc, { value: room.rid, label: { name: room.fname || room.name, avatarETag: room.avatarETag, type: room.t, }, }, ]; }, []), [limit, rooms, user], ); return ( ( {label.name} )} renderItem={({ value, label, ...props }) => ( )} options={options} /> ); }; export default memo(UserAndRoomAutoCompleteMultiple);