mirror of
https://github.com/router-for-me/Cli-Proxy-API-Management-Center.git
synced 2026-02-03 03:10:50 +08:00
feat: add auth type counts and hide disabled quotas
This commit is contained in:
@@ -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',
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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>
|
||||||
);
|
);
|
||||||
})}
|
})}
|
||||||
|
|||||||
@@ -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}-`)
|
||||||
|
|||||||
Reference in New Issue
Block a user