import { InteractionManager } from 'react-native'; import semver from 'semver'; import reduxStore from '../createStore'; import { setActiveUsers } from '../../actions/activeUsers'; export function subscribeUsersPresence() { const serverVersion = reduxStore.getState().server.version; // if server is lower than 1.1.0 if (serverVersion && semver.lt(semver.coerce(serverVersion), '1.1.0')) { if (this.activeUsersSubTimeout) { clearTimeout(this.activeUsersSubTimeout); this.activeUsersSubTimeout = false; } this.activeUsersSubTimeout = setTimeout(() => { this.sdk.subscribe('activeUsers'); }, 5000); } else { this.sdk.subscribe('stream-notify-logged', 'user-status'); } } let ids = []; export default async function getUsersPresence() { const serverVersion = reduxStore.getState().server.version; // if server is greather than or equal 1.1.0 if (serverVersion && !semver.lt(semver.coerce(serverVersion), '1.1.0')) { let params = {}; // if server is greather than or equal 3.0.0 if (serverVersion && !semver.lt(semver.coerce(serverVersion), '3.0.0')) { // if not have any id if (!ids.length) { return; } // Request userPresence on demand params = { ids: ids.join(',') }; ids = []; } // RC 1.1.0 const result = await this.sdk.get('users.presence', params); if (result.success) { const activeUsers = result.users.reduce((ret, item) => { ret[item._id] = { status: item.status, statusText: item.statusText }; return ret; }, {}); InteractionManager.runAfterInteractions(() => { reduxStore.dispatch(setActiveUsers(activeUsers)); }); } } } let usersTimer = null; export function getUserPresence(uid) { const auth = reduxStore.getState().login.isAuthenticated; if (!usersTimer) { usersTimer = setTimeout(() => { if (auth && ids.length) { getUsersPresence.call(this); } usersTimer = null; }, 2000); } ids.push(uid); }