diff --git a/app/notifications/client/lib/Notifications.js b/app/notifications/client/lib/Notifications.js index feb3bfd4680..cc9f8f9ebb4 100644 --- a/app/notifications/client/lib/Notifications.js +++ b/app/notifications/client/lib/Notifications.js @@ -75,8 +75,9 @@ class Notifications { return this.streamRoom.on(`${ room }/${ eventName }`, callback); } - onUser(eventName, callback) { - return this.streamUser.on(`${ Meteor.userId() }/${ eventName }`, callback); + async onUser(eventName, callback) { + await this.streamUser.on(`${ Meteor.userId() }/${ eventName }`, callback); + return () => this.unUser(eventName, callback); } unAll(callback) { diff --git a/app/ui-sidenav/client/userPresence.js b/app/ui-sidenav/client/userPresence.js index b7e821c104b..957b4537268 100644 --- a/app/ui-sidenav/client/userPresence.js +++ b/app/ui-sidenav/client/userPresence.js @@ -73,18 +73,14 @@ const featureExists = !!window.IntersectionObserver; const observer = featureExists && new IntersectionObserver(handleEntries, options); -let wasConnected = Meteor.status().connected; - Tracker.autorun(() => { // Only clear statuses on disconnect, prevent process it on reconnect again const isConnected = Meteor.status().connected; - if (!Meteor.userId() || (wasConnected && !isConnected)) { - wasConnected = isConnected; + if (!Meteor.userId() || !isConnected) { Presence.reset(); return Meteor.users.update({ status: { $exists: true } }, { $unset: { status: true } }, { multi: true }); } mem.clear(get); - wasConnected = isConnected; Presence.restart(); diff --git a/client/lib/userData.ts b/client/lib/userData.ts index b8da5636259..2b37d1957f5 100644 --- a/client/lib/userData.ts +++ b/client/lib/userData.ts @@ -27,12 +27,15 @@ const updateUser = (userData: IUser & { _updatedAt: Date }): void => { Meteor.users.update({ _id: user._id }, { $set: userData }); }; +let cancel: undefined | (() => void); export const synchronizeUserData = async (uid: Meteor.User['_id']): Promise => { if (!uid) { return; } - Notifications.onUser('userData', (data: IUserDataEvent) => { + cancel && cancel(); + + cancel = await Notifications.onUser('userData', (data: IUserDataEvent) => { switch (data.type) { case 'inserted': // eslint-disable-next-line @typescript-eslint/no-unused-vars diff --git a/client/startup/startup.ts b/client/startup/startup.ts index d226716c019..2cc59de0543 100644 --- a/client/startup/startup.ts +++ b/client/startup/startup.ts @@ -47,6 +47,7 @@ Meteor.startup(() => { } const user = await synchronizeUserData(uid); + if (!user) { return; }