From 1be9f0cba59801ec4b3cb7b462432c76eee24693 Mon Sep 17 00:00:00 2001 From: Erwan Leboucher Date: Wed, 15 Jul 2026 23:42:04 +0200 Subject: [PATCH] fix: stop presence sync from resetting user status to online --- .changeset/fix-presence-reset.md | 5 +++++ src/app/utils/presence.ts | 7 +++++-- src/client/presenceSync.ts | 17 +++++++++++++++-- 3 files changed, 25 insertions(+), 4 deletions(-) create mode 100644 .changeset/fix-presence-reset.md diff --git a/.changeset/fix-presence-reset.md b/.changeset/fix-presence-reset.md new file mode 100644 index 0000000000..9c91581837 --- /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 cb50bab9d0..a0eeac07ca 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 3148fd1651..3111be8a71 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 }