Skip to content

Commit b5b4be2

Browse files
committed
fix(webui): More fixes [copilot]
1 parent b964faa commit b5b4be2

2 files changed

Lines changed: 28 additions & 11 deletions

File tree

packages/webui/src/client/lib/VirtualElement.tsx

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -234,16 +234,11 @@ export function VirtualElement({
234234
)
235235

236236
const isScrolling = (): boolean => {
237-
// Don't do updates while scrolling:
238-
if (getViewPortScrollingState().isProgrammaticScrollInProgress) {
239-
return true
240-
}
241-
// And wait if a programmatic scroll was done recently:
242-
const timeSinceLastProgrammaticScroll = Date.now() - getViewPortScrollingState().lastProgrammaticScrollTime
243-
if (timeSinceLastProgrammaticScroll < 100) {
244-
return true
245-
}
246-
return false
237+
const { isProgrammaticScrollInProgress, lastProgrammaticScrollTime } = getViewPortScrollingState()
238+
if (!isProgrammaticScrollInProgress) return false
239+
240+
// Safety valve: stale programmatic scroll state should not block virtualization indefinitely.
241+
return Date.now() - lastProgrammaticScrollTime < 1200
247242
}
248243

249244
useEffect(() => {

packages/webui/src/client/lib/viewPort.ts

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -337,8 +337,30 @@ export async function scrollToPosition(scrollPosition: number, noAnimation?: boo
337337
left: 0,
338338
behavior: 'smooth',
339339
})
340-
await new Promise((resolve) => setTimeout(resolve, 300))
340+
341+
await new Promise<void>((resolve) => {
342+
const startTime = Date.now()
343+
let previousY = window.scrollY
344+
let stableTicks = 0
345+
const interval = window.setInterval(() => {
346+
const currentY = window.scrollY
347+
if (Math.abs(currentY - previousY) <= 1) {
348+
stableTicks++
349+
} else {
350+
stableTicks = 0
351+
}
352+
previousY = currentY
353+
viewPortScrollingState.lastProgrammaticScrollTime = Date.now()
354+
355+
if (stableTicks >= 2 || Date.now() - startTime > 1200) {
356+
window.clearInterval(interval)
357+
resolve()
358+
}
359+
}, 50)
360+
})
361+
341362
viewPortScrollingState.isProgrammaticScrollInProgress = false
363+
viewPortScrollingState.lastProgrammaticScrollTime = Date.now()
342364
}
343365
}
344366

0 commit comments

Comments
 (0)