From c307505f8b3629a3ffda291fa8496f474c3e097d Mon Sep 17 00:00:00 2001 From: Shoubhit Dash Date: Fri, 3 Apr 2026 18:42:01 +0530 Subject: [PATCH] fix(session): delay jump-to-bottom button (#20853) --- packages/app/src/pages/session.tsx | 11 ++++++++--- packages/app/src/pages/session/message-timeline.tsx | 7 +++---- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/packages/app/src/pages/session.tsx b/packages/app/src/pages/session.tsx index 98d06fda74..ae895adbe9 100644 --- a/packages/app/src/pages/session.tsx +++ b/packages/app/src/pages/session.tsx @@ -347,6 +347,7 @@ export default function Page() { scroll: { overflow: false, bottom: true, + jump: false, }, }) @@ -1247,13 +1248,17 @@ export default function Page() { let scrollStateTarget: HTMLDivElement | undefined let fillFrame: number | undefined + const jumpThreshold = (el: HTMLDivElement) => Math.max(400, el.clientHeight) + const updateScrollState = (el: HTMLDivElement) => { const max = el.scrollHeight - el.clientHeight + const distance = max - el.scrollTop const overflow = max > 1 - const bottom = !overflow || el.scrollTop >= max - 2 + const bottom = !overflow || distance <= 2 + const jump = overflow && distance > jumpThreshold(el) - if (ui.scroll.overflow === overflow && ui.scroll.bottom === bottom) return - setUi("scroll", { overflow, bottom }) + if (ui.scroll.overflow === overflow && ui.scroll.bottom === bottom && ui.scroll.jump === jump) return + setUi("scroll", { overflow, bottom, jump }) } const scheduleScrollState = (el: HTMLDivElement) => { diff --git a/packages/app/src/pages/session/message-timeline.tsx b/packages/app/src/pages/session/message-timeline.tsx index a246abaf3f..e1d6da1958 100644 --- a/packages/app/src/pages/session/message-timeline.tsx +++ b/packages/app/src/pages/session/message-timeline.tsx @@ -200,7 +200,7 @@ export function MessageTimeline(props: { mobileChanges: boolean mobileFallback: JSX.Element actions?: UserActions - scroll: { overflow: boolean; bottom: boolean } + scroll: { overflow: boolean; bottom: boolean; jump: boolean } onResumeScroll: () => void setScrollRef: (el: HTMLDivElement | undefined) => void onScheduleScrollState: (el: HTMLDivElement) => void @@ -568,10 +568,9 @@ export function MessageTimeline(props: {