import { Context } from "hono"; import { Env } from "../types"; import { getStats } from "../application/stats"; import { formatBytes } from "../domain/format"; import { R2_FREE_TIER_BYTES, KV_FREE_TIER_BYTES } from "../config/constants"; import { Layout } from "./admin/ui"; function formatDateTime(iso?: string): string { if (!iso) return "Never"; const date = new Date(iso); if (Number.isNaN(date.getTime())) return "Never"; return date .toISOString() .replace("T", " ") .replace(/\.\d+Z$/, " UTC"); } function formatRelative(iso?: string): string { if (!iso) return "Never"; const date = new Date(iso); if (Number.isNaN(date.getTime())) return "Never"; const diffMs = Date.now() - date.getTime(); if (diffMs < 0) return "just now"; const seconds = Math.floor(diffMs / 1000); if (seconds < 60) return "just now"; const minutes = Math.floor(seconds / 60); if (minutes < 60) return `${minutes}m ago`; const hours = Math.floor(minutes / 60); if (hours < 24) return `${hours}h ago`; const days = Math.floor(hours / 24); return `${days}d ago`; } function formatUptime(iso?: string): string { if (!iso) return "—"; const date = new Date(iso); if (Number.isNaN(date.getTime())) return "—"; const diffMs = Date.now() - date.getTime(); if (diffMs < 0) return "—"; const minutes = Math.floor(diffMs / 60000); if (minutes < 60) return `${minutes} min`; const hours = Math.floor(minutes / 60); if (hours < 24) return `${hours} ${hours === 1 ? "hour" : "hours"}`; const days = Math.floor(hours / 24); return `${days} ${days === 1 ? "day" : "days"}`; } function tierPercent(used: number, total: number): number { if (total <= 0) return 0; return Math.round((used / total) * 100); } function formatBytesOrDash(bytes?: number): string { return bytes === undefined ? "—" : formatBytes(bytes); } type Tone = "success" | "danger"; type StatProps = { label: string; value: string | number; tone?: Tone; title?: string; time?: boolean; }; const Stat = ({ label, value, tone, title, time }: StatProps) => { const valueClass = [ "stat-value", time ? "stat-value-time" : "", tone ? `stat-value-${tone}` : "", ] .filter(Boolean) .join(" "); return (
Instance status & monitoring