From 13bd8569e705a77007c6d2e045af2fe45c073cec Mon Sep 17 00:00:00 2001 From: Nazareno Bucciarelli Date: Wed, 27 May 2026 15:57:23 -0300 Subject: [PATCH 1/2] add useRef to track components hydration lifecycle --- .../client/views/room/providers/RoomProvider.tsx | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/apps/meteor/client/views/room/providers/RoomProvider.tsx b/apps/meteor/client/views/room/providers/RoomProvider.tsx index d4fb329c54885..12a6cb611a627 100644 --- a/apps/meteor/client/views/room/providers/RoomProvider.tsx +++ b/apps/meteor/client/views/room/providers/RoomProvider.tsx @@ -1,6 +1,6 @@ import type { IRoom } from '@rocket.chat/core-typings'; import type { ReactNode, ContextType, ReactElement } from 'react'; -import { useMemo, memo, useEffect } from 'react'; +import { useRef, useMemo, memo, useEffect } from 'react'; import ComposerPopupProvider from './ComposerPopupProvider'; import RoomToolboxProvider from './RoomToolboxProvider'; @@ -27,9 +27,10 @@ type RoomProviderProps = { const RoomProvider = ({ rid, children }: RoomProviderProps): ReactElement => { const room = Rooms.use((state) => state.get(rid)); - const subscritionFromLocal = Subscriptions.use((state) => state.find((record) => record.rid === rid)); + const hasLoadedOnce = useRef(false); + useRedirectOnSettingsChanged(subscritionFromLocal); useUsersNameChanged(); @@ -56,6 +57,8 @@ const RoomProvider = ({ rid, children }: RoomProviderProps): ReactElement => { return null; } + hasLoadedOnce.current = true; + return { rid, room: pseudoRoom, @@ -92,7 +95,11 @@ const RoomProvider = ({ rid, children }: RoomProviderProps): ReactElement => { }, [rid, subscribed]); if (!pseudoRoom) { - return !room ? : ; + if (!hasLoadedOnce.current) { + return ; + } + + return ; } return ( From 9c3e567a07962be846cc194898e025dfd9de7fae Mon Sep 17 00:00:00 2001 From: Nazareno Bucciarelli Date: Wed, 27 May 2026 17:08:00 -0300 Subject: [PATCH 2/2] remove ref update from useMemo and use loadedRoomId instead of hasLoadedOnce --- .../client/views/room/providers/RoomProvider.tsx | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/apps/meteor/client/views/room/providers/RoomProvider.tsx b/apps/meteor/client/views/room/providers/RoomProvider.tsx index 12a6cb611a627..125de7e0b7ffe 100644 --- a/apps/meteor/client/views/room/providers/RoomProvider.tsx +++ b/apps/meteor/client/views/room/providers/RoomProvider.tsx @@ -29,7 +29,7 @@ const RoomProvider = ({ rid, children }: RoomProviderProps): ReactElement => { const room = Rooms.use((state) => state.get(rid)); const subscritionFromLocal = Subscriptions.use((state) => state.find((record) => record.rid === rid)); - const hasLoadedOnce = useRef(false); + const loadedRoomId = useRef(null); useRedirectOnSettingsChanged(subscritionFromLocal); @@ -57,8 +57,6 @@ const RoomProvider = ({ rid, children }: RoomProviderProps): ReactElement => { return null; } - hasLoadedOnce.current = true; - return { rid, room: pseudoRoom, @@ -71,6 +69,12 @@ const RoomProvider = ({ rid, children }: RoomProviderProps): ReactElement => { const { mutate: fireRoomOpenedEvent } = useFireGlobalEvent('room-opened', rid); + useEffect(() => { + if (pseudoRoom) { + loadedRoomId.current = rid; + } + }, [pseudoRoom, rid]); + useEffect(() => { if (room) { fireRoomOpenedEvent(omit(room, 'usernames')); @@ -95,7 +99,7 @@ const RoomProvider = ({ rid, children }: RoomProviderProps): ReactElement => { }, [rid, subscribed]); if (!pseudoRoom) { - if (!hasLoadedOnce.current) { + if (loadedRoomId.current !== rid) { return ; }