(function () { var timer = null; function fmtDist(v) { if (v === null || v === undefined) return '--'; return v.toFixed(2); } function pollPrices() { var list = document.getElementById('key-monitor-list'); if (!list || !list.querySelector('.key-item')) return; fetch('/api/key_prices') .then(function (r) { return r.json(); }) .then(function (rows) { rows.forEach(function (row) { var el = list.querySelector('.key-item[data-key-id="' + row.id + '"]'); if (!el) return; var priceEl = el.querySelector('.live-price'); var upEl = el.querySelector('.dist-up'); var downEl = el.querySelector('.dist-down'); if (priceEl) { priceEl.textContent = row.price != null ? row.price : '--'; } if (upEl) upEl.textContent = fmtDist(row.dist_upper); if (downEl) downEl.textContent = fmtDist(row.dist_lower); }); }) .catch(function () { /* ignore */ }); } function startPolling() { if (timer) clearInterval(timer); pollPrices(); timer = setInterval(pollPrices, 1000); } document.addEventListener('DOMContentLoaded', startPolling); })();