From 0bfdc522d5606119b5051bdabc4b8d59aaeb4891 Mon Sep 17 00:00:00 2001 From: Tam Nhu Tran Date: Tue, 14 Apr 2026 21:23:13 -0400 Subject: [PATCH] fix(accounts): prefer live codex plan over stale free tags --- .../account/flow-viz/account-card.tsx | 38 ++++++++++++++++-- .../account/shared/account-surface-card.tsx | 40 ++++++++++++++++++- .../shared/account-surface-card.test.tsx | 19 +++++++++ 3 files changed, 92 insertions(+), 5 deletions(-) diff --git a/ui/src/components/account/flow-viz/account-card.tsx b/ui/src/components/account/flow-viz/account-card.tsx index 22e8cea8..dc10aea9 100644 --- a/ui/src/components/account/flow-viz/account-card.tsx +++ b/ui/src/components/account/flow-viz/account-card.tsx @@ -104,6 +104,35 @@ function getCodexPlanAudience(quota: unknown): AccountAudience { return 'unknown'; } +function resolveCodexAudience( + identityAudience: AccountAudience, + planAudience: AccountAudience +): AccountAudience { + if (planAudience === 'unknown') { + return identityAudience; + } + + if (planAudience === 'business') { + return 'business'; + } + + if (identityAudience === 'business') { + return 'business'; + } + + if (planAudience === 'personal') { + return 'personal'; + } + + if (planAudience === 'free') { + return identityAudience === 'unknown' || identityAudience === 'free' + ? 'free' + : identityAudience; + } + + return identityAudience; +} + function getCodexPlanDetailLabel(quota: unknown): string | null { if (!quota || typeof quota !== 'object' || !('planType' in quota)) { return null; @@ -162,7 +191,7 @@ function getVariantAudience( }, quota?: unknown ) { - return variant.audience !== 'unknown' ? variant.audience : getCodexPlanAudience(quota); + return resolveCodexAudience(variant.audience, getCodexPlanAudience(quota)); } function getVariantInlineLabel( @@ -176,8 +205,11 @@ function getVariantInlineLabel( quota?: unknown ) { const detailLabel = getVariantDetailLabel(variant, quota); + const audience = getVariantAudience(variant, quota); const audienceLabel = - variant.audienceLabel ?? getDetailedAudienceLabel(getVariantAudience(variant, quota)); + variant.audience === audience + ? (variant.audienceLabel ?? getDetailedAudienceLabel(audience)) + : getDetailedAudienceLabel(audience); const composedLabel = [audienceLabel, detailLabel].filter(Boolean).join(' ยท '); return composedLabel || variant.inlineLabel || null; } @@ -207,8 +239,8 @@ function getVariantMarkerLabel( const normalizedFallback = compactDetailLabel?.trim() || - variant.audienceLabel?.trim() || getDetailedAudienceLabel(audience) || + variant.audienceLabel?.trim() || variant.detailLabel?.trim(); return normalizedFallback?.[0]?.toUpperCase() ?? '?'; } diff --git a/ui/src/components/account/shared/account-surface-card.tsx b/ui/src/components/account/shared/account-surface-card.tsx index 063676a1..3de92fe5 100644 --- a/ui/src/components/account/shared/account-surface-card.tsx +++ b/ui/src/components/account/shared/account-surface-card.tsx @@ -113,6 +113,35 @@ function getCodexPlanAudience(quota: UnifiedQuotaResult | undefined): AccountAud return 'unknown'; } +function resolveCodexAudience( + identityAudience: AccountAudience, + planAudience: AccountAudience +): AccountAudience { + if (planAudience === 'unknown') { + return identityAudience; + } + + if (planAudience === 'business') { + return 'business'; + } + + if (identityAudience === 'business') { + return 'business'; + } + + if (planAudience === 'personal') { + return 'personal'; + } + + if (planAudience === 'free') { + return identityAudience === 'unknown' || identityAudience === 'free' + ? 'free' + : identityAudience; + } + + return identityAudience; +} + function getCodexPlanDetailLabel(quota: UnifiedQuotaResult | undefined): string | null { if (!quota || !('planType' in quota) || !quota.planType) { return null; @@ -157,9 +186,16 @@ export function AccountSurfaceCard({ normalizedProvider === 'codex' ? getCodexPlanAudience(quota) : 'unknown'; const codexPlanDetailLabel = normalizedProvider === 'codex' ? getCodexPlanDetailLabel(quota) : null; - const effectiveAudience = identity.audience !== 'unknown' ? identity.audience : codexPlanAudience; + const effectiveAudience = + normalizedProvider === 'codex' + ? resolveCodexAudience(identity.audience, codexPlanAudience) + : identity.audience !== 'unknown' + ? identity.audience + : codexPlanAudience; const effectiveAudienceLabel = - identity.audienceLabel ?? getDetailedAudienceLabel(effectiveAudience); + identity.audience === effectiveAudience + ? (identity.audienceLabel ?? getDetailedAudienceLabel(effectiveAudience)) + : getDetailedAudienceLabel(effectiveAudience); const resolvedDetailLabel = identity.detailLabel ?? codexPlanDetailLabel; const resolvedCompactDetailLabel = identity.compactDetailLabel ?? codexPlanDetailLabel; const showTierBadge = diff --git a/ui/tests/unit/ui/components/account/shared/account-surface-card.test.tsx b/ui/tests/unit/ui/components/account/shared/account-surface-card.test.tsx index 5f4909f7..e4e2d126 100644 --- a/ui/tests/unit/ui/components/account/shared/account-surface-card.test.tsx +++ b/ui/tests/unit/ui/components/account/shared/account-surface-card.test.tsx @@ -127,4 +127,23 @@ describe('AccountSurfaceCard', () => { expect(screen.getByText('Pers')).toBeInTheDocument(); expect(screen.getByText('Pro')).toBeInTheDocument(); }); + + it('lets live paid Codex plans override stale free identity badges', () => { + render( + + ); + + expect(screen.getByText('Pers')).toBeInTheDocument(); + expect(screen.getByText('Plus')).toBeInTheDocument(); + expect(screen.queryByTitle('Free')).not.toBeInTheDocument(); + }); });