/** * Reusable countdown timer for dialog components. */ import type { TUI } from "@mariozechner/pi-tui"; export class CountdownTimer { private intervalId: ReturnType | undefined; private remainingSeconds: number; constructor( timeoutMs: number, private tui: TUI | undefined, private onTick: (seconds: number) => void, private onExpire: () => void, ) { this.remainingSeconds = Math.ceil(timeoutMs / 1000); this.onTick(this.remainingSeconds); this.intervalId = setInterval(() => { this.remainingSeconds--; this.onTick(this.remainingSeconds); this.tui?.requestRender(); if (this.remainingSeconds <= 0) { this.dispose(); this.onExpire(); } }, 1000); } dispose(): void { if (this.intervalId) { clearInterval(this.intervalId); this.intervalId = undefined; } } }