Files
CC-Switch/src/utils/usageDisplay.ts
T
2026-05-27 10:50:29 +08:00

68 lines
1.6 KiB
TypeScript

import type { UsageData } from "@/types";
interface UsageSummaryLabels {
invalid: string;
remaining: string;
used: string;
}
function formatNumber(value: number): string {
return Number.isInteger(value) ? value.toString() : value.toFixed(2);
}
function formatValue(value: number, unit?: string): string {
if (!unit) {
return formatNumber(value);
}
return unit === "%"
? `${formatNumber(value)}%`
: `${formatNumber(value)} ${unit}`;
}
function isNumber(value: unknown): value is number {
return typeof value === "number" && Number.isFinite(value);
}
function formatUsed(
data: UsageData,
labels: UsageSummaryLabels,
): string | null {
if (!isNumber(data.used)) {
return null;
}
if (isNumber(data.total) && data.total > 0) {
const usedPercent = (data.used / data.total) * 100;
if (data.unit === "%" && data.total === 100) {
return `${labels.used} ${formatValue(data.used, "%")}`;
}
return `${labels.used} ${formatNumber(usedPercent)}%`;
}
return `${labels.used} ${formatValue(data.used, data.unit)}`;
}
export function formatUsageDataSummary(
data: UsageData,
labels: UsageSummaryLabels,
): string {
const planPrefix = data.planName ? `[${data.planName}] ` : "";
if (data.isValid === false) {
return `${planPrefix}${data.invalidMessage || labels.invalid}`;
}
const parts = [
formatUsed(data, labels),
isNumber(data.remaining)
? `${labels.remaining} ${formatValue(data.remaining, data.unit)}`
: null,
data.extra || null,
].filter((part): part is string => Boolean(part));
return `${planPrefix}${parts.join(" / ") || labels.invalid}`;
}