"use client" import { useTranslations } from "next-intl" import { type ReactElement } from "react" import { type AiProviderSummary } from "@/modules/settings/actions" import { Badge } from "@/shared/components/ui/badge" import { Label } from "@/shared/components/ui/label" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/shared/components/ui/select" const NEW_PROVIDER_VALUE = "__new__" interface AiProviderSelectorProps { /** 已有服务商列表 */ providers: AiProviderSummary[] /** 当前选中的服务商 ID(空字符串表示新建) */ selectedId: string /** 当前用户 ID,用于判断是否为创建者 */ currentUserId?: string /** 选择变更回调 */ onSelectChange: (value: string) => void } /** * AI 服务商选择器 * * 负责: * - 渲染已有服务商下拉选择(含"新建"选项) * - 展示当前选中服务商的密钥状态与可见性徽章 * * 不包含任何业务逻辑,仅做展示与事件转发。 */ export function AiProviderSelector({ providers, selectedId, currentUserId, onSelectChange, }: AiProviderSelectorProps): ReactElement { const t = useTranslations("settings.ai.providers") const selectedProvider = providers.find((item) => item.id === selectedId) ?? null const renderProviderLabel = (item: AiProviderSummary): string => { const parts = [item.provider, "·", item.model] if (item.isDefault) parts.push(`(${t("setDefault")})`) return parts.join(" ") } const renderVisibilityBadge = (item: AiProviderSummary): ReactElement => { const isOwner = currentUserId !== undefined && item.createdBy === currentUserId return ( {item.visibility === "public" ? ( {t("badgePublic")} ) : ( {t("badgePrivate")} )} {isOwner ? ( {t("badgeOwner")} ) : null} ) } return (
{selectedProvider ? renderVisibilityBadge(selectedProvider) : null} {selectedProvider?.apiKeyLast4 ? `${t("stored")} • ****${selectedProvider.apiKeyLast4}` : t("noKey")}
) }