export class CountdownTimer { private _timerID = -1; start(seconds: number, onUpdate: (left: number) => void, interval = 1) { this.stop(); if (seconds <= 0) return; const end_ts = Date.now() + seconds * 1000; const update = () => { const left = Math.floor((end_ts - Date.now()) / 1000); onUpdate && onUpdate(left); } this._timerID = setInterval(update, interval * 1000); update(); } stop() { if (this._timerID > -1) { clearInterval(this._timerID); } this._timerID = -1; } } export function formatTimes(seconds: number): string { const totalSeconds = Number.isFinite(seconds) ? Math.max(0, Math.floor(seconds)) : 0; const days = Math.floor(totalSeconds / 86_400); const hours = Math.floor((totalSeconds % 86_400) / 3_600); const minutes = Math.floor((totalSeconds % 3_600) / 60); const remainingSeconds = totalSeconds % 60; const pad = (value: number) => value.toString().padStart(2, '0'); return `${days}D ${pad(hours)}:${pad(minutes)}:${pad(remainingSeconds)}`; }