revert: restore stable chat history scrolling

This commit is contained in:
Bohdan Triapitsyn
2026-06-14 23:06:03 +03:00
parent 296177357b
commit 928b7ff1d6
2 changed files with 5 additions and 15 deletions
@@ -1372,8 +1372,6 @@ const MessageList = React.forwardRef<MessageListHandle, MessageListProps>(({
scrollEl.scrollTop += prependedHeight;
});
const [historyVirtualRows, setHistoryVirtualRows] = React.useState<VirtualItem[]>(EMPTY_VIRTUAL_ROWS);
const historyVirtualizer = useVirtualizer({
count: historyEntries.length,
getScrollElement: resolveScrollContainer,
@@ -1383,9 +1381,6 @@ const MessageList = React.forwardRef<MessageListHandle, MessageListProps>(({
useAnimationFrameWithResizeObserver: true,
overscan: MESSAGE_LIST_OVERSCAN,
enabled: shouldVirtualizeHistory,
onChange: () => {
setHistoryVirtualRows(historyVirtualizer.getVirtualItems());
},
});
React.useLayoutEffect(() => {
@@ -1440,13 +1435,10 @@ const MessageList = React.forwardRef<MessageListHandle, MessageListProps>(({
};
}, []);
// Sync virtual rows on initial mount and when virtualization toggles.
// Ongoing updates are handled by the virtualizer's onChange callback.
React.useLayoutEffect(() => {
setHistoryVirtualRows(
shouldVirtualizeHistory ? historyVirtualizer.getVirtualItems() : EMPTY_VIRTUAL_ROWS,
);
}, [shouldVirtualizeHistory, historyVirtualizer]);
const historyVirtualRows = React.useMemo(
() => (shouldVirtualizeHistory ? historyVirtualizer.getVirtualItems() : EMPTY_VIRTUAL_ROWS),
[historyVirtualizer, shouldVirtualizeHistory],
);
const allEntries = React.useMemo(() => {
return trailingStreamingEntry ? [...historyEntries, trailingStreamingEntry] : historyEntries;
+1 -3
View File
@@ -411,9 +411,7 @@ export const useChatAutoFollow = ({
}, [sessionIsWorking, startFollowLoop]);
// Replay a deferred restoreSnapshot once ChatViewport mounts.
// useLayoutEffect ensures scroll position is set before the browser paints,
// preventing a visible flash of content at the wrong scroll position.
React.useLayoutEffect(() => {
React.useEffect(() => {
if (!containerEl) return;
if (pendingInitialRestoreRef.current && pendingInitialRestoreRef.current === currentSessionId) {
void restoreSnapshot();