Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
96b5c20
Improve usage of MessageListProvider
gabriellsh Mar 20, 2025
5a0c2e3
fix ts
gabriellsh Mar 21, 2025
3a91114
Merge remote-tracking branch 'origin/develop' into chore/improveMessa…
gabriellsh Mar 25, 2025
c956f29
Merge branch 'develop' into chore/improveMessageList
gabriellsh Mar 25, 2025
972969b
Merge branch 'develop' into chore/improveMessageList
gabriellsh Mar 26, 2025
7ce7c85
Merge branch 'develop' into chore/improveMessageList
gabriellsh Apr 3, 2025
6334ff1
Merge branch 'develop' into chore/improveMessageList
gabriellsh Apr 14, 2025
db63285
Merge remote-tracking branch 'origin/develop' into chore/improveMessa…
gabriellsh Apr 17, 2025
7c3fc7a
Merge branch 'develop' into chore/improveMessageList
kodiakhq[bot] Apr 17, 2025
61096d2
Merge branch 'develop' into chore/improveMessageList
kodiakhq[bot] Apr 17, 2025
f040393
Merge branch 'develop' into chore/improveMessageList
kodiakhq[bot] Apr 18, 2025
5cfb6c9
Merge branch 'develop' into chore/improveMessageList
kodiakhq[bot] Apr 18, 2025
0083d3b
Merge branch 'develop' into chore/improveMessageList
kodiakhq[bot] Apr 19, 2025
7c0b170
Merge branch 'develop' into chore/improveMessageList
kodiakhq[bot] Apr 19, 2025
a9e70a8
Merge branch 'develop' into chore/improveMessageList
scuciatto Apr 20, 2025
7eb00f1
Merge branch 'develop' into chore/improveMessageList
kodiakhq[bot] Apr 21, 2025
d6e542a
Merge branch 'develop' into chore/improveMessageList
gabriellsh Apr 22, 2025
dfe2cfc
Merge branch 'develop' into chore/improveMessageList
gabriellsh Apr 28, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion apps/meteor/client/components/GazzodownText.spec.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ jest.mock('@rocket.chat/fuselage-hooks', () => ({
}));
jest.mock('./message/list/MessageListContext', () => ({
useMessageListHighlights: jest.fn(),
useMessageListShowRealName: jest.fn(() => false),
}));
jest.mock('../lib/utils/fireGlobalEvent', () => ({
fireGlobalEvent: jest.fn(),
Expand All @@ -22,7 +23,6 @@ jest.mock('../views/room/hooks/useGoToRoom', () => ({
}));

const mockUseMessageListHighlights = useMessageListHighlights as jest.MockedFunction<typeof useMessageListHighlights>;

const wrapper = mockAppRoot().withUserPreference('useEmojis', true).withSetting('UI_Use_Real_Name', false).withJohnDoe();

const HighlightTester = ({ text }: { text: string }) => {
Expand Down
6 changes: 3 additions & 3 deletions apps/meteor/client/components/GazzodownText.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@ import type { ChannelMention, UserMention } from '@rocket.chat/gazzodown';
import { MarkupInteractionContext } from '@rocket.chat/gazzodown';
import { escapeRegExp } from '@rocket.chat/string-helpers';
import { useFeaturePreview } from '@rocket.chat/ui-client';
import { useLayout, useRouter, useSetting, useUserPreference, useUserId } from '@rocket.chat/ui-contexts';
import { useLayout, useRouter, useUserPreference, useUserId } from '@rocket.chat/ui-contexts';
import type { UIEvent } from 'react';
import { useCallback, memo, useMemo } from 'react';

import { detectEmoji } from '../lib/utils/detectEmoji';
import { fireGlobalEvent } from '../lib/utils/fireGlobalEvent';
import { useMessageListHighlights } from './message/list/MessageListContext';
import { useMessageListHighlights, useMessageListShowRealName } from './message/list/MessageListContext';
import { useUserCard } from '../views/room/contexts/UserCardContext';
import { useGoToRoom } from '../views/room/hooks/useGoToRoom';

Expand Down Expand Up @@ -56,7 +56,7 @@ const GazzodownText = ({ mentions, channels, searchText, children }: GazzodownTe

const convertAsciiToEmoji = useUserPreference<boolean>('convertAsciiEmoji', true);
const useEmoji = Boolean(useUserPreference('useEmojis'));
const useRealName = useSetting('UI_Use_Real_Name', false);
const useRealName = useMessageListShowRealName();
const ownUserId = useUserId();
const showMentionSymbol = Boolean(useUserPreference<boolean>('mentionsWithSymbol'));

Expand Down
14 changes: 9 additions & 5 deletions apps/meteor/client/components/message/MessageHeader.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,14 @@ import { useTranslation } from 'react-i18next';

import StatusIndicators from './StatusIndicators';
import MessageRoles from './header/MessageRoles';
import { useMessageListShowUsername, useMessageListShowRealName, useMessageListShowRoles } from './list/MessageListContext';
import { useFormatDateAndTime } from '../../hooks/useFormatDateAndTime';
import { useFormatTime } from '../../hooks/useFormatTime';
import { useMessageRoles } from './header/hooks/useMessageRoles';
import {
useMessageListShowUsername,
useMessageListShowRealName,
useMessageListShowRoles,
useMessageListFormatDateAndTime,
useMessageListFormatTime,
} from './list/MessageListContext';
import { useUserCard } from '../../views/room/contexts/UserCardContext';

type MessageHeaderProps = {
Expand All @@ -28,8 +32,8 @@ type MessageHeaderProps = {
const MessageHeader = ({ message }: MessageHeaderProps): ReactElement => {
const { t } = useTranslation();

const formatTime = useFormatTime();
const formatDateAndTime = useFormatDateAndTime();
const formatTime = useMessageListFormatTime();
const formatDateAndTime = useMessageListFormatDateAndTime();
const { triggerProps, openUserCard } = useUserCard();

const showRealName = useMessageListShowRealName();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,12 @@ import {
isQuoteAttachment,
} from '@rocket.chat/core-typings';
import type { Options } from '@rocket.chat/message-parser';
import { useSetting } from '@rocket.chat/ui-contexts';
import { useMemo } from 'react';

import { useSubscriptionFromMessageQuery } from './useSubscriptionFromMessageQuery';
import type { MessageWithMdEnforced } from '../../../lib/parseMessageTextToAstMarkdown';
import { parseMessageTextToAstMarkdown } from '../../../lib/parseMessageTextToAstMarkdown';
import { useAutoLinkDomains } from '../../../views/room/MessageList/hooks/useAutoLinkDomains';
import { useAutoTranslate } from '../../../views/room/MessageList/hooks/useAutoTranslate';
import { useKatex } from '../../../views/room/MessageList/hooks/useKatex';
import { useMessageListAutoTranslate, useMessageListKatex, useMessageListShowColors } from '../list/MessageListContext';

const normalizeAttachments = (attachments: MessageAttachment[], name?: string, type?: string): MessageAttachment[] => {
if (name) {
Expand Down Expand Up @@ -61,11 +58,11 @@ const normalizeAttachments = (attachments: MessageAttachment[], name?: string, t
};

export const useNormalizedMessage = <TMessage extends IMessage>(message: TMessage): MessageWithMdEnforced => {
const { katexEnabled, katexDollarSyntaxEnabled, katexParenthesisSyntaxEnabled } = useKatex();
const katex = useMessageListKatex();
const katexEnabled = !!katex;
const customDomains = useAutoLinkDomains();
const subscription = useSubscriptionFromMessageQuery(message).data ?? undefined;
const autoTranslateOptions = useAutoTranslate(subscription);
const showColors = useSetting('HexColorPreview_Enabled', true);
const autoTranslateOptions = useMessageListAutoTranslate();
const showColors = useMessageListShowColors();

return useMemo(() => {
const parseOptions: Options = {
Expand All @@ -74,8 +71,8 @@ export const useNormalizedMessage = <TMessage extends IMessage>(message: TMessag
customDomains,
...(katexEnabled && {
katex: {
dollarSyntax: katexDollarSyntaxEnabled,
parenthesisSyntax: katexParenthesisSyntaxEnabled,
dollarSyntax: katex.dollarSyntaxEnabled,
parenthesisSyntax: katex.parenthesisSyntaxEnabled,
},
}),
};
Expand All @@ -91,5 +88,5 @@ export const useNormalizedMessage = <TMessage extends IMessage>(message: TMessag
}

return normalizedMessage;
}, [showColors, customDomains, katexEnabled, katexDollarSyntaxEnabled, katexParenthesisSyntaxEnabled, message, autoTranslateOptions]);
}, [showColors, customDomains, katexEnabled, katex?.dollarSyntaxEnabled, katex?.parenthesisSyntaxEnabled, message, autoTranslateOptions]);
};
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import { useLayout, useSetting } from '@rocket.chat/ui-contexts';
import { useLayout } from '@rocket.chat/ui-contexts';

import { useMessageListOembedEnabled } from '../list/MessageListContext';

type OembedLayout = {
enabled: boolean;
Expand All @@ -15,7 +17,7 @@ export const useOembedLayout = (): OembedLayout => {
very often, so this hook is not going to be re-evaluated very often either;
this is why we don't need to memoize the result or store it in a context
*/
const enabled = useSetting('API_Embed', false);
const enabled = useMessageListOembedEnabled();
const { isMobile } = useLayout();

const maxWidth = isMobile ? ('100%' as const) : 368;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,17 @@ import type { IMessage } from '@rocket.chat/core-typings';
import type { KeyboardEvent, MouseEvent, MutableRefObject } from 'react';
import { createContext, useContext } from 'react';

import type { useFormatDate } from '../../../hooks/useFormatDate';
import type { useFormatDateAndTime } from '../../../hooks/useFormatDateAndTime';
import type { useFormatTime } from '../../../hooks/useFormatTime';

export type MessageListContextValue = {
useShowTranslated: (message: IMessage) => boolean;
autoTranslate: {
showAutoTranslate: (message: IMessage) => boolean;
autoTranslateLanguage?: string;
autoTranslateEnabled: boolean;
};
autoLinkDomains: string;
useShowStarred: ({ message }: { message: IMessage }) => boolean;
useShowFollowing: ({ message }: { message: IMessage }) => boolean;
useMessageDateFormatter: () => (date: Date) => string;
Expand All @@ -25,11 +34,23 @@ export type MessageListContextValue = {
showColors: boolean;
jumpToMessageParam?: string;
username: string | undefined;
apiEmbedEnabled: boolean;
readReceipts: {
enabled: boolean;
storeUsers: boolean;
};
formatDateAndTime: ReturnType<typeof useFormatDateAndTime>;
formatTime: ReturnType<typeof useFormatTime>;
formatDate: ReturnType<typeof useFormatDate>;
messageListRef?: MutableRefObject<HTMLElement | undefined>;
};

export const MessageListContext = createContext<MessageListContextValue>({
useShowTranslated: () => false,
autoTranslate: {
showAutoTranslate: () => false,
autoTranslateLanguage: undefined,
autoTranslateEnabled: false,
},
useShowStarred: () => false,
useShowFollowing: () => false,
useUserHasReacted: () => (): boolean => false,
Expand All @@ -43,11 +64,20 @@ export const MessageListContext = createContext<MessageListContextValue>({
showUsername: false,
showColors: false,
username: undefined,
apiEmbedEnabled: false,
readReceipts: {
enabled: false,
storeUsers: false,
},
autoLinkDomains: '',
formatDateAndTime: () => '',
formatTime: () => '',
formatDate: () => '',
messageListRef: { current: undefined },
});

export const useShowTranslated: MessageListContextValue['useShowTranslated'] = (...args) =>
useContext(MessageListContext).useShowTranslated(...args);
export const useShowTranslated: MessageListContextValue['autoTranslate']['showAutoTranslate'] = (...args) =>
useContext(MessageListContext).autoTranslate.showAutoTranslate(...args);
export const useShowStarred: MessageListContextValue['useShowStarred'] = (...args) =>
useContext(MessageListContext).useShowStarred(...args);
export const useShowFollowing: MessageListContextValue['useShowFollowing'] = (...args) =>
Expand All @@ -67,3 +97,22 @@ export const useOpenEmojiPicker: MessageListContextValue['useOpenEmojiPicker'] =
useContext(MessageListContext).useOpenEmojiPicker(...args);

export const useMessageListRef = (): MessageListContextValue['messageListRef'] => useContext(MessageListContext).messageListRef;

export const useMessageListShowColors = (): MessageListContextValue['showColors'] => useContext(MessageListContext).showColors;

export const useMessageListKatex = (): MessageListContextValue['katex'] => useContext(MessageListContext).katex;

export const useMessageListReadReceipts = (): MessageListContextValue['readReceipts'] => useContext(MessageListContext).readReceipts;

export const useMessageListAutoTranslate = (): MessageListContextValue['autoTranslate'] => useContext(MessageListContext).autoTranslate;

export const useMessageListOembedEnabled = (): MessageListContextValue['apiEmbedEnabled'] => useContext(MessageListContext).apiEmbedEnabled;

export const useMessageListAutoLinkDomains = (): MessageListContextValue['autoLinkDomains'] =>
useContext(MessageListContext).autoLinkDomains;

export const useMessageListFormatDateAndTime = (): MessageListContextValue['formatDateAndTime'] =>
useContext(MessageListContext).formatDateAndTime;

export const useMessageListFormatTime = (): MessageListContextValue['formatTime'] => useContext(MessageListContext).formatTime;
export const useMessageListFormatDate = (): MessageListContextValue['formatDate'] => useContext(MessageListContext).formatDate;
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import type { ITranslatedMessage, IMessage, ISubscription } from '@rocket.chat/core-typings';
import { useTranslation } from 'react-i18next';

import { useAutoTranslate } from '../../../../../views/room/MessageList/hooks/useAutoTranslate';
import { useChat } from '../../../../../views/room/contexts/ChatContext';
import { useMessageListAutoTranslate } from '../../../list/MessageListContext';
import MessageToolbarItem from '../../MessageToolbarItem';

type QuoteMessageActionProps = {
Expand All @@ -12,7 +12,7 @@ type QuoteMessageActionProps = {

const QuoteMessageAction = ({ message, subscription }: QuoteMessageActionProps) => {
const chat = useChat();
const autoTranslateOptions = useAutoTranslate(subscription);
const autoTranslateOptions = useMessageListAutoTranslate();
const { t } = useTranslation();

if (!chat || !subscription) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
import type { IMessage } from '@rocket.chat/core-typings';
import { useSetModal, useSetting } from '@rocket.chat/ui-contexts';
import { useSetModal } from '@rocket.chat/ui-contexts';

import type { MessageActionConfig } from '../../../../app/ui-utils/client/lib/MessageAction';
import ReadReceiptsModal from '../../../views/room/modals/ReadReceiptsModal';
import { useMessageListReadReceipts } from '../list/MessageListContext';

export const useReadReceiptsDetailsAction = (message: IMessage): MessageActionConfig | null => {
const setModal = useSetModal();

const readReceiptsEnabled = useSetting('Message_Read_Receipt_Enabled', false);
const readReceiptsStoreUsers = useSetting('Message_Read_Receipt_Store_Users', false);
const { enabled: readReceiptsEnabled, storeUsers: readReceiptsStoreUsers } = useMessageListReadReceipts();

if (!readReceiptsEnabled || !readReceiptsStoreUsers) {
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,6 @@ import { memo } from 'react';
import { useTranslation } from 'react-i18next';

import { MessageTypes } from '../../../../app/ui-utils/client';
import { useFormatDateAndTime } from '../../../hooks/useFormatDateAndTime';
import { useFormatTime } from '../../../hooks/useFormatTime';
import {
useIsSelecting,
useToggleSelect,
Expand All @@ -31,7 +29,12 @@ import {
import { useUserCard } from '../../../views/room/contexts/UserCardContext';
import Attachments from '../content/Attachments';
import MessageActions from '../content/MessageActions';
import { useMessageListShowRealName, useMessageListShowUsername } from '../list/MessageListContext';
import {
useMessageListShowRealName,
useMessageListShowUsername,
useMessageListFormatDateAndTime,
useMessageListFormatTime,
} from '../list/MessageListContext';

type SystemMessageProps = {
message: IMessage;
Expand All @@ -40,8 +43,8 @@ type SystemMessageProps = {

const SystemMessage = ({ message, showUserAvatar, ...props }: SystemMessageProps): ReactElement => {
const { t } = useTranslation();
const formatTime = useFormatTime();
const formatDateAndTime = useFormatDateAndTime();
const formatTime = useMessageListFormatTime();
const formatDateAndTime = useMessageListFormatDateAndTime();
const { triggerProps, openUserCard } = useUserCard();

const showRealName = useMessageListShowRealName();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ const ThreadMessagePreview = ({ message, showUserAvatar, sequential, ...props }:
useCountSelected();

const messageType = parentMessage.isSuccess ? MessageTypes.getType(parentMessage.data) : null;
const messageBody = useMessageBody(parentMessage.data, message.rid);
const messageBody = useMessageBody(parentMessage.data);

const previewMessage = isParsedMessage(messageBody) ? { md: messageBody } : { msg: messageBody };

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import type { IMessage } from '@rocket.chat/core-typings';
import { isDiscussionMessage, isThreadMainMessage, isE2EEMessage, isQuoteAttachment } from '@rocket.chat/core-typings';
import { MessageBody } from '@rocket.chat/fuselage';
import type { TranslationKey } from '@rocket.chat/ui-contexts';
import { useSetting, useTranslation, useUserId, useUserPresence } from '@rocket.chat/ui-contexts';
import { useTranslation, useUserId, useUserPresence } from '@rocket.chat/ui-contexts';
import type { ReactElement } from 'react';
import { memo } from 'react';

Expand All @@ -20,6 +20,7 @@ import UrlPreviews from '../../content/UrlPreviews';
import { useNormalizedMessage } from '../../hooks/useNormalizedMessage';
import { useOembedLayout } from '../../hooks/useOembedLayout';
import { useSubscriptionFromMessageQuery } from '../../hooks/useSubscriptionFromMessageQuery';
import { useMessageListReadReceipts } from '../../list/MessageListContext';
import UiKitMessageBlock from '../../uikit/UiKitMessageBlock';

type RoomMessageContentProps = {
Expand All @@ -36,8 +37,8 @@ const RoomMessageContent = ({ message, unread, all, mention, searchText }: RoomM
const subscription = useSubscriptionFromMessageQuery(message).data ?? undefined;
const broadcast = subscription?.broadcast ?? false;
const uid = useUserId();
const { enabled: readReceiptEnabled } = useMessageListReadReceipts();
const messageUser = { ...message.u, roles: [], ...useUserPresence(message.u._id) };
const readReceiptEnabled = useSetting('Message_Read_Receipt_Enabled', false);
const chat = useChat();
const t = useTranslation();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import type { IThreadMainMessage, IThreadMessage } from '@rocket.chat/core-typin
import { isE2EEMessage, isQuoteAttachment } from '@rocket.chat/core-typings';
import { MessageBody } from '@rocket.chat/fuselage';
import type { TranslationKey } from '@rocket.chat/ui-contexts';
import { useSetting, useUserId, useUserPresence } from '@rocket.chat/ui-contexts';
import { useUserId, useUserPresence } from '@rocket.chat/ui-contexts';
import type { ReactElement } from 'react';
import { memo } from 'react';
import { useTranslation } from 'react-i18next';
Expand All @@ -18,6 +18,7 @@ import UrlPreviews from '../../content/UrlPreviews';
import { useNormalizedMessage } from '../../hooks/useNormalizedMessage';
import { useOembedLayout } from '../../hooks/useOembedLayout';
import { useSubscriptionFromMessageQuery } from '../../hooks/useSubscriptionFromMessageQuery';
import { useMessageListReadReceipts } from '../../list/MessageListContext';
import UiKitMessageBlock from '../../uikit/UiKitMessageBlock';

type ThreadMessageContentProps = {
Expand All @@ -30,8 +31,8 @@ const ThreadMessageContent = ({ message }: ThreadMessageContentProps): ReactElem
const subscription = useSubscriptionFromMessageQuery(message).data ?? undefined;
const broadcast = subscription?.broadcast ?? false;
const uid = useUserId();
const { enabled: readReceiptEnabled } = useMessageListReadReceipts();
const messageUser = { ...message.u, roles: [], ...useUserPresence(message.u._id) };
const readReceiptEnabled = useSetting('Message_Read_Receipt_Enabled', false);

const { t } = useTranslation();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@ import { useTranslation } from 'react-i18next';
import RoomMessage from '../../../components/message/variants/RoomMessage';
import SystemMessage from '../../../components/message/variants/SystemMessage';
import ThreadMessagePreview from '../../../components/message/variants/ThreadMessagePreview';
import { useFormatDate } from '../../../hooks/useFormatDate';
import { useDateRef } from '../providers/DateListProvider';
import { isMessageNewDay } from './lib/isMessageNewDay';
import { useMessageListFormatDate } from '../../../components/message/list/MessageListContext';

type MessageListItemProps = {
message: IMessage;
Expand All @@ -31,7 +31,7 @@ export const MessageListItem = ({
system,
}: MessageListItemProps) => {
const { t } = useTranslation();
const formatDate = useFormatDate();
const formatDate = useMessageListFormatDate();

const ref = useDateRef();

Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import { useSetting } from '@rocket.chat/ui-contexts';
import { useMemo } from 'react';

import { useMessageListAutoLinkDomains } from '../../../../components/message/list/MessageListContext';

export const useAutoLinkDomains = (): string[] => {
const domains = useSetting('Message_CustomDomain_AutoLink', '');
const domains = useMessageListAutoLinkDomains();

const customDomains = useMemo(() => (domains ? domains.split(',').map((domain) => domain.trim()) : []), [domains]);

Expand Down
Loading
Loading