(name)
| 1197 | const cfg = config || await fetchAPI('/api/config'); |
| 1198 | if (cfg && Object.prototype.hasOwnProperty.call(cfg, RUSENSE_TAB_KEY)) { |
| 1199 | localStorage.setItem(RUSENSE_TAB_KEY, cfg[RUSENSE_TAB_KEY] ? '1' : '0'); |
| 1200 | applyRusenseTabVisibility(); |
| 1201 | } |
| 1202 | } catch (e) { /* offline — keep the localStorage value */ } |
| 1203 | } |
| 1204 | |
| 1205 | function onRusenseTabToggled(cb) { |
| 1206 | localStorage.setItem(RUSENSE_TAB_KEY, cb.checked ? '1' : '0'); |
| 1207 | applyRusenseTabVisibility(); |
| 1208 | // Persist server-side so it's shared/persistent for everyone, not just here. |
| 1209 | postAPI('/api/config', { [RUSENSE_TAB_KEY]: cb.checked }) |
| 1210 | .catch(err => console.warn('Failed to persist RuSense tab visibility:', err)); |
| 1211 | if (cb.checked) showTab('rusense'); |
| 1212 | } |
| 1213 | |
| 1214 | // ── Ragnar Mesh tab visibility (toggle in Settings; ON by default) ────────── |
| 1215 | // Same server-backed + localStorage-cache pattern as the RuSense tab, but the |
| 1216 | // default is VISIBLE: absent the key the tab shows, and only an explicit '0' |
| 1217 | // hides it. Hiding is cosmetic — it never joins or leaves the mesh (that is |
| 1218 | // mesh_enabled); it only removes the nav entry. |
| 1219 | const MESH_TAB_KEY = 'mesh_tab_enabled'; |
| 1220 | |
| 1221 | function _meshTabVisible() { |
| 1222 | return localStorage.getItem(MESH_TAB_KEY) !== '0'; // default on |
| 1223 | } |
| 1224 | |
| 1225 | function syncMeshTabToggle() { |
| 1226 | const cb = document.getElementById('mesh-tab-enabled'); |
| 1227 | if (cb) cb.checked = _meshTabVisible(); |
| 1228 | } |
no test coverage detected