chore(i18n): update antigravity refresh label

This commit is contained in:
Supra4E8C
2025-12-29 12:33:04 +08:00
parent 66d58288b4
commit 8a59ab73a1
3 changed files with 107 additions and 88 deletions

View File

@@ -361,11 +361,13 @@
"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.", "idle": "Not loaded. Click Refresh Button.",
"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",
"empty_models": "No quota data available" "empty_models": "No quota data available",
"refresh_button": "Refresh Quota",
"fetch_all": "Fetch All"
}, },
"vertex_import": { "vertex_import": {
"title": "Vertex JSON Login", "title": "Vertex JSON Login",

View File

@@ -361,11 +361,13 @@
"title": "Antigravity 额度", "title": "Antigravity 额度",
"empty_title": "暂无 Antigravity 认证", "empty_title": "暂无 Antigravity 认证",
"empty_desc": "上传 Antigravity 认证文件后即可查看额度。", "empty_desc": "上传 Antigravity 认证文件后即可查看额度。",
"idle": "尚未加载额度,请点击刷新。", "idle": "尚未加载额度,请点击刷新按钮。",
"loading": "正在加载额度...", "loading": "正在加载额度...",
"load_failed": "额度获取失败:{{message}}", "load_failed": "额度获取失败:{{message}}",
"missing_auth_index": "认证文件缺少 auth_index", "missing_auth_index": "认证文件缺少 auth_index",
"empty_models": "暂无额度数据" "empty_models": "暂无额度数据",
"refresh_button": "刷新额度",
"fetch_all": "获取全部"
}, },
"vertex_import": { "vertex_import": {
"title": "Vertex JSON 登录", "title": "Vertex JSON 登录",

View File

@@ -172,8 +172,7 @@ 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 {
@@ -406,6 +405,9 @@ export function AuthFilesPage() {
{} {}
); );
const [antigravityLoading, setAntigravityLoading] = useState(false); const [antigravityLoading, setAntigravityLoading] = useState(false);
const [antigravityLoadingScope, setAntigravityLoadingScope] = useState<
'page' | 'all' | null
>(null);
// 详情弹窗相关 // 详情弹窗相关
const [detailModalOpen, setDetailModalOpen] = useState(false); const [detailModalOpen, setDetailModalOpen] = useState(false);
@@ -572,73 +574,77 @@ export function AuthFilesPage() {
[t] [t]
); );
const loadAntigravityQuota = useCallback(async () => { const loadAntigravityQuota = useCallback(
if (antigravityLoadingRef.current) return; async (targets: AuthFileItem[], scope: 'page' | 'all') => {
antigravityLoadingRef.current = true; if (antigravityLoadingRef.current) return;
const requestId = ++antigravityRequestIdRef.current; antigravityLoadingRef.current = true;
setAntigravityLoading(true); const requestId = ++antigravityRequestIdRef.current;
setAntigravityLoading(true);
setAntigravityLoadingScope(scope);
try { try {
if (antigravityFiles.length === 0) { if (targets.length === 0) return;
setAntigravityQuota({});
return;
}
const loadingState: Record<string, AntigravityQuotaState> = {}; setAntigravityQuota((prev) => {
antigravityFiles.forEach((file) => { const nextState = { ...prev };
loadingState[file.name] = { status: 'loading', groups: [] }; targets.forEach((file) => {
}); nextState[file.name] = { status: 'loading', groups: [] };
setAntigravityQuota(loadingState); });
return nextState;
});
const results = await Promise.all( const results = await Promise.all(
antigravityFiles.map(async (file) => { targets.map(async (file) => {
const rawAuthIndex = file['auth_index'] ?? file.authIndex; const rawAuthIndex = file['auth_index'] ?? file.authIndex;
const authIndex = normalizeAuthIndexValue(rawAuthIndex); const authIndex = normalizeAuthIndexValue(rawAuthIndex);
if (!authIndex) { if (!authIndex) {
return { return {
name: file.name, name: file.name,
status: 'error' as const, status: 'error' as const,
error: t('antigravity_quota.missing_auth_index') error: t('antigravity_quota.missing_auth_index')
}; };
} }
try { try {
const groups = await fetchAntigravityQuota(authIndex); const groups = await fetchAntigravityQuota(authIndex);
return { name: file.name, status: 'success' as const, groups }; return { name: file.name, status: 'success' as const, groups };
} catch (err: unknown) { } catch (err: unknown) {
const message = err instanceof Error ? err.message : t('common.unknown_error'); const message = err instanceof Error ? err.message : t('common.unknown_error');
return { name: file.name, status: 'error' as const, error: message }; return { name: file.name, status: 'error' as const, error: message };
} }
}) })
); );
if (requestId !== antigravityRequestIdRef.current) return; if (requestId !== antigravityRequestIdRef.current) return;
const nextState: Record<string, AntigravityQuotaState> = {}; setAntigravityQuota((prev) => {
results.forEach((result) => { const nextState = { ...prev };
if (result.status === 'success') { results.forEach((result) => {
nextState[result.name] = { if (result.status === 'success') {
status: 'success', nextState[result.name] = {
groups: result.groups status: 'success',
}; groups: result.groups
} else { };
nextState[result.name] = { } else {
status: 'error', nextState[result.name] = {
groups: [], status: 'error',
error: result.error groups: [],
}; error: result.error
};
}
});
return nextState;
});
} finally {
if (requestId === antigravityRequestIdRef.current) {
setAntigravityLoading(false);
setAntigravityLoadingScope(null);
antigravityLoadingRef.current = false;
} }
});
setAntigravityQuota(nextState);
antigravityQuotaCache = nextState;
antigravityQuotaCacheLoaded = true;
} finally {
if (requestId === antigravityRequestIdRef.current) {
setAntigravityLoading(false);
antigravityLoadingRef.current = false;
} }
} },
}, [antigravityFiles, fetchAntigravityQuota, t]); [fetchAntigravityQuota, t]
);
useEffect(() => { useEffect(() => {
loadFiles(); loadFiles();
@@ -651,17 +657,17 @@ export function AuthFilesPage() {
setAntigravityQuota({}); setAntigravityQuota({});
return; return;
} }
if (antigravityQuotaCacheLoaded) { setAntigravityQuota((prev) => {
setAntigravityQuota(antigravityQuotaCache); const nextState: Record<string, AntigravityQuotaState> = {};
return; antigravityFiles.forEach((file) => {
} const cached = prev[file.name];
loadAntigravityQuota(); if (cached) {
}, [ nextState[file.name] = cached;
antigravityFiles, }
loadAntigravityQuota, });
antigravityQuotaCacheLoaded, return nextState;
antigravityQuotaCache });
]); }, [antigravityFiles]);
// 定时刷新状态数据每240秒 // 定时刷新状态数据每240秒
useInterval(loadKeyStats, 240_000); useInterval(loadKeyStats, 240_000);
@@ -1201,9 +1207,7 @@ 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 = const quotaStatus = quotaState?.status ?? 'idle';
quotaState?.status ??
(antigravityLoading || !antigravityQuotaCacheLoaded ? 'loading' : 'idle');
const quotaGroups = quotaState?.groups ?? []; const quotaGroups = quotaState?.groups ?? [];
return ( return (
@@ -1397,15 +1401,26 @@ export function AuthFilesPage() {
<Card <Card
title={t('antigravity_quota.title')} title={t('antigravity_quota.title')}
extra={ extra={
<Button <div className={styles.headerActions}>
variant="secondary" <Button
size="sm" variant="secondary"
onClick={loadAntigravityQuota} size="sm"
disabled={disableControls || antigravityLoading || antigravityFiles.length === 0} onClick={() => loadAntigravityQuota(antigravityPageItems, 'page')}
loading={antigravityLoading} disabled={disableControls || antigravityLoading || antigravityPageItems.length === 0}
> loading={antigravityLoading && antigravityLoadingScope === 'page'}
{t('common.refresh')} >
</Button> {t('antigravity_quota.refresh_button')}
</Button>
<Button
variant="secondary"
size="sm"
onClick={() => loadAntigravityQuota(antigravityFiles, 'all')}
disabled={disableControls || antigravityLoading || antigravityFiles.length === 0}
loading={antigravityLoading && antigravityLoadingScope === 'all'}
>
{t('antigravity_quota.fetch_all')}
</Button>
</div>
} }
> >
{antigravityFiles.length === 0 ? ( {antigravityFiles.length === 0 ? (