Files
tv/web/js/app.js
T
2026-08-26 13:22:49 -05:00

80 lines
2.3 KiB
JavaScript

/*
APP — shared chrome for every page: settings dialog, footer API label,
toast notifications.
*/
(function () {
'use strict';
function initChrome() {
const modal = document.getElementById('settingsModal');
const openBtn = document.getElementById('settingsBtn');
const input = document.getElementById('apiBaseInput');
if (openBtn && modal && input) {
const close = () => {
modal.hidden = true;
};
openBtn.addEventListener('click', () => {
input.value = SR.config.getBase();
modal.hidden = false;
input.focus();
input.select();
});
const closeBtn = document.getElementById('settingsClose');
if (closeBtn) closeBtn.addEventListener('click', close);
modal.addEventListener('click', (e) => {
if (e.target === modal) close();
});
document.addEventListener('keydown', (e) => {
if (e.key === 'Escape' && !modal.hidden) close();
});
const saveBtn = document.getElementById('apiBaseSave');
if (saveBtn) {
saveBtn.addEventListener('click', () => {
SR.config.setBase(input.value);
location.reload();
});
}
const resetBtn = document.getElementById('apiBaseReset');
if (resetBtn) {
resetBtn.addEventListener('click', () => {
SR.config.clearBase();
location.reload();
});
}
}
const label = document.getElementById('apiBaseLabel');
if (label) {
const base = SR.config.getBase();
label.textContent = base;
label.href = base;
}
}
let toastTimer = null;
function toast(message, isError) {
let el = document.getElementById('toast');
if (!el) {
el = document.createElement('div');
el.id = 'toast';
el.className = 'toast';
el.setAttribute('role', 'status');
document.body.appendChild(el);
}
el.textContent = message;
el.classList.toggle('toast--error', !!isError);
el.classList.add('toast--show');
clearTimeout(toastTimer);
toastTimer = setTimeout(() => el.classList.remove('toast--show'), 4500);
}
function showError(err, fallback) {
toast(err && err.message ? err.message : fallback || 'Something went wrong', true);
}
window.SR = window.SR || {};
SR.app = { initChrome, toast, showError };
})();