diff --git a/apps/chimer/widget.js b/apps/chimer/widget.js index 9a29c80f6..a587b61de 100644 --- a/apps/chimer/widget.js +++ b/apps/chimer/widget.js @@ -34,6 +34,19 @@ chime1(); } + function queueNextCheckMins(mins) { + const now = new Date(), + m = now.getMinutes(), + s = now.getSeconds(), + ms = now.getMilliseconds(); + + const mLeft = mins - (m + mins * 2) % mins, + sLeft = mLeft * 60 - s, + msLeft = sLeft * 1000 - ms; + + setTimeout(check, msLeft); + } + let lastHour = new Date().getHours(); let lastMinute = new Date().getMinutes(); // don't chime when (re)loaded at a whole hour function check() { @@ -42,88 +55,41 @@ m = now.getMinutes(), s = now.getSeconds(), ms = now.getMilliseconds(); - if ( - (settings.sleep && h > settings.end) || - (settings.sleep && h >= settings.end && m !== 0) || - (settings.sleep && h < settings.start) + if (settings.sleep && ( + h > settings.end || + (h >= settings.end && m !== 0) || + h < settings.start) ) { - var mLeft = 60 - m, - sLeft = mLeft * 60 - s, - msLeft = sLeft * 1000 - ms; - setTimeout(check, msLeft); + queueNextCheckMins(60); return; } - if (settings.freq === 1) { - if ((m !== lastMinute && m === 0) || (m !== lastMinute && m === 30)) - chime(); - lastHour = h; - lastMinute = m; - // check again in 30 minutes - switch (true) { - case m / 30 >= 1: - var mLeft = 30 - (m - 30), - sLeft = mLeft * 60 - s, - msLeft = sLeft * 1000 - ms; - break; - case m / 30 < 1: - var mLeft = 30 - m, - sLeft = mLeft * 60 - s, - msLeft = sLeft * 1000 - ms; - break; - } - setTimeout(check, msLeft); - } else if (settings.freq === 2) { - if ( - (m !== lastMinute && m === 0) || - (m !== lastMinute && m === 15) || - (m !== lastMinute && m === 30) || - (m !== lastMinute && m === 45) - ) - chime(); - lastHour = h; - lastMinute = m; - // check again in 15 minutes - switch (true) { - case m / 15 >= 3: - var mLeft = 15 - (m - 45), - sLeft = mLeft * 60 - s, - msLeft = sLeft * 1000 - ms; - break; - case m / 15 >= 2: - var mLeft = 15 - (m - 30), - sLeft = mLeft * 60 - s, - msLeft = sLeft * 1000 - ms; - break; - case m / 15 >= 1: - var mLeft = 15 - (m - 15), - sLeft = mLeft * 60 - s, - msLeft = sLeft * 1000 - ms; - break; - case m / 15 < 1: - var mLeft = 15 - m, - sLeft = mLeft * 60 - s, - msLeft = sLeft * 1000 - ms; - break; - } - setTimeout(check, msLeft); - } else if (settings.freq === 3) { - if (m !== lastMinute) chime(); - lastHour = h; - lastMinute = m; - // check again in 1 minute - - var mLeft = 1, - sLeft = mLeft * 60 - s, - msLeft = sLeft * 1000 - ms; - setTimeout(check, msLeft); - } else { - if (h !== lastHour && m === 0) chime(); - lastHour = h; - // check again in 60 minutes - var mLeft = 60 - m, - sLeft = mLeft * 60 - s, - msLeft = sLeft * 1000 - ms; - setTimeout(check, msLeft); + switch (settings.freq) { + case 1: + if (m !== lastMinute && m % 30 === 0) + chime(); + lastHour = h; + lastMinute = m; + queueNextCheckMins(30); + break; + case 2: + if (m !== lastMinute && m % 15 === 0) + chime(); + lastHour = h; + lastMinute = m; + queueNextCheckMins(15); + break; + case 3: + // unreachable - not available in settings + if (m !== lastMinute) chime(); + lastHour = h; + lastMinute = m; + queueNextCheckMins(1); + break; + default: + if (h !== lastHour && m === 0) chime(); + lastHour = h; + queueNextCheckMins(60); + break; } }