diff --git a/apps/ai-game-creator-shell/src/features/project-workspace/modelAvailabilityCopy.ts b/apps/ai-game-creator-shell/src/features/project-workspace/modelAvailabilityCopy.ts index c37cdd28a..b8135de01 100644 --- a/apps/ai-game-creator-shell/src/features/project-workspace/modelAvailabilityCopy.ts +++ b/apps/ai-game-creator-shell/src/features/project-workspace/modelAvailabilityCopy.ts @@ -1,21 +1,34 @@ import type { ClientLlmModelUnavailableReason } from '../../services/llmModelCatalog'; /** - * 锁定项 hover / 键盘 focus 的原因文案。 + * 原因 → 文案的统一映射。 * - * `unknown` 是契约的前向兜底,后端将来新增 `reason` 时旧客户端仍给出可读文案。 + * `unknown` 是契约的前向兜底,后端将来新增 `reason` 时旧客户端仍给出可读文案;两个 helper + * 共用本表,避免各自维护一份 switch 后漂移。 */ +const REASON_COPY: Record< + ClientLlmModelUnavailableReason, + { label: string; fallback: string } +> = { + plan_required: { + label: '订阅计划不支持', + fallback: '所选模型需要更高订阅计划,已切换为默认模型', + }, + disabled: { + label: '该模型已下线', + fallback: '所选模型已下线,已切换为默认模型', + }, + unknown: { + label: '暂不可用', + fallback: '所选模型已不可用,已切回默认模型', + }, +}; + +/** 锁定项 hover / 键盘 focus 的原因文案。 */ export function unavailableModelReasonLabel( reason: ClientLlmModelUnavailableReason, ): string { - switch (reason) { - case 'plan_required': - return '订阅计划不支持'; - case 'disabled': - return '该模型已下线'; - default: - return '暂不可用'; - } + return (REASON_COPY[reason] ?? REASON_COPY.unknown).label; } /** @@ -27,12 +40,8 @@ export function unavailableModelReasonLabel( export function unavailableModelFallbackNotice( unavailableReason: ClientLlmModelUnavailableReason | undefined, ): string { - switch (unavailableReason) { - case 'plan_required': - return '所选模型需要更高订阅计划,已切换为默认模型'; - case 'disabled': - return '所选模型已下线,已切换为默认模型'; - default: - return '所选模型已不可用,已切回默认模型'; + if (!unavailableReason) { + return REASON_COPY.unknown.fallback; } + return (REASON_COPY[unavailableReason] ?? REASON_COPY.unknown).fallback; }