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
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);
|
|
}
|
|
}
|