claude-code/components/messages/RateLimitMessage.tsx

161 lines
17 KiB
TypeScript
Raw Normal View History

import { c as _c } from "react/compiler-runtime";
import React, { useEffect, useMemo, useState } from 'react';
import { extraUsage } from 'src/commands/extra-usage/index.js';
import { Box, Text } from 'src/ink.js';
import { useClaudeAiLimits } from 'src/services/claudeAiLimitsHook.js';
import { shouldProcessMockLimits } from 'src/services/rateLimitMocking.js'; // Used for /mock-limits command
import { getRateLimitTier, getSubscriptionType, isClaudeAISubscriber } from 'src/utils/auth.js';
import { hasClaudeAiBillingAccess } from 'src/utils/billing.js';
import { MessageResponse } from '../MessageResponse.js';
type UpsellParams = {
shouldShowUpsell: boolean;
isMax20x: boolean;
isExtraUsageCommandEnabled: boolean;
shouldAutoOpenRateLimitOptionsMenu: boolean;
isTeamOrEnterprise: boolean;
hasBillingAccess: boolean;
};
export function getUpsellMessage({
shouldShowUpsell,
isMax20x,
isExtraUsageCommandEnabled,
shouldAutoOpenRateLimitOptionsMenu,
isTeamOrEnterprise,
hasBillingAccess
}: UpsellParams): string | null {
if (!shouldShowUpsell) return null;
if (isMax20x) {
if (isExtraUsageCommandEnabled) {
return '/extra-usage to finish what you\u2019re working on.';
}
return '/login to switch to an API usage-billed account.';
}
if (shouldAutoOpenRateLimitOptionsMenu) {
return 'Opening your options\u2026';
}
if (!isTeamOrEnterprise && !isExtraUsageCommandEnabled) {
return '/upgrade to increase your usage limit.';
}
if (isTeamOrEnterprise) {
if (!isExtraUsageCommandEnabled) return null;
if (hasBillingAccess) {
return '/extra-usage to finish what you\u2019re working on.';
}
return '/extra-usage to request more usage from your admin.';
}
return '/upgrade or /extra-usage to finish what you\u2019re working on.';
}
type RateLimitMessageProps = {
text: string;
onOpenRateLimitOptions?: () => void;
};
export function RateLimitMessage(t0) {
const $ = _c(16);
const {
text,
onOpenRateLimitOptions
} = t0;
let t1;
if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
t1 = getSubscriptionType();
$[0] = t1;
} else {
t1 = $[0];
}
const subscriptionType = t1;
let t2;
if ($[1] === Symbol.for("react.memo_cache_sentinel")) {
t2 = getRateLimitTier();
$[1] = t2;
} else {
t2 = $[1];
}
const rateLimitTier = t2;
const isTeamOrEnterprise = subscriptionType === "team" || subscriptionType === "enterprise";
const isMax20x = rateLimitTier === "default_claude_max_20x";
let t3;
if ($[2] === Symbol.for("react.memo_cache_sentinel")) {
t3 = shouldProcessMockLimits() || isClaudeAISubscriber();
$[2] = t3;
} else {
t3 = $[2];
}
const shouldShowUpsell = t3;
const canSeeRateLimitOptionsUpsell = shouldShowUpsell && !isMax20x;
const [hasOpenedInteractiveMenu, setHasOpenedInteractiveMenu] = useState(false);
const claudeAiLimits = useClaudeAiLimits();
const isCurrentlyRateLimited = claudeAiLimits.status === "rejected" && claudeAiLimits.resetsAt !== undefined && !claudeAiLimits.isUsingOverage;
const shouldAutoOpenRateLimitOptionsMenu = canSeeRateLimitOptionsUpsell && !hasOpenedInteractiveMenu && isCurrentlyRateLimited && onOpenRateLimitOptions;
let t4;
let t5;
if ($[3] !== onOpenRateLimitOptions || $[4] !== shouldAutoOpenRateLimitOptionsMenu) {
t4 = () => {
if (shouldAutoOpenRateLimitOptionsMenu) {
setHasOpenedInteractiveMenu(true);
onOpenRateLimitOptions();
}
};
t5 = [shouldAutoOpenRateLimitOptionsMenu, onOpenRateLimitOptions];
$[3] = onOpenRateLimitOptions;
$[4] = shouldAutoOpenRateLimitOptionsMenu;
$[5] = t4;
$[6] = t5;
} else {
t4 = $[5];
t5 = $[6];
}
useEffect(t4, t5);
let t6;
bb0: {
let t7;
if ($[7] !== shouldAutoOpenRateLimitOptionsMenu) {
t7 = getUpsellMessage({
shouldShowUpsell,
isMax20x,
isExtraUsageCommandEnabled: extraUsage.isEnabled(),
shouldAutoOpenRateLimitOptionsMenu: !!shouldAutoOpenRateLimitOptionsMenu,
isTeamOrEnterprise,
hasBillingAccess: hasClaudeAiBillingAccess()
});
$[7] = shouldAutoOpenRateLimitOptionsMenu;
$[8] = t7;
} else {
t7 = $[8];
}
const message = t7;
if (!message) {
t6 = null;
break bb0;
}
let t8;
if ($[9] !== message) {
t8 = <Text dimColor={true}>{message}</Text>;
$[9] = message;
$[10] = t8;
} else {
t8 = $[10];
}
t6 = t8;
}
const upsell = t6;
let t7;
if ($[11] !== text) {
t7 = <Text color="error">{text}</Text>;
$[11] = text;
$[12] = t7;
} else {
t7 = $[12];
}
const t8 = hasOpenedInteractiveMenu ? null : upsell;
let t9;
if ($[13] !== t7 || $[14] !== t8) {
t9 = <MessageResponse><Box flexDirection="column">{t7}{t8}</Box></MessageResponse>;
$[13] = t7;
$[14] = t8;
$[15] = t9;
} else {
t9 = $[15];
}
return t9;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsInVzZUVmZmVjdCIsInVzZU1lbW8iLCJ1c2VTdGF0ZSIsImV4dHJhVXNhZ2UiLCJCb3giLCJUZXh0IiwidXNlQ2xhdWRlQWlMaW1pdHMiLCJzaG91bGRQcm9jZXNzTW9ja0xpbWl0cyIsImdldFJhdGVMaW1pdFRpZXIiLCJnZXRTdWJzY3JpcHRpb25UeXBlIiwiaXNDbGF1ZGVBSVN1YnNjcmliZXIiLCJoYXNDbGF1ZGVBaUJpbGxpbmdBY2Nlc3MiLCJNZXNzYWdlUmVzcG9uc2UiLCJVcHNlbGxQYXJhbXMiLCJzaG91bGRTaG93VXBzZWxsIiwiaXNNYXgyMHgiLCJpc0V4dHJhVXNhZ2VDb21tYW5kRW5hYmxlZCIsInNob3VsZEF1dG9PcGVuUmF0ZUxpbWl0T3B0aW9uc01lbnUiLCJpc1RlYW1PckVudGVycHJpc2UiLCJoYXNCaWxsaW5nQWNjZXNzIiwiZ2V0VXBzZWxsTWVzc2FnZSIsIlJhdGVMaW1pdE1lc3NhZ2VQcm9wcyIsInRleHQiLCJvbk9wZW5SYXRlTGltaXRPcHRpb25zIiwiUmF0ZUxpbWl0TWVzc2FnZSIsInQwIiwiJCIsIl9jIiwidDEiLCJTeW1ib2wiLCJmb3IiLCJzdWJzY3JpcHRpb25UeXBlIiwidDIiLCJyYXRlTGltaXRUaWVyIiwidDMiLCJjYW5TZWVSYXRlTGltaXRPcHRpb25zVXBzZWxsIiwiaGFzT3BlbmVkSW50ZXJhY3RpdmVNZW51Iiwic2V0SGFzT3BlbmVkSW50ZXJhY3RpdmVNZW51IiwiY2xhdWRlQWlMaW1pdHMiLCJpc0N1cnJlbnRseVJhdGVMaW1pdGVkIiwic3RhdHVzIiwicmVzZXRzQXQiLCJ1bmRlZmluZWQiLCJpc1VzaW5nT3ZlcmFnZSIsInQ0IiwidDUiLCJ0NiIsImJiMCIsInQ3IiwiaXNFbmFibGVkIiwibWVzc2FnZSIsInQ4IiwidXBzZWxsIiwidDkiXSwic291cmNlcyI6WyJSYXRlTGltaXRNZXNzYWdlLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QsIHsgdXNlRWZmZWN0LCB1c2VNZW1vLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgZXh0cmFVc2FnZSB9IGZyb20gJ3NyYy9jb21tYW5kcy9leHRyYS11c2FnZS9pbmRleC5qcydcbmltcG9ydCB7IEJveCwgVGV4dCB9IGZyb20gJ3NyYy9pbmsuanMnXG5pbXBvcnQgeyB1c2VDbGF1ZGVBaUxpbWl0cyB9IGZyb20gJ3NyYy9zZXJ2aWNlcy9jbGF1ZGVBaUxpbWl0c0hvb2suanMnXG5pbXBvcnQgeyBzaG91bGRQcm9jZXNzTW9ja0xpbWl0cyB9IGZyb20gJ3NyYy9zZXJ2aWNlcy9yYXRlTGltaXRNb2NraW5nLmpzJyAvLyBVc2VkIGZvciAvbW9jay1saW1pdHMgY29tbWFuZFxuaW1wb3J0IHtcbiAgZ2V0UmF0ZUxpbWl0VGllcixcbiAgZ2V0U3Vic2NyaXB0aW9uVHlwZSxcbiAgaXNDbGF1ZGVBSVN1YnNjcmliZXIsXG59IGZyb20gJ3NyYy91dGlscy9hdXRoLmpzJ1xuaW1wb3J0IHsgaGFzQ2xhdWRlQWlCaWxsaW5nQWNjZXNzIH0gZnJvbSAnc3JjL3V0aWxzL2JpbGxpbmcuanMnXG5pbXBvcnQgeyBNZXNzYWdlUmVzcG9uc2UgfSBmcm9tICcuLi9NZXNzYWdlUmVzcG9uc2UuanMnXG5cbnR5cGUgVXBzZWxsUGFyYW1zID0ge1xuICBzaG91bGRTaG93VXBzZWxsOiBib29sZWFuXG4gIGlzTWF4MjB4OiBib29sZWFuXG4gIGlzRXh0cmFVc2FnZUNvbW1hbmRFbmFibGVkOiBib29sZWFuXG4gIHNob3VsZEF1dG9PcGVuUmF0ZUxpbWl0T3B0aW9uc01lbnU6IGJvb2xlYW5cbiAgaXNUZWFtT3JFbnRlcnByaXNlOiBib29sZWFuXG4gIGhhc0JpbGxpbmdBY2Nlc3M6IGJvb2xlYW5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFVwc2VsbE1lc3NhZ2Uoe1xuICBzaG91bGRTaG93VXBzZWxsLFxuICBpc01heDIweCxcbiAgaXNFeHRyYVVzYWdlQ29tbWFuZEVuYWJsZWQsXG4gIHNob3VsZEF1dG9PcGVuUmF0ZUxpbWl0T3B0aW9uc01lbnUsXG4gIGlzVGVhbU9yRW50ZXJwcmlzZSxcbiAgaGFzQmlsbGluZ0FjY2Vzcyxcbn06IFVwc2VsbFBhcmFtcyk6IHN0cmluZyB8IG51bGwge1xuICBpZiAoIXNob3VsZFNob3dVcHNlbGwpIHJldHVybiBudWxsXG5cbiAgaWYgKGlzTWF4MjB4KSB7XG4gICAgaWYgKGlzRXh0cmFVc2FnZUNvbW1hbmRFbmFibGVkKSB7XG4gICAgICByZXR1cm4gJy9leHRyYS11c2FnZSB0byBmaW5pc2ggd2hhdCB5b3VcXHUyMDE5cmUgd29ya2luZyBvbi4nXG4gICAgfVxuICAgIHJldHVybiAnL2xvZ2luIHRvIHN3aXRjaCB0byBhbiBBUEkgdXNhZ2UtYmlsbGVkIGFjY291bnQuJ1xuICB9XG5cbiAgaWYgKHNob3VsZEF1dG9PcGVuUmF0ZUxpbWl0T3B0aW9uc01lbnUpIHtcbiAgICByZXR1cm4gJ09wZW5pbmcgeW91ciBvcHRpb25zXFx1MjAyNidcbiAgfVxuXG4gIGlmICghaXNUZWFtT3JFbnRlcnByaXNlICYmICFpc0V4dHJhVXNhZ2VDb21tYW5kRW5hYmxlZCkge1xuICAgIHJldHVybiAnL3VwZ3JhZGUgdG8gaW5jcmVhc2UgeW91ciB1c2FnZSBsaW1pdC4nXG4gIH1cblxuICBpZiAoaXNUZWFtT3JFbnRlcnByaXNlKSB7XG4gICAgaWYgKCFpc0V4dHJhVXNhZ2VDb21tYW5kRW5hYmxlZCkgcmV0dXJuIG51bGxcblxuICAgIGlmIChoYXNCaWxsaW5nQWNjZXNzKSB7XG4gICAgICByZXR1cm4gJy9leHRyYS11c2FnZSB0byBmaW5pc2ggd2hhdCB5b3VcXHUyMDE5cmUgd29ya2luZyBvbi4nXG4gICAgfVxuXG4gICAgcmV0dXJuICcvZXh0cmEtdXNhZ2UgdG8gcmVxdWVzdCBtb3JlIHVzYWdlIGZyb20geW91ciBhZG1pbi4nXG4gIH1cblxuICByZXR1cm4gJy91cGdyYWRlIG9yIC9leHRyYS11c2FnZSB0byBmaW5pc2ggd2hhdCB5b3VcXHUyMDE5cmUgd29ya2luZyBvbi4nXG59XG5cbnR5cGUgUmF0ZUxpbWl0TWVzc2FnZVByb3BzID0ge1xuICB0ZXh0OiBzdHJpbmdcbiAgb25PcGVuUmF0ZUxpbWl0T3B0aW9ucz86ICgpID0+IHZvaWRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFJhdGVMaW1pdE1lc3NhZ2Uoe1xuICB0ZXh0LFxuICBvbk9wZW5SYXRlTGltaXRPcHRpb25zLFxufTogUmF0ZUxpbWl0TWVzc2FnZVByb3BzKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgY29uc3Qgc3Vic2NyaXB0aW9uVHlwZSA9IGdldFN1YnNjcmlwdGlvblR5cGUoKVxuICBjb25zdCByYXRlTGltaXRUaWVyID0gZ2V0UmF0ZUxpbWl0VGllcigpXG4gIGNvbnN0IGlzVGVhbU9yRW50ZXJwcmlzZSA