mirror of
https://github.com/fluxerapp/fluxer
synced 2026-10-17 21:15:32 +09:00
perf(app): stop redundant member list presence updates (#1940)
This commit is contained in:
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;
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user