import { defineRenderers, type HeaderContext, type HeaderView } from "@berry/api/web.ts";
import * as j from "@char/justin";
import {
isProvider,
type Provider,
providerNames,
type SubscriptionUsage,
usageSchema,
} from "./types.ts";
import "./web.css";
const usageOf = j.validation.compile(usageSchema);
export function subscriptionHeader(): HeaderView {
const button = as HTMLButtonElement;
const body =
as HTMLElement;
const panel = (
{body}
) as HTMLElement;
const element = {button}{panel} as HTMLElement;
let context: HeaderContext;
let provider: Provider | null = null;
let open = false;
let disposed = false;
let revision = 0;
let pending = false;
let timer: ReturnType | undefined;
let result: SubscriptionUsage | null = null;
let fetchedAt = 0;
function draw() {
if (result === null) {
body.textContent = pending
? "Loading subscription usage…"
: "Click to view subscription usage";
} else if (result.status !== "ok") {
body.textContent = result.message;
} else {
const heading = {provider ? providerNames[provider] : ""} subscription;
const rows = result.windows.map((window) => {
const reset = window.resetsAt ? new Date(window.resetsAt) : null;
const remaining = reset ? Math.max(0, reset.getTime() - Date.now()) : null;
const duration = remaining === null
? "Reset time unavailable"
: remaining === 0
? "Reset due; refresh pending"
: remaining < 3600_000
? `Resets in ${Math.ceil(remaining / 60_000)}m`
: remaining < 86400_000
? `Resets in ${Math.ceil(remaining / 3600_000)}h`
: `Resets in ${Math.ceil(remaining / 86400_000)}d`;
const exact = reset?.toLocaleString(undefined, {
month: "short",
day: "numeric",
hour: "numeric",
minute: "2-digit",
});
const detail = {duration}{exact ? ` · ${exact}` : ""} as HTMLElement;
if (reset) detail.title = reset.toLocaleString();
return (
{window.label}
{window.usedPercent.toFixed(0)}% used