import { useState, useEffect } from "react"; export type CountdownFormat = "clock" | "duration"; interface CountdownProps { targetUnixSeconds: number; format?: CountdownFormat; className?: string; } function formatClock(secondsLeft: number): string { const m = Math.floor(secondsLeft / 60); const s = secondsLeft % 60; return `${m}:${s.toString().padStart(2, "0")}`; } /** * Format seconds into "Xd Xh Xm" for "next eligible" style countdown. * Exported for reuse in denial panel and success modal. */ export function formatDuration(secondsLeft: number): string { if (secondsLeft <= 0) return "0d 0h 0m"; const d = Math.floor(secondsLeft / 86400); const h = Math.floor((secondsLeft % 86400) / 3600); const m = Math.floor((secondsLeft % 3600) / 60); const parts: string[] = []; if (d > 0) parts.push(`${d}d`); parts.push(`${h}h`); parts.push(`${m}m`); return parts.join(" "); } function getSecondsLeft(targetUnixSeconds: number): number { return Math.max(0, targetUnixSeconds - Math.floor(Date.now() / 1000)); } export function Countdown({ targetUnixSeconds, format = "clock", className }: CountdownProps) { const [secondsLeft, setSecondsLeft] = useState(() => getSecondsLeft(targetUnixSeconds)); useEffect(() => { setSecondsLeft(getSecondsLeft(targetUnixSeconds)); const t = setInterval(() => { setSecondsLeft(getSecondsLeft(targetUnixSeconds)); }, 1000); return () => clearInterval(t); }, [targetUnixSeconds]); const text = format === "duration" ? formatDuration(secondsLeft) : formatClock(secondsLeft); return {text}; }