38ff40111a
Co-authored-by: Cursor <cursoragent@cursor.com>
40 lines
1.4 KiB
JavaScript
40 lines
1.4 KiB
JavaScript
(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);
|
|
})();
|