"use client"; import { useStallState } from "@/hooks/use-stall-state"; /** * Persistent top-of-page banner shown while reflexio learning is stalled. * Renders nothing when state is null or clean. */ export function StallBanner() { const state = useStallState(); if (!state || !state.stalled) return null; const text = renderText(state.reason, state.reset_estimate); if (!text) return null; return (
{text}
); } function renderText( reason: string | null, resetEstimate: string | null, ): string { if (reason === "billing_error") { if (resetEstimate) { const formatted = formatReset(resetEstimate); return `claude-smart: learning paused — Agent SDK credit exhausted (resets ~${formatted}).`; } return "claude-smart: learning paused — Agent SDK credit exhausted."; } if (reason === "auth_error") { return "claude-smart: learning paused — please run /login in Claude Code."; } return ""; } function formatReset(iso: string): string { const d = new Date(iso); if (Number.isNaN(d.getTime())) return iso; return d.toLocaleString(undefined, { month: "short", day: "numeric", hour: "2-digit", minute: "2-digit", }); }