diff --git a/packages/app/src/pages/session/composer/session-todo-dock.tsx b/packages/app/src/pages/session/composer/session-todo-dock.tsx index 7928bcc9ca..2214248b14 100644 --- a/packages/app/src/pages/session/composer/session-todo-dock.tsx +++ b/packages/app/src/pages/session/composer/session-todo-dock.tsx @@ -7,7 +7,7 @@ import { useSpring } from "@opencode-ai/ui/motion-spring" import { TextReveal } from "@opencode-ai/ui/text-reveal" import { TextStrikethrough } from "@opencode-ai/ui/text-strikethrough" import { createResizeObserver } from "@solid-primitives/resize-observer" -import { Index, createEffect, createMemo, on, onCleanup } from "solid-js" +import { Index, createEffect, createMemo, onCleanup } from "solid-js" import { createStore } from "solid-js/store" import { composerEnabled, composerProbe } from "@/testing/session-composer" import { useLanguage } from "@/context/language" @@ -210,76 +210,25 @@ export function SessionTodoDock(props: { opacity: `${Math.max(0, Math.min(1, 1 - hide()))}`, }} > - + ) } -function TodoList(props: { todos: Todo[]; open: boolean }) { +function TodoList(props: { todos: Todo[] }) { const [store, setStore] = createStore({ stuck: false, - scrolling: false, - }) - let scrollRef!: HTMLDivElement - let timer: number | undefined - - const inProgress = createMemo(() => props.todos.findIndex((todo) => todo.status === "in_progress")) - - const ensure = () => { - if (!props.open) return - if (store.scrolling) return - if (!scrollRef || scrollRef.offsetParent === null) return - - const el = scrollRef.querySelector("[data-in-progress]") - if (!(el instanceof HTMLElement)) return - - const topFade = 16 - const bottomFade = 44 - const container = scrollRef.getBoundingClientRect() - const rect = el.getBoundingClientRect() - const top = rect.top - container.top + scrollRef.scrollTop - const bottom = rect.bottom - container.top + scrollRef.scrollTop - const viewTop = scrollRef.scrollTop + topFade - const viewBottom = scrollRef.scrollTop + scrollRef.clientHeight - bottomFade - - if (top < viewTop) { - scrollRef.scrollTop = Math.max(0, top - topFade) - } else if (bottom > viewBottom) { - scrollRef.scrollTop = bottom - (scrollRef.clientHeight - bottomFade) - } - - setStore("stuck", scrollRef.scrollTop > 0) - } - - createEffect( - on([() => props.open, inProgress], () => { - if (!props.open || inProgress() < 0) return - requestAnimationFrame(ensure) - }), - ) - - onCleanup(() => { - if (!timer) return - window.clearTimeout(timer) }) return (
{ setStore("stuck", e.currentTarget.scrollTop > 0) - setStore("scrolling", true) - if (timer) window.clearTimeout(timer) - timer = window.setTimeout(() => { - setStore("scrolling", false) - if (inProgress() < 0) return - requestAnimationFrame(ensure) - }, 250) }} >