From be3f58f0a8e1424e7314cb098e4a873f0847c572 Mon Sep 17 00:00:00 2001 From: Supra4E8C Date: Mon, 29 Dec 2025 01:18:18 +0800 Subject: [PATCH] fix(auth-files): cache Antigravity quota to avoid auto refresh on reopen --- src/i18n/locales/en.json | 1 + src/i18n/locales/zh-CN.json | 1 + src/pages/AuthFilesPage.tsx | 28 +++++++++++++++++++++------- 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/i18n/locales/en.json b/src/i18n/locales/en.json index bf3ff5a..516846c 100644 --- a/src/i18n/locales/en.json +++ b/src/i18n/locales/en.json @@ -361,6 +361,7 @@ "title": "Antigravity Quota", "empty_title": "No Antigravity Auth Files", "empty_desc": "Upload an Antigravity credential to view remaining quota.", + "idle": "Not loaded. Click Refresh.", "loading": "Loading quota...", "load_failed": "Failed to load quota: {{message}}", "missing_auth_index": "Auth file missing auth_index", diff --git a/src/i18n/locales/zh-CN.json b/src/i18n/locales/zh-CN.json index 9d110e4..083f5f9 100644 --- a/src/i18n/locales/zh-CN.json +++ b/src/i18n/locales/zh-CN.json @@ -361,6 +361,7 @@ "title": "Antigravity 额度", "empty_title": "暂无 Antigravity 认证", "empty_desc": "上传 Antigravity 认证文件后即可查看额度。", + "idle": "尚未加载额度,请点击刷新。", "loading": "正在加载额度...", "load_failed": "额度获取失败:{{message}}", "missing_auth_index": "认证文件缺少 auth_index", diff --git a/src/pages/AuthFilesPage.tsx b/src/pages/AuthFilesPage.tsx index e13a97c..4c8e4ee 100644 --- a/src/pages/AuthFilesPage.tsx +++ b/src/pages/AuthFilesPage.tsx @@ -171,6 +171,9 @@ const ANTIGRAVITY_QUOTA_GROUPS: AntigravityQuotaGroupDefinition[] = [ labelFromModel: true } ]; + +let antigravityQuotaCache: Record = {}; +let antigravityQuotaCacheLoaded = false; // 标准化 auth_index 值(与 usage.ts 中的 normalizeAuthIndex 保持一致) function normalizeAuthIndexValue(value: unknown): string | null { @@ -627,6 +630,8 @@ export function AuthFilesPage() { } }); setAntigravityQuota(nextState); + antigravityQuotaCache = nextState; + antigravityQuotaCacheLoaded = true; } finally { if (requestId === antigravityRequestIdRef.current) { setAntigravityLoading(false); @@ -646,15 +651,20 @@ export function AuthFilesPage() { setAntigravityQuota({}); return; } + if (antigravityQuotaCacheLoaded) { + setAntigravityQuota(antigravityQuotaCache); + return; + } loadAntigravityQuota(); - }, [antigravityFiles, loadAntigravityQuota]); + }, [ + antigravityFiles, + loadAntigravityQuota, + antigravityQuotaCacheLoaded, + antigravityQuotaCache + ]); // 定时刷新状态数据(每240秒) useInterval(loadKeyStats, 240_000); - useInterval(() => { - if (antigravityFiles.length === 0) return; - loadAntigravityQuota(); - }, 240_000); // 提取所有存在的类型 const existingTypes = useMemo(() => { @@ -1191,7 +1201,9 @@ export function AuthFilesPage() { const displayType = item.type || item.provider || 'antigravity'; const typeColor = getTypeColor(displayType); const quotaState = antigravityQuota[item.name]; - const quotaStatus = quotaState?.status ?? 'idle'; + const quotaStatus = + quotaState?.status ?? + (antigravityLoading || !antigravityQuotaCacheLoaded ? 'loading' : 'idle'); const quotaGroups = quotaState?.groups ?? []; return ( @@ -1211,8 +1223,10 @@ export function AuthFilesPage() {
- {quotaStatus === 'loading' || quotaStatus === 'idle' ? ( + {quotaStatus === 'loading' ? (
{t('antigravity_quota.loading')}
+ ) : quotaStatus === 'idle' ? ( +
{t('antigravity_quota.idle')}
) : quotaStatus === 'error' ? (
{t('antigravity_quota.load_failed', {