mirror of
https://github.com/router-for-me/Cli-Proxy-API-Management-Center.git
synced 2026-02-03 03:10:50 +08:00
Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
be3f58f0a8 | ||
|
|
c299e403cc |
@@ -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",
|
||||
|
||||
@@ -361,6 +361,7 @@
|
||||
"title": "Antigravity 额度",
|
||||
"empty_title": "暂无 Antigravity 认证",
|
||||
"empty_desc": "上传 Antigravity 认证文件后即可查看额度。",
|
||||
"idle": "尚未加载额度,请点击刷新。",
|
||||
"loading": "正在加载额度...",
|
||||
"load_failed": "额度获取失败:{{message}}",
|
||||
"missing_auth_index": "认证文件缺少 auth_index",
|
||||
|
||||
@@ -176,6 +176,27 @@
|
||||
}
|
||||
}
|
||||
|
||||
.antigravityControls {
|
||||
display: flex;
|
||||
gap: $spacing-md;
|
||||
flex-wrap: wrap;
|
||||
align-items: flex-end;
|
||||
margin-bottom: $spacing-md;
|
||||
}
|
||||
|
||||
.antigravityControl {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 4px;
|
||||
|
||||
label {
|
||||
font-size: 12px;
|
||||
color: var(--text-secondary);
|
||||
font-weight: 500;
|
||||
white-space: nowrap;
|
||||
}
|
||||
}
|
||||
|
||||
.antigravityCard {
|
||||
background-image: linear-gradient(
|
||||
180deg,
|
||||
|
||||
@@ -171,6 +171,9 @@ const ANTIGRAVITY_QUOTA_GROUPS: AntigravityQuotaGroupDefinition[] = [
|
||||
labelFromModel: true
|
||||
}
|
||||
];
|
||||
|
||||
let antigravityQuotaCache: Record<string, AntigravityQuotaState> = {};
|
||||
let antigravityQuotaCacheLoaded = false;
|
||||
|
||||
// 标准化 auth_index 值(与 usage.ts 中的 normalizeAuthIndex 保持一致)
|
||||
function normalizeAuthIndexValue(value: unknown): string | null {
|
||||
@@ -393,6 +396,7 @@ export function AuthFilesPage() {
|
||||
const [page, setPage] = useState(1);
|
||||
const [pageSize, setPageSize] = useState(9);
|
||||
const [antigravityPage, setAntigravityPage] = useState(1);
|
||||
const [antigravityPageSize, setAntigravityPageSize] = useState(6);
|
||||
const [uploading, setUploading] = useState(false);
|
||||
const [deleting, setDeleting] = useState<string | null>(null);
|
||||
const [deletingAll, setDeletingAll] = useState(false);
|
||||
@@ -508,7 +512,6 @@ export function AuthFilesPage() {
|
||||
[files]
|
||||
);
|
||||
|
||||
const antigravityPageSize = 6;
|
||||
const antigravityTotalPages = Math.max(
|
||||
1,
|
||||
Math.ceil(antigravityFiles.length / antigravityPageSize)
|
||||
@@ -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() {
|
||||
</div>
|
||||
|
||||
<div className={styles.quotaSection}>
|
||||
{quotaStatus === 'loading' || quotaStatus === 'idle' ? (
|
||||
{quotaStatus === 'loading' ? (
|
||||
<div className={styles.quotaMessage}>{t('antigravity_quota.loading')}</div>
|
||||
) : quotaStatus === 'idle' ? (
|
||||
<div className={styles.quotaMessage}>{t('antigravity_quota.idle')}</div>
|
||||
) : quotaStatus === 'error' ? (
|
||||
<div className={styles.quotaError}>
|
||||
{t('antigravity_quota.load_failed', {
|
||||
@@ -1401,6 +1415,31 @@ export function AuthFilesPage() {
|
||||
/>
|
||||
) : (
|
||||
<>
|
||||
<div className={styles.antigravityControls}>
|
||||
<div className={styles.antigravityControl}>
|
||||
<label>{t('auth_files.page_size_label')}</label>
|
||||
<select
|
||||
className={styles.pageSizeSelect}
|
||||
value={antigravityPageSize}
|
||||
onChange={(e) => {
|
||||
setAntigravityPageSize(Number(e.target.value) || 6);
|
||||
setAntigravityPage(1);
|
||||
}}
|
||||
>
|
||||
<option value={6}>6</option>
|
||||
<option value={9}>9</option>
|
||||
<option value={12}>12</option>
|
||||
<option value={18}>18</option>
|
||||
<option value={24}>24</option>
|
||||
</select>
|
||||
</div>
|
||||
<div className={styles.antigravityControl}>
|
||||
<label>{t('common.info')}</label>
|
||||
<div className={styles.statsInfo}>
|
||||
{antigravityFiles.length} {t('auth_files.files_count')}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className={styles.antigravityGrid}>
|
||||
{antigravityPageItems.map(renderAntigravityCard)}
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user