diff --git a/apps/meteor/client/providers/UserProvider/UserProvider.tsx b/apps/meteor/client/providers/UserProvider/UserProvider.tsx index 5621746403765..c1e8b84aff014 100644 --- a/apps/meteor/client/providers/UserProvider/UserProvider.tsx +++ b/apps/meteor/client/providers/UserProvider/UserProvider.tsx @@ -6,7 +6,7 @@ import type { FindOptions, SubscriptionWithRoom } from '@rocket.chat/ui-contexts import { UserContext, useRouteParameter, useSearchParameter } from '@rocket.chat/ui-contexts'; import { useQueryClient } from '@tanstack/react-query'; import { Meteor } from 'meteor/meteor'; -import type { Filter } from 'mongodb'; +import type { Filter, ObjectId } from 'mongodb'; import type { ContextType, ReactElement, ReactNode } from 'react'; import { useEffect, useMemo, useRef } from 'react'; import type { StoreApi, UseBoundStore } from 'zustand'; @@ -16,13 +16,12 @@ import { useDeleteUser } from './hooks/useDeleteUser'; import { useEmailVerificationWarning } from './hooks/useEmailVerificationWarning'; import { useReloadAfterLogin } from './hooks/useReloadAfterLogin'; import { useUpdateAvatar } from './hooks/useUpdateAvatar'; -import { getUserPreference } from '../../../app/utils/client'; import { sdk } from '../../../app/utils/client/lib/SDKClient'; import { useIdleConnection } from '../../hooks/useIdleConnection'; import type { IDocumentMapStore } from '../../lib/cachedStores/DocumentMapStore'; import { applyQueryOptions } from '../../lib/cachedStores/applyQueryOptions'; -import { createReactiveSubscriptionFactory } from '../../lib/createReactiveSubscriptionFactory'; import { getDdpSdk } from '../../lib/sdk/ddpSdk'; +import { settings } from '../../lib/settings'; import { userIdStore } from '../../lib/user'; import { Users, Rooms, Subscriptions } from '../../stores'; import { useSamlInviteToken } from '../../views/invite/hooks/useSamlInviteToken'; @@ -138,9 +137,30 @@ const UserProvider = ({ children }: UserProviderProps): ReactElement => { (): ContextType => ({ userId, user, - queryPreference: createReactiveSubscriptionFactory( - (key: string, defaultValue?: T) => getUserPreference(userId, key, defaultValue) as T, - ), + queryPreference: ( + key: string | ObjectId, + defaultValue?: T, + ): [subscribe: (onStoreChange: () => void) => () => void, getSnapshot: () => T | undefined] => { + const effectiveKey = String(key); + + const subscribe = (onStoreChange: () => void): (() => void) => { + const unsubUsers = Users.use.subscribe(onStoreChange); + const unsubSettings = settings.observe(`Accounts_Default_User_Preferences_${effectiveKey}`, onStoreChange); + return () => { + unsubUsers(); + unsubSettings(); + }; + }; + + const getSnapshot = (): T | undefined => { + return ( + (user?.settings?.preferences?.[effectiveKey] as T | undefined) ?? + defaultValue ?? + settings.peek(`Accounts_Default_User_Preferences_${effectiveKey}`) + ); + }; + return [subscribe, getSnapshot]; + }, querySubscription, queryRoom, querySubscriptions,