refactor: Moves `getUserDisplayName` outside from meteor app (#35031)

pull/35195/head^2
Douglas Fabris 11 months ago committed by GitHub
parent a9956c04d8
commit f89741d174
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 2
      apps/meteor/app/lib/server/functions/attachMessage.ts
  2. 3
      apps/meteor/app/lib/server/startup/mentionUserNotInChannel.ts
  3. 2
      apps/meteor/client/NavBarV2/NavBarSettingsToolbar/UserMenu/UserMenuHeader.tsx
  4. 2
      apps/meteor/client/components/UserInfo/UserInfo.tsx
  5. 7
      apps/meteor/client/components/message/MessageHeader.tsx
  6. 5
      apps/meteor/client/components/message/variants/SystemMessage.tsx
  7. 3
      apps/meteor/client/hooks/useRoomName.ts
  8. 16
      apps/meteor/client/lib/getUserDisplayName.spec.ts
  9. 2
      apps/meteor/client/sidebar/header/UserMenuHeader.tsx
  10. 2
      apps/meteor/client/views/admin/moderation/helpers/ContextMessage.tsx
  11. 2
      apps/meteor/client/views/conference/ConferencePage.tsx
  12. 5
      apps/meteor/client/views/omnichannel/contactHistory/MessageList/ContactHistoryMessage.tsx
  13. 2
      apps/meteor/client/views/outlookCalendar/hooks/useOutlookOpenCall.ts
  14. 2
      apps/meteor/client/views/room/UserCard/UserCardWithData.tsx
  15. 3
      apps/meteor/client/views/room/body/RoomForeword/RoomForewordUsernameList.tsx
  16. 8
      apps/meteor/client/views/room/body/RoomForeword/RoomForewordUsernameListItem.tsx
  17. 48
      apps/meteor/client/views/room/composer/messageBox/MessageBoxReplies.tsx
  18. 55
      apps/meteor/client/views/room/composer/messageBox/MessageBoxReply.tsx
  19. 7
      apps/meteor/client/views/room/contextualBar/VideoConference/VideoConfList/VideoConfListItem.tsx
  20. 3
      apps/meteor/client/views/room/contextualBar/VideoConference/hooks/useVideoConfRoomName.ts
  21. 2
      apps/meteor/client/views/room/hooks/useUserInfoActions/actions/useReportUser.tsx
  22. 2
      apps/meteor/client/views/room/modals/ForwardMessageModal/ForwardMessageModal.tsx
  23. 2
      apps/meteor/client/views/room/modals/PinMessageModal/PinMessageModal.tsx
  24. 2
      apps/meteor/client/views/room/modals/ReadReceiptsModal/ReadReceiptRow.tsx
  25. 4
      apps/meteor/lib/createQuoteAttachment.ts
  26. 4
      apps/meteor/lib/getUserDisplayName.ts
  27. 2
      apps/meteor/server/lib/rooms/roomCoordinator.ts
  28. 3
      packages/core-typings/src/IUser.ts
  29. 11
      packages/fuselage-ui-kit/src/blocks/VideoConferenceBlock/VideoConferenceBlock.tsx
  30. 1
      packages/ui-client/src/components/index.ts
  31. 7
      packages/ui-client/src/hooks/index.ts
  32. 36
      packages/ui-client/src/hooks/useUserDisplayName.spec.ts
  33. 3
      packages/ui-client/src/hooks/useUserDisplayName.ts
  34. 6
      packages/ui-client/src/index.ts
  35. 7
      packages/ui-video-conf/src/VideoConfMessage/VideoConfMessageUserStack.tsx

@ -1,6 +1,6 @@
import { getUserDisplayName } from '@rocket.chat/core-typings';
import type { IMessage, IRoom, MessageAttachment } from '@rocket.chat/core-typings';
import { getUserDisplayName } from '../../../../lib/getUserDisplayName';
import { roomCoordinator } from '../../../../server/lib/rooms/roomCoordinator';
import { settings } from '../../../settings/server/cached';
import { getUserAvatarURL } from '../../../utils/server/getUserAvatarURL';

@ -1,12 +1,11 @@
import { api } from '@rocket.chat/core-services';
import type { IMessage } from '@rocket.chat/core-typings';
import { isDirectMessageRoom, isEditedMessage, isOmnichannelRoom, isRoomFederated } from '@rocket.chat/core-typings';
import { isDirectMessageRoom, isEditedMessage, isOmnichannelRoom, isRoomFederated, getUserDisplayName } from '@rocket.chat/core-typings';
import { Subscriptions, Users } from '@rocket.chat/models';
import type { ActionsBlock } from '@rocket.chat/ui-kit';
import moment from 'moment';
import { callbacks } from '../../../../lib/callbacks';
import { getUserDisplayName } from '../../../../lib/getUserDisplayName';
import { isTruthy } from '../../../../lib/isTruthy';
import { i18n } from '../../../../server/lib/i18n';
import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission';

@ -1,12 +1,12 @@
import type { IUser } from '@rocket.chat/core-typings';
import { Box, Margins } from '@rocket.chat/fuselage';
import { UserAvatar } from '@rocket.chat/ui-avatar';
import { useUserDisplayName } from '@rocket.chat/ui-client';
import { useSetting } from '@rocket.chat/ui-contexts';
import { useTranslation } from 'react-i18next';
import MarkdownText from '../../../components/MarkdownText';
import { UserStatus } from '../../../components/UserStatus';
import { useUserDisplayName } from '../../../hooks/useUserDisplayName';
type UserMenuHeaderProps = { user: IUser };

@ -1,5 +1,6 @@
import type { IUser, Serialized } from '@rocket.chat/core-typings';
import { Box, Margins, Tag } from '@rocket.chat/fuselage';
import { useUserDisplayName } from '@rocket.chat/ui-client';
import type { TranslationKey } from '@rocket.chat/ui-contexts';
import type { ReactElement, ReactNode } from 'react';
import { memo } from 'react';
@ -7,7 +8,6 @@ import { useTranslation } from 'react-i18next';
import { useTimeAgo } from '../../hooks/useTimeAgo';
import { useUserCustomFields } from '../../hooks/useUserCustomFields';
import { useUserDisplayName } from '../../hooks/useUserDisplayName';
import { ContextualbarScrollableContent } from '../Contextualbar';
import {
InfoPanel,

@ -7,6 +7,7 @@ import {
MessageStatusPrivateIndicator,
MessageNameContainer,
} from '@rocket.chat/fuselage';
import { useUserDisplayName } from '@rocket.chat/ui-client';
import type { KeyboardEvent, ReactElement } from 'react';
import { memo } from 'react';
import { useTranslation } from 'react-i18next';
@ -14,7 +15,6 @@ import { useTranslation } from 'react-i18next';
import StatusIndicators from './StatusIndicators';
import MessageRoles from './header/MessageRoles';
import { useMessageListShowUsername, useMessageListShowRealName, useMessageListShowRoles } from './list/MessageListContext';
import { getUserDisplayName } from '../../../lib/getUserDisplayName';
import { useFormatDateAndTime } from '../../hooks/useFormatDateAndTime';
import { useFormatTime } from '../../hooks/useFormatTime';
import { useUserData } from '../../hooks/useUserData';
@ -37,6 +37,7 @@ const MessageHeader = ({ message }: MessageHeaderProps): ReactElement => {
const user: UserPresence = { ...message.u, roles: [], ...useUserData(message.u._id) };
const usernameAndRealNameAreSame = !user.name || user.username === user.name;
const showUsername = useMessageListShowUsername() && showRealName && !usernameAndRealNameAreSame;
const displayName = useUserDisplayName(user);
const showRoles = useMessageListShowRoles();
const roles = useMessageRoles(message.u._id, message.rid, showRoles);
@ -48,7 +49,7 @@ const MessageHeader = ({ message }: MessageHeaderProps): ReactElement => {
tabIndex={0}
role='button'
id={`${message._id}-displayName`}
aria-label={getUserDisplayName(user.name, user.username, showRealName)}
aria-label={displayName}
onClick={(e) => openUserCard(e, message.u.username)}
onKeyDown={(e: KeyboardEvent<HTMLSpanElement>) => {
(e.code === 'Enter' || e.code === 'Space') && openUserCard(e, message.u.username);
@ -61,7 +62,7 @@ const MessageHeader = ({ message }: MessageHeaderProps): ReactElement => {
title={!showUsername && !usernameAndRealNameAreSame ? `@${user.username}` : undefined}
data-username={user.username}
>
{message.alias || getUserDisplayName(user.name, user.username, showRealName)}
{message.alias || displayName}
</MessageName>
{showUsername && (
<>

@ -12,13 +12,13 @@ import {
MessageNameContainer,
} from '@rocket.chat/fuselage';
import { UserAvatar } from '@rocket.chat/ui-avatar';
import { useUserDisplayName } from '@rocket.chat/ui-client';
import type { TranslationKey } from '@rocket.chat/ui-contexts';
import type { ComponentProps, ReactElement, KeyboardEvent } from 'react';
import { memo } from 'react';
import { useTranslation } from 'react-i18next';
import { MessageTypes } from '../../../../app/ui-utils/client';
import { getUserDisplayName } from '../../../../lib/getUserDisplayName';
import { useFormatDateAndTime } from '../../../hooks/useFormatDateAndTime';
import { useFormatTime } from '../../../hooks/useFormatTime';
import { useUserData } from '../../../hooks/useUserData';
@ -49,6 +49,7 @@ const SystemMessage = ({ message, showUserAvatar, ...props }: SystemMessageProps
const user: UserPresence = { ...message.u, roles: [], ...useUserData(message.u._id) };
const usernameAndRealNameAreSame = !user.name || user.username === user.name;
const showUsername = useMessageListShowUsername() && showRealName && !usernameAndRealNameAreSame;
const displayName = useUserDisplayName(user);
const messageType = MessageTypes.getType(message);
@ -85,7 +86,7 @@ const SystemMessage = ({ message, showUserAvatar, ...props }: SystemMessageProps
style={{ cursor: 'pointer' }}
{...triggerProps}
>
<MessageSystemName>{getUserDisplayName(user.name, user.username, showRealName)}</MessageSystemName>
<MessageSystemName>{displayName}</MessageSystemName>
{showUsername && (
<>
{' '}

@ -1,9 +1,8 @@
import type { IRoom } from '@rocket.chat/core-typings';
import { isDirectMessageRoom } from '@rocket.chat/core-typings';
import { useUserDisplayName } from '@rocket.chat/ui-client';
import { useUserSubscription } from '@rocket.chat/ui-contexts';
import { useUserDisplayName } from './useUserDisplayName';
/**
*
* Hook to get the name of the room

@ -0,0 +1,16 @@
import { getUserDisplayName } from '@rocket.chat/core-typings';
const fakeUser = {
name: 'John Doe',
username: 'john.doe',
};
it('should return username if UI_Use_Real_Name setting is false', () => {
const result = getUserDisplayName(fakeUser.name, fakeUser.username, false);
expect(result).toBe(fakeUser.username);
});
it('should return name if UI_Use_Real_Name setting is true', () => {
const result = getUserDisplayName(fakeUser.name, fakeUser.username, true);
expect(result).toBe(fakeUser.name);
});

@ -1,12 +1,12 @@
import type { IUser } from '@rocket.chat/core-typings';
import { Box, Margins } from '@rocket.chat/fuselage';
import { UserAvatar } from '@rocket.chat/ui-avatar';
import { useUserDisplayName } from '@rocket.chat/ui-client';
import { useSetting } from '@rocket.chat/ui-contexts';
import { useTranslation } from 'react-i18next';
import MarkdownText from '../../components/MarkdownText';
import { UserStatus } from '../../components/UserStatus';
import { useUserDisplayName } from '../../hooks/useUserDisplayName';
const UserMenuHeader = ({ user }: { user: IUser }) => {
const { t } = useTranslation();

@ -2,6 +2,7 @@ import type { IMessage, MessageReport, MessageAttachment } from '@rocket.chat/co
import { isE2EEMessage, isQuoteAttachment } from '@rocket.chat/core-typings';
import { Message, MessageName, MessageToolbarItem, MessageToolbarWrapper, MessageUsername } from '@rocket.chat/fuselage';
import { UserAvatar } from '@rocket.chat/ui-avatar';
import { useUserDisplayName } from '@rocket.chat/ui-client';
import { useSetting } from '@rocket.chat/ui-contexts';
import { useTranslation } from 'react-i18next';
@ -12,7 +13,6 @@ import UiKitMessageBlock from '../../../../components/message/uikit/UiKitMessage
import { useFormatDate } from '../../../../hooks/useFormatDate';
import { useFormatDateAndTime } from '../../../../hooks/useFormatDateAndTime';
import { useFormatTime } from '../../../../hooks/useFormatTime';
import { useUserDisplayName } from '../../../../hooks/useUserDisplayName';
import MessageReportInfo from '../MessageReportInfo';
import useDeleteMessage from '../hooks/useDeleteMessage';
import { useDismissMessageAction } from '../hooks/useDismissMessageAction';

@ -1,9 +1,9 @@
import { useUserDisplayName } from '@rocket.chat/ui-client';
import { useRoute, useSetModal, useUser } from '@rocket.chat/ui-contexts';
import type { ReactElement } from 'react';
import { useEffect } from 'react';
import ConferencePageError from './ConferencePageError';
import { useUserDisplayName } from '../../hooks/useUserDisplayName';
import { useVideoConfOpenCall } from '../room/contextualBar/VideoConference/hooks/useVideoConfOpenCall';
import PageLoading from '../root/PageLoading';

@ -19,10 +19,10 @@ import {
Bubble,
} from '@rocket.chat/fuselage';
import { UserAvatar } from '@rocket.chat/ui-avatar';
import { useUserDisplayName } from '@rocket.chat/ui-client';
import { memo } from 'react';
import { useTranslation } from 'react-i18next';
import { getUserDisplayName } from '../../../../../lib/getUserDisplayName';
import MessageContentBody from '../../../../components/message/MessageContentBody';
import StatusIndicators from '../../../../components/message/StatusIndicators';
import Attachments from '../../../../components/message/content/Attachments';
@ -44,6 +44,7 @@ const ContactHistoryMessage = ({ message, sequential, isNewDay, showUserAvatar }
const format = useFormatDate();
const formatTime = useFormatTime();
const displayName = useUserDisplayName(message.u);
const quotes = message?.attachments?.filter(isQuoteAttachment) || [];
@ -106,7 +107,7 @@ const ContactHistoryMessage = ({ message, sequential, isNewDay, showUserAvatar }
{!sequential && (
<MessageHeaderTemplate>
<MessageName title={`@${message.u.username}`} data-username={message.u.username}>
{message.alias || getUserDisplayName(message.u.name, message.u.username, false)}
{message.alias || displayName}
</MessageName>
<MessageUsername data-username={message.u.username} data-qa-type='username'>
@{message.u.username}

@ -1,6 +1,6 @@
import { useUserDisplayName } from '@rocket.chat/ui-client';
import { useUser } from '@rocket.chat/ui-contexts';
import { useUserDisplayName } from '../../../hooks/useUserDisplayName';
import { useVideoConfOpenCall } from '../../room/contextualBar/VideoConference/hooks/useVideoConfOpenCall';
export const useOutlookOpenCall = (meetingUrl?: string) => {

@ -1,3 +1,4 @@
import { getUserDisplayName } from '@rocket.chat/core-typings';
import type { IRoom } from '@rocket.chat/core-typings';
import { useEffectEvent } from '@rocket.chat/fuselage-hooks';
import { GenericMenu } from '@rocket.chat/ui-client';
@ -6,7 +7,6 @@ import type { ReactElement } from 'react';
import { useMemo } from 'react';
import { useTranslation } from 'react-i18next';
import { getUserDisplayName } from '../../../../lib/getUserDisplayName';
import LocalTime from '../../../components/LocalTime';
import { UserCard, UserCardAction, UserCardRole, UserCardSkeleton } from '../../../components/UserCard';
import { ReactiveUserStatus } from '../../../components/UserStatus';

@ -1,6 +1,5 @@
import type { IUser } from '@rocket.chat/core-typings';
import { Margins } from '@rocket.chat/fuselage';
import { useSetting } from '@rocket.chat/ui-contexts';
import RoomForewordUsernameListItem from './RoomForewordUsernameListItem';
import { roomCoordinator } from '../../../../lib/rooms/roomCoordinator';
@ -8,7 +7,6 @@ import { roomCoordinator } from '../../../../lib/rooms/roomCoordinator';
type RoomForewordUsernameListProps = { usernames: Array<NonNullable<IUser['username']>> };
const RoomForewordUsernameList = ({ usernames }: RoomForewordUsernameListProps) => {
const useRealName = useSetting('UI_Use_Real_Name', false);
return (
<Margins inline={4}>
{usernames.map((username) => (
@ -16,7 +14,6 @@ const RoomForewordUsernameList = ({ usernames }: RoomForewordUsernameListProps)
username={username}
key={username}
href={roomCoordinator.getRouteLink('d', { name: username }) || undefined}
useRealName={useRealName}
/>
))}
</Margins>

@ -1,23 +1,23 @@
import type { IUser } from '@rocket.chat/core-typings';
import { Icon, Tag, Skeleton } from '@rocket.chat/fuselage';
import { useUserDisplayName } from '@rocket.chat/ui-client';
import { getUserDisplayName } from '../../../../../lib/getUserDisplayName';
import { useUserInfoQuery } from '../../../../hooks/useUserInfoQuery';
type RoomForewordUsernameListItemProps = {
href: string | undefined;
username: NonNullable<IUser['username']>;
useRealName: boolean;
};
const RoomForewordUsernameListItem = ({ username, href, useRealName }: RoomForewordUsernameListItemProps) => {
const RoomForewordUsernameListItem = ({ username, href }: RoomForewordUsernameListItemProps) => {
const { data, isLoading, isError, isSuccess } = useUserInfoQuery({ username });
const displayName = useUserDisplayName({ name: data?.user?.name, username });
return (
<Tag icon={<Icon name='user' size='x20' />} data-username={username} large href={href}>
{isLoading && <Skeleton variant='rect' />}
{isError && username}
{isSuccess && getUserDisplayName(data?.user?.name, username, useRealName)}
{isSuccess && displayName}
</Tag>
);
};

@ -1,13 +1,8 @@
import type { MessageQuoteAttachment } from '@rocket.chat/core-typings';
import { css } from '@rocket.chat/css-in-js';
import { IconButton, Box, Margins } from '@rocket.chat/fuselage';
import { useSetting } from '@rocket.chat/ui-contexts';
import { Box } from '@rocket.chat/fuselage';
import type { ReactElement } from 'react';
import { memo, useSyncExternalStore } from 'react';
import { getUserDisplayName } from '../../../../../lib/getUserDisplayName';
import { QuoteAttachment } from '../../../../components/message/content/attachments/QuoteAttachment';
import AttachmentProvider from '../../../../providers/AttachmentProvider';
import MessageBoxReply from './MessageBoxReply';
import { useChat } from '../../contexts/ChatContext';
const MessageBoxReplies = (): ReactElement | null => {
@ -19,49 +14,14 @@ const MessageBoxReplies = (): ReactElement | null => {
const replies = useSyncExternalStore(chat.composer.quotedMessages.subscribe, chat.composer.quotedMessages.get);
const useRealName = useSetting('UI_Use_Real_Name', false);
if (!replies.length) {
return null;
}
const closeWrapperStyle = css`
position: absolute;
right: 0.5rem;
top: 0.75rem;
`;
return (
<Box mbe={8} position='relative' overflowY='auto' maxHeight='x256'>
{replies.map((reply, key) => (
<Margins block={4} key={key}>
<Box display='flex' position='relative'>
<AttachmentProvider>
<QuoteAttachment
attachment={
{
text: reply.msg,
md: reply.md,
author_name: reply.alias || getUserDisplayName(reply.u.name, reply.u.username, useRealName),
author_icon: `/avatar/${reply.u.username}`,
ts: reply.ts,
attachments: reply?.attachments?.map((obj) => ({ ...obj, collapsed: true })),
collapsed: true,
} as MessageQuoteAttachment
}
/>
</AttachmentProvider>
<Box
className={closeWrapperStyle}
data-mid={reply._id}
onClick={(): void => {
chat.composer?.dismissQuotedMessage(reply._id);
}}
>
<IconButton mini icon='cross' />
</Box>
</Box>
</Margins>
{replies.map((reply) => (
<MessageBoxReply key={reply._id} reply={reply} />
))}
</Box>
);

@ -0,0 +1,55 @@
import type { IMessage, MessageQuoteAttachment } from '@rocket.chat/core-typings';
import { css } from '@rocket.chat/css-in-js';
import { IconButton, Box, Margins } from '@rocket.chat/fuselage';
import { useUserDisplayName } from '@rocket.chat/ui-client';
import type { ReactElement } from 'react';
import { memo } from 'react';
import { QuoteAttachment } from '../../../../components/message/content/attachments/QuoteAttachment';
import AttachmentProvider from '../../../../providers/AttachmentProvider';
import { useChat } from '../../contexts/ChatContext';
const MessageBoxReply = ({ reply }: { reply: IMessage }): ReactElement | null => {
const chat = useChat();
const displayName = useUserDisplayName(reply?.u);
const closeWrapperStyle = css`
position: absolute;
right: 0.5rem;
top: 0.75rem;
`;
return (
<Margins block={4}>
<Box display='flex' position='relative'>
<AttachmentProvider>
<QuoteAttachment
attachment={
{
text: reply.msg,
md: reply.md,
author_name: reply.alias || displayName,
author_icon: `/avatar/${reply.u.username}`,
ts: reply.ts,
attachments: reply?.attachments?.map((obj) => ({ ...obj, collapsed: true })),
collapsed: true,
} as MessageQuoteAttachment
}
/>
</AttachmentProvider>
<Box
className={closeWrapperStyle}
data-mid={reply._id}
onClick={(): void => {
chat?.composer?.dismissQuotedMessage(reply._id);
}}
>
<IconButton mini icon='cross' />
</Box>
</Box>
</Margins>
);
};
export default memo(MessageBoxReply);

@ -3,7 +3,8 @@ import { css } from '@rocket.chat/css-in-js';
import { Button, Message, Box, Avatar, Palette, IconButton, ButtonGroup } from '@rocket.chat/fuselage';
import { useEffectEvent } from '@rocket.chat/fuselage-hooks';
import { UserAvatar } from '@rocket.chat/ui-avatar';
import { useTranslation, useSetting } from '@rocket.chat/ui-contexts';
import { useUserDisplayName } from '@rocket.chat/ui-client';
import { useTranslation } from '@rocket.chat/ui-contexts';
import { useVideoConfJoinCall } from '@rocket.chat/ui-video-conf';
import type { ReactElement } from 'react';
@ -24,7 +25,6 @@ const VideoConfListItem = ({
const t = useTranslation();
const formatDate = useTimeAgo();
const joinCall = useVideoConfJoinCall();
const showRealName = useSetting('UI_Use_Real_Name', false);
const {
_id: callId,
@ -35,6 +35,7 @@ const VideoConfListItem = ({
discussionRid,
} = videoConfData;
const displayName = useUserDisplayName({ name, username });
const joinedUsers = users.filter((user) => user._id !== _id);
const hovered = css`
@ -67,7 +68,7 @@ const VideoConfListItem = ({
<Message.LeftContainer>{username && <UserAvatar username={username} size='x36' />}</Message.LeftContainer>
<Message.Container>
<Message.Header>
<Message.Name title={username}>{showRealName ? name : username}</Message.Name>
<Message.Name title={username}>{displayName}</Message.Name>
<Message.Timestamp>{formatDate(createdAt)}</Message.Timestamp>
</Message.Header>
<Message.Body clamp={2} />

@ -1,9 +1,8 @@
import type { IRoom } from '@rocket.chat/core-typings';
import { isDirectMessageRoom } from '@rocket.chat/core-typings';
import { useUserDisplayName } from '@rocket.chat/ui-client';
import { useUserSubscription } from '@rocket.chat/ui-contexts';
import { useUserDisplayName } from '../../../../../hooks/useUserDisplayName';
export const useVideoConfRoomName = (room: IRoom): string | undefined => {
const subscription = useUserSubscription(room._id);
const username = useUserDisplayName({ name: subscription?.fname, username: subscription?.name });

@ -1,10 +1,10 @@
import type { IUser } from '@rocket.chat/core-typings';
import { useUserDisplayName } from '@rocket.chat/ui-client';
import { useEndpoint, useSetModal, useToastMessageDispatch, useUserId } from '@rocket.chat/ui-contexts';
import { useMutation } from '@tanstack/react-query';
import { useMemo } from 'react';
import { useTranslation } from 'react-i18next';
import { useUserDisplayName } from '../../../../../hooks/useUserDisplayName';
import ReportUserModal from '../../../contextualBar/UserInfo/ReportUserModal';
import type { UserInfoAction } from '../useUserInfoActions';

@ -1,6 +1,7 @@
import type { IMessage, MessageQuoteAttachment } from '@rocket.chat/core-typings';
import { Modal, Field, FieldGroup, FieldLabel, FieldRow, FieldHint, ButtonGroup, Button } from '@rocket.chat/fuselage';
import { useClipboard } from '@rocket.chat/fuselage-hooks';
import { useUserDisplayName } from '@rocket.chat/ui-client';
import { useTranslation, useEndpoint, useToastMessageDispatch, useUserAvatarPath } from '@rocket.chat/ui-contexts';
import { useMutation } from '@tanstack/react-query';
import type { ReactElement } from 'react';
@ -9,7 +10,6 @@ import { useForm, Controller } from 'react-hook-form';
import UserAndRoomAutoCompleteMultiple from '../../../../components/UserAndRoomAutoCompleteMultiple';
import { QuoteAttachment } from '../../../../components/message/content/attachments/QuoteAttachment';
import { useUserDisplayName } from '../../../../hooks/useUserDisplayName';
import { prependReplies } from '../../../../lib/utils/prependReplies';
type ForwardMessageProps = {

@ -1,11 +1,11 @@
import type { MessageQuoteAttachment, IMessage } from '@rocket.chat/core-typings';
import { Box } from '@rocket.chat/fuselage';
import { useUserDisplayName } from '@rocket.chat/ui-client';
import { useTranslation, useUserAvatarPath } from '@rocket.chat/ui-contexts';
import type { ComponentProps, ReactElement } from 'react';
import GenericModal from '../../../../components/GenericModal';
import { QuoteAttachment } from '../../../../components/message/content/attachments/QuoteAttachment';
import { useUserDisplayName } from '../../../../hooks/useUserDisplayName';
import AttachmentProvider from '../../../../providers/AttachmentProvider';
type PinMessageModalProps = { message: IMessage } & ComponentProps<typeof GenericModal>;

@ -1,10 +1,10 @@
import type { ReadReceipt } from '@rocket.chat/core-typings';
import { Box } from '@rocket.chat/fuselage';
import { UserAvatar } from '@rocket.chat/ui-avatar';
import { useUserDisplayName } from '@rocket.chat/ui-client';
import type { ReactElement } from 'react';
import { useFormatDateAndTime } from '../../../../hooks/useFormatDateAndTime';
import { useUserDisplayName } from '../../../../hooks/useUserDisplayName';
const ReadReceiptRow = ({ user, ts }: ReadReceipt): ReactElement => {
const displayName = useUserDisplayName(user || {});

@ -1,8 +1,6 @@
import { isTranslatedMessage } from '@rocket.chat/core-typings';
import { isTranslatedMessage, getUserDisplayName } from '@rocket.chat/core-typings';
import type { ITranslatedMessage, IMessage } from '@rocket.chat/core-typings';
import { getUserDisplayName } from './getUserDisplayName';
export function createQuoteAttachment(
message: IMessage | ITranslatedMessage,
messageLink: string,

@ -1,4 +0,0 @@
import type { IUser } from '@rocket.chat/core-typings';
export const getUserDisplayName = (name: IUser['name'], username: IUser['username'], useRealName: boolean): string | undefined =>
useRealName ? name || username : username;

@ -1,9 +1,9 @@
import { getUserDisplayName } from '@rocket.chat/core-typings';
import type { IRoom, RoomType, IUser, IMessage, ReadReceipt, ValueOf, AtLeast } from '@rocket.chat/core-typings';
import { Users } from '@rocket.chat/models';
import { settings } from '../../../app/settings/server';
import type { IRoomTypeConfig, IRoomTypeServerDirectives, RoomSettingsEnum, RoomMemberActions } from '../../../definition/IRoomTypeConfig';
import { getUserDisplayName } from '../../../lib/getUserDisplayName';
import { RoomCoordinator } from '../../../lib/rooms/coordinator';
class RoomCoordinatorServer extends RoomCoordinator {

@ -264,3 +264,6 @@ export type AvatarServiceObject = {
};
export type AvatarObject = AvatarReset | AvatarUrlObj | FormData | AvatarServiceObject;
export const getUserDisplayName = (name: IUser['name'], username: IUser['username'], useRealName: boolean): string | undefined =>
useRealName ? name || username : username;

@ -1,4 +1,7 @@
import { VideoConferenceStatus } from '@rocket.chat/core-typings';
import {
getUserDisplayName,
VideoConferenceStatus,
} from '@rocket.chat/core-typings';
import {
useGoToRoom,
useSetting,
@ -42,7 +45,7 @@ const VideoConferenceBlock = ({
const userId = useUserId();
const goToRoom = useGoToRoom();
const displayAvatars = useUserPreference<boolean>('displayAvatars');
const showRealName = useSetting('UI_Use_Real_Name');
const showRealName = useSetting('UI_Use_Real_Name', false);
const { action, viewId = undefined, rid } = useContext(UiKitContext);
@ -127,7 +130,9 @@ const VideoConferenceBlock = ({
const joinedNamesOrUsernames = [...data.users]
.splice(0, MAX_USERS)
.map(({ name, username }) => (showRealName ? name || username : username))
.map(({ name, username }) =>
getUserDisplayName(name, username, showRealName),
)
.join(', ');
const title =

@ -4,7 +4,6 @@ export * from './ExternalLink';
export * from './DotLeader';
export * from './CustomFieldsForm';
export * from './PasswordVerifier/PasswordVerifier';
export * from '../hooks/useValidatePassword';
export { default as TextSeparator } from './TextSeparator';
export * from './TooltipComponent';
export * as UserStatus from './UserStatus';

@ -0,0 +1,7 @@
export * from './useFeaturePreview';
export * from './useDefaultSettingFeaturePreviewList';
export * from './useFeaturePreviewList';
export * from './usePreferenceFeaturePreviewList';
export * from './useDocumentTitle';
export * from './useUserDisplayName';
export * from './useValidatePassword';

@ -0,0 +1,36 @@
import { mockAppRoot } from '@rocket.chat/mock-providers';
import { renderHook } from '@testing-library/react';
import { useUserDisplayName } from './useUserDisplayName';
const fakeUser = {
name: 'John Doe',
username: 'john.doe',
};
it('should return username if UI_Use_Real_Name setting is false', () => {
const { result } = renderHook(() => useUserDisplayName(fakeUser), {
legacyRoot: true,
wrapper: mockAppRoot().withSetting('UI_Use_Real_Name', false).build(),
});
expect(result.current).toBe(fakeUser.username);
});
it('should return name if UI_Use_Real_Name setting is true', () => {
const { result } = renderHook(() => useUserDisplayName(fakeUser), {
legacyRoot: true,
wrapper: mockAppRoot().withSetting('UI_Use_Real_Name', true).build(),
});
expect(result.current).toBe(fakeUser.name);
});
it('should return username if UI_Use_Real_Name setting is true and user has no name', () => {
const { result } = renderHook(() => useUserDisplayName({ ...fakeUser, name: undefined }), {
legacyRoot: true,
wrapper: mockAppRoot().withSetting('UI_Use_Real_Name', true).build(),
});
expect(result.current).toBe(fakeUser.username);
});

@ -1,8 +1,7 @@
import type { IUser } from '@rocket.chat/core-typings';
import { getUserDisplayName } from '@rocket.chat/core-typings';
import { useSetting } from '@rocket.chat/ui-contexts';
import { getUserDisplayName } from '../../lib/getUserDisplayName';
export const useUserDisplayName = ({ name, username }: Pick<IUser, 'name' | 'username'>): string | undefined => {
const useRealName = useSetting('UI_Use_Real_Name');

@ -1,7 +1,3 @@
export * from './components';
export * from './hooks/useFeaturePreview';
export * from './hooks/useDefaultSettingFeaturePreviewList';
export * from './hooks/useFeaturePreviewList';
export * from './hooks/usePreferenceFeaturePreviewList';
export * from './hooks/useDocumentTitle';
export * from './helpers';
export * from './hooks';

@ -1,4 +1,5 @@
import type { IVideoConferenceUser, Serialized } from '@rocket.chat/core-typings';
import { getUserDisplayName } from '@rocket.chat/core-typings';
import { Avatar, Box, Icon } from '@rocket.chat/fuselage';
import { useSetting, useUserAvatarPath, useUserPreference } from '@rocket.chat/ui-contexts';
import { memo, type ReactElement } from 'react';
@ -11,7 +12,7 @@ type VideoConfMessageUserStackProps = {
const VideoConfMessageUserStack = ({ users }: VideoConfMessageUserStackProps): ReactElement => {
const displayAvatars = useUserPreference<boolean>('displayAvatars');
const showRealName = useSetting('UI_Use_Real_Name');
const showRealName = useSetting('UI_Use_Real_Name', false);
const getUserAvatarPath = useUserAvatarPath();
return (
@ -23,8 +24,8 @@ const VideoConfMessageUserStack = ({ users }: VideoConfMessageUserStackProps): R
<Avatar
size='x28'
alt={username || ''}
title={showRealName ? name || username : username}
url={getUserAvatarPath(username as string)}
title={getUserDisplayName(name, username, showRealName)}
url={getUserAvatarPath(username)}
/>
</Box>
))}

Loading…
Cancel
Save