diff --git a/app/lib/methods/getUsersPresence.ts b/app/lib/methods/getUsersPresence.ts index 798fe37ebec..edee13dfb7d 100644 --- a/app/lib/methods/getUsersPresence.ts +++ b/app/lib/methods/getUsersPresence.ts @@ -1,5 +1,6 @@ import { InteractionManager } from 'react-native'; import { sanitizedRaw } from '@nozbe/watermelondb/RawRecord'; +import { Q } from '@nozbe/watermelondb'; import { type IActiveUsers } from '../../reducers/activeUsers'; import { store as reduxStore } from '../store/auxStore'; @@ -9,6 +10,7 @@ import database from '../database'; import { type IUser } from '../../definitions'; import sdk from '../services/sdk'; import { compareServerVersion } from './helpers'; +import log from './helpers/log'; import userPreferences from './userPreferences'; import { NOTIFICATION_PRESENCE_CAP } from '../constants/notifications'; import { setNotificationPresenceCap } from '../../actions/app'; @@ -44,6 +46,12 @@ let usersBatch: string[] = []; export async function getUsersPresence(usersParams: string[]) { const serverVersion = reduxStore.getState().server.version as string; const { user: loggedUser } = reduxStore.getState().login; + const { Presence_broadcast_disabled: presenceBroadcastDisabled } = reduxStore.getState().settings; + + // Skip presence fetch if broadcasting is disabled on the server + if (presenceBroadcastDisabled) { + return; + } // if server is greather than or equal 1.1.0 if (compareServerVersion(serverVersion, 'greaterThanOrEqualTo', '1.1.0')) { @@ -140,3 +148,32 @@ export const setPresenceCap = async (enabled: boolean) => { reduxStore.dispatch(setNotificationPresenceCap(false)); } }; + +export const getDirectMessageUserIds = async (): Promise => { + try { + const db = database.active; + const loggedUserId = reduxStore.getState().login.user?.id; + const subscriptionsCollection = db.get('subscriptions'); + const subscriptions = await subscriptionsCollection + .query(Q.where('t', 'd'), Q.where('open', true), Q.where('archived', false)) + .fetch(); + const userIds = subscriptions + .flatMap((sub: { uids?: string[] }) => sub.uids || []) + .filter((uid): uid is string => Boolean(uid) && uid !== loggedUserId); + return [...new Set(userIds)]; + } catch (e) { + log(e); + return []; + } +}; + +export const refreshDmUsersPresence = async (): Promise => { + try { + const userIds = await getDirectMessageUserIds(); + if (userIds.length > 0) { + await getUsersPresence(userIds); + } + } catch (e) { + log(e); + } +}; diff --git a/app/sagas/login.js b/app/sagas/login.js index e88740ed6ff..0443f69be43 100644 --- a/app/sagas/login.js +++ b/app/sagas/login.js @@ -28,7 +28,7 @@ import { getEnterpriseModules, isOmnichannelModuleAvailable } from '../lib/metho import { getPermissions } from '../lib/methods/getPermissions'; import { getRoles } from '../lib/methods/getRoles'; import { getSlashCommands } from '../lib/methods/getSlashCommands'; -import { getUserPresence, subscribeUsersPresence } from '../lib/methods/getUsersPresence'; +import { getUserPresence, refreshDmUsersPresence, subscribeUsersPresence } from '../lib/methods/getUsersPresence'; import { logout, removeServerData, removeServerDatabase } from '../lib/methods/logout'; import { subscribeSettings } from '../lib/methods/getSettings'; import { connect, loginWithPassword, login } from '../lib/services/connect'; @@ -195,6 +195,7 @@ const registerPushTokenFork = function* registerPushTokenFork() { const fetchUsersPresenceFork = function* fetchUsersPresenceFork() { try { yield subscribeUsersPresence(); + yield refreshDmUsersPresence(); } catch (e) { log(e); }