Browse Source

fix: auto-scroll

Adam 2 months ago
parent
commit
a168d854f4
1 changed files with 8 additions and 3 deletions
  1. 8 3
      packages/ui/src/components/session-turn.tsx

+ 8 - 3
packages/ui/src/components/session-turn.tsx

@@ -56,6 +56,7 @@ export function SessionTurn(
   })
 
   let scrollRef: HTMLDivElement | undefined
+  let lastScrollTop = 0
   const [state, setState] = createStore({
     contentRef: undefined as HTMLDivElement | undefined,
     stickyTitleRef: undefined as HTMLDivElement | undefined,
@@ -84,11 +85,14 @@ export function SessionTurn(
 
   function handleScroll() {
     if (!scrollRef || state.autoScrolled) return
-    const { scrollTop, scrollHeight, clientHeight } = scrollRef
-    const atBottom = scrollHeight - scrollTop - clientHeight < 50
-    if (!atBottom && working()) {
+    const { scrollTop } = scrollRef
+    // only mark as user scrolled if they actively scrolled upward
+    // content growth increases scrollHeight but never decreases scrollTop
+    const scrolledUp = scrollTop < lastScrollTop - 10
+    if (scrolledUp && working()) {
       setState("userScrolled", true)
     }
+    lastScrollTop = scrollTop
   }
 
   function handleInteraction() {
@@ -103,6 +107,7 @@ export function SessionTurn(
     requestAnimationFrame(() => {
       scrollRef?.scrollTo({ top: scrollRef.scrollHeight, behavior: "smooth" })
       requestAnimationFrame(() => {
+        lastScrollTop = scrollRef?.scrollTop ?? 0
         setState("autoScrolled", false)
       })
     })