You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

132 lines
4.1 KiB
JavaScript

let cfg_changed = false;
let cfg = {
serial_offset: 2000,
use_pin: false,
pin: '',
theme: 'auto',
maincolor: 'GREEN',
font: 'monospace',
check_upd: true,
ui_width: 450,
wide_mode: false,
lang: userLang(),
app_plugin_css: '',
app_plugin_js: '',
api_ver: 2,
};
if (localStorage.hasOwnProperty('app_config')) {
const cfg_r = JSON.parse(localStorage.getItem('app_config'));
if (cfg.api_ver === cfg_r.api_ver) {
cfg = cfg_r;
} else {
localStorage.clear();
location.reload();
}
}
localStorage.setItem('app_config', JSON.stringify(cfg));
let lang = langBase[cfg.lang];
function update_cfg(el) {
if (el.type == 'text') el.value = el.value.trim();
const val = (el.type == 'checkbox') ? el.checked : el.value;
if (el.id in cfg) cfg[el.id] = val;
else if (el.dataset.hubConfig) {
if (el.dataset.hubConfig === 'connections.HTTP.local_ip' && !checkIP(val)) {
asyncAlert(lang.wrong_ip);
return;
}
hub.config.set(...el.dataset.hubConfig.split('.'), val);
}
cfg_changed = true;
update_theme();
}
function save_cfg() {
if (cfg.pin.length < 4) cfg.use_pin = false;
localStorage.setItem('app_config', JSON.stringify(cfg));
localStorage.setItem('hub_config', hub.config.toJson());
}
function update_theme() {
document.body.classList.remove('theme-dark', 'theme-light', 'theme-auto');
document.body.classList.add('theme-' + cfg.theme.toLowerCase());
const r = document.querySelector(':root');
r.style.setProperty('--ui_width', cfg.ui_width + 'px');
r.style.setProperty('--prim', intToCol(colors[cfg.maincolor]));
r.style.setProperty('--font_f', cfg.font);
EL('app_plugins').replaceChildren();
addDOM('app_css', 'style', cfg.app_plugin_css, EL('app_plugins'));
addDOM('app_js', 'script', cfg.app_plugin_js, EL('app_plugins'));
display('local_block', hub.config.get('connections', 'HTTP', 'enabled') ? 'block' : 'none');
EL('local_label').style.color = hub.config.get('connections', 'HTTP', 'enabled') ? 'var(--font)' : 'var(--font3)';
display('pin_block', cfg.use_pin ? 'block' : 'none');
EL('pin_label').style.color = cfg.use_pin ? 'var(--font)' : 'var(--font3)';
/*@[if_not_target:esp]*/
display('mq_block', hub.config.get('connections', 'MQTT', 'enabled') ? 'block' : 'none');
EL('mqtt_label').style.color = hub.config.get('connections', 'MQTT', 'enabled') ? 'var(--font)' : 'var(--font3)';
display('tg_block', hub.config.get('connections', 'TG', 'enabled') ? 'block' : 'none');
EL('tg_label').style.color = hub.config.get('connections', 'TG', 'enabled') ? 'var(--font)' : 'var(--font3)';
const bt = hub.config.get('connections', 'BLE', 'enabled');
display('bt_block', bt ? 'block' : 'none');
EL('bt_label').style.color = bt ? 'var(--font)' : 'var(--font3)';
const ser = hub.config.get('connections', 'SERIAL', 'enabled');
display('serial_block', ser ? 'block' : 'none');
EL('serial_label').style.color = ser ? 'var(--font)' : 'var(--font3)';
/*@/[if_not_target:esp]*/
}
function cfg_export() {
const config = {
app_config: cfg,
hub_config: hub.config.toJson(),
};
const $a = document.createElement('a');
$a.href = "data:text/json;charset=utf-8," + encodeURIComponent(JSON.stringify(config));
$a.download = "GyverHub-config-export.json";
document.body.appendChild($a);
$a.click();
$a.remove();
}
function cfg_import() {
const $in = document.createElement('input');
$in.type = 'file';
$in.accept = ".json,application/json";
$in.addEventListener("change", async () => {
const file = $in.files[0];
try {
const ab = await readFileAsArrayBuffer(file);
const text = new TextDecoder().decode(ab);
const data = JSON.parse(text);
cfg = data.app_config;
hub.config.fromJson(data.hub_config);
} catch (e) {
console.log(e);
showPopupError(lang.import_err);
return;
}
save_cfg();
showPopup(lang.import_ok);
setTimeout(() => location.reload(), 500);
});
$in.click();
}
async function cfg_reset() {
if (await asyncConfirm(lang.cfg_reset_conf)) {
localStorage.clear();
setTimeout(() => location.reload(), 500);
}
}