diff options
| author | Adam <[email protected]> | 2026-03-13 06:27:58 -0500 |
|---|---|---|
| committer | GitHub <[email protected]> | 2026-03-13 06:27:58 -0500 |
| commit | 270cb0b8b4265ac0965ac8b94a58a3bca86fa558 (patch) | |
| tree | 5a37c81bec1dea75b5c24f6aa8fb6a762d438f64 /packages/ui/src/components/list.tsx | |
| parent | 46ba9c81703fc6e7db7e623a607eeaab94fcd00f (diff) | |
| download | opencode-270cb0b8b4265ac0965ac8b94a58a3bca86fa558.tar.gz opencode-270cb0b8b4265ac0965ac8b94a58a3bca86fa558.zip | |
chore: cleanup (#17284)
Diffstat (limited to 'packages/ui/src/components/list.tsx')
| -rw-r--r-- | packages/ui/src/components/list.tsx | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/packages/ui/src/components/list.tsx b/packages/ui/src/components/list.tsx index aa2347037..8ce45bc5c 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, For, onCleanup, type JSX, on, Show } from "solid-js" import { createStore } from "solid-js/store" import { useI18n } from "../context/i18n" import { Icon, type IconProps } from "./icon" @@ -56,12 +56,16 @@ export interface ListRef { export function List<T>(props: ListProps<T> & { ref?: (ref: ListRef) => void }) { const i18n = useI18n() - const [scrollRef, setScrollRef] = createSignal<HTMLDivElement | undefined>(undefined) - const [internalFilter, setInternalFilter] = createSignal("") let inputRef: HTMLInputElement | HTMLTextAreaElement | undefined const [store, setStore] = createStore({ mouseActive: false, + scrollRef: undefined as HTMLDivElement | undefined, + internalFilter: "", }) + const scrollRef = () => store.scrollRef + const setScrollRef = (el: HTMLDivElement | undefined) => setStore("scrollRef", el) + const internalFilter = () => store.internalFilter + const setInternalFilter = (value: string) => setStore("internalFilter", value) const scrollIntoView = (container: HTMLDivElement, node: HTMLElement, block: "center" | "nearest") => { const containerRect = container.getBoundingClientRect() @@ -208,18 +212,20 @@ export function List<T>(props: ListProps<T> & { ref?: (ref: ListRef) => void }) } function GroupHeader(groupProps: { group: { category: string; items: T[] } }): JSX.Element { - const [stuck, setStuck] = createSignal(false) - const [header, setHeader] = createSignal<HTMLDivElement | undefined>(undefined) + const [state, setState] = createStore({ + stuck: false, + header: undefined as HTMLDivElement | undefined, + }) createEffect(() => { const scroll = scrollRef() - const node = header() + const node = state.header if (!scroll || !node) return const handler = () => { const rect = node.getBoundingClientRect() const scrollRect = scroll.getBoundingClientRect() - setStuck(rect.top <= scrollRect.top + 1 && scroll.scrollTop > 0) + setState("stuck", rect.top <= scrollRect.top + 1 && scroll.scrollTop > 0) } scroll.addEventListener("scroll", handler, { passive: true }) @@ -228,7 +234,7 @@ export function List<T>(props: ListProps<T> & { ref?: (ref: ListRef) => void }) }) return ( - <div data-slot="list-header" data-stuck={stuck()} ref={setHeader}> + <div data-slot="list-header" data-stuck={state.stuck} ref={(el) => setState("header", el)}> {props.groupHeader?.(groupProps.group) ?? groupProps.group.category} </div> ) |
