From cc28d59dd292b10ad000aed3e6681e8b74106387 Mon Sep 17 00:00:00 2001 From: juliajforesti Date: Thu, 12 Jun 2025 16:58:06 -0300 Subject: [PATCH 1/2] chore: remove `useReactiveVar` from `useReplyInDMAction` --- .../message/toolbar/useReplyInDMAction.ts | 47 ++++++++++++------- 1 file changed, 30 insertions(+), 17 deletions(-) diff --git a/apps/meteor/client/components/message/toolbar/useReplyInDMAction.ts b/apps/meteor/client/components/message/toolbar/useReplyInDMAction.ts index abf4babf15775..3d275d5e1a14b 100644 --- a/apps/meteor/client/components/message/toolbar/useReplyInDMAction.ts +++ b/apps/meteor/client/components/message/toolbar/useReplyInDMAction.ts @@ -1,11 +1,12 @@ import { type IMessage, type ISubscription, type IRoom, isE2EEMessage } from '@rocket.chat/core-typings'; +import type { SubscriptionWithRoom } from '@rocket.chat/ui-contexts'; import { usePermission, useRouter, useUser } from '@rocket.chat/ui-contexts'; -import { useCallback } from 'react'; +import { useCallback, useMemo } from 'react'; +import { useShallow } from 'zustand/shallow'; import { Rooms, Subscriptions } from '../../../../app/models/client'; import type { MessageActionConfig } from '../../../../app/ui-utils/client/lib/MessageAction'; import { useEmbeddedLayout } from '../../../hooks/useEmbeddedLayout'; -import { useReactiveValue } from '../../../hooks/useReactiveValue'; import { roomCoordinator } from '../../../lib/rooms/roomCoordinator'; export const useReplyInDMAction = ( @@ -18,25 +19,37 @@ export const useReplyInDMAction = ( const canCreateDM = usePermission('create-d'); const isLayoutEmbedded = useEmbeddedLayout(); - const condition = useReactiveValue( - useCallback(() => { - if (!subscription || room.t === 'd' || room.t === 'l' || isLayoutEmbedded) { - return false; - } - - // Check if we already have a DM started with the message user (not ourselves) or we can start one - if (!!user && user._id !== message.u._id && !canCreateDM) { - const dmRoom = Rooms.findOne({ _id: [user._id, message.u._id].sort().join('') }); - if (!dmRoom || !Subscriptions.findOne({ 'rid': dmRoom._id, 'u._id': user._id })) { - return false; - } + const roomPredicate = useCallback( + (record: IRoom): boolean => { + if (!!user && user._id !== message.u._id && canCreateDM) { + const ids = [user._id, message.u._id].sort().join(''); + return ids.includes(record._id); } + return false; + }, + [canCreateDM, message.u._id, user], + ); + const dmRoom = Rooms.use(useShallow((state) => state.find(roomPredicate))); - return true; - }, [canCreateDM, isLayoutEmbedded, message.u._id, room.t, subscription, user]), + const subsPredicate = useCallback( + (record: SubscriptionWithRoom) => record.rid === dmRoom?._id || record.u._id === user?._id, + [dmRoom, user?._id], ); + const dmSubs = Subscriptions.use(useShallow((state) => state.find(subsPredicate))); + + const canReplyInDM = useMemo(() => { + if (!subscription || room.t === 'd' || room.t === 'l' || isLayoutEmbedded) { + return false; + } + if (!!user && user._id !== message.u._id && canCreateDM) { + if (!dmRoom || !dmSubs) { + return false; + } + } + return true; + }, [canCreateDM, dmRoom, dmSubs, isLayoutEmbedded, message.u._id, room.t, subscription, user]); - if (!condition) { + if (!canReplyInDM) { return null; } From 87e859634595f7a2467686db29662422ec721bdd Mon Sep 17 00:00:00 2001 From: juliajforesti Date: Wed, 18 Jun 2025 16:56:05 -0300 Subject: [PATCH 2/2] chore: improve computation --- .../message/toolbar/useReplyInDMAction.ts | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/apps/meteor/client/components/message/toolbar/useReplyInDMAction.ts b/apps/meteor/client/components/message/toolbar/useReplyInDMAction.ts index 3d275d5e1a14b..7bd70c230dd64 100644 --- a/apps/meteor/client/components/message/toolbar/useReplyInDMAction.ts +++ b/apps/meteor/client/components/message/toolbar/useReplyInDMAction.ts @@ -21,15 +21,14 @@ export const useReplyInDMAction = ( const roomPredicate = useCallback( (record: IRoom): boolean => { - if (!!user && user._id !== message.u._id && canCreateDM) { - const ids = [user._id, message.u._id].sort().join(''); - return ids.includes(record._id); - } - return false; + const ids = [user?._id, message.u._id].sort().join(''); + return ids.includes(record._id); }, - [canCreateDM, message.u._id, user], + [message.u._id, user], ); - const dmRoom = Rooms.use(useShallow((state) => state.find(roomPredicate))); + + const shouldFindRoom = useMemo(() => !!user && canCreateDM && user._id !== message.u._id, [canCreateDM, message.u._id, user]); + const dmRoom = Rooms.use(useShallow((state) => (shouldFindRoom ? state.find(roomPredicate) : undefined))); const subsPredicate = useCallback( (record: SubscriptionWithRoom) => record.rid === dmRoom?._id || record.u._id === user?._id,