import type { IRole, IUser, Serialized } from '@rocket.chat/core-typings'; import { Pagination } from '@rocket.chat/fuselage'; import { useEffectEvent, useBreakpoints } from '@rocket.chat/fuselage-hooks'; import type { DefaultUserInfo } from '@rocket.chat/rest-typings'; import { GenericTable, GenericTableHeader, GenericTableHeaderCell, GenericTableBody, GenericTableLoadingTable, } from '@rocket.chat/ui-client'; import type { usePagination, useSort } from '@rocket.chat/ui-client'; import type { TranslationKey } from '@rocket.chat/ui-contexts'; import { useRouter } from '@rocket.chat/ui-contexts'; import type { ReactElement, Dispatch, SetStateAction, MouseEvent, KeyboardEvent } from 'react'; import { useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import UsersTableFilters from './UsersTableFilters'; import UsersTableRow from './UsersTableRow'; import GenericNoResults from '../../../../components/GenericNoResults'; import type { AdminUsersTab, UsersFilters, UsersTableSortingOption } from '../AdminUsersPage'; import { useShowVoipExtension } from '../useShowVoipExtension'; type UsersTableProps = { tab: AdminUsersTab; roleData: { roles: IRole[] } | undefined; users: Serialized[]; total: number; isLoading: boolean; isError: boolean; isSuccess: boolean; onReload: () => void; setUserFilters: Dispatch>; paginationData: ReturnType; sortData: ReturnType>; isSeatsCapExceeded: boolean; }; const UsersTable = ({ users, total, isLoading, isError, isSuccess, setUserFilters, roleData, tab, onReload, paginationData, sortData, isSeatsCapExceeded, }: UsersTableProps): ReactElement | null => { const { t } = useTranslation(); const router = useRouter(); const breakpoints = useBreakpoints(); const isMobile = !breakpoints.includes('xl'); const isLaptop = !breakpoints.includes('xxl'); const showVoipExtension = useShowVoipExtension(); const { current, itemsPerPage, setCurrent, setItemsPerPage, ...paginationProps } = paginationData; const isKeyboardEvent = (event: MouseEvent | KeyboardEvent): event is KeyboardEvent => { return (event as KeyboardEvent).key !== undefined; }; const handleClickOrKeyDown = useEffectEvent((id: IUser['_id'], e: MouseEvent | KeyboardEvent): void => { e.stopPropagation(); const keyboardSubmitKeys = ['Enter', ' ']; if (isKeyboardEvent(e) && !keyboardSubmitKeys.includes(e.key)) { return; } router.navigate({ name: 'admin-users', params: { context: 'info', id, }, }); }); const headers = useMemo( () => [ {t('Name')} , {t('Username')} , !isLaptop && ( {t('Email')} ), !isLaptop && {t('Roles')}, tab === 'all' && !isMobile && ( {t('Registration_status')} ), tab === 'pending' && !isMobile && ( {t('Pending_action')} ), tab === 'all' && showVoipExtension && ( {t('Voice_call_extension')} ), {t('Actions')} , ], [sortData, t, isLaptop, tab, isMobile, showVoipExtension], ); return ( <> {isLoading && ( {headers} )} {isError && ( )} {isSuccess && users.length === 0 && ( )} {isSuccess && users.length > 0 && ( <> {headers} {users.map((user) => ( ))} )} ); }; export default UsersTable;