import { Component, createMemo, createSignal, Show } from "solid-js" import { useSync } from "@/context/sync" import { useSDK } from "@/context/sdk" import { Dialog } from "@opencode-ai/ui/dialog" import { List } from "@opencode-ai/ui/list" import { Switch } from "@opencode-ai/ui/switch" import { useLanguage } from "@/context/language" export const DialogSelectMcp: Component = () => { const sync = useSync() const sdk = useSDK() const language = useLanguage() const [loading, setLoading] = createSignal(null) const items = createMemo(() => Object.entries(sync.data.mcp ?? {}) .map(([name, status]) => ({ name, status: status.status })) .sort((a, b) => a.name.localeCompare(b.name)), ) const toggle = async (name: string) => { if (loading()) return setLoading(name) const status = sync.data.mcp[name] if (status?.status === "connected") { await sdk.client.mcp.disconnect({ name }) } else { await sdk.client.mcp.connect({ name }) } const result = await sdk.client.mcp.status() if (result.data) sync.set("mcp", result.data) setLoading(null) } const enabledCount = createMemo(() => items().filter((i) => i.status === "connected").length) const totalCount = createMemo(() => items().length) return ( x?.name ?? ""} items={items} filterKeys={["name", "status"]} sortBy={(a, b) => a.name.localeCompare(b.name)} onSelect={(x) => { if (x) toggle(x.name) }} > {(i) => { const mcpStatus = () => sync.data.mcp[i.name] const status = () => mcpStatus()?.status const error = () => { const s = mcpStatus() return s?.status === "failed" ? s.error : undefined } const enabled = () => status() === "connected" return (
{i.name} {language.t("mcp.status.connected")} {language.t("mcp.status.failed")} {language.t("mcp.status.needs_auth")} {language.t("mcp.status.disabled")} {language.t("common.loading.ellipsis")}
{error()}
e.stopPropagation()}> toggle(i.name)} />
) }}
) }