perf(app): stop redundant member list presence updates (#1940)

This commit is contained in:
Hampus authored and GitHub committed 2026-08-24 12:49:40 +02:00
1 parent 32d7ae3eef
commit 7be52fa9fc
1 file changed
+22 -20
@@ -42,40 +42,42 @@ export function useMemberListPresence({
userId, userId,
enabled = true, enabled = true,
}: UseMemberListPresenceOptions): StatusType { }: UseMemberListPresenceOptions): StatusType {
const hasMemberListSource = guildId !== '';
const computeStatus = useCallback( const computeStatus = useCallback(
() => () =>
resolveMemberListPresence({ resolveMemberListPresence({
guildId, guildId,
channelId, channelId,
userId, userId,
enabled, enabled: hasMemberListSource,
}), }),
[channelId, enabled, guildId, userId], [channelId, guildId, hasMemberListSource, userId],
); );
const [status, setStatus] = useState<StatusType>(() => computeStatus()); const [status, setStatus] = useState<StatusType>(() => (enabled ? computeStatus() : StatusTypes.OFFLINE));
useEffect(() => { useEffect(() => {
setStatus(computeStatus()); if (!enabled) {
let disposeMemberListReaction: (() => void) | undefined; return;
if (enabled) {
disposeMemberListReaction = reaction(
() => MemberSidebar.getPresence(guildId, channelId, userId),
() => setStatus(computeStatus()),
{fireImmediately: false},
);
} }
const unsubscribePresence = Presence.subscribeToUserStatus(userId, () => { let lastStatus = computeStatus();
setStatus(computeStatus()); setStatus(lastStatus);
}); const applyStatus = () => {
const disposeTransient = reaction( const nextStatus = computeStatus();
() => TransientPresence.getTransientStatus(userId), if (nextStatus === lastStatus) {
() => setStatus(computeStatus()), return;
{fireImmediately: false}, }
); 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 () => { return () => {
unsubscribePresence(); unsubscribePresence();
disposeTransient(); disposeTransient();
disposeMemberListReaction?.(); disposeMemberListReaction?.();
}; };
}, [computeStatus, enabled, guildId, channelId, userId]); }, [computeStatus, enabled, hasMemberListSource, guildId, channelId, userId]);
return status; return status;
} }