diff options
| author | Adam <[email protected]> | 2025-12-24 05:57:44 -0600 |
|---|---|---|
| committer | Adam <[email protected]> | 2025-12-24 05:57:48 -0600 |
| commit | bff7518a247d7044216acc6de6b6391940237535 (patch) | |
| tree | aad50c52b079278453f837a221ef3ef6737f3a42 | |
| parent | 8eab6770940295c95412f04e39b7392152848ccc (diff) | |
| download | opencode-bff7518a247d7044216acc6de6b6391940237535.tar.gz opencode-bff7518a247d7044216acc6de6b6391940237535.zip | |
fix(desktop): auto-scroll
| -rw-r--r-- | packages/ui/src/hooks/create-auto-scroll.tsx | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/packages/ui/src/hooks/create-auto-scroll.tsx b/packages/ui/src/hooks/create-auto-scroll.tsx index d201fe36b..3bba7aec6 100644 --- a/packages/ui/src/hooks/create-auto-scroll.tsx +++ b/packages/ui/src/hooks/create-auto-scroll.tsx @@ -22,16 +22,28 @@ export function createAutoScroll(options: AutoScrollOptions) { function scrollToBottom() { if (!scrollRef || store.userScrolled || !options.working()) return setStore("autoScrolled", true) - requestAnimationFrame(() => { - scrollRef?.scrollTo({ top: scrollRef.scrollHeight, behavior: "smooth" }) - requestAnimationFrame(() => { + const targetHeight = scrollRef.scrollHeight + scrollRef.scrollTo({ top: targetHeight, behavior: "smooth" }) + + // Wait for scroll to complete before clearing autoScrolled + const checkScrollComplete = () => { + if (!scrollRef) { + setStore("autoScrolled", false) + return + } + const atBottom = scrollRef.scrollTop + scrollRef.clientHeight >= scrollRef.scrollHeight - 10 + const reachedTarget = scrollRef.scrollTop >= targetHeight - scrollRef.clientHeight - 10 + if (atBottom || reachedTarget) { batch(() => { setStore("lastScrollTop", scrollRef?.scrollTop ?? 0) setStore("lastScrollHeight", scrollRef?.scrollHeight ?? 0) setStore("autoScrolled", false) }) - }) - }) + } else { + requestAnimationFrame(checkScrollComplete) + } + } + requestAnimationFrame(checkScrollComplete) } function handleScroll() { |
