From 971bd30516fb2b245f87bdf79e36bb64e72265bc Mon Sep 17 00:00:00 2001 From: mridul <65942753+rexdotsh@users.noreply.github.com> Date: Sun, 1 Mar 2026 02:43:23 +0530 Subject: [PATCH] fix(app): fallback to synthetic icon for unknown provider IDs (#15295) --- .../app/src/components/dialog-connect-provider.tsx | 3 +-- .../src/components/dialog-select-model-unpaid.tsx | 3 +-- .../app/src/components/dialog-select-provider.tsx | 8 +------- packages/app/src/components/prompt-input.tsx | 5 ++--- packages/app/src/components/settings-models.tsx | 3 +-- packages/app/src/components/settings-providers.tsx | 12 +++--------- packages/enterprise/src/routes/share/[shareID].tsx | 8 +++----- packages/ui/src/components/provider-icon.tsx | 7 ++++--- 8 files changed, 16 insertions(+), 33 deletions(-) diff --git a/packages/app/src/components/dialog-connect-provider.tsx b/packages/app/src/components/dialog-connect-provider.tsx index 90f4f41f7..b042205cf 100644 --- a/packages/app/src/components/dialog-connect-provider.tsx +++ b/packages/app/src/components/dialog-connect-provider.tsx @@ -4,7 +4,6 @@ import { useDialog } from "@opencode-ai/ui/context/dialog" import { Dialog } from "@opencode-ai/ui/dialog" import { Icon } from "@opencode-ai/ui/icon" import { IconButton } from "@opencode-ai/ui/icon-button" -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 { Spinner } from "@opencode-ai/ui/spinner" @@ -447,7 +446,7 @@ export function DialogConnectProvider(props: { provider: string }) { >
- +
diff --git a/packages/app/src/components/dialog-select-model-unpaid.tsx b/packages/app/src/components/dialog-select-model-unpaid.tsx index 5ca29a520..bcee3f501 100644 --- a/packages/app/src/components/dialog-select-model-unpaid.tsx +++ b/packages/app/src/components/dialog-select-model-unpaid.tsx @@ -1,7 +1,6 @@ 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" @@ -95,7 +94,7 @@ export const DialogSelectModelUnpaid: Component = () => { > {(i) => (
- + {i.name}
{language.t("dialog.provider.opencode.tagline")}
diff --git a/packages/app/src/components/dialog-select-provider.tsx b/packages/app/src/components/dialog-select-provider.tsx index 76e718bb0..e53738399 100644 --- a/packages/app/src/components/dialog-select-provider.tsx +++ b/packages/app/src/components/dialog-select-provider.tsx @@ -5,18 +5,12 @@ import { Dialog } from "@opencode-ai/ui/dialog" import { List } from "@opencode-ai/ui/list" import { Tag } from "@opencode-ai/ui/tag" import { ProviderIcon } from "@opencode-ai/ui/provider-icon" -import { iconNames, type IconName } from "@opencode-ai/ui/icons/provider" import { DialogConnectProvider } from "./dialog-connect-provider" import { useLanguage } from "@/context/language" import { DialogCustomProvider } from "./dialog-custom-provider" const CUSTOM_ID = "_custom" -function icon(id: string): IconName { - if (iconNames.includes(id as IconName)) return id as IconName - return "synthetic" -} - export const DialogSelectProvider: Component = () => { const dialog = useDialog() const providers = useProviders() @@ -69,7 +63,7 @@ export const DialogSelectProvider: Component = () => { > {(i) => (
- + {i.name}
{language.t("dialog.provider.opencode.tagline")}
diff --git a/packages/app/src/components/prompt-input.tsx b/packages/app/src/components/prompt-input.tsx index 3ba3763b8..d16791a61 100644 --- a/packages/app/src/components/prompt-input.tsx +++ b/packages/app/src/components/prompt-input.tsx @@ -23,7 +23,6 @@ import { Button } from "@opencode-ai/ui/button" import { DockShellForm, DockTray } from "@opencode-ai/ui/dock-surface" import { Icon } from "@opencode-ai/ui/icon" import { ProviderIcon } from "@opencode-ai/ui/provider-icon" -import type { IconName } from "@opencode-ai/ui/icons/provider" import { Tooltip, TooltipKeybind } from "@opencode-ai/ui/tooltip" import { IconButton } from "@opencode-ai/ui/icon-button" import { Select } from "@opencode-ai/ui/select" @@ -1398,7 +1397,7 @@ export const PromptInput: Component = (props) => { > @@ -1428,7 +1427,7 @@ export const PromptInput: Component = (props) => { > diff --git a/packages/app/src/components/settings-models.tsx b/packages/app/src/components/settings-models.tsx index 07f6d30e1..eff62cd6c 100644 --- a/packages/app/src/components/settings-models.tsx +++ b/packages/app/src/components/settings-models.tsx @@ -4,7 +4,6 @@ import { Switch } from "@opencode-ai/ui/switch" import { Icon } from "@opencode-ai/ui/icon" import { IconButton } from "@opencode-ai/ui/icon-button" import { TextField } from "@opencode-ai/ui/text-field" -import type { IconName } from "@opencode-ai/ui/icons/provider" import { type Component, For, Show } from "solid-js" import { useLanguage } from "@/context/language" import { useModels } from "@/context/models" @@ -98,7 +97,7 @@ export const SettingsModels: Component = () => { {(group) => (
- + {group.items[0].provider.name}
diff --git a/packages/app/src/components/settings-providers.tsx b/packages/app/src/components/settings-providers.tsx index 6fac9feca..21db62950 100644 --- a/packages/app/src/components/settings-providers.tsx +++ b/packages/app/src/components/settings-providers.tsx @@ -3,7 +3,6 @@ import { useDialog } from "@opencode-ai/ui/context/dialog" import { ProviderIcon } from "@opencode-ai/ui/provider-icon" import { Tag } from "@opencode-ai/ui/tag" import { showToast } from "@opencode-ai/ui/toast" -import { iconNames, type IconName } from "@opencode-ai/ui/icons/provider" import { popularProviders, useProviders } from "@/hooks/use-providers" import { createMemo, type Component, For, Show } from "solid-js" import { useLanguage } from "@/context/language" @@ -33,11 +32,6 @@ export const SettingsProviders: Component = () => { const globalSync = useGlobalSync() const providers = useProviders() - const icon = (id: string): IconName => { - if (iconNames.includes(id as IconName)) return id as IconName - return "synthetic" - } - const connected = createMemo(() => { return providers .connected() @@ -154,7 +148,7 @@ export const SettingsProviders: Component = () => { {(item) => (
- + {item.name} {type(item)}
@@ -185,7 +179,7 @@ export const SettingsProviders: Component = () => {
- + {item.name} @@ -228,7 +222,7 @@ export const SettingsProviders: Component = () => { >
- + {language.t("provider.custom.title")} {language.t("settings.providers.tag.custom")}
diff --git a/packages/enterprise/src/routes/share/[shareID].tsx b/packages/enterprise/src/routes/share/[shareID].tsx index ada543b7d..007b4c268 100644 --- a/packages/enterprise/src/routes/share/[shareID].tsx +++ b/packages/enterprise/src/routes/share/[shareID].tsx @@ -23,7 +23,6 @@ import { MessageNav } from "@opencode-ai/ui/message-nav" import { preloadMultiFileDiff, PreloadMultiFileDiffResult } from "@pierre/diffs/ssr" import { FileSSR } from "@opencode-ai/ui/file-ssr" import { clientOnly } from "@solidjs/start" -import { type IconName } from "@opencode-ai/ui/icons/provider" import { Meta, Title } from "@solidjs/meta" import { Base64 } from "js-base64" @@ -268,10 +267,9 @@ export default function () {
- + + +
{model()?.name ?? modelID()}
diff --git a/packages/ui/src/components/provider-icon.tsx b/packages/ui/src/components/provider-icon.tsx index d653765a5..b2a99989c 100644 --- a/packages/ui/src/components/provider-icon.tsx +++ b/packages/ui/src/components/provider-icon.tsx @@ -1,14 +1,15 @@ import type { Component, JSX } from "solid-js" import { splitProps } from "solid-js" import sprite from "./provider-icons/sprite.svg" -import type { IconName } from "./provider-icons/types" +import { iconNames, type IconName } from "./provider-icons/types" export type ProviderIconProps = JSX.SVGElementTags["svg"] & { - id: IconName + id: string } export const ProviderIcon: Component = (props) => { const [local, rest] = splitProps(props, ["id", "class", "classList"]) + const resolved = iconNames.includes(local.id as IconName) ? local.id : "synthetic" return ( = (props) => { [local.class ?? ""]: !!local.class, }} > - + ) }