mirror of
https://github.com/router-for-me/Cli-Proxy-API-Management-Center.git
synced 2026-02-20 03:30:50 +08:00
fix(auth-files): cache Antigravity quota to avoid auto refresh on reopen
This commit is contained in:
@@ -361,6 +361,7 @@
|
|||||||
"title": "Antigravity Quota",
|
"title": "Antigravity Quota",
|
||||||
"empty_title": "No Antigravity Auth Files",
|
"empty_title": "No Antigravity Auth Files",
|
||||||
"empty_desc": "Upload an Antigravity credential to view remaining quota.",
|
"empty_desc": "Upload an Antigravity credential to view remaining quota.",
|
||||||
|
"idle": "Not loaded. Click Refresh.",
|
||||||
"loading": "Loading quota...",
|
"loading": "Loading quota...",
|
||||||
"load_failed": "Failed to load quota: {{message}}",
|
"load_failed": "Failed to load quota: {{message}}",
|
||||||
"missing_auth_index": "Auth file missing auth_index",
|
"missing_auth_index": "Auth file missing auth_index",
|
||||||
|
|||||||
@@ -361,6 +361,7 @@
|
|||||||
"title": "Antigravity 额度",
|
"title": "Antigravity 额度",
|
||||||
"empty_title": "暂无 Antigravity 认证",
|
"empty_title": "暂无 Antigravity 认证",
|
||||||
"empty_desc": "上传 Antigravity 认证文件后即可查看额度。",
|
"empty_desc": "上传 Antigravity 认证文件后即可查看额度。",
|
||||||
|
"idle": "尚未加载额度,请点击刷新。",
|
||||||
"loading": "正在加载额度...",
|
"loading": "正在加载额度...",
|
||||||
"load_failed": "额度获取失败:{{message}}",
|
"load_failed": "额度获取失败:{{message}}",
|
||||||
"missing_auth_index": "认证文件缺少 auth_index",
|
"missing_auth_index": "认证文件缺少 auth_index",
|
||||||
|
|||||||
@@ -172,6 +172,9 @@ const ANTIGRAVITY_QUOTA_GROUPS: AntigravityQuotaGroupDefinition[] = [
|
|||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|
||||||
|
let antigravityQuotaCache: Record<string, AntigravityQuotaState> = {};
|
||||||
|
let antigravityQuotaCacheLoaded = false;
|
||||||
|
|
||||||
// 标准化 auth_index 值(与 usage.ts 中的 normalizeAuthIndex 保持一致)
|
// 标准化 auth_index 值(与 usage.ts 中的 normalizeAuthIndex 保持一致)
|
||||||
function normalizeAuthIndexValue(value: unknown): string | null {
|
function normalizeAuthIndexValue(value: unknown): string | null {
|
||||||
if (typeof value === 'number' && Number.isFinite(value)) {
|
if (typeof value === 'number' && Number.isFinite(value)) {
|
||||||
@@ -627,6 +630,8 @@ export function AuthFilesPage() {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
setAntigravityQuota(nextState);
|
setAntigravityQuota(nextState);
|
||||||
|
antigravityQuotaCache = nextState;
|
||||||
|
antigravityQuotaCacheLoaded = true;
|
||||||
} finally {
|
} finally {
|
||||||
if (requestId === antigravityRequestIdRef.current) {
|
if (requestId === antigravityRequestIdRef.current) {
|
||||||
setAntigravityLoading(false);
|
setAntigravityLoading(false);
|
||||||
@@ -646,15 +651,20 @@ export function AuthFilesPage() {
|
|||||||
setAntigravityQuota({});
|
setAntigravityQuota({});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (antigravityQuotaCacheLoaded) {
|
||||||
|
setAntigravityQuota(antigravityQuotaCache);
|
||||||
|
return;
|
||||||
|
}
|
||||||
loadAntigravityQuota();
|
loadAntigravityQuota();
|
||||||
}, [antigravityFiles, loadAntigravityQuota]);
|
}, [
|
||||||
|
antigravityFiles,
|
||||||
|
loadAntigravityQuota,
|
||||||
|
antigravityQuotaCacheLoaded,
|
||||||
|
antigravityQuotaCache
|
||||||
|
]);
|
||||||
|
|
||||||
// 定时刷新状态数据(每240秒)
|
// 定时刷新状态数据(每240秒)
|
||||||
useInterval(loadKeyStats, 240_000);
|
useInterval(loadKeyStats, 240_000);
|
||||||
useInterval(() => {
|
|
||||||
if (antigravityFiles.length === 0) return;
|
|
||||||
loadAntigravityQuota();
|
|
||||||
}, 240_000);
|
|
||||||
|
|
||||||
// 提取所有存在的类型
|
// 提取所有存在的类型
|
||||||
const existingTypes = useMemo(() => {
|
const existingTypes = useMemo(() => {
|
||||||
@@ -1191,7 +1201,9 @@ export function AuthFilesPage() {
|
|||||||
const displayType = item.type || item.provider || 'antigravity';
|
const displayType = item.type || item.provider || 'antigravity';
|
||||||
const typeColor = getTypeColor(displayType);
|
const typeColor = getTypeColor(displayType);
|
||||||
const quotaState = antigravityQuota[item.name];
|
const quotaState = antigravityQuota[item.name];
|
||||||
const quotaStatus = quotaState?.status ?? 'idle';
|
const quotaStatus =
|
||||||
|
quotaState?.status ??
|
||||||
|
(antigravityLoading || !antigravityQuotaCacheLoaded ? 'loading' : 'idle');
|
||||||
const quotaGroups = quotaState?.groups ?? [];
|
const quotaGroups = quotaState?.groups ?? [];
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@@ -1211,8 +1223,10 @@ export function AuthFilesPage() {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className={styles.quotaSection}>
|
<div className={styles.quotaSection}>
|
||||||
{quotaStatus === 'loading' || quotaStatus === 'idle' ? (
|
{quotaStatus === 'loading' ? (
|
||||||
<div className={styles.quotaMessage}>{t('antigravity_quota.loading')}</div>
|
<div className={styles.quotaMessage}>{t('antigravity_quota.loading')}</div>
|
||||||
|
) : quotaStatus === 'idle' ? (
|
||||||
|
<div className={styles.quotaMessage}>{t('antigravity_quota.idle')}</div>
|
||||||
) : quotaStatus === 'error' ? (
|
) : quotaStatus === 'error' ? (
|
||||||
<div className={styles.quotaError}>
|
<div className={styles.quotaError}>
|
||||||
{t('antigravity_quota.load_failed', {
|
{t('antigravity_quota.load_failed', {
|
||||||
|
|||||||
Reference in New Issue
Block a user