11import { type IMessage , type ISubscription , type IRoom , isE2EEMessage } from '@rocket.chat/core-typings' ;
2+ import type { SubscriptionWithRoom } from '@rocket.chat/ui-contexts' ;
23import { 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
57import { Rooms , Subscriptions } from '../../../../app/models/client' ;
68import type { MessageActionConfig } from '../../../../app/ui-utils/client/lib/MessageAction' ;
79import { useEmbeddedLayout } from '../../../hooks/useEmbeddedLayout' ;
8- import { useReactiveValue } from '../../../hooks/useReactiveValue' ;
910import { roomCoordinator } from '../../../lib/rooms/roomCoordinator' ;
1011
1112export 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