From 6c02062c7e41d71da3861c376d33e4003257d913 Mon Sep 17 00:00:00 2001 From: y9san9 / Alex Sokol Date: Wed, 10 Dec 2025 19:30:56 +0300 Subject: [PATCH] fix(clock): Clocks are now self-correcting and use safeSetInterval --- javascripts/teamodoro.js | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/javascripts/teamodoro.js b/javascripts/teamodoro.js index 00cbf75..3dd4f8a 100644 --- a/javascripts/teamodoro.js +++ b/javascripts/teamodoro.js @@ -6,8 +6,8 @@ Teamodoro = { start: function() { this.clock = SVG("canvas").clock("100%"); this.updateClock(); - setInterval(this.updateClock.bind(this), 500); - setInterval(this.displayRandomGif.bind(this), 30 * 1000); + this.safeSetInterval(this.updateClock.bind(this), 500); + this.safeSetInterval(this.displayRandomGif.bind(this), 30 * 1000); if (this.inBreak()) this.displayRandomGif(); @@ -40,6 +40,17 @@ Teamodoro = { return new Date((new Date()).valueOf() + this.timeDifference); }, + safeSetInterval: function(callback, timeout, drift) { + let correctedTimeout = timeout + (drift ?? 0); + correctedTimeout = Math.max(correctedTimeout, 0); + const expectedDate = Date.now() + correctedTimeout; + setTimeout(() => { + callback(); + const drift = Date.now() - expectedDate; + this.safeSetInterval(callback, timeout, drift); + }, correctedTimeout); + }, + displayRandomGif: function() { if (!this.inBreak()) return;