diff --git a/src/components/providers/AddProviderDialog.tsx b/src/components/providers/AddProviderDialog.tsx index ef9c43a..b04dd94 100644 --- a/src/components/providers/AddProviderDialog.tsx +++ b/src/components/providers/AddProviderDialog.tsx @@ -41,6 +41,8 @@ export function AddProviderDialog({ notes: values.notes?.trim() || undefined, websiteUrl: values.websiteUrl?.trim() || undefined, settingsConfig: parsedConfig, + icon: values.icon?.trim() || undefined, + iconColor: values.iconColor?.trim() || undefined, ...(values.presetCategory ? { category: values.presetCategory } : {}), ...(values.meta ? { meta: values.meta } : {}), }; diff --git a/src/components/providers/EditProviderDialog.tsx b/src/components/providers/EditProviderDialog.tsx index 4a350c4..4f2db7b 100644 --- a/src/components/providers/EditProviderDialog.tsx +++ b/src/components/providers/EditProviderDialog.tsx @@ -89,6 +89,8 @@ export function EditProviderDialog({ notes: values.notes?.trim() || undefined, websiteUrl: values.websiteUrl?.trim() || undefined, settingsConfig: parsedConfig, + icon: values.icon?.trim() || undefined, + iconColor: values.iconColor?.trim() || undefined, ...(values.presetCategory ? { category: values.presetCategory } : {}), // 保留或更新 meta 字段 ...(values.meta ? { meta: values.meta } : {}), @@ -124,6 +126,8 @@ export function EditProviderDialog({ settingsConfig: initialSettingsConfig, category: provider.category, meta: provider.meta, + icon: provider.icon, + iconColor: provider.iconColor, }} showButtons={false} /> diff --git a/src/components/providers/ProviderCard.tsx b/src/components/providers/ProviderCard.tsx index 8d35286..e6f6444 100644 --- a/src/components/providers/ProviderCard.tsx +++ b/src/components/providers/ProviderCard.tsx @@ -9,6 +9,7 @@ import type { Provider } from "@/types"; import type { AppId } from "@/lib/api"; import { cn } from "@/lib/utils"; import { ProviderActions } from "@/components/providers/ProviderActions"; +import { ProviderIcon } from "@/components/ProviderIcon"; import UsageFooter from "@/components/UsageFooter"; interface DragHandleProps { @@ -139,6 +140,16 @@ export function ProviderCard({ + {/* 供应商图标 */} +
+ +
+

@@ -185,7 +196,7 @@ export function ProviderCard({

-
+
{ + const meta = getIconMetadata(icon); + form.setValue("icon", icon); + form.setValue("iconColor", meta?.defaultColor ?? ""); + }; return ( <> @@ -60,6 +86,87 @@ export function BasicFormFields({ form }: BasicFormFieldsProps) { )} /> + + {/* 图标配置 */} +
+ + {t("providerIcon.label", { defaultValue: "图标" })} + + + {/* 图标预览 */} +
+ +
+

{providerName}

+

+ {currentIcon || + t("providerIcon.noIcon", { defaultValue: "未选择图标" })} +

+
+ + + + + +
+
+ + + +
+

+ {t("providerIcon.selectIcon", { + defaultValue: "选择图标", + })} +

+

+ {t("providerIcon.selectDescription", { + defaultValue: "为供应商选择一个图标", + })} +

+
+
+
+
+ {/* 图标选择器 */} + +
+ + + +
+
+
+
+
+
+
+
); } diff --git a/src/components/providers/forms/ProviderForm.tsx b/src/components/providers/forms/ProviderForm.tsx index 0d6e29a..11258c5 100644 --- a/src/components/providers/forms/ProviderForm.tsx +++ b/src/components/providers/forms/ProviderForm.tsx @@ -78,6 +78,8 @@ interface ProviderFormProps { settingsConfig?: Record; category?: ProviderCategory; meta?: ProviderMeta; + icon?: string; + iconColor?: string; }; showButtons?: boolean; } @@ -147,6 +149,8 @@ export function ProviderForm({ : appId === "gemini" ? GEMINI_DEFAULT_CONFIG : CLAUDE_DEFAULT_CONFIG, + icon: initialData?.icon ?? "", + iconColor: initialData?.iconColor ?? "", }), [initialData, appId], ); diff --git a/src/lib/schemas/provider.ts b/src/lib/schemas/provider.ts index d3ce7a7..cfaee71 100644 --- a/src/lib/schemas/provider.ts +++ b/src/lib/schemas/provider.ts @@ -52,6 +52,9 @@ export const providerSchema = z.object({ }); } }), + // 图标配置 + icon: z.string().optional(), + iconColor: z.string().optional(), }); export type ProviderFormData = z.infer; diff --git a/src/types.ts b/src/types.ts index ff0fcbf..3fc6b18 100644 --- a/src/types.ts +++ b/src/types.ts @@ -20,6 +20,9 @@ export interface Provider { isPartner?: boolean; // 可选:供应商元数据(仅存于 ~/.cc-switch/config.json,不写入 live 配置) meta?: ProviderMeta; + // 图标配置 + icon?: string; // 图标名称(如 "openai", "anthropic") + iconColor?: string; // 图标颜色(Hex 格式,如 "#00A67E") } export interface AppConfig {