π File detail
components/messages/RateLimitMessage.tsx
π― Use case
This file lives under βcomponents/β, which covers shared React UI pieces. On the API surface it exposes getUpsellMessage and RateLimitMessage β mainly functions, hooks, or classes. Dependencies touch React UI and src. It composes internal code from MessageResponse (relative imports).
Generated from folder role, exports, dependency roots, and inline comments β not hand-reviewed for every path.
π§ Inline summary
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';
π€ Exports (heuristic)
getUpsellMessageRateLimitMessage
π External import roots
Package roots from from "β¦" (relative paths omitted).
reactsrc
π₯οΈ Source preview
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+IHZvaWRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFJhdGVMaW1pdE1lc3NhZ2Uoe1xuICB0ZXh0LFxuICBvbk9wZW5SYXRlTGltaXRPcHRpb25zLFxufTogUmF0ZUxpbWl0TWVzc2FnZVByb3BzKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgY29uc3Qgc3Vic2NyaXB0aW9uVHlwZSA9IGdldFN1YnNjcmlwdGlvblR5cGUoKVxuICBjb25zdCByYXRlTGltaXRUaWVyID0gZ2V0UmF0ZUxpbWl0VGllcigpXG4gIGNvbnN0IGlzVGVhbU9yRW50ZXJwcmlzZSA9XG4gICAgc3Vic2NyaXB0aW9uVHlwZSA9PT0gJ3RlYW0nIHx8IHN1YnNjcmlwdGlvblR5cGUgPT09ICdlbnRlcnByaXNlJ1xuICBjb25zdCBpc01heDIweCA9IHJhdGVMaW1pdFRpZXIgPT09ICdkZWZhdWx0X2NsYXVkZV9tYXhfMjB4J1xuICAvLyBBbHdheXMgc2hvdyB1cHNlbGwgd2hlbiB1c2luZyAvbW9jay1saW1pdHMgY29tbWFuZCwgb3RoZXJ3aXNlIHNob3cgZm9yIHN1YnNjcmliZXJzXG4gIGNvbnN0IHNob3VsZFNob3dVcHNlbGwgPSBzaG91bGRQcm9jZXNzTW9ja0xpbWl0cygpIHx8IGlzQ2xhdWRlQUlTdWJzY3JpYmVyKClcblxuICBjb25zdCBjYW5TZWVSYXRlTGltaXRPcHRpb25zVXBzZWxsID0gc2hvdWxkU2hvd1Vwc2VsbCAmJiAhaXNNYXgyMHhcblxuICBjb25zdCBbaGFzT3BlbmVkSW50ZXJhY3RpdmVNZW51LCBzZXRIYXNPcGVuZWRJbnRlcmFjdGl2ZU1lbnVdID1cbiAgICB1c2VTdGF0ZShmYWxzZSlcblxuICAvLyBDaGVjayBhY3R1YWwgcmF0ZSBsaW1pdCBzdGF0dXMgLSBvbmx5IGF1dG8tb3BlbiBpZiB1c2VyIGlzIGN1cnJlbnRseSByYXRlIGxpbWl0ZWRcbiAgLy8gQU5EIHdlJ3ZlIHZlcmlmaWVkIHRoaXMgd2l0aCB0aGUgQVBJIChyZXNldHNBdCBpcyBvbmx5IHNldCBhZnRlciBBUEkgcmVzcG9uc2UpLlxuICAvLyBUaGlzIHByZXZlbnRzIGZhbHNlIGFsZXJ0cyB3aGVuIHJlc3VtaW5nIHNlc3Npb25zIHdpdGggb2xkIHJhdGUgbGltaXQgbWVzc2FnZXMuXG4gIGNvbnN0IGNsYXVkZUFpTGltaXRzID0gdXNlQ2xhdWRlQWlMaW1pdHMoKVxuICBjb25zdCBpc0N1cnJlbnRseVJhdGVMaW1pdGVkID1cbiAgICBjbGF1ZGVBaUxpbWl0cy5zdGF0dXMgPT09ICdyZWplY3RlZCcgJiZcbiAgICBjbGF1ZGVBaUxpbWl0cy5yZXNldHNBdCAhPT0gdW5kZWZpbmVkICYmXG4gICAgIWNsYXVkZUFpTGltaXRzLmlzVXNpbmdPdmVyYWdlXG5cbiAgY29uc3Qgc2hvdWxkQXV0b09wZW5SYXRlTGltaXRPcHRpb25zTWVudSA9XG4gICAgY2FuU2VlUmF0ZUxpbWl0T3B0aW9uc1Vwc2VsbCAmJlxuICAgICFoYXNPcGVuZWRJbnRlcmFjdGl2ZU1lbnUgJiZcbiAgICBpc0N1cnJlbnRseVJhdGVMaW1pdGVkICYmXG4gICAgb25PcGVuUmF0ZUxpbWl0T3B0aW9uc1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHNob3VsZEF1dG9PcGVuUmF0ZUxpbWl0T3B0aW9uc01lbnUpIHtcbiAgICAgIHNldEhhc09wZW5lZEludGVyYWN0aXZlTWVudSh0cnVlKVxuICAgICAgb25PcGVuUmF0ZUxpbWl0T3B0aW9ucygpXG4gICAgfVxuICB9LCBbc2hvdWxkQXV0b09wZW5SYXRlTGltaXRPcHRpb25zTWVudSwgb25PcGVuUmF0ZUxpbWl0T3B0aW9uc10pXG5cbiAgY29uc3QgdXBzZWxsID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgbWVzc2FnZSA9IGdldFVwc2VsbE1lc3NhZ2Uoe1xuICAgICAgc2hvdWxkU2hvd1Vwc2VsbCxcbiAgICAgIGlzTWF4MjB4LFxuICAgICAgaXNFeHRyYVVzYWdlQ29tbWFuZEVuYWJsZWQ6IGV4dHJhVXNhZ2UuaXNFbmFibGVkKCksXG4gICAgICBzaG91bGRBdXRvT3BlblJhdGVMaW1pdE9wdGlvbnNNZW51OiAhIXNob3VsZEF1dG9PcGVuUmF0ZUxpbWl0T3B0aW9uc01lbnUsXG4gICAgICBpc1RlYW1PckVudGVycHJpc2UsXG4gICAgICBoYXNCaWxsaW5nQWNjZXNzOiBoYXNDbGF1ZGVBaUJpbGxpbmdBY2Nlc3MoKSxcbiAgICB9KVxuICAgIGlmICghbWVzc2FnZSkgcmV0dXJuIG51bGxcbiAgICByZXR1cm4gPFRleHQgZGltQ29sb3I+e21lc3NhZ2V9PC9UZXh0PlxuICB9LCBbXG4gICAgc2hvdWxkU2hvd1Vwc2VsbCxcbiAgICBpc01heDIweCxcbiAgICBpc1RlYW1PckVudGVycHJpc2UsXG4gICAgc2hvdWxkQXV0b09wZW5SYXRlTGltaXRPcHRpb25zTWVudSxcbiAgXSlcblxuICByZXR1cm4gKFxuICAgIDxNZXNzYWdlUmVzcG9uc2U+XG4gICAgICA8Qm94IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIj5cbiAgICAgICAgPFRleHQgY29sb3I9XCJlcnJvclwiPnt0ZXh0fTwvVGV4dD5cbiAgICAgICAge2hhc09wZW5lZEludGVyYWN0aXZlTWVudSA/IG51bGwgOiB1cHNlbGx9XG4gICAgICA8L0JveD5cbiAgICA8L01lc3NhZ2VSZXNwb25zZT5cbiAgKVxufVxuIl0sIm1hcHBpbmdzIjoiO0FBQUEsT0FBT0EsS0FBSyxJQUFJQyxTQUFTLEVBQUVDLE9BQU8sRUFBRUMsUUFBUSxRQUFRLE9BQU87QUFDM0QsU0FBU0MsVUFBVSxRQUFRLG1DQUFtQztBQUM5RCxTQUFTQyxHQUFHLEVBQUVDLElBQUksUUFBUSxZQUFZO0FBQ3RDLFNBQVNDLGlCQUFpQixRQUFRLG9DQUFvQztBQUN0RSxTQUFTQyx1QkFBdUIsUUFBUSxrQ0FBa0MsRUFBQztBQUMzRSxTQUNFQyxnQkFBZ0IsRUFDaEJDLG1CQUFtQixFQUNuQkMsb0JBQW9CLFFBQ2YsbUJBQW1CO0FBQzFCLFNBQVNDLHdCQUF3QixR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