const IntervalTimeManager = params => ({ id: false, times: {}, estimated: null, remaning: null, totalTime: params.totalTime || 5000, stepTime: params.stepTime || 50, callbackFunctions: params.callbackFunctions || {}, callback() { this.times["callback"] = this.getTime(); this.remaning = this.remaning - this.stepTime; this.estimated = this.estimated + this.stepTime; this.callCallbackFN("callback"); if (this.remaning <= 0) { return this.finish(); } }, getTime() { return new Date().getTime(); }, getPercent() { return Math.floor((this.remaning / this.totalTime) * 100); }, start() { this.times["started"] = this.getTime(); this.callCallbackFN("before:start"); this.remaning = this.totalTime; this._setupInterval(); this.callCallbackFN("after:start"); }, finish() { this.times["finished"] = this.getTime(); this.callCallbackFN("before:finish"); this._clearInterval(this.id); this.callCallbackFN("after:finish"); }, stop() { this.times["stoped"] = this.getTime(); // People can stop manualy this.callCallbackFN("before:stop"); this._clearInterval(this.id); this.callCallbackFN("after:stop"); }, pause() { this.times["paused"] = this.getTime(); this.callCallbackFN("before:pause"); this._clearInterval(this.id); this.callCallbackFN("after:pause"); }, resume() { this.times["resumed"] = this.getTime(); this.callCallbackFN("before:resume"); this._setupInterval(); this.callCallbackFN("after:resume"); }, callCallbackFN(type) { // console.log(this.callbackFunctions, type); if (typeof this.callbackFunctions[type] === "function") { this.callbackFunctions[type](); } }, _clearInterval() { clearInterval(this.id); }, _setupInterval() { this.id = setInterval(() => { this.callback(); }, this.stepTime); } }); export default IntervalTimeManager;