Merge pull request 'fix(presence): Invisible, Hide Online Status, Idle and DND stick (#282)' (#354) from fix/presence-sticky into lotus
CI / Build & Quality Checks (push) Successful in 3m8s
CI / Docker image build & smoke test (push) Skipped
CI / Secret scan (gitleaks) (push) Successful in 10s
CI / Trigger Desktop Build (push) Successful in 5s
CI / Playwright smoke (e2e) (push) Canceled after 14s
CI / Build & Quality Checks (push) Successful in 3m8s
CI / Docker image build & smoke test (push) Skipped
CI / Secret scan (gitleaks) (push) Successful in 10s
CI / Trigger Desktop Build (push) Successful in 5s
CI / Playwright smoke (e2e) (push) Canceled after 14s
This commit was merged in pull request #354.
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
import { useEffect, useRef } from 'react';
|
import { useEffect, useRef } from 'react';
|
||||||
|
import { SetPresence } from 'matrix-js-sdk';
|
||||||
import { PresenceDeduper, PresenceWrite } from '../utils/presenceWrite';
|
import { PresenceDeduper, PresenceWrite } from '../utils/presenceWrite';
|
||||||
import { useMatrixClient } from './useMatrixClient';
|
import { useMatrixClient } from './useMatrixClient';
|
||||||
import { getLastLocalStatusWrite, pickHeartbeatStatus } from '../utils/ownStatusSync';
|
import { getLastLocalStatusWrite, pickHeartbeatStatus } from '../utils/ownStatusSync';
|
||||||
@@ -90,11 +91,21 @@ export function usePresenceUpdater() {
|
|||||||
return status;
|
return status;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// [Gitea #282] A one-off PUT /presence doesn't stick: the SDK long-polls
|
||||||
|
// /sync with set_presence=online by default and Synapse treats every sync
|
||||||
|
// as "online", so Invisible / Idle / DND flipped back within seconds. Tell
|
||||||
|
// the sync loop which presence to report too (as Element does).
|
||||||
|
const syncPresence = (presence: SetPresence) => {
|
||||||
|
mx.setSyncPresence(presence).catch(() => undefined);
|
||||||
|
};
|
||||||
|
|
||||||
const setOnline = async () => {
|
const setOnline = async () => {
|
||||||
|
syncPresence(SetPresence.Online);
|
||||||
const status = await resolveStatus();
|
const status = await resolveStatus();
|
||||||
return send({ presence: 'online', ...(status ? { status_msg: status } : {}) }, 'online');
|
return send({ presence: 'online', ...(status ? { status_msg: status } : {}) }, 'online');
|
||||||
};
|
};
|
||||||
const setUnavailable = async (statusMsg?: string) => {
|
const setUnavailable = async (statusMsg?: string) => {
|
||||||
|
syncPresence(SetPresence.Unavailable);
|
||||||
const status = await resolveStatus();
|
const status = await resolveStatus();
|
||||||
return send(
|
return send(
|
||||||
{
|
{
|
||||||
@@ -104,7 +115,10 @@ export function usePresenceUpdater() {
|
|||||||
'unavailable',
|
'unavailable',
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
const setOffline = () => send({ presence: 'offline', status_msg: '' }, 'offline');
|
const setOffline = () => {
|
||||||
|
syncPresence(SetPresence.Offline);
|
||||||
|
return send({ presence: 'offline', status_msg: '' }, 'offline');
|
||||||
|
};
|
||||||
|
|
||||||
// Manual presence overrides — no activity tracking needed.
|
// Manual presence overrides — no activity tracking needed.
|
||||||
if (hidePresence || presenceStatus === 'invisible') {
|
if (hidePresence || presenceStatus === 'invisible') {
|
||||||
|
|||||||
Reference in New Issue
Block a user