diff options
| author | Adam <[email protected]> | 2025-12-29 09:56:21 -0600 |
|---|---|---|
| committer | Adam <[email protected]> | 2025-12-29 09:56:33 -0600 |
| commit | fb0e1e4d8d3adc54b382c9daa5cdae7435d82e35 (patch) | |
| tree | b7ea9c0c05a5f323990a8ee16853f675bfa8486b /packages/ui/src/components | |
| parent | b745b1593f3ac25302ab7e8fc375f5fbe956e403 (diff) | |
| download | opencode-fb0e1e4d8d3adc54b382c9daa5cdae7435d82e35.tar.gz opencode-fb0e1e4d8d3adc54b382c9daa5cdae7435d82e35.zip | |
Revert "fix(desktop): jankiness"
This reverts commit 831e9bce51c035ec22ce9562bf0257d6b59b2fe4.
Diffstat (limited to 'packages/ui/src/components')
| -rw-r--r-- | packages/ui/src/components/list.tsx | 55 | ||||
| -rw-r--r-- | packages/ui/src/components/message-part.tsx | 11 | ||||
| -rw-r--r-- | packages/ui/src/components/session-turn.tsx | 23 |
3 files changed, 46 insertions, 43 deletions
diff --git a/packages/ui/src/components/list.tsx b/packages/ui/src/components/list.tsx index a549c19e9..808c9b032 100644 --- a/packages/ui/src/components/list.tsx +++ b/packages/ui/src/components/list.tsx @@ -1,5 +1,5 @@ import { type FilteredListProps, useFilteredList } from "@opencode-ai/ui/hooks" -import { createEffect, createSignal, For, onCleanup, type JSX, on, Show } from "solid-js" +import { createEffect, createSignal, For, type JSX, on, Show } from "solid-js" import { createStore } from "solid-js/store" import { Icon, type IconProps } from "./icon" import { IconButton } from "./icon-button" @@ -116,33 +116,6 @@ export function List<T>(props: ListProps<T> & { ref?: (ref: ListRef) => void }) setScrollRef, }) - function GroupHeader(props: { category: string }): JSX.Element { - const [stuck, setStuck] = createSignal(false) - const [header, setHeader] = createSignal<HTMLDivElement | undefined>(undefined) - - createEffect(() => { - const scroll = scrollRef() - const node = header() - if (!scroll || !node) return - - const handler = () => { - const rect = node.getBoundingClientRect() - const scrollRect = scroll.getBoundingClientRect() - setStuck(rect.top <= scrollRect.top + 1 && scroll.scrollTop > 0) - } - - scroll.addEventListener("scroll", handler, { passive: true }) - handler() - onCleanup(() => scroll.removeEventListener("scroll", handler)) - }) - - return ( - <div data-slot="list-header" data-stuck={stuck()} ref={setHeader}> - {props.category} - </div> - ) - } - return ( <div data-component="list" classList={{ [props.class ?? ""]: !!props.class }}> <Show when={!!props.search}> @@ -184,7 +157,31 @@ export function List<T>(props: ListProps<T> & { ref?: (ref: ListRef) => void }) {(group) => ( <div data-slot="list-group"> <Show when={group.category}> - <GroupHeader category={group.category} /> + {(() => { + const [stuck, setStuck] = createSignal(false) + return ( + <div + data-slot="list-header" + data-stuck={stuck()} + ref={(el) => { + createEffect(() => { + const scroll = scrollRef() + if (!scroll) return + const handler = () => { + const rect = el.getBoundingClientRect() + const scrollRect = scroll.getBoundingClientRect() + setStuck(rect.top <= scrollRect.top + 1 && scroll.scrollTop > 0) + } + scroll.addEventListener("scroll", handler, { passive: true }) + handler() + return () => scroll.removeEventListener("scroll", handler) + }) + }} + > + {group.category} + </div> + ) + })()} </Show> <div data-slot="list-items"> <For each={group.items}> diff --git a/packages/ui/src/components/message-part.tsx b/packages/ui/src/components/message-part.tsx index ea865d7ce..e43ffc322 100644 --- a/packages/ui/src/components/message-part.tsx +++ b/packages/ui/src/components/message-part.tsx @@ -364,7 +364,16 @@ PART_MAPPING["tool"] = function ToolPartDisplay(props) { const permission = createMemo(() => { const sessionID = props.message.sessionID const permissions = data.store.permission?.[sessionID] ?? [] - return permissions.find((perm) => perm.callID === part.callID) + const next = permissions.reduce( + (result, perm) => { + if (!result) return perm + if (perm.id < result.id) return perm + return result + }, + undefined as (typeof permissions)[number] | undefined, + ) + if (!next) return undefined + return next.callID === part.callID ? next : undefined }) const [forceOpen, setForceOpen] = createSignal(false) diff --git a/packages/ui/src/components/session-turn.tsx b/packages/ui/src/components/session-turn.tsx index 0a1ee5c4f..a3ac5b0b4 100644 --- a/packages/ui/src/components/session-turn.tsx +++ b/packages/ui/src/components/session-turn.tsx @@ -111,23 +111,13 @@ export function SessionTurn( const allMessages = createMemo(() => data.store.message[props.sessionID] ?? []) - const messageIndex = createMemo(() => { + const message = createMemo(() => { const messages = allMessages() const result = Binary.search(messages, props.messageID, (m) => m.id) - if (!result.found) return -1 + if (!result.found) return undefined const msg = messages[result.index] - if (msg.role !== "user") return -1 - - return result.index - }) - - const message = createMemo(() => { - const index = messageIndex() - if (index < 0) return undefined - - const msg = allMessages()[index] - if (!msg || msg.role !== "user") return undefined + if (msg.role !== "user") return undefined return msg }) @@ -151,6 +141,13 @@ export function SessionTurn( return data.store.part[msg.id] ?? [] }) + const messageIndex = createMemo(() => { + const messages = allMessages() + const result = Binary.search(messages, props.messageID, (m) => m.id) + if (!result.found) return -1 + return result.index + }) + const assistantMessages = createMemo(() => { const msg = message() if (!msg) return [] as AssistantMessage[] |
