Files
Cli-Proxy-API-Management-Ce…/src/utils/quota/formatters.ts

69 lines
2.0 KiB
TypeScript

/**
* 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;
}