Files
CC-Switch/src/components/providers/forms/shared/ApiKeySection.tsx
T
Jason e6d40d0a93 feat(presets): add OpenCode Go referral link and promo copy without partner badge
Decouple the in-app promotion banner from isPartner so a preset can show a
promo phrase plus referral link without earning the paid-partner star.

- ApiKeySection: gate the banner on partnerPromotionKey alone; the star is
  still driven solely by isPartner. This also un-suppresses the existing
  MiniMax cn/en promos, which already carried copy without isPartner.
- OpenCode Go (claude/codex/opencode): point apiKeyUrl at the referral
  link and add partnerPromotionKey "opencode_go" (no isPartner set).
- i18n: add the opencode_go promo string across zh/en/ja/zh-TW.
2026-06-26 23:39:18 +08:00

91 lines
2.5 KiB
TypeScript

import { useTranslation } from "react-i18next";
import ApiKeyInput from "../ApiKeyInput";
import type { ProviderCategory } from "@/types";
interface ApiKeySectionProps {
id?: string;
label?: string;
value: string;
onChange: (value: string) => void;
category?: ProviderCategory;
shouldShowLink: boolean;
websiteUrl: string;
placeholder?: {
official: string;
thirdParty: string;
};
disabled?: boolean;
isPartner?: boolean;
partnerPromotionKey?: string;
}
export function ApiKeySection({
id,
label,
value,
onChange,
category,
shouldShowLink,
websiteUrl,
placeholder,
disabled,
partnerPromotionKey,
}: ApiKeySectionProps) {
const { t } = useTranslation();
const defaultPlaceholder = {
official: t("providerForm.officialNoApiKey", {
defaultValue: "官方供应商无需 API Key",
}),
thirdParty: t("providerForm.apiKeyAutoFill", {
defaultValue: "输入 API Key,将自动填充到配置",
}),
};
const finalPlaceholder = placeholder || defaultPlaceholder;
return (
<div className="space-y-1">
<ApiKeyInput
id={id}
label={label}
value={value}
onChange={onChange}
placeholder={
category === "official"
? finalPlaceholder.official
: finalPlaceholder.thirdParty
}
disabled={disabled ?? category === "official"}
/>
{/* API Key 获取链接 */}
{shouldShowLink && websiteUrl && (
<div className="space-y-2 -mt-1 pl-1">
<a
href={websiteUrl}
target="_blank"
rel="noopener noreferrer"
className="text-xs text-blue-400 dark:text-blue-500 hover:text-blue-500 dark:hover:text-blue-400 transition-colors"
>
{t("providerForm.getApiKey", {
defaultValue: "获取 API Key",
})}
</a>
{/* 促销信息(与 isPartner 解耦:仅凭 partnerPromotionKey 即可展示,星标仍由 isPartner 控制) */}
{partnerPromotionKey && (
<div className="rounded-md bg-blue-50 dark:bg-blue-950/30 p-2.5 border border-blue-200 dark:border-blue-800">
<p className="text-xs leading-relaxed text-blue-700 dark:text-blue-300">
💡{" "}
{t(`providerForm.partnerPromotion.${partnerPromotionKey}`, {
defaultValue: "",
})}
</p>
</div>
)}
</div>
)}
</div>
);
}