Skip to content

Commit cc28d59

Browse files
committed
chore: remove useReactiveVar from useReplyInDMAction
1 parent 2cdaabb commit cc28d59

File tree

1 file changed

+30
-17
lines changed

1 file changed

+30
-17
lines changed

apps/meteor/client/components/message/toolbar/useReplyInDMAction.ts

Lines changed: 30 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
import { type IMessage, type ISubscription, type IRoom, isE2EEMessage } from '@rocket.chat/core-typings';
2+
import type { SubscriptionWithRoom } from '@rocket.chat/ui-contexts';
23
import { usePermission, useRouter, useUser } from '@rocket.chat/ui-contexts';
3-
import { useCallback } from 'react';
4+
import { useCallback, useMemo } from 'react';
5+
import { useShallow } from 'zustand/shallow';
46

57
import { Rooms, Subscriptions } from '../../../../app/models/client';
68
import type { MessageActionConfig } from '../../../../app/ui-utils/client/lib/MessageAction';
79
import { useEmbeddedLayout } from '../../../hooks/useEmbeddedLayout';
8-
import { useReactiveValue } from '../../../hooks/useReactiveValue';
910
import { roomCoordinator } from '../../../lib/rooms/roomCoordinator';
1011

1112
export const useReplyInDMAction = (
@@ -18,25 +19,37 @@ export const useReplyInDMAction = (
1819
const canCreateDM = usePermission('create-d');
1920
const isLayoutEmbedded = useEmbeddedLayout();
2021

21-
const condition = useReactiveValue(
22-
useCallback(() => {
23-
if (!subscription || room.t === 'd' || room.t === 'l' || isLayoutEmbedded) {
24-
return false;
25-
}
26-
27-
// Check if we already have a DM started with the message user (not ourselves) or we can start one
28-
if (!!user && user._id !== message.u._id && !canCreateDM) {
29-
const dmRoom = Rooms.findOne({ _id: [user._id, message.u._id].sort().join('') });
30-
if (!dmRoom || !Subscriptions.findOne({ 'rid': dmRoom._id, 'u._id': user._id })) {
31-
return false;
32-
}
22+
const roomPredicate = useCallback(
23+
(record: IRoom): boolean => {
24+
if (!!user && user._id !== message.u._id && canCreateDM) {
25+
const ids = [user._id, message.u._id].sort().join('');
26+
return ids.includes(record._id);
3327
}
28+
return false;
29+
},
30+
[canCreateDM, message.u._id, user],
31+
);
32+
const dmRoom = Rooms.use(useShallow((state) => state.find(roomPredicate)));
3433

35-
return true;
36-
}, [canCreateDM, isLayoutEmbedded, message.u._id, room.t, subscription, user]),
34+
const subsPredicate = useCallback(
35+
(record: SubscriptionWithRoom) => record.rid === dmRoom?._id || record.u._id === user?._id,
36+
[dmRoom, user?._id],
3737
);
38+
const dmSubs = Subscriptions.use(useShallow((state) => state.find(subsPredicate)));
39+
40+
const canReplyInDM = useMemo(() => {
41+
if (!subscription || room.t === 'd' || room.t === 'l' || isLayoutEmbedded) {
42+
return false;
43+
}
44+
if (!!user && user._id !== message.u._id && canCreateDM) {
45+
if (!dmRoom || !dmSubs) {
46+
return false;
47+
}
48+
}
49+
return true;
50+
}, [canCreateDM, dmRoom, dmSubs, isLayoutEmbedded, message.u._id, room.t, subscription, user]);
3851

39-
if (!condition) {
52+
if (!canReplyInDM) {
4053
return null;
4154
}
4255

0 commit comments

Comments
 (0)