Skip to content
This repository was archived by the owner on Apr 1, 2026. It is now read-only.

Commit ba16bfd

Browse files
committed
wip(desktop): progress
1 parent ad5614b commit ba16bfd

4 files changed

Lines changed: 42 additions & 32 deletions

File tree

packages/desktop/src/components/dialog-manage-models.tsx

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,18 +27,21 @@ export const DialogManageModels: Component = () => {
2727
}}
2828
onSelect={(x) => {
2929
if (!x) return
30-
local.model.setVisibility({ modelID: x.id, providerID: x.provider.id }, !x.visible)
30+
const visible = local.model.visible({ modelID: x.id, providerID: x.provider.id })
31+
local.model.setVisibility({ modelID: x.id, providerID: x.provider.id }, !visible)
3132
}}
3233
>
3334
{(i) => (
3435
<div class="w-full flex items-center justify-between gap-x-2.5">
3536
<span>{i.name}</span>
36-
<Switch
37-
checked={!!i.visible}
38-
onChange={(checked) => {
39-
local.model.setVisibility({ modelID: i.id, providerID: i.provider.id }, checked)
40-
}}
41-
/>
37+
<div onClick={(e) => e.stopPropagation()}>
38+
<Switch
39+
checked={!!local.model.visible({ modelID: i.id, providerID: i.provider.id })}
40+
onChange={(checked) => {
41+
local.model.setVisibility({ modelID: i.id, providerID: i.provider.id }, checked)
42+
}}
43+
/>
44+
</div>
4245
</div>
4346
)}
4447
</List>

packages/desktop/src/components/dialog-select-model.tsx

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,10 @@ export const DialogSelectModel: Component<{ provider?: string }> = (props) => {
1313
const local = useLocal()
1414
const dialog = useDialog()
1515

16-
let closeButton!: HTMLButtonElement
1716
const models = createMemo(() =>
1817
local.model
1918
.list()
20-
.filter((m) => m.visible)
19+
.filter((m) => local.model.visible({ modelID: m.id, providerID: m.provider.id }))
2120
.filter((m) => (props.provider ? m.provider.id === props.provider : true)),
2221
)
2322

@@ -58,7 +57,7 @@ export const DialogSelectModel: Component<{ provider?: string }> = (props) => {
5857
local.model.set(x ? { modelID: x.id, providerID: x.provider.id } : undefined, {
5958
recent: true,
6059
})
61-
closeButton.click()
60+
dialog.clear()
6261
}}
6362
>
6463
{(i) => (

packages/desktop/src/context/local.tsx

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -132,10 +132,10 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({
132132
Object.values(p.models).map((m) => ({
133133
...m,
134134
provider: p,
135-
user: store.user.find((x) => x.modelID === m.id && x.providerID === p.id),
136135
})),
137136
),
138137
)
138+
139139
const latest = createMemo(() =>
140140
pipe(
141141
available(),
@@ -163,10 +163,6 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({
163163
...m,
164164
name: m.name.replace("(latest)", "").trim(),
165165
latest: m.name.includes("(latest)"),
166-
visible:
167-
m.user?.visibility !== "hide" &&
168-
(latest().find((x) => x.modelID === m.id && x.providerID === m.provider.id) ||
169-
store.user.find((x) => x.modelID === m.id && x.providerID === m.provider.id)?.visibility === "show"),
170166
})),
171167
)
172168

@@ -241,7 +237,7 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({
241237
if (index >= 0) {
242238
setStore("user", index, { visibility })
243239
} else {
244-
setStore("user", (prev) => [...prev, { ...model, visibility }])
240+
setStore("user", store.user.length, { ...model, visibility })
245241
}
246242
}
247243

@@ -260,11 +256,13 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({
260256
}
261257
})
262258
},
263-
show(model: ModelKey) {
264-
updateVisibility(model, "show")
265-
},
266-
hide(model: ModelKey) {
267-
updateVisibility(model, "hide")
259+
visible(model: ModelKey) {
260+
const user = store.user.find((x) => x.modelID === model.modelID && x.providerID === model.providerID)
261+
return (
262+
user?.visibility !== "hide" &&
263+
(latest().find((x) => x.modelID === model.modelID && x.providerID === model.providerID) ||
264+
user?.visibility === "show")
265+
)
268266
},
269267
setVisibility(model: ModelKey, visible: boolean) {
270268
updateVisibility(model, visible ? "show" : "hide")

packages/ui/src/components/list.tsx

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { createEffect, Show, For, type JSX, createSignal } from "solid-js"
1+
import { createEffect, on, Show, For, type JSX, createSignal } from "solid-js"
22
import { createStore } from "solid-js/store"
33
import { FilteredListProps, useFilteredList } from "@opencode-ai/ui/hooks"
44
import { Icon, IconProps } from "./icon"
@@ -32,24 +32,34 @@ export function List<T>(props: ListProps<T> & { ref?: (ref: ListRef) => void })
3232
mouseActive: false,
3333
})
3434

35-
const { filter, grouped, flat, reset, active, setActive, onKeyDown, onInput } = useFilteredList<T>(props)
35+
const { filter, grouped, flat, active, setActive, onKeyDown, onInput } = useFilteredList<T>(props)
3636

3737
const searchProps = () => (typeof props.search === "object" ? props.search : {})
38-
const hasSearch = () => !!props.search
3938

4039
createEffect(() => {
4140
if (props.filter !== undefined) {
4241
onInput(props.filter)
43-
} else if (hasSearch()) {
44-
onInput(internalFilter())
4542
}
4643
})
4744

48-
createEffect(() => {
49-
filter()
50-
scrollRef()?.scrollTo(0, 0)
51-
reset()
52-
})
45+
createEffect((prev) => {
46+
if (!props.search) return
47+
const current = internalFilter()
48+
if (prev !== current) {
49+
onInput(current)
50+
}
51+
return current
52+
}, "")
53+
54+
createEffect(
55+
on(
56+
filter,
57+
() => {
58+
scrollRef()?.scrollTo(0, 0)
59+
},
60+
{ defer: true },
61+
),
62+
)
5363

5464
createEffect(() => {
5565
if (!scrollRef()) return
@@ -100,7 +110,7 @@ export function List<T>(props: ListProps<T> & { ref?: (ref: ListRef) => void })
100110

101111
return (
102112
<div data-component="list" classList={{ [props.class ?? ""]: !!props.class }}>
103-
<Show when={hasSearch()}>
113+
<Show when={!!props.search}>
104114
<div data-slot="list-search">
105115
<div data-slot="list-search-container">
106116
<Icon name="magnifying-glass" />

0 commit comments

Comments
 (0)