perf(renderer): batch visible message read updates
This commit is contained in:
parent
e5f2c262e8
commit
6b08e0d1a7
1 changed files with 28 additions and 7 deletions
|
|
@ -682,19 +682,43 @@ export const MessagesPanel = memo(function MessagesPanel({
|
||||||
if (!open) setExpandedItemKey(null);
|
if (!open) setExpandedItemKey(null);
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
const { readSet, markRead, markAllRead } = useTeamMessagesRead(teamName);
|
const { readSet, markAllRead } = useTeamMessagesRead(teamName);
|
||||||
const { expandedSet, toggle: toggleExpandOverride } = useTeamMessagesExpanded(teamName);
|
const { expandedSet, toggle: toggleExpandOverride } = useTeamMessagesExpanded(teamName);
|
||||||
|
const pendingVisibleReadKeysRef = useRef<Set<string>>(new Set());
|
||||||
|
const visibleReadFlushFrameRef = useRef<number | null>(null);
|
||||||
|
|
||||||
const messagesUnreadCount = useMemo(
|
const messagesUnreadCount = useMemo(
|
||||||
() => filteredMessages.filter((m) => !m.read && !readSet.has(toMessageKey(m))).length,
|
() => filteredMessages.filter((m) => !m.read && !readSet.has(toMessageKey(m))).length,
|
||||||
[filteredMessages, readSet]
|
[filteredMessages, readSet]
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const flushVisibleReadKeys = useCallback(() => {
|
||||||
|
visibleReadFlushFrameRef.current = null;
|
||||||
|
const keys = [...pendingVisibleReadKeysRef.current];
|
||||||
|
pendingVisibleReadKeysRef.current.clear();
|
||||||
|
markAllRead(keys);
|
||||||
|
}, [markAllRead]);
|
||||||
|
|
||||||
const handleMessageVisible = useCallback(
|
const handleMessageVisible = useCallback(
|
||||||
(message: InboxMessage) => markRead(toMessageKey(message)),
|
(message: InboxMessage) => {
|
||||||
[markRead]
|
pendingVisibleReadKeysRef.current.add(toMessageKey(message));
|
||||||
|
if (visibleReadFlushFrameRef.current !== null) return;
|
||||||
|
visibleReadFlushFrameRef.current = window.requestAnimationFrame(flushVisibleReadKeys);
|
||||||
|
},
|
||||||
|
[flushVisibleReadKeys]
|
||||||
);
|
);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const pendingVisibleReadKeys = pendingVisibleReadKeysRef.current;
|
||||||
|
return () => {
|
||||||
|
if (visibleReadFlushFrameRef.current !== null) {
|
||||||
|
window.cancelAnimationFrame(visibleReadFlushFrameRef.current);
|
||||||
|
visibleReadFlushFrameRef.current = null;
|
||||||
|
}
|
||||||
|
pendingVisibleReadKeys.clear();
|
||||||
|
};
|
||||||
|
}, [teamName]);
|
||||||
|
|
||||||
const readState = useMemo(() => ({ readSet, getMessageKey: toMessageKey }), [readSet]);
|
const readState = useMemo(() => ({ readSet, getMessageKey: toMessageKey }), [readSet]);
|
||||||
|
|
||||||
const { teamNames, teamColorByName } = useStableTeamMentionMeta(teams);
|
const { teamNames, teamColorByName } = useStableTeamMentionMeta(teams);
|
||||||
|
|
@ -745,10 +769,7 @@ export const MessagesPanel = memo(function MessagesPanel({
|
||||||
};
|
};
|
||||||
}, [
|
}, [
|
||||||
refreshSendMessageRuntimeDeliveryStatus,
|
refreshSendMessageRuntimeDeliveryStatus,
|
||||||
sendMessageDebugDetails?.messageId,
|
sendMessageDebugDetails,
|
||||||
sendMessageDebugDetails?.statusMessageId,
|
|
||||||
sendMessageDebugDetails?.responsePending,
|
|
||||||
sendMessageDebugDetails?.userVisibleState,
|
|
||||||
sendMessageRuntimeReplyVisible,
|
sendMessageRuntimeReplyVisible,
|
||||||
teamName,
|
teamName,
|
||||||
]);
|
]);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue