import { UserStatus as Status } from '@rocket.chat/core-typings'; import type { IUser, Serialized } from '@rocket.chat/core-typings'; import { Box, Button } from '@rocket.chat/fuselage'; import type { DefaultUserInfo } from '@rocket.chat/rest-typings'; import { UserAvatar } from '@rocket.chat/ui-avatar'; import { GenericMenu, GenericTableRow, GenericTableCell } from '@rocket.chat/ui-client'; import type { KeyboardEvent, MouseEvent, ReactElement } from 'react'; import { useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { UserStatus } from '../../../../components/UserStatus'; import { Roles } from '../../../../stores'; import type { AdminUsersTab } from '../AdminUsersPage'; import { useChangeAdminStatusAction } from '../hooks/useChangeAdminStatusAction'; import { useChangeUserStatusAction } from '../hooks/useChangeUserStatusAction'; import { useDeleteUserAction } from '../hooks/useDeleteUserAction'; import { useResetE2EEKeyAction } from '../hooks/useResetE2EEKeyAction'; import { useResetTOTPAction } from '../hooks/useResetTOTPAction'; import { useSendWelcomeEmailMutation } from '../hooks/useSendWelcomeEmailMutation'; type UsersTableRowProps = { user: Serialized; tab: AdminUsersTab; isMobile: boolean; isLaptop: boolean; onReload: () => void; onClick: (id: IUser['_id'], e: MouseEvent | KeyboardEvent) => void; isSeatsCapExceeded: boolean; showVoipExtension: boolean; }; const UsersTableRow = ({ user, tab, isMobile, isLaptop, isSeatsCapExceeded, showVoipExtension, onClick, onReload, }: UsersTableRowProps): ReactElement => { const { t } = useTranslation(); const { _id, emails, username = '', name = '', roles, status, active, avatarETag, lastLogin, type, freeSwitchExtension, federated, } = user; const registrationStatusText = useMemo(() => { const usersExcludedFromPending = ['bot', 'app']; if (!active && lastLogin) { return t('Deactivated'); } if (federated) { return t('Federated'); } if (!lastLogin && !usersExcludedFromPending.includes(type)) { return t('Pending'); } if (active && lastLogin) { return t('Active'); } }, [active, lastLogin, t, type, federated]); const roleNames = Roles.use((state) => { return roles ?.map((roleId) => state.get(roleId)?.name) .filter((roleName): roleName is string => !!roleName) .join(', '); }); const userId = user._id; const isAdmin = user.roles?.includes('admin'); const isActive = user.active; const isFederatedUser = !!user.federated; const changeAdminStatusAction = useChangeAdminStatusAction(username, isAdmin, onReload); const changeUserStatusAction = useChangeUserStatusAction(userId, isActive, onReload); const deleteUserAction = useDeleteUserAction(userId, onReload, onReload); const resetTOTPAction = useResetTOTPAction(userId); const resetE2EKeyAction = useResetE2EEKeyAction(userId); const resendWelcomeEmail = useSendWelcomeEmailMutation(); const isNotPendingDeactivatedNorFederated = tab !== 'pending' && tab !== 'deactivated' && !isFederatedUser; const actions = useMemo( () => ({ ...(isNotPendingDeactivatedNorFederated && changeAdminStatusAction && { changeAdminStatusAction, }), ...(isNotPendingDeactivatedNorFederated && resetE2EKeyAction && { resetE2EKeyAction, }), ...(isNotPendingDeactivatedNorFederated && resetTOTPAction && { resetTOTPAction }), ...(changeUserStatusAction && !isFederatedUser && { changeUserStatusAction, }), ...(deleteUserAction && { deleteUserAction, }), }), [ changeAdminStatusAction, changeUserStatusAction, deleteUserAction, isFederatedUser, isNotPendingDeactivatedNorFederated, resetE2EKeyAction, resetTOTPAction, ], ); const menuOptions = Object.entries(actions).map(([_key, item]) => { return { ...item, id: item.content || item.title || '', content: item.content || item.title, }; }); const handleResendWelcomeEmail = () => resendWelcomeEmail.mutateAsync({ email: emails?.[0].address }); return ( onClick(_id, e)} onClick={(e) => onClick(_id, e)} tabIndex={0} role='link' action qa-user-id={_id}> {username && } {name || username} {username} {!isLaptop && {emails?.length && emails[0].address}} {!isLaptop && {roleNames}} {tab === 'all' && !isMobile && ( {registrationStatusText} )} {tab === 'pending' && !isMobile && ( {active ? t('User_first_log_in') : t('Activation')} )} {tab === 'all' && showVoipExtension && ( {freeSwitchExtension || t('Not_assigned')} )} { e.stopPropagation(); }} > {tab === 'pending' && ( <> {active ? ( ) : ( )} )} ); }; export default UsersTableRow;