let polling = true const blocks = { time: { interval: 30 * 1000, lastUpdate: 0, update: updateTime }, // 30s weather: { interval: 30 * 60000, lastUpdate: 0, update: updateWeather } // 30min // Add more: { interval: X, lastUpdate: 0, update: updateFunction } }; let lastPoll = 0; function updateTime() { fetch("/time") .then(res => res.json()) .then(data => document.getElementById("time").innerText = data.time); } function updateWeather() { const city = document.getElementById("city").value; fetch(`/weather?city=${encodeURIComponent(city)}`) .then(res => res.json()) .then(data => { const weatherBlock = document.getElementById("weather"); if (!data) weatherBlock.innerText = "Error: Bad city"; else weatherBlock.innerText = `${data.summary}`; }); } function pollUpdates() { if (!polling) return; const now = Date.now(); Object.keys(blocks).forEach(key => { const block = blocks[key]; if (now - block.lastUpdate >= block.interval) { block.update(); block.lastUpdate = now; } }); lastPoll = now; } function reloadAll() { Object.keys(blocks).forEach(key => { blocks[key].update(); blocks[key].lastUpdate = Date.now(); }); } // Header controls document.getElementById("reload").addEventListener("click", reloadAll); document.getElementById("pause").addEventListener("change", (e) => { polling = e.target.checked; }); // Initial load reloadAll(); // Poll every 500ms to check intervals (fast enough for 1s updates, light on CPU) // maybe the 1s updates should be special case, but for now let's keep it simple setInterval(pollUpdates, 500);