From 7be52fa9fc100fc6a37059368b1897ffc05aac59 Mon Sep 17 00:00:00 2001 From: Hampus Date: Mon, 24 Aug 2026 12:49:40 +0200 Subject: [PATCH] perf(app): stop redundant member list presence updates (#1940) --- .../member/hooks/useMemberListPresence.ts | 42 ++++++++++--------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/fluxer_app/src/features/member/hooks/useMemberListPresence.ts b/fluxer_app/src/features/member/hooks/useMemberListPresence.ts index 7a3a49fde..b6b8a20ce 100644 --- a/fluxer_app/src/features/member/hooks/useMemberListPresence.ts +++ b/fluxer_app/src/features/member/hooks/useMemberListPresence.ts @@ -42,40 +42,42 @@ export function useMemberListPresence({ userId, enabled = true, }: UseMemberListPresenceOptions): StatusType { + const hasMemberListSource = guildId !== ''; const computeStatus = useCallback( () => resolveMemberListPresence({ guildId, channelId, userId, - enabled, + enabled: hasMemberListSource, }), - [channelId, enabled, guildId, userId], + [channelId, guildId, hasMemberListSource, userId], ); - const [status, setStatus] = useState(() => computeStatus()); + const [status, setStatus] = useState(() => (enabled ? computeStatus() : StatusTypes.OFFLINE)); useEffect(() => { - setStatus(computeStatus()); - let disposeMemberListReaction: (() => void) | undefined; - if (enabled) { - disposeMemberListReaction = reaction( - () => MemberSidebar.getPresence(guildId, channelId, userId), - () => setStatus(computeStatus()), - {fireImmediately: false}, - ); + if (!enabled) { + return; } - const unsubscribePresence = Presence.subscribeToUserStatus(userId, () => { - setStatus(computeStatus()); - }); - const disposeTransient = reaction( - () => TransientPresence.getTransientStatus(userId), - () => setStatus(computeStatus()), - {fireImmediately: false}, - ); + let lastStatus = computeStatus(); + setStatus(lastStatus); + const applyStatus = () => { + const nextStatus = computeStatus(); + if (nextStatus === lastStatus) { + return; + } + lastStatus = nextStatus; + setStatus(nextStatus); + }; + const disposeMemberListReaction = hasMemberListSource + ? reaction(() => MemberSidebar.getPresence(guildId, channelId, userId), applyStatus) + : undefined; + const unsubscribePresence = Presence.subscribeToUserStatus(userId, applyStatus); + const disposeTransient = reaction(() => TransientPresence.getTransientStatus(userId), applyStatus); return () => { unsubscribePresence(); disposeTransient(); disposeMemberListReaction?.(); }; - }, [computeStatus, enabled, guildId, channelId, userId]); + }, [computeStatus, enabled, hasMemberListSource, guildId, channelId, userId]); return status; }