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; }