feat: add auth type counts and hide disabled quotas

This commit is contained in:
Supra4E8C
2026-01-31 16:05:48 +08:00
parent 7b77520526
commit 1502e14ca7
4 changed files with 37 additions and 4 deletions

View File

@@ -45,6 +45,7 @@ import {
getStatusFromError, getStatusFromError,
isAntigravityFile, isAntigravityFile,
isCodexFile, isCodexFile,
isDisabledAuthFile,
isGeminiCliFile, isGeminiCliFile,
isRuntimeOnlyAuthFile isRuntimeOnlyAuthFile
} from '@/utils/quota'; } from '@/utils/quota';
@@ -519,7 +520,7 @@ const renderGeminiCliItems = (
export const ANTIGRAVITY_CONFIG: QuotaConfig<AntigravityQuotaState, AntigravityQuotaGroup[]> = { export const ANTIGRAVITY_CONFIG: QuotaConfig<AntigravityQuotaState, AntigravityQuotaGroup[]> = {
type: 'antigravity', type: 'antigravity',
i18nPrefix: 'antigravity_quota', i18nPrefix: 'antigravity_quota',
filterFn: (file) => isAntigravityFile(file), filterFn: (file) => isAntigravityFile(file) && !isDisabledAuthFile(file),
fetchQuota: fetchAntigravityQuota, fetchQuota: fetchAntigravityQuota,
storeSelector: (state) => state.antigravityQuota, storeSelector: (state) => state.antigravityQuota,
storeSetter: 'setAntigravityQuota', storeSetter: 'setAntigravityQuota',
@@ -544,7 +545,7 @@ export const CODEX_CONFIG: QuotaConfig<
> = { > = {
type: 'codex', type: 'codex',
i18nPrefix: 'codex_quota', i18nPrefix: 'codex_quota',
filterFn: (file) => isCodexFile(file), filterFn: (file) => isCodexFile(file) && !isDisabledAuthFile(file),
fetchQuota: fetchCodexQuota, fetchQuota: fetchCodexQuota,
storeSelector: (state) => state.codexQuota, storeSelector: (state) => state.codexQuota,
storeSetter: 'setCodexQuota', storeSetter: 'setCodexQuota',
@@ -570,7 +571,8 @@ export const CODEX_CONFIG: QuotaConfig<
export const GEMINI_CLI_CONFIG: QuotaConfig<GeminiCliQuotaState, GeminiCliQuotaBucketState[]> = { export const GEMINI_CLI_CONFIG: QuotaConfig<GeminiCliQuotaState, GeminiCliQuotaBucketState[]> = {
type: 'gemini-cli', type: 'gemini-cli',
i18nPrefix: 'gemini_cli_quota', i18nPrefix: 'gemini_cli_quota',
filterFn: (file) => isGeminiCliFile(file) && !isRuntimeOnlyAuthFile(file), filterFn: (file) =>
isGeminiCliFile(file) && !isRuntimeOnlyAuthFile(file) && !isDisabledAuthFile(file),
fetchQuota: fetchGeminiCliQuota, fetchQuota: fetchGeminiCliQuota,
storeSelector: (state) => state.geminiCliQuota, storeSelector: (state) => state.geminiCliQuota,
storeSetter: 'setGeminiCliQuota', storeSetter: 'setGeminiCliQuota',

View File

@@ -79,6 +79,9 @@
} }
.filterTag { .filterTag {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 6px 14px; padding: 6px 14px;
border-radius: 20px; border-radius: 20px;
font-size: 13px; font-size: 13px;
@@ -97,6 +100,16 @@
font-weight: 600; font-weight: 600;
} }
.filterTagLabel {
white-space: nowrap;
}
.filterTagCount {
font-size: 12px;
font-weight: 600;
opacity: 0.85;
}
.filterControls { .filterControls {
display: flex; display: flex;
gap: $spacing-md; gap: $spacing-md;

View File

@@ -453,6 +453,15 @@ export function AuthFilesPage() {
return Array.from(types); return Array.from(types);
}, [files]); }, [files]);
const typeCounts = useMemo(() => {
const counts: Record<string, number> = { all: files.length };
files.forEach((file) => {
if (!file.type) return;
counts[file.type] = (counts[file.type] || 0) + 1;
});
return counts;
}, [files]);
// 过滤和搜索 // 过滤和搜索
const filtered = useMemo(() => { const filtered = useMemo(() => {
return files.filter((item) => { return files.filter((item) => {
@@ -1006,7 +1015,8 @@ export function AuthFilesPage() {
setPage(1); setPage(1);
}} }}
> >
{getTypeLabel(type)} <span className={styles.filterTagLabel}>{getTypeLabel(type)}</span>
<span className={styles.filterTagCount}>{typeCounts[type] ?? 0}</span>
</button> </button>
); );
})} })}

View File

@@ -29,6 +29,14 @@ export function isRuntimeOnlyAuthFile(file: AuthFileItem): boolean {
return false; return false;
} }
export function isDisabledAuthFile(file: AuthFileItem): boolean {
const raw = (file as { disabled?: unknown }).disabled;
if (typeof raw === 'boolean') return raw;
if (typeof raw === 'number') return raw !== 0;
if (typeof raw === 'string') return raw.trim().toLowerCase() === 'true';
return false;
}
export function isIgnoredGeminiCliModel(modelId: string): boolean { export function isIgnoredGeminiCliModel(modelId: string): boolean {
return GEMINI_CLI_IGNORED_MODEL_PREFIXES.some( return GEMINI_CLI_IGNORED_MODEL_PREFIXES.some(
(prefix) => modelId === prefix || modelId.startsWith(`${prefix}-`) (prefix) => modelId === prefix || modelId.startsWith(`${prefix}-`)