chore: cleanup (#17284)

This commit is contained in:
Adam 2026-03-13 06:27:58 -05:00 committed by GitHub
commit 270cb0b8b4
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
23 changed files with 516 additions and 357 deletions

View file

@ -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>
)