( limits: ClaudeAILimits, model: string, )
| 101 | * Returns null if no message should be shown |
| 102 | */ |
| 103 | export function getRateLimitMessage( |
| 104 | limits: ClaudeAILimits, |
| 105 | model: string, |
| 106 | ): RateLimitMessage | null { |
| 107 | const sessionState = getCurrentRateLimitMessageSessionState() |
| 108 | |
| 109 | // Check overage scenarios first (when subscription is rejected but overage is available) |
| 110 | // getUsingOverageText is rendered separately from warning. |
| 111 | if (limits.isUsingOverage) { |
| 112 | // Show warning if approaching overage spending limit |
| 113 | if (limits.overageStatus === 'allowed_warning') { |
| 114 | return { |
| 115 | message: "You're close to your extra usage spending limit", |
| 116 | severity: 'warning', |
| 117 | } |
| 118 | } |
| 119 | return null |
| 120 | } |
| 121 | |
| 122 | // ERROR STATES - when limits are rejected |
| 123 | if (limits.status === 'rejected') { |
| 124 | return { |
| 125 | message: getLimitReachedText(limits, model, sessionState), |
| 126 | severity: 'error', |
| 127 | } |
| 128 | } |
| 129 | |
| 130 | // WARNING STATES - when approaching limits with early warning |
| 131 | if (limits.status === 'allowed_warning') { |
| 132 | // Only show warnings when utilization is above threshold (70%) |
| 133 | // This prevents false warnings after week reset when API may send |
| 134 | // allowed_warning with stale data at low usage levels |
| 135 | const WARNING_THRESHOLD = 0.7 |
| 136 | if ( |
| 137 | limits.utilization !== undefined && |
| 138 | limits.utilization < WARNING_THRESHOLD |
| 139 | ) { |
| 140 | return null |
| 141 | } |
| 142 | |
| 143 | // Don't warn non-billing Team/Enterprise users about approaching plan limits |
| 144 | // if overages are enabled - they'll seamlessly roll into overage |
| 145 | const isTeamOrEnterprise = |
| 146 | sessionState.subscriptionType === 'team' || |
| 147 | sessionState.subscriptionType === 'enterprise' |
| 148 | |
| 149 | if ( |
| 150 | isTeamOrEnterprise && |
| 151 | sessionState.hasExtraUsageEnabled && |
| 152 | !hasManagedPlanBillingAccess() |
| 153 | ) { |
| 154 | return null |
| 155 | } |
| 156 | |
| 157 | const text = getEarlyWarningText(limits, sessionState) |
| 158 | if (text) { |
| 159 | return { message: text, severity: 'warning' } |
| 160 | } |
no test coverage detected