71 lines
1.7 KiB
JavaScript
71 lines
1.7 KiB
JavaScript
export function formatBytes(bytes) {
|
|
const size = Number(bytes) || 0;
|
|
if (size < 1024) {
|
|
return `${size} B`;
|
|
}
|
|
|
|
const units = ['KB', 'MB', 'GB', 'TB'];
|
|
let value = size / 1024;
|
|
let unitIndex = 0;
|
|
|
|
while (value >= 1024 && unitIndex < units.length - 1) {
|
|
value /= 1024;
|
|
unitIndex += 1;
|
|
}
|
|
|
|
return `${value.toFixed(value < 10 ? 1 : 0)} ${units[unitIndex]}`;
|
|
}
|
|
|
|
export function formatTimestamp(timestamp) {
|
|
const value = Number(timestamp);
|
|
if (!Number.isFinite(value) || value <= 0) {
|
|
return '-';
|
|
}
|
|
return new Date(value).toLocaleString('de-DE');
|
|
}
|
|
|
|
export function formatCountdown(timestamp) {
|
|
const expiresAt = Number(timestamp) || 0;
|
|
const deltaMinutes = Math.floor(Math.max(0, expiresAt - Date.now()) / 60_000);
|
|
const hours = Math.floor(deltaMinutes / 60);
|
|
const days = Math.floor(hours / 24);
|
|
|
|
if (days > 0) {
|
|
return `${days}d ${hours % 24}h`;
|
|
}
|
|
if (hours > 0) {
|
|
return `${hours}h ${deltaMinutes % 60}m`;
|
|
}
|
|
return `${deltaMinutes}m`;
|
|
}
|
|
|
|
export function parseLogDetail(detailText) {
|
|
if (!detailText) {
|
|
return [];
|
|
}
|
|
|
|
try {
|
|
const parsed = JSON.parse(detailText);
|
|
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
return [{ key: 'detail', value: String(detailText) }];
|
|
}
|
|
return Object.entries(parsed).map(([key, value]) => ({
|
|
key,
|
|
value: String(value),
|
|
}));
|
|
} catch {
|
|
return [{ key: 'detail', value: String(detailText) }];
|
|
}
|
|
}
|
|
|
|
export function readSearchParam(searchParams, key) {
|
|
const rawValue = searchParams?.[key];
|
|
if (Array.isArray(rawValue)) {
|
|
return String(rawValue[0] || '');
|
|
}
|
|
if (typeof rawValue === 'string') {
|
|
return rawValue;
|
|
}
|
|
return '';
|
|
}
|