๐ File detail
hooks/notifs/useCanSwitchToExistingSubscription.tsx
๐ฏ Use case
This file lives under โhooks/โ, which covers reusable UI or integration hooks. On the API surface it exposes useCanSwitchToExistingSubscription โ mainly functions, hooks, or classes. Dependencies touch React UI and src. It composes internal code from ink, services, utils, and useStartupNotification (relative imports).
Generated from folder role, exports, dependency roots, and inline comments โ not hand-reviewed for every path.
๐ง Inline summary
import * as React from 'react'; import { getOauthProfileFromApiKey } from 'src/services/oauth/getOauthProfile.js'; import { isClaudeAISubscriber } from 'src/utils/auth.js'; import { Text } from '../../ink.js'; import { logEvent } from '../../services/analytics/index.js';
๐ค Exports (heuristic)
useCanSwitchToExistingSubscription
๐ External import roots
Package roots from from "โฆ" (relative paths omitted).
reactsrc
๐ฅ๏ธ Source preview
import * as React from 'react';
import { getOauthProfileFromApiKey } from 'src/services/oauth/getOauthProfile.js';
import { isClaudeAISubscriber } from 'src/utils/auth.js';
import { Text } from '../../ink.js';
import { logEvent } from '../../services/analytics/index.js';
import { getGlobalConfig, saveGlobalConfig } from '../../utils/config.js';
import { useStartupNotification } from './useStartupNotification.js';
const MAX_SHOW_COUNT = 3;
/**
* Hook to check if the user has a subscription on Console but isn't logged into it.
*/
export function useCanSwitchToExistingSubscription() {
useStartupNotification(_temp2);
}
/**
* Checks if the user has a subscription but is not currently logged into it.
* This helps inform users they should run /login to access their subscription.
*/
async function _temp2() {
if ((getGlobalConfig().subscriptionNoticeCount ?? 0) >= MAX_SHOW_COUNT) {
return null;
}
const subscriptionType = await getExistingClaudeSubscription();
if (subscriptionType === null) {
return null;
}
saveGlobalConfig(_temp);
logEvent("tengu_switch_to_subscription_notice_shown", {});
return {
key: "switch-to-subscription",
jsx: <Text color="suggestion">Use your existing Claude {subscriptionType} plan with Claude Code<Text color="text" dimColor={true}>{" "}ยท /login to activate</Text></Text>,
priority: "low"
};
}
function _temp(current) {
return {
...current,
subscriptionNoticeCount: (current.subscriptionNoticeCount ?? 0) + 1
};
}
async function getExistingClaudeSubscription(): Promise<'Max' | 'Pro' | null> {
// If already using subscription auth, there is nothing to switch to
if (isClaudeAISubscriber()) {
return null;
}
const profile = await getOauthProfileFromApiKey();
if (!profile) {
return null;
}
if (profile.account.has_claude_max) {
return 'Max';
}
if (profile.account.has_claude_pro) {
return 'Pro';
}
return null;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsImdldE9hdXRoUHJvZmlsZUZyb21BcGlLZXkiLCJpc0NsYXVkZUFJU3Vic2NyaWJlciIsIlRleHQiLCJsb2dFdmVudCIsImdldEdsb2JhbENvbmZpZyIsInNhdmVHbG9iYWxDb25maWciLCJ1c2VTdGFydHVwTm90aWZpY2F0aW9uIiwiTUFYX1NIT1dfQ09VTlQiLCJ1c2VDYW5Td2l0Y2hUb0V4aXN0aW5nU3Vic2NyaXB0aW9uIiwiX3RlbXAyIiwic3Vic2NyaXB0aW9uTm90aWNlQ291bnQiLCJzdWJzY3JpcHRpb25UeXBlIiwiZ2V0RXhpc3RpbmdDbGF1ZGVTdWJzY3JpcHRpb24iLCJfdGVtcCIsImtleSIsImpzeCIsInByaW9yaXR5IiwiY3VycmVudCIsIlByb21pc2UiLCJwcm9maWxlIiwiYWNjb3VudCIsImhhc19jbGF1ZGVfbWF4IiwiaGFzX2NsYXVkZV9wcm8iXSwic291cmNlcyI6WyJ1c2VDYW5Td2l0Y2hUb0V4aXN0aW5nU3Vic2NyaXB0aW9uLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IGdldE9hdXRoUHJvZmlsZUZyb21BcGlLZXkgfSBmcm9tICdzcmMvc2VydmljZXMvb2F1dGgvZ2V0T2F1dGhQcm9maWxlLmpzJ1xuaW1wb3J0IHsgaXNDbGF1ZGVBSVN1YnNjcmliZXIgfSBmcm9tICdzcmMvdXRpbHMvYXV0aC5qcydcbmltcG9ydCB7IFRleHQgfSBmcm9tICcuLi8uLi9pbmsuanMnXG5pbXBvcnQgeyBsb2dFdmVudCB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2FuYWx5dGljcy9pbmRleC5qcydcbmltcG9ydCB7IGdldEdsb2JhbENvbmZpZywgc2F2ZUdsb2JhbENvbmZpZyB9IGZyb20gJy4uLy4uL3V0aWxzL2NvbmZpZy5qcydcbmltcG9ydCB7IHVzZVN0YXJ0dXBOb3RpZmljYXRpb24gfSBmcm9tICcuL3VzZVN0YXJ0dXBOb3RpZmljYXRpb24uanMnXG5cbmNvbnN0IE1BWF9TSE9XX0NPVU5UID0gM1xuXG4vKipcbiAqIEhvb2sgdG8gY2hlY2sgaWYgdGhlIHVzZXIgaGFzIGEgc3Vic2NyaXB0aW9uIG9uIENvbnNvbGUgYnV0IGlzbid0IGxvZ2dlZCBpbnRvIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlQ2FuU3dpdGNoVG9FeGlzdGluZ1N1YnNjcmlwdGlvbigpOiB2b2lkIHtcbiAgdXNlU3RhcnR1cE5vdGlmaWNhdGlvbihhc3luYyAoKSA9PiB7XG4gICAgaWYgKChnZXRHbG9iYWxDb25maWcoKS5zdWJzY3JpcHRpb25Ob3RpY2VDb3VudCA/PyAwKSA+PSBNQVhfU0hPV19DT1VOVCkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uVHlwZSA9IGF3YWl0IGdldEV4aXN0aW5nQ2xhdWRlU3Vic2NyaXB0aW9uKClcbiAgICBpZiAoc3Vic2NyaXB0aW9uVHlwZSA9PT0gbnVsbCkgcmV0dXJuIG51bGxcblxuICAgIHNhdmVHbG9iYWxDb25maWcoY3VycmVudCA9PiAoe1xuICAgICAgLi4uY3VycmVudCxcbiAgICAgIHN1YnNjcmlwdGlvbk5vdGljZUNvdW50OiAoY3VycmVudC5zdWJzY3JpcHRpb25Ob3RpY2VDb3VudCA/PyAwKSArIDEsXG4gICAgfSkpXG4gICAgbG9nRXZlbnQoJ3Rlbmd1X3N3aXRjaF90b19zdWJzY3JpcHRpb25fbm90aWNlX3Nob3duJywge30pXG5cbiAgICByZXR1cm4ge1xuICAgICAga2V5OiAnc3dpdGNoLXRvLXN1YnNjcmlwdGlvbicsXG4gICAgICBqc3g6IChcbiAgICAgICAgPFRleHQgY29sb3I9XCJzdWdnZXN0aW9uXCI+XG4gICAgICAgICAgVXNlIHlvdXIgZXhpc3RpbmcgQ2xhdWRlIHtzdWJzY3JpcHRpb25UeXBlfSBwbGFuIHdpdGggQ2xhdWRlIENvZGVcbiAgICAgICAgICA8VGV4dCBjb2xvcj1cInRleHRcIiBkaW1Db2xvcj5cbiAgICAgICAgICAgIHsnICd9XG4gICAgICAgICAgICDCtyAvbG9naW4gdG8gYWN0aXZhdGVcbiAgICAgICAgICA8L1RleHQ+XG4gICAgICAgIDwvVGV4dD5cbiAgICAgICksXG4gICAgICBwcmlvcml0eTogJ2xvdycsXG4gICAgfVxuICB9KVxufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgdXNlciBoYXMgYSBzdWJzY3JpcHRpb24gYnV0IGlzIG5vdCBjdXJyZW50bHkgbG9nZ2VkIGludG8gaXQuXG4gKiBUaGlzIGhlbHBzIGluZm9ybSB1c2VycyB0aGV5IHNob3VsZCBydW4gL2xvZ2luIHRvIGFjY2VzcyB0aGVpciBzdWJzY3JpcHRpb24uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEV4aXN0aW5nQ2xhdWRlU3Vic2NyaXB0aW9uKCk6IFByb21pc2U8J01heCcgfCAnUHJvJyB8IG51bGw+IHtcbiAgLy8gSWYgYWxyZWFkeSB1c2luZyBzdWJzY3JpcHRpb24gYXV0aCwgdGhlcmUgaXMgbm90aGluZyB0byBzd2l0Y2ggdG9cbiAgaWYgKGlzQ2xhdWRlQUlTdWJzY3JpYmVyKCkpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG4gIGNvbnN0IHByb2ZpbGUgPSBhd2FpdCBnZXRPYXV0aFByb2ZpbGVGcm9tQXBpS2V5KClcbiAgaWYgKCFwcm9maWxlKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGlmIChwcm9maWxlLmFjY291bnQuaGFzX2NsYXVkZV9tYXgpIHtcbiAgICByZXR1cm4gJ01heCdcbiAgfVxuXG4gIGlmIChwcm9maWxlLmFjY291bnQuaGFzX2NsYXVkZV9wcm8pIHtcbiAgICByZXR1cm4gJ1BybydcbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG4iXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBS0EsS0FBSyxNQUFNLE9BQU87QUFDOUIsU0FBU0MseUJBQXlCLFFBQVEsdUNBQXVDO0FBQ2pGLFNBQVNDLG9CQUFvQixRQUFRLG1CQUFtQjtBQUN4RCxTQUFTQyxJQUFJLFFBQVEsY0FBYztBQUNuQyxTQUFTQyxRQUFRLFFBQVEsbUNBQW1DO0FBQzVELFNBQVNDLGVBQWUsRUFBRUMsZ0JBQWdCLFFBQVEsdUJBQXVCO0FBQ3pFLFNBQVNDLHNCQUFzQixRQUFRLDZCQUE2QjtBQUVwRSxNQUFNQyxjQUFjLEdBQUcsQ0FBQzs7QUFFeEI7QUFDQTtBQUNBO0FBQ0EsT0FBTyxTQUFBQyxtQ0FBQTtFQUNMRixzQkFBc0IsQ0FBQ0csTUEwQnRCLENBQUM7QUFBQTs7QUFHSjtBQUNBO0FBQ0E7QUFDQTtBQWpDTyxlQUFBQSxPQUFBO0VBRUgsSUFBSSxDQUFDTCxlQUFlLENBQUMsQ0FBQyxDQUFBTSx1QkFBNkIsSUFBOUMsQ0FBOEMsS0FBS0gsY0FBYztJQUFBLE9BQzdELElBQUk7RUFBQTtFQUViLE1BQUFJLGdCQUFBLEdBQXlCLE1BQU1DLDZCQUE2QixDQUFDLENBQUM7RUFDOUQsSUFBSUQsZ0JBQWdCLEtBQUssSUFBSTtJQUFBLE9BQVMsSUFBSTtFQUFBO0VBRTFDTixnQkFBZ0IsQ0FBQ1EsS0FHZixDQUFDO0VBQ0hWLFFBQVEsQ0FBQywyQ0FBMkMsRUFBRSxDQUFDLENBQUMsQ0FBQztFQUFBLE9BRWxEO0lBQUFXLEdBQUEsRUFDQSx3QkFBd0I7SUFBQUMsR0FBQSxFQUUzQixDQUFDLElBQUksQ0FBTyxLQUFZLENBQVosWUFBWSxDQUFDLHlCQUNHSixpQkFBZSxDQUFFLHNCQUMzQyxDQUFDLElBQUksQ0FBTyxLQUFNLENBQU4sTUFBTSxDQUFDLFFBQVEsQ0FBUixLQUFPLENBQUMsQ0FDeEIsSUFBRSxDQUFFLG9CQUVQLEVBSEMsSUFBSSxDQUlQLEVBTkMsSUFBSSxDQU1FO0lBQUFLLFFBQUEsRUFFQztFQUNaLENBQUM7QUFBQTtBQTFCRSxTQUFBSCxNQUFBSSxPQUFBO0VBQUEsT0FRMEI7SUFBQSxHQUN4QkEsT0FBTztJQUFBUCx1QkFBQSxFQUNlLENBQUNPLE9BQU8sQ0FBQVAsdUJBQTZCLElBQXBDLENBQW9DLElBQUk7RUFDcEUsQ0FBQztBQUFBO0FBdUJMLGVBQWVFLDZCQUE2QkEsQ0FBQSxDQUFFLEVBQUVNLE9BQU8sQ0FBQyxLQUFLLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDO0VBQzVFO0VBQ0EsSUFBSWpCLG9CQUFvQixDQUFDLENBQUMsRUFBRTtJQUMxQixPQUFPLElBQUk7RUFDYjtFQUNBLE1BQU1rQixPQUFPLEdBQUcsTUFBTW5CLHlCQUF5QixDQUFDLENBQUM7RUFDakQsSUFBSSxDQUFDbUIsT0FBTyxFQUFFO0lBQ1osT0FBTyxJQUFJO0VBQ2I7RUFFQSxJQUFJQSxPQUFPLENBQUNDLE9BQU8sQ0FBQ0MsY0FBYyxFQUFFO0lBQ2xDLE9BQU8sS0FBSztFQUNkO0VBRUEsSUFBSUYsT0FBTyxDQUFDQyxPQUFPLENBQUNFLGNBQWMsRUFBRTtJQUNsQyxPQUFPLEtBQUs7RUFDZDtFQUVBLE9BQU8sSUFBSTtBQUNiIiwiaWdub3JlTGlzdCI6W119