From 0ebcaff92717ba0cb3ca122064cabc7622a2dd68 Mon Sep 17 00:00:00 2001 From: Adam <2363879+adamdotdevin@users.noreply.github.com> Date: Thu, 18 Dec 2025 14:31:13 -0600 Subject: fix(desktop): expanded states --- packages/ui/src/components/session-turn.tsx | 55 ++++++++++------------------- 1 file changed, 19 insertions(+), 36 deletions(-) (limited to 'packages/ui/src') diff --git a/packages/ui/src/components/session-turn.tsx b/packages/ui/src/components/session-turn.tsx index bae7a2a40..6a0e11422 100644 --- a/packages/ui/src/components/session-turn.tsx +++ b/packages/ui/src/components/session-turn.tsx @@ -25,7 +25,8 @@ export function SessionTurn( sessionID: string messageID: string stepsExpanded?: boolean - onStepsExpandedChange?: (expanded: boolean) => void + onStepsExpandedToggle?: () => void + onUserInteracted?: () => void classes?: { root?: string content?: string @@ -171,7 +172,6 @@ export function SessionTurn( stickyHeaderHeight: 0, retrySeconds: 0, status: rawStatus(), - stepsExpanded: props.stepsExpanded ?? working(), duration: duration(), }) @@ -192,18 +192,26 @@ export function SessionTurn( function handleScroll() { if (!scrollRef || store.autoScrolled) return - const { scrollTop } = scrollRef - // only mark as user scrolled if they actively scrolled upward - // content growth increases scrollHeight but never decreases scrollTop + const scrollTop = scrollRef.scrollTop + const reset = scrollTop <= 0 && store.lastScrollTop > 100 && working() && !store.userScrolled + if (reset) { + setStore("lastScrollTop", scrollTop) + requestAnimationFrame(scrollToBottom) + return + } const scrolledUp = scrollTop < store.lastScrollTop - 10 if (scrolledUp && working()) { setStore("userScrolled", true) + props.onUserInteracted?.() } setStore("lastScrollTop", scrollTop) } function handleInteraction() { - if (working()) setStore("userScrolled", true) + if (working()) { + setStore("userScrolled", true) + props.onUserInteracted?.() + } } function scrollToBottom() { @@ -242,12 +250,6 @@ export function SessionTurn( }, ) - createEffect(() => { - if (props.stepsExpanded !== undefined) { - setStore("stepsExpanded", props.stepsExpanded) - } - }) - createEffect(() => { const timer = setInterval(() => { setStore("duration", duration()) @@ -262,7 +264,6 @@ export function SessionTurn( if (newStatus === store.status || !newStatus) return const timeSinceLastChange = Date.now() - lastStatusChange - if (timeSinceLastChange >= 2500) { setStore("status", newStatus) lastStatusChange = Date.now() @@ -280,19 +281,6 @@ export function SessionTurn( } }) - createEffect((prev) => { - const isWorking = working() - if (!prev && isWorking) { - setStore("stepsExpanded", true) - props.onStepsExpandedChange?.(true) - } - if (prev && !isWorking && !store.userScrolled) { - setStore("stepsExpanded", false) - props.onStepsExpandedChange?.(false) - } - return isWorking - }, working()) - return (
@@ -336,12 +324,7 @@ export function SessionTurn( data-slot="session-turn-collapsible-trigger-content" variant="ghost" size="small" - onClick={() => { - if (assistantMessages().length === 0) return - const next = !store.stepsExpanded - setStore("stepsExpanded", next) - props.onStepsExpandedChange?.(next) - }} + onClick={props.onStepsExpandedToggle ?? (() => {})} > @@ -361,8 +344,8 @@ export function SessionTurn( (#{retry()?.attempt}) {store.status ?? "Considering next steps"} - Hide steps - Show steps + Hide steps + Show steps ยท {store.duration} @@ -373,7 +356,7 @@ export function SessionTurn(
{/* Response */} - 0}> + 0}>
{(assistantMessage) => { @@ -472,7 +455,7 @@ export function SessionTurn(
- + {error()?.data?.message as string} -- cgit v1.2.3