useFastModeNotification.tsx
hooks/notifs/useFastModeNotification.tsx
162
Lines
14961
Bytes
1
Exports
7
Imports
10
Keywords
What this is
This page documents one file from the repository and includes its full source so you can read it without leaving the docs site.
Beginner explanation
This file is one piece of the larger system. Its name, directory, imports, and exports show where it fits. Start by reading the exports and related files first.
How it is used
Start from the exports list and related files. Those are the easiest clues for where this file fits into the system.
Expert explanation
Architecturally, this file intersects with modes. It contains 162 lines, 7 detected imports, and 1 detected exports.
Important relationships
- hooks/notifs/useAutoModeUnavailableNotification.ts
- hooks/notifs/useCanSwitchToExistingSubscription.tsx
- hooks/notifs/useDeprecationWarningNotification.tsx
- hooks/notifs/useIDEStatusIndicator.tsx
- hooks/notifs/useInstallMessages.tsx
- hooks/notifs/useLspInitializationNotification.tsx
- hooks/notifs/useMcpConnectivityStatus.tsx
- hooks/notifs/useModelMigrationNotifications.tsx
Detected exports
useFastModeNotification
Keywords
addnotificationisfastmodesetappstatefastfastmodecolorpriorityimmediatetextresetin
Detected imports
react/compiler-runtimereactsrc/context/notifications.jssrc/state/AppState.jssrc/utils/fastMode.jssrc/utils/format.js../../bootstrap/state.js
Source notes
This page embeds the full file contents. Small or leaf files are still indexed honestly instead of being over-explained.
Full source
import { c as _c } from "react/compiler-runtime";
import { useEffect } from 'react';
import { useNotifications } from 'src/context/notifications.js';
import { useAppState, useSetAppState } from 'src/state/AppState.js';
import { type CooldownReason, isFastModeEnabled, onCooldownExpired, onCooldownTriggered, onFastModeOverageRejection, onOrgFastModeChanged } from 'src/utils/fastMode.js';
import { formatDuration } from 'src/utils/format.js';
import { getIsRemoteMode } from '../../bootstrap/state.js';
const COOLDOWN_STARTED_KEY = 'fast-mode-cooldown-started';
const COOLDOWN_EXPIRED_KEY = 'fast-mode-cooldown-expired';
const ORG_CHANGED_KEY = 'fast-mode-org-changed';
const OVERAGE_REJECTED_KEY = 'fast-mode-overage-rejected';
export function useFastModeNotification() {
const $ = _c(13);
const {
addNotification
} = useNotifications();
const isFastMode = useAppState(_temp);
const setAppState = useSetAppState();
let t0;
let t1;
if ($[0] !== addNotification || $[1] !== isFastMode || $[2] !== setAppState) {
t0 = () => {
if (getIsRemoteMode()) {
return;
}
if (!isFastModeEnabled()) {
return;
}
return onOrgFastModeChanged(orgEnabled => {
if (orgEnabled) {
addNotification({
key: ORG_CHANGED_KEY,
color: "fastMode",
priority: "immediate",
text: "Fast mode is now available \xB7 /fast to turn on"
});
} else {
if (isFastMode) {
setAppState(_temp2);
addNotification({
key: ORG_CHANGED_KEY,
color: "warning",
priority: "immediate",
text: "Fast mode has been disabled by your organization"
});
}
}
});
};
t1 = [addNotification, isFastMode, setAppState];
$[0] = addNotification;
$[1] = isFastMode;
$[2] = setAppState;
$[3] = t0;
$[4] = t1;
} else {
t0 = $[3];
t1 = $[4];
}
useEffect(t0, t1);
let t2;
let t3;
if ($[5] !== addNotification || $[6] !== setAppState) {
t2 = () => {
if (getIsRemoteMode()) {
return;
}
if (!isFastModeEnabled()) {
return;
}
return onFastModeOverageRejection(message => {
setAppState(_temp3);
addNotification({
key: OVERAGE_REJECTED_KEY,
color: "warning",
priority: "immediate",
text: message
});
});
};
t3 = [addNotification, setAppState];
$[5] = addNotification;
$[6] = setAppState;
$[7] = t2;
$[8] = t3;
} else {
t2 = $[7];
t3 = $[8];
}
useEffect(t2, t3);
let t4;
let t5;
if ($[9] !== addNotification || $[10] !== isFastMode) {
t4 = () => {
if (getIsRemoteMode()) {
return;
}
if (!isFastMode) {
return;
}
const unsubTriggered = onCooldownTriggered((resetAt, reason) => {
const resetIn = formatDuration(resetAt - Date.now(), {
hideTrailingZeros: true
});
const message_0 = getCooldownMessage(reason, resetIn);
addNotification({
key: COOLDOWN_STARTED_KEY,
invalidates: [COOLDOWN_EXPIRED_KEY],
text: message_0,
color: "warning",
priority: "immediate"
});
});
const unsubExpired = onCooldownExpired(() => {
addNotification({
key: COOLDOWN_EXPIRED_KEY,
invalidates: [COOLDOWN_STARTED_KEY],
color: "fastMode",
text: "Fast limit reset \xB7 now using fast mode",
priority: "immediate"
});
});
return () => {
unsubTriggered();
unsubExpired();
};
};
t5 = [addNotification, isFastMode];
$[9] = addNotification;
$[10] = isFastMode;
$[11] = t4;
$[12] = t5;
} else {
t4 = $[11];
t5 = $[12];
}
useEffect(t4, t5);
}
function _temp3(prev_0) {
return {
...prev_0,
fastMode: false
};
}
function _temp2(prev) {
return {
...prev,
fastMode: false
};
}
function _temp(s) {
return s.fastMode;
}
function getCooldownMessage(reason: CooldownReason, resetIn: string): string {
switch (reason) {
case 'overloaded':
return `Fast mode overloaded and is temporarily unavailable · resets in ${resetIn}`;
case 'rate_limit':
return `Fast limit reached and temporarily disabled · resets in ${resetIn}`;
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VFZmZlY3QiLCJ1c2VOb3RpZmljYXRpb25zIiwidXNlQXBwU3RhdGUiLCJ1c2VTZXRBcHBTdGF0ZSIsIkNvb2xkb3duUmVhc29uIiwiaXNGYXN0TW9kZUVuYWJsZWQiLCJvbkNvb2xkb3duRXhwaXJlZCIsIm9uQ29vbGRvd25UcmlnZ2VyZWQiLCJvbkZhc3RNb2RlT3ZlcmFnZVJlamVjdGlvbiIsIm9uT3JnRmFzdE1vZGVDaGFuZ2VkIiwiZm9ybWF0RHVyYXRpb24iLCJnZXRJc1JlbW90ZU1vZGUiLCJDT09MRE9XTl9TVEFSVEVEX0tFWSIsIkNPT0xET1dOX0VYUElSRURfS0VZIiwiT1JHX0NIQU5HRURfS0VZIiwiT1ZFUkFHRV9SRUpFQ1RFRF9LRVkiLCJ1c2VGYXN0TW9kZU5vdGlmaWNhdGlvbiIsIiQiLCJfYyIsImFkZE5vdGlmaWNhdGlvbiIsImlzRmFzdE1vZGUiLCJfdGVtcCIsInNldEFwcFN0YXRlIiwidDAiLCJ0MSIsIm9yZ0VuYWJsZWQiLCJrZXkiLCJjb2xvciIsInByaW9yaXR5IiwidGV4dCIsIl90ZW1wMiIsInQyIiwidDMiLCJtZXNzYWdlIiwiX3RlbXAzIiwidDQiLCJ0NSIsInVuc3ViVHJpZ2dlcmVkIiwicmVzZXRBdCIsInJlYXNvbiIsInJlc2V0SW4iLCJEYXRlIiwibm93IiwiaGlkZVRyYWlsaW5nWmVyb3MiLCJtZXNzYWdlXzAiLCJnZXRDb29sZG93bk1lc3NhZ2UiLCJpbnZhbGlkYXRlcyIsInVuc3ViRXhwaXJlZCIsInByZXZfMCIsInByZXYiLCJmYXN0TW9kZSIsInMiXSwic291cmNlcyI6WyJ1c2VGYXN0TW9kZU5vdGlmaWNhdGlvbi50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyB1c2VOb3RpZmljYXRpb25zIH0gZnJvbSAnc3JjL2NvbnRleHQvbm90aWZpY2F0aW9ucy5qcydcbmltcG9ydCB7IHVzZUFwcFN0YXRlLCB1c2VTZXRBcHBTdGF0ZSB9IGZyb20gJ3NyYy9zdGF0ZS9BcHBTdGF0ZS5qcydcbmltcG9ydCB7XG4gIHR5cGUgQ29vbGRvd25SZWFzb24sXG4gIGlzRmFzdE1vZGVFbmFibGVkLFxuICBvbkNvb2xkb3duRXhwaXJlZCxcbiAgb25Db29sZG93blRyaWdnZXJlZCxcbiAgb25GYXN0TW9kZU92ZXJhZ2VSZWplY3Rpb24sXG4gIG9uT3JnRmFzdE1vZGVDaGFuZ2VkLFxufSBmcm9tICdzcmMvdXRpbHMvZmFzdE1vZGUuanMnXG5pbXBvcnQgeyBmb3JtYXREdXJhdGlvbiB9IGZyb20gJ3NyYy91dGlscy9mb3JtYXQuanMnXG5pbXBvcnQgeyBnZXRJc1JlbW90ZU1vZGUgfSBmcm9tICcuLi8uLi9ib290c3RyYXAvc3RhdGUuanMnXG5cbmNvbnN0IENPT0xET1dOX1NUQVJURURfS0VZID0gJ2Zhc3QtbW9kZS1jb29sZG93bi1zdGFydGVkJ1xuY29uc3QgQ09PTERPV05fRVhQSVJFRF9LRVkgPSAnZmFzdC1tb2RlLWNvb2xkb3duLWV4cGlyZWQnXG5jb25zdCBPUkdfQ0hBTkdFRF9LRVkgPSAnZmFzdC1tb2RlLW9yZy1jaGFuZ2VkJ1xuY29uc3QgT1ZFUkFHRV9SRUpFQ1RFRF9LRVkgPSAnZmFzdC1tb2RlLW92ZXJhZ2UtcmVqZWN0ZWQnXG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VGYXN0TW9kZU5vdGlmaWNhdGlvbigpOiB2b2lkIHtcbiAgY29uc3QgeyBhZGROb3RpZmljYXRpb24gfSA9IHVzZU5vdGlmaWNhdGlvbnMoKVxuICBjb25zdCBpc0Zhc3RNb2RlID0gdXNlQXBwU3RhdGUocyA9PiBzLmZhc3RNb2RlKVxuICBjb25zdCBzZXRBcHBTdGF0ZSA9IHVzZVNldEFwcFN0YXRlKClcblxuICAvLyBOb3RpZnkgd2hlbiBvcmcgZmFzdCBtb2RlIHN0YXR1cyBjaGFuZ2VzXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGdldElzUmVtb3RlTW9kZSgpKSByZXR1cm5cbiAgICBpZiAoIWlzRmFzdE1vZGVFbmFibGVkKCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHJldHVybiBvbk9yZ0Zhc3RNb2RlQ2hhbmdlZChvcmdFbmFibGVkID0+IHtcbiAgICAgIGlmIChvcmdFbmFibGVkKSB7XG4gICAgICAgIGFkZE5vdGlmaWNhdGlvbih7XG4gICAgICAgICAga2V5OiBPUkdfQ0hBTkdFRF9LRVksXG4gICAgICAgICAgY29sb3I6ICdmYXN0TW9kZScsXG4gICAgICAgICAgcHJpb3JpdHk6ICdpbW1lZGlhdGUnLFxuICAgICAgICAgIHRleHQ6ICdGYXN0IG1vZGUgaXMgbm93IGF2YWlsYWJsZSDCtyAvZmFzdCB0byB0dXJuIG9uJyxcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSBpZiAoaXNGYXN0TW9kZSkge1xuICAgICAgICAvLyBPcmcgZGlzYWJsZWQgZmFzdCBtb2RlIOKAlCBwZXJtYW5lbnRseSB0dXJuIG9mZiBmYXN0IG1vZGVcbiAgICAgICAgc2V0QXBwU3RhdGUocHJldiA9PiAoeyAuLi5wcmV2LCBmYXN0TW9kZTogZmFsc2UgfSkpXG4gICAgICAgIGFkZE5vdGlmaWNhdGlvbih7XG4gICAgICAgICAga2V5OiBPUkdfQ0hBTkdFRF9LRVksXG4gICAgICAgICAgY29sb3I6ICd3YXJuaW5nJyxcbiAgICAgICAgICBwcmlvcml0eTogJ2ltbWVkaWF0ZScsXG4gICAgICAgICAgdGV4dDogJ0Zhc3QgbW9kZSBoYXMgYmVlbiBkaXNhYmxlZCBieSB5b3VyIG9yZ2FuaXphdGlvbicsXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcbiAgfSwgW2FkZE5vdGlmaWNhdGlvbiwgaXNGYXN0TW9kZSwgc2V0QXBwU3RhdGVdKVxuXG4gIC8vIE5vdGlmeSB3aGVuIGZhc3QgbW9kZSBpcyByZWplY3RlZCBkdWUgdG8gb3ZlcmFnZS9leHRyYSB1c2FnZSBpc3N1ZXNcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoZ2V0SXNSZW1vdGVNb2RlKCkpIHJldHVyblxuICAgIGlmICghaXNGYXN0TW9kZUVuYWJsZWQoKSkgcmV0dXJuXG5cbiAgICByZXR1cm4gb25GYXN0TW9kZU92ZXJhZ2VSZWplY3Rpb24obWVzc2FnZSA9PiB7XG4gICAgICBzZXRBcHBTdGF0ZShwcmV2ID0+ICh7IC4uLnByZXYsIGZhc3RNb2RlOiBmYWxzZSB9KSlcbiAgICAgIGFkZE5vdGlmaWNhdGlvbih7XG4gICAgICAgIGtleTogT1ZFUkFHRV9SRUpFQ1RFRF9LRVksXG4gICAgICAgIGNvbG9yOiAnd2FybmluZycsXG4gICAgICAgIHByaW9yaXR5OiAnaW1tZWRpYXRlJyxcbiAgICAgICAgdGV4dDogbWVzc2FnZSxcbiAgICAgIH0pXG4gICAgfSlcbiAgfSwgW2FkZE5vdGlmaWNhdGlvbiwgc2V0QXBwU3RhdGVdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGdldElzUmVtb3RlTW9kZSgpKSByZXR1cm5cbiAgICBpZiAoIWlzRmFzdE1vZGUpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHVuc3ViVHJpZ2dlcmVkID0gb25Db29sZG93blRyaWdnZXJlZCgocmVzZXRBdCwgcmVhc29uKSA9PiB7XG4gICAgICBjb25zdCByZXNldEluID0gZm9ybWF0RHVyYXRpb24ocmVzZXRBdCAtIERhdGUubm93KCksIHtcbiAgICAgICAgaGlkZVRyYWlsaW5nWmVyb3M6IHRydWUsXG4gICAgICB9KVxuICAgICAgY29uc3QgbWVzc2FnZSA9IGdldENvb2xkb3duTWVzc2FnZShyZWFzb24sIHJlc2V0SW4pXG4gICAgICBhZGROb3RpZmljYXRpb24oe1xuICAgICAgICBrZXk6IENPT0xET1dOX1NUQVJURURfS0VZLFxuICAgICAgICBpbnZhbGlkYXRlczogW0NPT0xET1dOX0VYUElSRURfS0VZXSxcbiAgICAgICAgdGV4dDogbWVzc2FnZSxcbiAgICAgICAgY29sb3I6ICd3YXJuaW5nJyxcbiAgICAgICAgcHJpb3JpdHk6ICdpbW1lZGlhdGUnLFxuICAgICAgfSlcbiAgICB9KVxuICAgIGNvbnN0IHVuc3ViRXhwaXJlZCA9IG9uQ29vbGRvd25FeHBpcmVkKCgpID0+IHtcbiAgICAgIGFkZE5vdGlmaWNhdGlvbih7XG4gICAgICAgIGtleTogQ09PTERPV05fRVhQSVJFRF9LRVksXG4gICAgICAgIGludmFsaWRhdGVzOiBbQ09PTERPV05fU1RBUlRFRF9LRVldLFxuICAgICAgICBjb2xvcjogJ2Zhc3RNb2RlJyxcbiAgICAgICAgdGV4dDogYEZhc3QgbGltaXQgcmVzZXQgwrcgbm93IHVzaW5nIGZhc3QgbW9kZWAsXG4gICAgICAgIHByaW9yaXR5OiAnaW1tZWRpYXRlJyxcbiAgICAgIH0pXG4gICAgfSlcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgdW5zdWJUcmlnZ2VyZWQoKVxuICAgICAgdW5zdWJFeHBpcmVkKClcbiAgICB9XG4gIH0sIFthZGROb3RpZmljYXRpb24sIGlzRmFzdE1vZGVdKVxufVxuXG5mdW5jdGlvbiBnZXRDb29sZG93bk1lc3NhZ2UocmVhc29uOiBDb29sZG93blJlYXNvbiwgcmVzZXRJbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgc3dpdGNoIChyZWFzb24pIHtcbiAgICBjYXNlICdvdmVybG9hZGVkJzpcbiAgICAgIHJldHVybiBgRmFzdCBtb2RlIG92ZXJsb2FkZWQgYW5kIGlzIHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlIMK3IHJlc2V0cyBpbiAke3Jlc2V0SW59YFxuICAgIGNhc2UgJ3JhdGVfbGltaXQnOlxuICAgICAgcmV0dXJuIGBGYXN0IGxpbWl0IHJlYWNoZWQgYW5kIHRlbXBvcmFyaWx5IGRpc2FibGVkIMK3IHJlc2V0cyBpbiAke3Jlc2V0SW59YFxuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7QUFBQSxTQUFTQSxTQUFTLFFBQVEsT0FBTztBQUNqQyxTQUFTQyxnQkFBZ0IsUUFBUSw4QkFBOEI7QUFDL0QsU0FBU0MsV0FBVyxFQUFFQyxjQUFjLFFBQVEsdUJBQXVCO0FBQ25FLFNBQ0UsS0FBS0MsY0FBYyxFQUNuQkMsaUJBQWlCLEVBQ2pCQyxpQkFBaUIsRUFDakJDLG1CQUFtQixFQUNuQkMsMEJBQTBCLEVBQzFC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