// Broadcast banner — polls /api/broadcast/current every 60s (Phase 3/4)
(function () {
'use strict';
const POLL_MS = 60000;
const DISMISS_KEY = 'jae-broadcast-dismissed';
function ready(fn) { if (document.readyState !== 'loading') fn(); else document.addEventListener('DOMContentLoaded', fn); }
function renderBanner(data) {
const dismissed = localStorage.getItem(DISMISS_KEY);
const fingerprint = (data.created_at || '') + '|' + (data.message || '');
if (dismissed === fingerprint) return;
let el = document.getElementById('jaeBroadcastBanner');
if (!el) {
el = document.createElement('div');
el.id = 'jaeBroadcastBanner';
el.className = 'jae-broadcast';
document.body.appendChild(el);
}
el.innerHTML = `
📣
`;
el.querySelector('.jbb-msg').textContent = data.message || '';
el.querySelector('.jbb-close').onclick = () => {
localStorage.setItem(DISMISS_KEY, fingerprint);
el.remove();
document.body.classList.remove('has-broadcast');
};
document.body.classList.add('has-broadcast');
}
function hideBanner() {
const el = document.getElementById('jaeBroadcastBanner');
if (el) el.remove();
document.body.classList.remove('has-broadcast');
}
async function check() {
try {
const res = await fetch('/api/broadcast/current', { cache: 'no-store' });
if (res.status === 204) { hideBanner(); return; }
if (!res.ok) return;
const data = await res.json();
if (data && data.message) renderBanner(data); else hideBanner();
} catch (e) { /* offline: ignore */ }
}
ready(function () {
check();
setInterval(check, POLL_MS);
});
})();