import { Button } from "@opencode-ai/ui/button" import { useDialog } from "@opencode-ai/ui/context/dialog" import { Dialog } from "@opencode-ai/ui/dialog" import type { IconName } from "@opencode-ai/ui/icons/provider" 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, onCleanup, onMount, Show } from "solid-js" import { useLocal } from "@/context/local" import { popularProviders, useProviders } from "@/hooks/use-providers" import { DialogConnectProvider } from "./dialog-connect-provider" import { DialogSelectProvider } from "./dialog-select-provider" import { ModelTooltip } from "./model-tooltip" import { useLanguage } from "@/context/language" export const DialogSelectModelUnpaid: Component = () => { const local = useLocal() const dialog = useDialog() const providers = useProviders() const language = useLanguage() let listRef: ListRef | undefined const handleKey = (e: KeyboardEvent) => { if (e.key === "Escape") return listRef?.onKeyDown(e) } onMount(() => { document.addEventListener("keydown", handleKey) onCleanup(() => { document.removeEventListener("keydown", handleKey) }) }) return (
{language.t("dialog.model.unpaid.freeModels.title")}
(listRef = ref)} items={local.model.list} current={local.model.current()} key={(x) => `${x.provider.id}:${x.id}`} itemWrapper={(item, node) => ( } > {node} )} onSelect={(x) => { local.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 dialog.show(() => ) }} > {(i) => (
{i.name} {language.t("dialog.provider.tag.recommended")}
{language.t("dialog.provider.anthropic.note")}
)}
) }