Skip to content

Commit a820570

Browse files
committed
refactor: drop useReactiveValue from MessageBox.canSend
The canSendMessage room directive reads Subscriptions.state.count, which is a Zustand snapshot — Tracker.autorun inside useReactiveValue never registered a dep on it, so the previous reactivity was effectively broken. Subscribe properly via useSyncExternalStore on Subscriptions.use so canSend updates when the user joins or leaves the room.
1 parent d2c6346 commit a820570

1 file changed

Lines changed: 19 additions & 18 deletions

File tree

apps/meteor/client/views/room/composer/messageBox/MessageBox.tsx

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,10 @@ import { formattingButtons } from '../../../../../app/ui-message/client/messageB
2828
import { getImageExtensionFromMime } from '../../../../../lib/getImageExtensionFromMime';
2929
import { useFormatDateAndTime } from '../../../../hooks/useFormatDateAndTime';
3030
import { useIsFederationEnabled } from '../../../../hooks/useIsFederationEnabled';
31-
import { useReactiveValue } from '../../../../hooks/useReactiveValue';
3231
import type { ComposerAPI } from '../../../../lib/chats/ChatAPI';
3332
import { roomCoordinator } from '../../../../lib/rooms/roomCoordinator';
3433
import { keyCodes } from '../../../../lib/utils/keyCodes';
34+
import { Subscriptions } from '../../../../stores';
3535
import AudioMessageRecorder from '../../../composer/AudioMessageRecorder';
3636
import VideoMessageRecorder from '../../../composer/VideoMessageRecorder';
3737
import { useFileUpload } from '../../body/hooks/useFileUpload';
@@ -293,27 +293,28 @@ const MessageBox = ({
293293

294294
const federationMatrixEnabled = useIsFederationEnabled();
295295

296-
const canSend = useReactiveValue(
297-
useCallback(() => {
298-
if (!room.t) {
299-
return false;
300-
}
296+
// canSendMessage directives read from the Subscriptions store, so subscribe to it to re-run on changes
297+
// (e.g. user joins/leaves the room). room and federationMatrixEnabled are already React-reactive.
298+
const subscribeSubscriptions = useCallback((onStoreChange: () => void) => Subscriptions.use.subscribe(onStoreChange), []);
299+
const canSend = useSyncExternalStore(subscribeSubscriptions, () => {
300+
if (!room.t) {
301+
return false;
302+
}
303+
304+
if (!roomCoordinator.getRoomDirectives(room.t).canSendMessage(room)) {
305+
return false;
306+
}
301307

302-
if (!roomCoordinator.getRoomDirectives(room.t).canSendMessage(room)) {
308+
if (isRoomFederated(room)) {
309+
// we are dropping the non native federation for now
310+
if (!isRoomNativeFederated(room)) {
303311
return false;
304312
}
305313

306-
if (isRoomFederated(room)) {
307-
// we are dropping the non native federation for now
308-
if (!isRoomNativeFederated(room)) {
309-
return false;
310-
}
311-
312-
return federationMatrixEnabled;
313-
}
314-
return true;
315-
}, [room, federationMatrixEnabled]),
316-
);
314+
return federationMatrixEnabled;
315+
}
316+
return true;
317+
});
317318

318319
const sizes = useContentBoxSize(textareaRef);
319320

0 commit comments

Comments
 (0)