Skip to content

Commit 6f9374f

Browse files
committed
fix: dynamic viewport adjustment to prevent scroll jumping on small screens
- Added useWindowSize hook to track viewport dimensions - Implemented dynamic bottom viewport calculation based on window height - Scales viewport from 500px (small screens) to 2000px (large screens) - Maintains memory optimization from PR #6697 while fixing scroll jumping Fixes #7026
1 parent 7b0f489 commit 6f9374f

File tree

1 file changed

+18
-2
lines changed

1 file changed

+18
-2
lines changed

webview-ui/src/components/chat/ChatView.tsx

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import React, { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from "react"
2-
import { useDeepCompareEffect, useEvent, useMount } from "react-use"
2+
import { useDeepCompareEffect, useEvent, useMount, useWindowSize } from "react-use"
33
import debounce from "debounce"
44
import { Virtuoso, type VirtuosoHandle } from "react-virtuoso"
55
import removeMd from "remove-markdown"
@@ -1743,6 +1743,22 @@ const ChatViewComponent: React.ForwardRefRenderFunction<ChatViewRef, ChatViewPro
17431743
}
17441744
}, [handleKeyDown])
17451745

1746+
// Use window size to calculate dynamic viewport
1747+
const { height: windowHeight } = useWindowSize()
1748+
1749+
// Calculate dynamic bottom viewport based on window height
1750+
// For smaller screens (< 800px), use a smaller viewport to prevent jumping
1751+
// For larger screens, use a larger viewport for smoother scrolling
1752+
const dynamicBottomViewport = useMemo(() => {
1753+
if (!windowHeight) return 1000 // Default fallback
1754+
1755+
// Scale the bottom viewport based on window height
1756+
// Minimum of 500px for very small screens, maximum of 2000px for large screens
1757+
const scaledViewport = Math.min(2000, Math.max(500, windowHeight * 0.8))
1758+
1759+
return Math.round(scaledViewport)
1760+
}, [windowHeight])
1761+
17461762
useImperativeHandle(ref, () => ({
17471763
acceptInput: () => {
17481764
if (enableButtons && primaryButtonText) {
@@ -1870,7 +1886,7 @@ const ChatViewComponent: React.ForwardRefRenderFunction<ChatViewRef, ChatViewPro
18701886
ref={virtuosoRef}
18711887
key={task.ts}
18721888
className="scrollable grow overflow-y-scroll mb-1"
1873-
increaseViewportBy={{ top: 3_000, bottom: 1000 }}
1889+
increaseViewportBy={{ top: 3_000, bottom: dynamicBottomViewport }}
18741890
data={groupedMessages}
18751891
itemContent={itemContent}
18761892
atBottomStateChange={(isAtBottom: boolean) => {

0 commit comments

Comments
 (0)