Initial commit: restructure to flat layout with ui/ and web/ at root
This commit is contained in:
76
web/server/lib/quota/utils/formatters.js
Normal file
76
web/server/lib/quota/utils/formatters.js
Normal file
@@ -0,0 +1,76 @@
|
||||
export const formatResetTime = (timestamp) => {
|
||||
try {
|
||||
const resetDate = new Date(timestamp);
|
||||
const now = new Date();
|
||||
const isToday = resetDate.toDateString() === now.toDateString();
|
||||
|
||||
if (isToday) {
|
||||
return resetDate.toLocaleTimeString(undefined, {
|
||||
hour: 'numeric',
|
||||
minute: '2-digit'
|
||||
});
|
||||
}
|
||||
|
||||
return resetDate.toLocaleString(undefined, {
|
||||
month: 'short',
|
||||
day: 'numeric',
|
||||
weekday: 'short',
|
||||
hour: 'numeric',
|
||||
minute: '2-digit'
|
||||
});
|
||||
} catch {
|
||||
return null;
|
||||
}
|
||||
};
|
||||
|
||||
export const calculateResetAfterSeconds = (resetAt) => {
|
||||
if (!resetAt) return null;
|
||||
const delta = Math.floor((resetAt - Date.now()) / 1000);
|
||||
return delta < 0 ? 0 : delta;
|
||||
};
|
||||
|
||||
export const toUsageWindow = ({ usedPercent, windowSeconds, resetAt, valueLabel }) => {
|
||||
const resetAfterSeconds = calculateResetAfterSeconds(resetAt);
|
||||
const resetFormatted = resetAt ? formatResetTime(resetAt) : null;
|
||||
return {
|
||||
usedPercent,
|
||||
remainingPercent: usedPercent !== null ? Math.max(0, 100 - usedPercent) : null,
|
||||
windowSeconds: windowSeconds ?? null,
|
||||
resetAfterSeconds,
|
||||
resetAt,
|
||||
resetAtFormatted: resetFormatted,
|
||||
resetAfterFormatted: resetFormatted,
|
||||
...(valueLabel ? { valueLabel } : {})
|
||||
};
|
||||
};
|
||||
|
||||
export const buildResult = ({ providerId, providerName, ok, configured, usage, error }) => ({
|
||||
providerId,
|
||||
providerName,
|
||||
ok,
|
||||
configured,
|
||||
usage: usage ?? null,
|
||||
...(error ? { error } : {}),
|
||||
fetchedAt: Date.now()
|
||||
});
|
||||
|
||||
export const durationToLabel = (duration, unit) => {
|
||||
if (!duration || !unit) return 'limit';
|
||||
if (unit === 'TIME_UNIT_MINUTE') return `${duration}m`;
|
||||
if (unit === 'TIME_UNIT_HOUR') return `${duration}h`;
|
||||
if (unit === 'TIME_UNIT_DAY') return `${duration}d`;
|
||||
return 'limit';
|
||||
};
|
||||
|
||||
export const durationToSeconds = (duration, unit) => {
|
||||
if (!duration || !unit) return null;
|
||||
if (unit === 'TIME_UNIT_MINUTE') return duration * 60;
|
||||
if (unit === 'TIME_UNIT_HOUR') return duration * 3600;
|
||||
if (unit === 'TIME_UNIT_DAY') return duration * 86400;
|
||||
return null;
|
||||
};
|
||||
|
||||
export const formatMoney = (value) => {
|
||||
if (typeof value !== 'number' || !Number.isFinite(value)) return null;
|
||||
return value.toFixed(2);
|
||||
};
|
||||
Reference in New Issue
Block a user