Files
zeitkort-web-golang/static/timer.js
T
2026-06-18 21:41:47 +01:00

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);
})();