/* eslint-disable no-unused-vars */ /* All Page Init */ const version = '2023.6.5' /* Feature Detectors */ /* Valid values for ${type}: localstorage, sessionstorage */ async function storageAvailable(type) { // Currently not used try { let storage = window[type] let x = '__storage_test__' storage.setItem(x, 'test') storage.getItem(x) storage.removeItem(x) log(`lib.main.storageAvailable: ${type} is available`, 'INFO') return true } catch (err) { log(`lib.main.storageAvailable: ${type} is not available`, 'ERR') return false } } async function versionDisplay() { // Outputs version string on to any page with a tag with id="ver_str" localStorage.setItem('version', version) document.getElementById('ver_str').textContent = version return } /* Array Converter Converts a string to a single item array */ async function makeArray(data) { if (!Array.isArray(data)) { var array = [] array.push(data) return array } return data } /* Timeouts */ /* Usage: '' */ const delay = ms => new Promise(res => setTimeout(res, ms)) /* Log Helper */ /* Maintains backwards compatibility for previous implementation of log helper */ async function log(msg, type) { const mode = 'dev' if (mode === 'prod' && type != 'ERR') { return } var time = new Date().toISOString() switch (type) { case 'ERR': console.error(`${time} - ${msg}`) break case 'WARN': console.warn(`${time} - ${msg}`) break case 'INFO': console.info(`${time} - ${msg}`) break default: console.log(`${time} - ${msg}`) break } } /* Show/Hide - Menu Control */ async function sidebarOpen() { document.getElementById('sidebar').style.width = '50%' document.getElementById('sidebar_open_short').style.display = 'none' document.getElementById('sidebar_close_short').style.display = 'block' } async function sidebarClose() { document.getElementById('sidebar').style.width = '0%' document.getElementById('sidebar_open_short').style.display = 'block' document.getElementById('sidebar_close_short').style.display = 'none' } /* Loading Box Control */ async function hideLoading() { document.getElementById('loading').style = 'display: none;' } /* DEPRECIATED: Alias for hideLoading() - Marked for removal*/ async function clearLoading() { log('Depreciated function called - clearLoading() - Alias to hideLoading()', 'WARN') hideLoading() } async function showLoading() { document.getElementById('loading').style = 'display: block;' } async function setLoadingDesc(desc) { document.getElementById('loading_desc').textContent = `${desc}` } /* Fetch User Settings */ async function getQuickLinks() { var defaults = ['bri','lwh','srd','mtp','rda','cfn', 'sml','shh','pri','avn','sar','svb'] try { if (localStorage.getItem('qlOpt')) { var data = JSON.parse(localStorage.getItem('qlOpt')) } else { data = defaults } } catch (err) { data = defaults } return data.sort() } /* Fetch a known query parameter from the pages URL */ async function getQuery(param) { var params = new URLSearchParams(window.location.search) var query = params.get(param) if (query) { return query } else { return 'false' } } async function getApi(path,auth = false) { let apiVer = 'v1' let url = `${window.location.origin}/api/${apiVer}/${path}` log(`getApi: Fetching from endpoint: ${url}, Auth=${auth}`) let options if (auth) { let key = localStorage.getItem('uuid') options = { method: 'GET', redirect: 'follow', headers: { 'uuid': key } } } else { options = { method: 'GET', redirect: 'follow' } } try { var resp = await fetch(url, options) var json = await resp.json() log(`resp.status: ${resp.status}`) log(`resp.json: ${json}`) if (resp.status != 200) { log(`lib.main: getApi: Response status: ${resp.status}`) return resp.status } if (!resp.ok) { log('lib.main: getApi: Fetch error') return false } return json } catch(err) { log(`lib.main: getApi: Caught fetch error. Status: ${resp.status}`) return resp.status } } async function showHideAuthNotice() { let uuid = localStorage.getItem('uuid') if (uuid) { document.getElementById('auth-required').style = 'display:none' } } async function vibe(type) { let canVibrate = 'vibrate' in navigator || 'mozVibrate' in navigator if (canVibrate && !('vibrate' in navigator)){ navigator.vibrate = navigator.mozVibrate } switch (type) { case 'err': navigator.vibrate([300]) break case 'ok': navigator.vibrate([50,50,50]) break default: navigator.vibrate(30) } } async function convertUnixLocal(unix) { // Convert unix time string to local var jsTime = unix*1000 var dt = new Date(jsTime) return dt.toLocaleString() }