mirror of
https://github.com/router-for-me/Cli-Proxy-API-Management-Center.git
synced 2026-02-03 03:10:50 +08:00
69 lines
2.0 KiB
TypeScript
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;
|
|
}
|