Skip to content

Commit c42bb36

Browse files
cardosogabriellsh
andauthored
fix: Browser slowdown when multiple tabs are open (RocketChat#37660)
Co-authored-by: gabriellsh <40830821+gabriellsh@users.noreply.github.com>
1 parent 69aa0bd commit c42bb36

2 files changed

Lines changed: 15 additions & 7 deletions

File tree

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@rocket.chat/meteor": patch
3+
---
4+
5+
Fixes browser slowdowns by preventing a rare cascading of language preference updates when multiple tabs reload

apps/meteor/client/providers/UserProvider/UserProvider.tsx

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { useLocalStorage } from '@rocket.chat/fuselage-hooks';
44
import { createPredicateFromFilter } from '@rocket.chat/mongo-adapter';
55
import { afterLogoutCleanUpCallback } from '@rocket.chat/ui-client';
66
import type { FindOptions, SubscriptionWithRoom } from '@rocket.chat/ui-contexts';
7-
import { UserContext, useEndpoint, useRouteParameter, useSearchParameter } from '@rocket.chat/ui-contexts';
7+
import { UserContext, useRouteParameter, useSearchParameter } from '@rocket.chat/ui-contexts';
88
import { useQueryClient } from '@tanstack/react-query';
99
import { Accounts } from 'meteor/accounts-base';
1010
import { Meteor } from 'meteor/meteor';
@@ -79,8 +79,6 @@ const UserProvider = ({ children }: UserProviderProps): ReactElement => {
7979
const samlCredentialToken = useSearchParameter('saml_idp_credentialToken');
8080
const inviteTokenHash = useRouteParameter('hash');
8181

82-
const setUserPreferences = useEndpoint('POST', '/v1/users.setPreferences');
83-
8482
useEmailVerificationWarning(user ?? undefined);
8583
useClearRemovedRoomsHistory(userId);
8684

@@ -156,17 +154,22 @@ const UserProvider = ({ children }: UserProviderProps): ReactElement => {
156154
[userId, user, querySubscription, querySubscriptions],
157155
);
158156

157+
// Mirror local preference changes into the live userLanguage state without hitting the server.
159158
useEffect(() => {
160-
if (!!userId && preferedLanguage !== userLanguage) {
161-
setUserPreferences({ data: { language: preferedLanguage } });
162-
setUserLanguage(preferedLanguage);
159+
if (preferedLanguage === userLanguage) {
160+
return;
163161
}
164162

163+
setUserLanguage(preferedLanguage);
164+
}, [preferedLanguage, setUserLanguage, userLanguage]);
165+
166+
// When the server reports a new language, overwrite both storage keys so every tab stays aligned.
167+
useEffect(() => {
165168
if (user?.language !== undefined && user.language !== userLanguage) {
166169
setUserLanguage(user.language);
167170
setPreferedLanguage(user.language);
168171
}
169-
}, [preferedLanguage, setPreferedLanguage, setUserLanguage, user?.language, userLanguage, userId, setUserPreferences]);
172+
}, [setPreferedLanguage, setUserLanguage, user?.language, userLanguage]);
170173

171174
useEffect(() => {
172175
if (!samlCredentialToken && !inviteTokenHash) {

0 commit comments

Comments
 (0)