import type { IRoom } from '@rocket.chat/core-typings'; import type { SelectOption } from '@rocket.chat/fuselage'; import { Box, Icon, TextInput, Select, Throbber, ButtonGroup, Button, Callout } from '@rocket.chat/fuselage'; import { useAutoFocus, useDebouncedCallback } from '@rocket.chat/fuselage-hooks'; import { VirtualizedScrollbars, ContextualbarHeader, ContextualbarIcon, ContextualbarTitle, ContextualbarClose, ContextualbarContent, ContextualbarFooter, ContextualbarEmptyContent, ContextualbarSection, ContextualbarDialog, } from '@rocket.chat/ui-client'; import { useSetting } from '@rocket.chat/ui-contexts'; import type { ChangeEventHandler, ComponentProps, MouseEvent, ElementType } from 'react'; import { useId, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { GroupedVirtuoso } from 'react-virtuoso'; import { MembersListDivider } from './MembersListDivider'; import RoomMembersListWrapper from './RoomMembersListWrapper'; import RoomMembersRow from './RoomMembersRow'; import InfiniteListAnchor from '../../../../components/InfiniteListAnchor'; import ResultsLiveRegion from '../../../../components/ResultsLiveRegion'; import type { RoomMember } from '../../../hooks/useMembersList'; export type RoomMembersProps = { rid: IRoom['_id']; isTeam?: boolean; isDirect?: boolean; isPending: boolean; isSuccess: boolean; text: string; type: string; setText: ChangeEventHandler; setType: (type: 'online' | 'all') => void; members: RoomMember[]; total: number; error?: Error; onClickClose: () => void; onClickView: (e: MouseEvent) => void; onClickAdd?: () => void; onClickInvite?: () => void; loadMoreItems: () => void; renderRow?: ElementType>; reload: () => void; isABACRoom?: boolean; }; const RoomMembers = ({ isPending, isSuccess, members = [], text, type = 'online', setText, setType, onClickClose, onClickView, onClickAdd, onClickInvite, total, error, loadMoreItems, renderRow: RowComponent = RoomMembersRow, rid, isTeam, isDirect, reload, isABACRoom = false, }: RoomMembersProps) => { const { t } = useTranslation(); const membersListId = useId(); const inputRef = useAutoFocus(true); const itemData = useMemo(() => ({ onClickView, rid }), [onClickView, rid]); const options: SelectOption[] = useMemo( () => [ ['online', t('Online')], ['all', t('All')], ], [t], ); const loadMoreMembers = useDebouncedCallback( () => { loadMoreItems(); }, 300, [loadMoreItems, members], ); const useRealName = useSetting('UI_Use_Real_Name', false); const { counts, titles } = useMemo(() => { const owners: RoomMember[] = []; const leaders: RoomMember[] = []; const moderators: RoomMember[] = []; const normalMembers: RoomMember[] = []; members.forEach((member) => { if (member.roles?.includes('owner')) { owners.push(member); } else if (member.roles?.includes('leader')) { leaders.push(member); } else if (member.roles?.includes('moderator')) { moderators.push(member); } else { normalMembers.push(member); } }); const counts = []; const titles = []; if (owners.length > 0) { counts.push(owners.length); titles.push(); } if (leaders.length > 0) { counts.push(leaders.length); titles.push(); } if (moderators.length > 0) { counts.push(moderators.length); titles.push(); } if (normalMembers.length > 0) { counts.push(normalMembers.length); titles.push(); } return { counts, titles }; }, [members]); return ( {isTeam ? t('Teams_members') : t('Members')} {onClickClose && } } />