mirror of
https://github.com/router-for-me/Cli-Proxy-API-Management-Center.git
synced 2026-02-19 03:00:49 +08:00
refactor(quota): modularize QuotaPage into separate section components
This commit is contained in:
68
src/utils/quota/formatters.ts
Normal file
68
src/utils/quota/formatters.ts
Normal file
@@ -0,0 +1,68 @@
|
||||
/**
|
||||
* Formatting functions for quota display.
|
||||
*/
|
||||
|
||||
import type { CodexUsageWindow } from '@/types';
|
||||
import { normalizeNumberValue } from './parsers';
|
||||
|
||||
export function formatQuotaResetTime(value?: string): string {
|
||||
if (!value) return '-';
|
||||
const date = new Date(value);
|
||||
if (Number.isNaN(date.getTime())) return '-';
|
||||
return date.toLocaleString(undefined, {
|
||||
month: '2-digit',
|
||||
day: '2-digit',
|
||||
hour: '2-digit',
|
||||
minute: '2-digit',
|
||||
hour12: false
|
||||
});
|
||||
}
|
||||
|
||||
export function formatUnixSeconds(value: number | null): string {
|
||||
if (!value) return '-';
|
||||
const date = new Date(value * 1000);
|
||||
if (Number.isNaN(date.getTime())) return '-';
|
||||
return date.toLocaleString(undefined, {
|
||||
month: '2-digit',
|
||||
day: '2-digit',
|
||||
hour: '2-digit',
|
||||
minute: '2-digit',
|
||||
hour12: false
|
||||
});
|
||||
}
|
||||
|
||||
export function formatCodexResetLabel(window?: CodexUsageWindow | null): string {
|
||||
if (!window) return '-';
|
||||
const resetAt = normalizeNumberValue(window.reset_at ?? window.resetAt);
|
||||
if (resetAt !== null && resetAt > 0) {
|
||||
return formatUnixSeconds(resetAt);
|
||||
}
|
||||
const resetAfter = normalizeNumberValue(window.reset_after_seconds ?? window.resetAfterSeconds);
|
||||
if (resetAfter !== null && resetAfter > 0) {
|
||||
const targetSeconds = Math.floor(Date.now() / 1000 + resetAfter);
|
||||
return formatUnixSeconds(targetSeconds);
|
||||
}
|
||||
return '-';
|
||||
}
|
||||
|
||||
export function createStatusError(message: string, status?: number): Error & { status?: number } {
|
||||
const error = new Error(message) as Error & { status?: number };
|
||||
if (status !== undefined) {
|
||||
error.status = status;
|
||||
}
|
||||
return error;
|
||||
}
|
||||
|
||||
export function getStatusFromError(err: unknown): number | undefined {
|
||||
if (typeof err === 'object' && err !== null && 'status' in err) {
|
||||
const rawStatus = (err as { status?: unknown }).status;
|
||||
if (typeof rawStatus === 'number' && Number.isFinite(rawStatus)) {
|
||||
return rawStatus;
|
||||
}
|
||||
const asNumber = Number(rawStatus);
|
||||
if (Number.isFinite(asNumber) && asNumber > 0) {
|
||||
return asNumber;
|
||||
}
|
||||
}
|
||||
return undefined;
|
||||
}
|
||||
Reference in New Issue
Block a user