73 lines
2.3 KiB
JavaScript
73 lines
2.3 KiB
JavaScript
// The only JavaScript in the app: tick the live work timer and the visible POC reset countdown.
|
|
// Everything else is plain HTML + htmx.
|
|
(function () {
|
|
var workInterval = null;
|
|
var resetInterval = null;
|
|
var reloadingForReset = false;
|
|
|
|
function pad(n) { return (n < 10 ? "0" : "") + n; }
|
|
|
|
function tickWorkTimer() {
|
|
var el = document.getElementById("clock");
|
|
if (!el || !el.dataset.start) {
|
|
if (workInterval) { clearInterval(workInterval); workInterval = null; }
|
|
return;
|
|
}
|
|
var start = new Date(el.dataset.start).getTime();
|
|
var diff = Math.max(0, Math.floor((Date.now() - start) / 1000));
|
|
var h = Math.floor(diff / 3600);
|
|
var m = Math.floor((diff % 3600) / 60);
|
|
var s = diff % 60;
|
|
el.textContent = pad(h) + ":" + pad(m) + ":" + pad(s);
|
|
}
|
|
|
|
function formatReset(seconds) {
|
|
var m = Math.floor(seconds / 60);
|
|
var s = seconds % 60;
|
|
return pad(m) + ":" + pad(s);
|
|
}
|
|
|
|
function tickResetCountdown() {
|
|
var el = document.getElementById("reset-countdown");
|
|
if (!el || !el.dataset.resetAt) {
|
|
if (resetInterval) { clearInterval(resetInterval); resetInterval = null; }
|
|
return;
|
|
}
|
|
|
|
var resetAt = new Date(el.dataset.resetAt).getTime();
|
|
var remaining = Math.ceil((resetAt - Date.now()) / 1000);
|
|
if (remaining <= 0) {
|
|
el.textContent = "resetting…";
|
|
document.body.classList.add("reset-imminent");
|
|
if (!reloadingForReset) {
|
|
reloadingForReset = true;
|
|
window.setTimeout(function () { window.location.reload(); }, 1500);
|
|
}
|
|
return;
|
|
}
|
|
|
|
el.textContent = formatReset(remaining);
|
|
document.body.classList.toggle("reset-imminent", remaining <= 30);
|
|
}
|
|
|
|
function restartWorkTimer() {
|
|
if (workInterval) clearInterval(workInterval);
|
|
tickWorkTimer();
|
|
workInterval = setInterval(tickWorkTimer, 1000);
|
|
}
|
|
|
|
function startResetCountdown() {
|
|
if (resetInterval) clearInterval(resetInterval);
|
|
tickResetCountdown();
|
|
resetInterval = setInterval(tickResetCountdown, 1000);
|
|
}
|
|
|
|
document.addEventListener("DOMContentLoaded", function () {
|
|
restartWorkTimer();
|
|
startResetCountdown();
|
|
});
|
|
|
|
// Re-evaluate the work timer after htmx swaps the working area in/out.
|
|
document.body.addEventListener("htmx:afterSettle", restartWorkTimer);
|
|
})();
|