๐ File detail
hooks/notifs/useFastModeNotification.tsx
๐ฏ Use case
This file lives under โhooks/โ, which covers reusable UI or integration hooks. On the API surface it exposes useFastModeNotification โ mainly functions, hooks, or classes. Dependencies touch React UI and src. It composes internal code from bootstrap (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 { 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';
๐ค Exports (heuristic)
useFastModeNotification
๐ External import roots
Package roots from from "โฆ" (relative paths omitted).
reactsrc
๐ฅ๏ธ Source preview
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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