refactor(quota): modularize QuotaPage into separate section components

This commit is contained in:
Supra4E8C
2026-01-02 15:55:17 +08:00
parent cc467889d0
commit 58154063ed
23 changed files with 2463 additions and 1920 deletions

View File

@@ -0,0 +1,112 @@
/**
* Resolver functions for extracting data from auth files.
*/
import type { AuthFileItem } from '@/types';
import {
normalizeStringValue,
normalizePlanType,
parseIdTokenPayload
} from './parsers';
export function extractCodexChatgptAccountId(value: unknown): string | null {
const payload = parseIdTokenPayload(value);
if (!payload) return null;
return normalizeStringValue(payload.chatgpt_account_id ?? payload.chatgptAccountId);
}
export function resolveCodexChatgptAccountId(file: AuthFileItem): string | null {
const metadata =
file && typeof file.metadata === 'object' && file.metadata !== null
? (file.metadata as Record<string, unknown>)
: null;
const attributes =
file && typeof file.attributes === 'object' && file.attributes !== null
? (file.attributes as Record<string, unknown>)
: null;
const candidates = [file.id_token, metadata?.id_token, attributes?.id_token];
for (const candidate of candidates) {
const id = extractCodexChatgptAccountId(candidate);
if (id) return id;
}
return null;
}
export function resolveCodexPlanType(file: AuthFileItem): string | null {
const metadata =
file && typeof file.metadata === 'object' && file.metadata !== null
? (file.metadata as Record<string, unknown>)
: null;
const attributes =
file && typeof file.attributes === 'object' && file.attributes !== null
? (file.attributes as Record<string, unknown>)
: null;
const idToken =
file && typeof file.id_token === 'object' && file.id_token !== null
? (file.id_token as Record<string, unknown>)
: null;
const metadataIdToken =
metadata && typeof metadata.id_token === 'object' && metadata.id_token !== null
? (metadata.id_token as Record<string, unknown>)
: null;
const candidates = [
file.plan_type,
file.planType,
file['plan_type'],
file['planType'],
file.id_token,
idToken?.plan_type,
idToken?.planType,
metadata?.plan_type,
metadata?.planType,
metadata?.id_token,
metadataIdToken?.plan_type,
metadataIdToken?.planType,
attributes?.plan_type,
attributes?.planType,
attributes?.id_token
];
for (const candidate of candidates) {
const planType = normalizePlanType(candidate);
if (planType) return planType;
}
return null;
}
export function extractGeminiCliProjectId(value: unknown): string | null {
if (typeof value !== 'string') return null;
const matches = Array.from(value.matchAll(/\(([^()]+)\)/g));
if (matches.length === 0) return null;
const candidate = matches[matches.length - 1]?.[1]?.trim();
return candidate ? candidate : null;
}
export function resolveGeminiCliProjectId(file: AuthFileItem): string | null {
const metadata =
file && typeof file.metadata === 'object' && file.metadata !== null
? (file.metadata as Record<string, unknown>)
: null;
const attributes =
file && typeof file.attributes === 'object' && file.attributes !== null
? (file.attributes as Record<string, unknown>)
: null;
const candidates = [
file.account,
file['account'],
metadata?.account,
attributes?.account
];
for (const candidate of candidates) {
const projectId = extractGeminiCliProjectId(candidate);
if (projectId) return projectId;
}
return null;
}