diff --git a/.changeset/fix-presence-reset.md b/.changeset/fix-presence-reset.md new file mode 100644 index 000000000..9c9158183 --- /dev/null +++ b/.changeset/fix-presence-reset.md @@ -0,0 +1,5 @@ +--- +default: patch +--- + +Fix presence status resetting to "online". diff --git a/src/app/utils/presence.ts b/src/app/utils/presence.ts index cb50bab9d..a0eeac07c 100644 --- a/src/app/utils/presence.ts +++ b/src/app/utils/presence.ts @@ -1,5 +1,6 @@ import type { MatrixClient } from 'matrix-js-sdk'; import { SetPresence } from 'matrix-js-sdk'; +import { getPresenceSyncManager } from '$client/initMatrix'; import { Presence } from '../hooks/useUserPresence'; const PRESENCE_TO_SET_PRESENCE: Record = { @@ -16,8 +17,10 @@ export const setUserPresence = async ( presence: Presence, statusMsg?: string ): Promise => { - Promise.all([ - mx.setSyncPresence(presenceToSetPresence(presence)), + const setPresence = presenceToSetPresence(presence); + getPresenceSyncManager(mx)?.setDesiredPresence(setPresence); + await Promise.all([ + mx.setSyncPresence(setPresence), mx.setPresence({ presence, status_msg: statusMsg, diff --git a/src/client/presenceSync.ts b/src/client/presenceSync.ts index 3148fd165..3111be8a7 100644 --- a/src/client/presenceSync.ts +++ b/src/client/presenceSync.ts @@ -1,5 +1,12 @@ import type { CryptoBackend, IDeviceLists, IToDeviceEvent, MatrixClient } from '$types/matrix-sdk'; -import { ClientEvent, Filter, Method, processToDeviceMessages, User } from '$types/matrix-sdk'; +import { + ClientEvent, + Filter, + Method, + processToDeviceMessages, + SetPresence, + User, +} from '$types/matrix-sdk'; import { createDebugLogger } from '$utils/debugLogger'; const debugLog = createDebugLogger('presenceSync'); @@ -19,6 +26,8 @@ export class PresenceSyncManager { private enabled = true; + private desiredSetPresence = SetPresence.Online; + private activeRequest: Promise | null = null; private abortController: AbortController | undefined; @@ -49,6 +58,10 @@ export class PresenceSyncManager { if (!this.activeRequest && !this.disposed) this.poll(); } + public setDesiredPresence(presence: SetPresence): void { + this.desiredSetPresence = presence; + } + public start(): void { if (this.disposed || this.activeRequest || !this.enabled) return; this.poll(); @@ -135,7 +148,7 @@ export class PresenceSyncManager { filter: filterId, since: this.syncToken, timeout: this.pollTimeoutMs, - set_presence: 'online', + set_presence: this.desiredSetPresence, }, undefined, { abortSignal: signal }