import type { IUser, Serialized } from '@rocket.chat/core-typings'; import { Box, Margins, Tag } from '@rocket.chat/fuselage'; import { useUserDisplayName, ContextualbarScrollableContent, InfoPanel, InfoPanelActionGroup, InfoPanelAvatar, InfoPanelField, InfoPanelLabel, InfoPanelSection, InfoPanelText, InfoPanelTitle, } from '@rocket.chat/ui-client'; import type { TranslationKey } from '@rocket.chat/ui-contexts'; import type { ReactNode } from 'react'; import { memo, useId } from 'react'; import { useTranslation } from 'react-i18next'; import { useTimeAgo } from '../../hooks/useTimeAgo'; import { useUserCustomFields } from '../../hooks/useUserCustomFields'; import MarkdownText from '../MarkdownText'; import UTCClock from '../UTCClock'; import { UserCardRoles } from '../UserCard'; import UserInfoABACAttributes from './UserInfoABACAttributes'; import UserInfoAvatar from './UserInfoAvatar'; type UserInfoDataProps = Serialized< Pick< IUser, | 'name' | 'username' | 'nickname' | 'bio' | 'lastLogin' | 'avatarETag' | 'utcOffset' | 'phone' | 'createdAt' | 'canViewAllInfo' | 'customFields' | 'freeSwitchExtension' | 'abacAttributes' > >; export type UserInfoProps = UserInfoDataProps & { status: ReactNode; customStatus?: ReactNode; email?: string; verified?: boolean; actions: ReactNode; roles: ReactNode[]; reason?: string; invitationDate?: string; }; const UserInfo = ({ username, name, lastLogin, nickname, bio, avatarETag, roles, utcOffset, phone, email, verified, createdAt, status, customStatus, customFields, canViewAllInfo, actions, reason, freeSwitchExtension, abacAttributes, invitationDate, ...props }: UserInfoProps) => { const { t } = useTranslation(); const timeAgo = useTimeAgo(); const userDisplayName = useUserDisplayName({ name, username }); const userCustomFields = useUserCustomFields(customFields); const usernameId = useId(); return ( {username && ( )} {actions && {actions}} {userDisplayName && } {customStatus && {customStatus}} {reason && ( {t('Reason_for_joining')} {reason} )} {nickname && ( {t('Nickname')} {nickname} )} {roles?.length !== 0 && ( {t('Roles')} {roles} )} {username && username !== name && ( {t('Username')} {username} )} {utcOffset && Number.isInteger(utcOffset) && ( {t('Local_Time')} )} {bio && ( {t('Bio')} )} {Number.isInteger(utcOffset) && canViewAllInfo && ( {t('Last_login')} {lastLogin ? timeAgo(lastLogin) : t('Never')} )} {phone && ( {t('Phone')} {phone} )} {email && ( {t('Email')} {email} {verified ? t('Verified') : t('Not_verified')} )} {freeSwitchExtension && ( {t('Voice_call_extension')} {freeSwitchExtension} )} {abacAttributes && abacAttributes.length > 0 && ( {t('ABAC_Attributes')} )} {userCustomFields?.map( (customField) => customField?.value && ( {t(customField.label as TranslationKey)} ), )} {invitationDate && ( {t('Invitation_date')} {timeAgo(invitationDate)} )} {createdAt && ( {t('Created_at')} {timeAgo(createdAt)} )} ); }; export default memo(UserInfo);