Skip to content

Commit d2c6346

Browse files
committed
refactor: drop useReactiveValue from readOnly-aware hooks/components
useMessageComposerIsReadOnly, useFileUploadDropTarget, and ReactionMessageAction all wrapped a roomCoordinator.readOnly(room, user) call in useReactiveValue to pick up changes in the post-readonly permission. Replace with usePermission('post-readonly', room._id) as an explicit dependency of a plain useMemo — when the permission flips, the memo re-runs and roomCoordinator.readOnly returns the up-to-date value (hasPermission underneath is Tracker-aware but returns the current value when no autorun is active).
1 parent 8162a26 commit d2c6346

3 files changed

Lines changed: 23 additions & 15 deletions

File tree

apps/meteor/client/components/message/toolbar/items/actions/ReactionMessageAction.tsx

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,11 @@ import {
66
type IRoom,
77
type ISubscription,
88
} from '@rocket.chat/core-typings';
9-
import { useUser, useEndpoint } from '@rocket.chat/ui-contexts';
10-
import { useCallback } from 'react';
9+
import { useUser, useEndpoint, usePermission } from '@rocket.chat/ui-contexts';
10+
import { useMemo } from 'react';
1111
import { useTranslation } from 'react-i18next';
1212

1313
import { useEmojiPickerData } from '../../../../../contexts/EmojiPickerContext';
14-
import { useReactiveValue } from '../../../../../hooks/useReactiveValue';
1514
import { roomCoordinator } from '../../../../../lib/rooms/roomCoordinator';
1615
import EmojiElement from '../../../../../views/composer/EmojiPicker/EmojiElement';
1716
import { useChat } from '../../../../../views/room/contexts/ChatContext';
@@ -33,8 +32,10 @@ const ReactionMessageAction = ({ message, room, subscription }: ReactionMessageA
3332
const isFederated = room && isRoomFederated(room);
3433
const isFederationBlocked = isFederated && !isRoomNativeFederated(room);
3534

36-
const enabled = useReactiveValue(
37-
useCallback(() => {
35+
// depend on post-readonly so readOnly re-evaluates when the permission toggles at runtime.
36+
const postReadOnly = usePermission('post-readonly', room._id);
37+
const enabled = useMemo(
38+
() => {
3839
if (isFederationBlocked) {
3940
return false;
4041
}
@@ -48,7 +49,9 @@ const ReactionMessageAction = ({ message, room, subscription }: ReactionMessageA
4849
}
4950

5051
return true;
51-
}, [chat, room, subscription, message.private, user, isFederationBlocked]),
52+
},
53+
// eslint-disable-next-line react-hooks/exhaustive-deps
54+
[chat, room, subscription, message.private, user, isFederationBlocked, postReadOnly],
5255
);
5356

5457
if (!enabled) {

apps/meteor/client/views/room/body/hooks/useFileUploadDropTarget.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
import { useEffectEvent } from '@rocket.chat/fuselage-hooks';
2-
import { useSetting, useTranslation, useUser } from '@rocket.chat/ui-contexts';
2+
import { usePermission, useSetting, useTranslation, useUser } from '@rocket.chat/ui-contexts';
33
import type { DragEvent, ReactNode } from 'react';
4-
import { useCallback, useMemo, useSyncExternalStore } from 'react';
4+
import { useMemo, useSyncExternalStore } from 'react';
55

66
import { useDropTarget } from './useDropTarget';
7-
import { useReactiveValue } from '../../../../hooks/useReactiveValue';
87
import { roomCoordinator } from '../../../../lib/rooms/roomCoordinator';
98
import { useIsRoomOverMacLimit } from '../../../omnichannel/hooks/useIsRoomOverMacLimit';
109
import { useChat } from '../../contexts/ChatContext';
@@ -30,8 +29,11 @@ export const useFileUploadDropTarget = (): readonly [
3029

3130
const fileUploadEnabled = useSetting('FileUpload_Enabled', true);
3231
const user = useUser();
33-
const fileUploadAllowedForUser = useReactiveValue(
34-
useCallback(() => !roomCoordinator.readOnly(room, { username: user?.username }), [room, user?.username]),
32+
const postReadOnly = usePermission('post-readonly', room._id);
33+
const fileUploadAllowedForUser = useMemo(
34+
() => !roomCoordinator.readOnly(room, { username: user?.username }),
35+
// eslint-disable-next-line react-hooks/exhaustive-deps
36+
[room, user?.username, postReadOnly],
3537
);
3638

3739
const chat = useChat();
Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
import type { IRoom } from '@rocket.chat/core-typings';
2-
import { useUser } from '@rocket.chat/ui-contexts';
3-
import { useCallback } from 'react';
2+
import { usePermission, useUser } from '@rocket.chat/ui-contexts';
3+
import { useMemo } from 'react';
44

5-
import { useReactiveValue } from '../../../../hooks/useReactiveValue';
65
import { roomCoordinator } from '../../../../lib/rooms/roomCoordinator';
76

87
export const useMessageComposerIsReadOnly = (room: IRoom): boolean => {
98
const user = useUser();
10-
return useReactiveValue(useCallback(() => roomCoordinator.readOnly(room, user), [room, user]));
9+
// depend on post-readonly so this re-runs when the permission is granted/revoked at runtime;
10+
// roomCoordinator.readOnly calls hasPermission internally and returns the up-to-date value.
11+
const postReadOnly = usePermission('post-readonly', room._id);
12+
// eslint-disable-next-line react-hooks/exhaustive-deps
13+
return useMemo(() => roomCoordinator.readOnly(room, user), [room, user, postReadOnly]);
1114
};

0 commit comments

Comments
 (0)