@polyv/utils
Version:
Utility functions of Polyv frontend development.
1 lines • 1.03 kB
JavaScript
const computes=[{divisor:86400,unit:"days"},{divisor:3600,unit:"hours"},{divisor:60,unit:"minutes"},{divisor:1,unit:"seconds"}];export class Countdown{constructor(s,t){if(s|=0,isNaN(s))throw new Error("Total seconds must be a number");this._totalMSecs=1e3*s,this._cb=t}_exec(){if(!this._startTime||null==this._usingMSecs)return;let s=Math.max(0,this._usingMSecs-(Date.now()-this._startTime));if(s>0&&setTimeout((()=>{this._exec()}),1e3),this._remainingMSecs=s,s>=0){const t={days:0,hours:0,minutes:0,seconds:0,totalMsecs:s};s=Math.round(s/1e3),computes.forEach(((i,e)=>{t[i.unit]=s/i.divisor,e===computes.length-1?t[i.unit]=Math.round(t[i.unit]):(t[i.unit]=Math.floor(t[i.unit]),s%=i.divisor)})),this._cb(t)}}start(){null==this._usingMSecs&&(this._usingMSecs=this._totalMSecs),this._usingMSecs<=0||(this._startTime=Date.now(),this._exec())}_break(){this._timerId&&clearTimeout(this._timerId),this._startTime=void 0}stop(){this._break(),this._usingMSecs=this._totalMSecs}pause(){this._break(),this._usingMSecs=this._remainingMSecs}}