import { Button } from "@opencode-ai/ui/button" import { useDialog } from "@opencode-ai/ui/context/dialog" import { Dialog } from "@opencode-ai/ui/dialog" import { List, type ListRef } from "@opencode-ai/ui/list" import { ProviderIcon } from "@opencode-ai/ui/provider-icon" import { Tag } from "@opencode-ai/ui/tag" import { Tooltip } from "@opencode-ai/ui/tooltip" import { type Component, Show } from "solid-js" import { useLocal } from "@/context/local" import { popularProviders, useProviders } from "@/hooks/use-providers" import { ModelTooltip } from "./model-tooltip" import { useLanguage } from "@/context/language" type ModelState = ReturnType["model"] export const DialogSelectModelUnpaid: Component<{ model?: ModelState }> = (props) => { const model = props.model ?? useLocal().model const dialog = useDialog() const providers = useProviders() const language = useLanguage() const connect = (provider: string) => { void import("./dialog-connect-provider").then((x) => { dialog.show(() => ) }) } const all = () => { void import("./dialog-select-provider").then((x) => { dialog.show(() => ) }) } let listRef: ListRef | undefined const handleKeyDown = (e: KeyboardEvent) => { if (e.key === "Escape") return listRef?.onKeyDown(e) } return (
{language.t("dialog.model.unpaid.freeModels.title")}
(listRef = ref)} items={model.list} current={model.current()} key={(x) => `${x.provider.id}:${x.id}`} itemWrapper={(item, node) => ( } > {node} )} onSelect={(x) => { model.set(x ? { modelID: x.id, providerID: x.provider.id } : undefined, { recent: true, }) dialog.close() }} > {(i) => (
{i.name} {language.t("model.tag.free")} {language.t("model.tag.latest")}
)}
{language.t("dialog.model.unpaid.addMore.title")}
x?.id} items={providers.popular} activeIcon="plus-small" sortBy={(a, b) => { if (popularProviders.includes(a.id) && popularProviders.includes(b.id)) return popularProviders.indexOf(a.id) - popularProviders.indexOf(b.id) return a.name.localeCompare(b.name) }} onSelect={(x) => { if (!x) return connect(x.id) }} > {(i) => (
{i.name}
{language.t("dialog.provider.opencode.tagline")}
{language.t("dialog.provider.tag.recommended")} <>
{language.t("dialog.provider.opencodeGo.tagline")}
{language.t("dialog.provider.tag.recommended")}
{language.t("dialog.provider.anthropic.note")}
)}
) }