import { Popover as Kobalte } from "@kobalte/core/popover" import { Component, createMemo, createSignal, JSX, Show } from "solid-js" import { useLocal } from "@/context/local" import { useDialog } from "@opencode-ai/ui/context/dialog" import { popularProviders } from "@/hooks/use-providers" import { Button } from "@opencode-ai/ui/button" import { Tag } from "@opencode-ai/ui/tag" import { Dialog } from "@opencode-ai/ui/dialog" import { List } from "@opencode-ai/ui/list" import { DialogSelectProvider } from "./dialog-select-provider" import { DialogManageModels } from "./dialog-manage-models" const ModelList: Component<{ provider?: string class?: string onSelect: () => void }> = (props) => { const local = useLocal() const models = createMemo(() => local.model .list() .filter((m) => local.model.visible({ modelID: m.id, providerID: m.provider.id })) .filter((m) => (props.provider ? m.provider.id === props.provider : true)), ) return ( `${x.provider.id}:${x.id}`} items={models} current={local.model.current()} filterKeys={["provider.name", "name", "id"]} sortBy={(a, b) => a.name.localeCompare(b.name)} groupBy={(x) => x.provider.name} sortGroupsBy={(a, b) => { if (a.category === "Recent" && b.category !== "Recent") return -1 if (b.category === "Recent" && a.category !== "Recent") return 1 const aProvider = a.items[0].provider.id const bProvider = b.items[0].provider.id if (popularProviders.includes(aProvider) && !popularProviders.includes(bProvider)) return -1 if (!popularProviders.includes(aProvider) && popularProviders.includes(bProvider)) return 1 return popularProviders.indexOf(aProvider) - popularProviders.indexOf(bProvider) }} onSelect={(x) => { local.model.set(x ? { modelID: x.id, providerID: x.provider.id } : undefined, { recent: true, }) props.onSelect() }} > {(i) => (
{i.name} Free Latest
)}
) } export const ModelSelectorPopover: Component<{ provider?: string children: JSX.Element }> = (props) => { const [open, setOpen] = createSignal(false) return ( {props.children} Select model setOpen(false)} class="p-1" /> ) } export const DialogSelectModel: Component<{ provider?: string }> = (props) => { const dialog = useDialog() return ( dialog.show(() => )} > Connect provider } > dialog.close()} /> ) }