From ecf65b7ca79c1695b3f792acae09c02cbf0a142f Mon Sep 17 00:00:00 2001 From: Kris Hu Date: Mon, 7 Jul 2025 09:42:00 +0800 Subject: [PATCH 1/2] update presence status when window lose focus (cherry picked from commit 9c99a84ad0513abf33c119ab68590997435f62c8) Signed-off-by: Kris Hu --- src/app/pages/client/ClientNonUIFeatures.tsx | 25 +++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/app/pages/client/ClientNonUIFeatures.tsx b/src/app/pages/client/ClientNonUIFeatures.tsx index ce952bfc..578c1603 100644 --- a/src/app/pages/client/ClientNonUIFeatures.tsx +++ b/src/app/pages/client/ClientNonUIFeatures.tsx @@ -1,7 +1,7 @@ import { useAtomValue } from 'jotai'; import React, { ReactNode, useCallback, useEffect, useRef } from 'react'; import { useNavigate } from 'react-router-dom'; -import { RoomEvent, RoomEventHandlerMap } from 'matrix-js-sdk'; +import { RoomEvent, RoomEventHandlerMap, SetPresence } from 'matrix-js-sdk'; import { roomToUnreadAtom, unreadEqual, unreadInfoToUnread } from '../../state/room/roomToUnread'; import LogoSVG from '../../../../public/res/svg/cinny.svg'; import LogoUnreadSVG from '../../../../public/res/svg/cinny-unread.svg'; @@ -253,6 +253,28 @@ function MessageNotifications() { ); } +function UpdatePresence() { + const mx = useMatrixClient(); + const onFocus = () => { + mx.setSyncPresence(SetPresence.Online); + }; + const onBlur = () => { + mx.setSyncPresence(SetPresence.Unavailable); + } + + useEffect(() => { + window.addEventListener("focus", onFocus); + window.addEventListener("blur", onBlur); + onFocus(); + return () => { + window.removeEventListener("focus", onFocus); + window.removeEventListener("blur", onBlur); + }; + }, [mx]); + + return null; +} + type ClientNonUIFeaturesProps = { children: ReactNode; }; @@ -265,6 +287,7 @@ export function ClientNonUIFeatures({ children }: ClientNonUIFeaturesProps) { + {children} ); From 74e64fb60a347e68a4e9396273fa19aefadefe8b Mon Sep 17 00:00:00 2001 From: Kris Hu Date: Tue, 15 Jul 2025 10:22:52 +0800 Subject: [PATCH 2/2] lint(presence): make eslint happy --- src/app/pages/client/ClientNonUIFeatures.tsx | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/app/pages/client/ClientNonUIFeatures.tsx b/src/app/pages/client/ClientNonUIFeatures.tsx index 578c1603..478e2d1a 100644 --- a/src/app/pages/client/ClientNonUIFeatures.tsx +++ b/src/app/pages/client/ClientNonUIFeatures.tsx @@ -255,14 +255,15 @@ function MessageNotifications() { function UpdatePresence() { const mx = useMatrixClient(); - const onFocus = () => { - mx.setSyncPresence(SetPresence.Online); - }; - const onBlur = () => { - mx.setSyncPresence(SetPresence.Unavailable); - } useEffect(() => { + const onFocus = () => { + mx.setSyncPresence(SetPresence.Online); + }; + const onBlur = () => { + mx.setSyncPresence(SetPresence.Unavailable); + } + window.addEventListener("focus", onFocus); window.addEventListener("blur", onBlur); onFocus();