import { useTranslation } from "react-i18next"; import { FormLabel } from "@/components/ui/form"; import { ClaudeIcon, CodexIcon, GeminiIcon } from "@/components/BrandIcons"; import { Zap, Star, Layers, Settings2 } from "lucide-react"; import type { ProviderPreset } from "@/config/claudeProviderPresets"; import type { CodexProviderPreset } from "@/config/codexProviderPresets"; import type { GeminiProviderPreset } from "@/config/geminiProviderPresets"; import type { ProviderCategory } from "@/types"; import { universalProviderPresets, type UniversalProviderPreset, } from "@/config/universalProviderPresets"; import { ProviderIcon } from "@/components/ProviderIcon"; type PresetEntry = { id: string; preset: ProviderPreset | CodexProviderPreset | GeminiProviderPreset; }; interface ProviderPresetSelectorProps { selectedPresetId: string | null; groupedPresets: Record; categoryKeys: string[]; presetCategoryLabels: Record; onPresetChange: (value: string) => void; onUniversalPresetSelect?: (preset: UniversalProviderPreset) => void; onManageUniversalProviders?: () => void; category?: ProviderCategory; // 当前选中的分类 } export function ProviderPresetSelector({ selectedPresetId, groupedPresets, categoryKeys, presetCategoryLabels, onPresetChange, onUniversalPresetSelect, onManageUniversalProviders, category, }: ProviderPresetSelectorProps) { const { t } = useTranslation(); const getCategoryHint = (): React.ReactNode => { switch (category) { case "official": return t("providerForm.officialHint", { defaultValue: "💡 官方供应商使用浏览器登录,无需配置 API Key", }); case "cn_official": return t("providerForm.cnOfficialApiKeyHint", { defaultValue: "💡 国产官方供应商只需填写 API Key,请求地址已预设", }); case "aggregator": return t("providerForm.aggregatorApiKeyHint", { defaultValue: "💡 聚合服务供应商只需填写 API Key 即可使用", }); case "third_party": return t("providerForm.thirdPartyApiKeyHint", { defaultValue: "💡 第三方供应商需要填写 API Key 和请求地址", }); case "custom": return t("providerForm.customApiKeyHint", { defaultValue: "💡 自定义配置需手动填写所有必要字段", }); case "omo": return t("providerForm.omoHint", { defaultValue: "💡 OMO 配置管理 Agent 模型分配,写入 oh-my-opencode.jsonc", }); default: return t("providerPreset.hint", { defaultValue: "选择预设后可继续调整下方字段。", }); } }; const renderPresetIcon = ( preset: ProviderPreset | CodexProviderPreset | GeminiProviderPreset, ) => { const iconType = preset.theme?.icon; if (!iconType) return null; switch (iconType) { case "claude": return ; case "codex": return ; case "gemini": return ; case "generic": return ; default: return null; } }; const getPresetButtonClass = ( isSelected: boolean, preset: ProviderPreset | CodexProviderPreset | GeminiProviderPreset, ) => { const baseClass = "inline-flex items-center gap-2 px-4 py-2 rounded-lg text-sm font-medium transition-colors"; if (isSelected) { if (preset.theme?.backgroundColor) { return `${baseClass} text-white`; } return `${baseClass} bg-blue-500 text-white dark:bg-blue-600`; } return `${baseClass} bg-accent text-muted-foreground hover:bg-accent/80`; }; const getPresetButtonStyle = ( isSelected: boolean, preset: ProviderPreset | CodexProviderPreset | GeminiProviderPreset, ) => { if (!isSelected || !preset.theme?.backgroundColor) { return undefined; } return { backgroundColor: preset.theme.backgroundColor, color: preset.theme.textColor || "#FFFFFF", }; }; return (
{t("providerPreset.label")}
{categoryKeys.map((category) => { const entries = groupedPresets[category]; if (!entries || entries.length === 0) return null; return entries.map((entry) => { const isSelected = selectedPresetId === entry.id; const isPartner = entry.preset.isPartner; return ( ); }); })}
{onUniversalPresetSelect && universalProviderPresets.length > 0 && ( <>
{universalProviderPresets.map((preset) => ( ))} {onManageUniversalProviders && ( )}
)}

{getCategoryHint()}

); }