{"mappings":"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","sources":["node_modules/@parcel/runtime-js/lib/helpers/bundle-manifest.js","node_modules/@parcel/runtime-js/lib/runtime-003bea00deb237bb.js","src/js/utils.js","src/js/slider.js","src/js/subs.js","src/js/alert.js","src/js/index.js","node_modules/@parcel/runtime-js/lib/runtime-9eacbb89f51be31e.js"],"sourcesContent":["\"use strict\";\n\nvar mapping = {};\n\nfunction register(pairs) {\n var keys = Object.keys(pairs);\n\n for (var i = 0; i < keys.length; i++) {\n mapping[keys[i]] = pairs[keys[i]];\n }\n}\n\nfunction resolve(id) {\n var resolved = mapping[id];\n\n if (resolved == null) {\n throw new Error('Could not resolve bundle with id ' + id);\n }\n\n return resolved;\n}\n\nmodule.exports.register = register;\nmodule.exports.resolve = resolve;","require('./helpers/bundle-manifest').register(JSON.parse(\"{\\\"ioUUD\\\":\\\"index.006d9089.js\\\",\\\"kLn2N\\\":\\\"sw.js\\\"}\"));","'use strict';\r\n\r\nimport * as conf from \"./config.js\";\r\n\r\nlet month_es = [\"Enero\", \"Febrero\", \"Marzo\", \"Abril\", \"Mayo\", \"Junio\", \"Julio\", \"Agosto\", \"Septiembre\", \"Octubre\", \"Noviembre\", \"Diciembre\"]\r\n\r\nconst timeout = function (s) {\r\n return new Promise(function (_, reject) {\r\n setTimeout(function () {\r\n reject(new Error(`Request took too long! Timed out after ${s} seconds`));\r\n }, s * 1000);\r\n });\r\n};\r\n\r\nexport const requestJSON = async function (url, init) {\r\n if (!init.method) init.method = 'GET';\r\n\r\n const res = await Promise.race([\r\n fetch(url, init),\r\n timeout(conf.FETCH_TIMEOUT_SEC),\r\n ]);\r\n //console.log('res:', res)\r\n\r\n const data = await res.json();\r\n\r\n if (!res.ok)\r\n throw new Error(\r\n `Unable to ${init.method} data. URL: ${url}: (${res.status}) ${res.statusText}`\r\n );\r\n\r\n return data;\r\n};\r\n\r\nexport function urlBase64ToUint8Array(base64String) {\r\n var padding = '='.repeat((4 - base64String.length % 4) % 4);\r\n var base64 = (base64String + padding)\r\n .replace(/\\-/g, '+')\r\n .replace(/_/g, '/');\r\n\r\n var rawData = window.atob(base64);\r\n var outputArray = new Uint8Array(rawData.length);\r\n\r\n for (var i = 0; i < rawData.length; ++i) {\r\n outputArray[i] = rawData.charCodeAt(i);\r\n }\r\n return outputArray;\r\n}\r\n\r\nexport function convDate(inDate) {\r\n let alTime = new Date(inDate);\r\n let dt = `${alTime.getDate().toString().padStart(2, '0')}`;\r\n dt += `/${month_es[alTime.getMonth()].slice(0,3)}`;\r\n dt += ` ${alTime.getHours().toString().padStart(2, '0')}`;\r\n dt += `:${alTime.getMinutes().toString().padStart(2, '0')}`;\r\n return dt;\r\n}","'use strict'\r\nimport * as conf from \"./config.js\";\r\nimport { requestJSON } from \"./utils.js\";\r\nimport { setMsgGeneral, logout } from \"./index.js\";\r\n\r\n// these are to set and get global state\r\nlet setState = () => { console.error(\"not defined yet\")};\r\nlet getState = () => { console.error(\"not defined yet\")};\r\nexport function setgetState(setST, getST) {\r\n setState = setST;\r\n getState = getST;\r\n}\r\n\r\nexport function slider(container, dragItem, params) {\r\n let active = false;\r\n let currentX;\r\n let currentY;\r\n let initialX;\r\n let initialY;\r\n let xOffset = 0;\r\n let yOffset = 0;\r\n\r\n // This is to prevent the slider from reaching the end of the box\r\n // if kept at its current position when window is resized.\r\n window.addEventListener(\"resize\", e => {\r\n currentX = 0;\r\n xOffset = 0;\r\n setTranslate(currentX, currentY, dragItem);\r\n });\r\n\r\n container.addEventListener(\"touchstart\", dragStart, false);\r\n container.addEventListener(\"touchend\", dragEnd, false);\r\n container.addEventListener(\"touchmove\", drag, false);\r\n\r\n container.addEventListener(\"mousedown\", dragStart, false);\r\n container.addEventListener(\"mouseup\", dragEnd, false);\r\n container.addEventListener(\"mousemove\", drag, false);\r\n\r\n function dragStart(e) {\r\n if (e.type === \"touchstart\") {\r\n initialX = e.touches[0].clientX - xOffset;\r\n initialY = e.touches[0].clientY - yOffset;\r\n } else {\r\n initialX = e.clientX - xOffset;\r\n initialY = e.clientY - yOffset;\r\n }\r\n\r\n if (e.target === dragItem) {\r\n active = true;\r\n }\r\n }\r\n\r\n function dragEnd(e) {\r\n initialX = currentX;\r\n initialY = currentY;\r\n active = false;\r\n }\r\n\r\n async function drag(e) {\r\n if (active) {\r\n e.preventDefault();\r\n\r\n let x, y;\r\n if (e.type === \"touchmove\") {\r\n x = e.touches[0].clientX;\r\n y = e.touches[0].clientY;\r\n } else {\r\n x = e.clientX\r\n y = e.clientY\r\n }\r\n if (x <= initialX) return;\r\n\r\n currentX = x - initialX;\r\n currentY = y - initialY;\r\n\r\n if (this.offsetWidth < currentX + dragItem.offsetWidth) {\r\n currentX = this.offsetWidth - dragItem.offsetWidth;\r\n if (params) {\r\n params.container = container;\r\n params.dragItem = dragItem;\r\n\r\n // reached the end. Trigger action\r\n \r\n let rc = await sendAlert(this);\r\n if (rc >= 400) { // error\r\n currentX = 0;\r\n this.classList.remove(\"armed\");\r\n this.querySelector(\".sliderText\").classList.add(\"hidden\");\r\n // this.querySelector(\".slider\").classList.remove(\"hidden\");\r\n \r\n setTimeout(() => {\r\n resetSlider();\r\n }, 3000);\r\n if (rc == 401) {\r\n logout();\r\n }\r\n return;\r\n } else {\r\n // slider will be available again in 10sec\r\n setTimeout(() => {\r\n resetSlider();\r\n }, 10000);\r\n }\r\n dragItem.classList.add(\"hidden\");\r\n }\r\n }\r\n\r\n xOffset = currentX;\r\n // yOffset = currentY;\r\n yOffset = currentY = 0;\r\n\r\n if (currentX < 0) {\r\n currentX = xOffset = 0;\r\n }\r\n setTranslate(currentX, currentY, dragItem);\r\n }\r\n }\r\n\r\n function resetSlider() {\r\n dragItem.classList.remove(\"hidden\");\r\n container.classList.remove(\"armed\");\r\n container.querySelector(\".sliderText\").classList.add(\"hidden\");\r\n\r\n currentX = 0;\r\n xOffset = currentX;\r\n yOffset = currentY = 0;\r\n setTranslate(currentX, currentY, dragItem);\r\n alertSent = false;\r\n }\r\n\r\n return resetSlider.bind(this);\r\n}\r\n\r\nfunction setTranslate(xPos, yPos, el) {\r\n el.style.transform = \"translate3d(\" + xPos + \"px, \" + yPos + \"px, 0)\";\r\n}\r\n\r\nlet alertSent = false;\r\nasync function sendAlert(sliderBox) {\r\n // This is to prevent multiple alerts.\r\n // If the user wants to send another one, he/she needs to wait\r\n // or refresh the page\r\n if (alertSent) return 200;\r\n alertSent = true;\r\n\r\n sliderBox.classList.add(\"armed\");\r\n // sliderBox.querySelector(\".sliderText\").textContent = params.text;\r\n sliderBox.querySelector(\".sliderText\").classList.remove(\"hidden\");\r\n sliderBox.querySelector(\".slider\").classList.add(\"hidden\");\r\n \r\n // future:Activation function should be passed as parameter instead of live \r\n // in the slider itself.\r\n // console.log(params);\r\n let user_data = getState().user_data\r\n let gid = user_data.groups[user_data.active_group].gid\r\n // console.log(\"gid\", gid)\r\n\r\n let knd = Number(document.querySelector(\"#alertKind\").value);\r\n let init = {\r\n method: \"PUT\",\r\n headers: {\r\n \"Authorization\": `Bearer ${user_data.sid}`\r\n },\r\n body : JSON.stringify({\r\n \"knd\": knd,\r\n \"gid\": gid\r\n })\r\n };\r\n // console.log(init);\r\n let resp;\r\n let error = 0;\r\n try {\r\n resp = await requestJSON(conf.API_BASE_URL + `/v1/alerts`, init)\r\n } catch {\r\n error = 400;\r\n }\r\n \r\n if (resp && resp.error) {\r\n if (resp.error.status.slice(0,3) == '401') {\r\n error = 401;\r\n } else {\r\n error = 400;\r\n }\r\n }\r\n\r\n if (error > 0) {\r\n setMsgGeneral(\"Error de comunicación\", \"warn\");\r\n alertSent = false;\r\n return error;\r\n }\r\n return 200;\r\n}\r\n","'use strict';\r\n\r\nimport { requestJSON, urlBase64ToUint8Array } from \"./utils.js\";\r\nimport * as conf from \"./config.js\";\r\n\r\nlet groupCode = document.querySelector(\"#group_code\");\r\nconst eMsgZone = document.querySelector('#subs-msg-zone');\r\n\r\n// these are to set and get global state\r\nlet setState = () => { console.error(\"not defined yet\")};\r\nlet getState = () => { console.error(\"not defined yet\")};\r\nexport function setgetState(setST, getST) {\r\n setState = setST;\r\n getState = getST;\r\n}\r\n\r\nconst setMsgZone = text => {\r\n eMsgZone.textContent = text;\r\n\r\n if (text == \"\") {\r\n eMsgZone.classList.add(\"hidden\");\r\n eMsgZone.classList.remove(\"warn-zone\");\r\n } else {\r\n eMsgZone.classList.remove(\"hidden\");\r\n eMsgZone.classList.add(\"warn-zone\");\r\n }\r\n};\r\n\r\nexport function noSubsSupport() {\r\n setMsgZone(\"Este navegador no soporta notificaciones\");\r\n document.querySelector('#subscriptions').classList.add('lgrey-txt');\r\n}\r\n// Esto puedo usar para avisar cuando una comunidad no tiene activo\r\n// el servicio de notificaciones\r\n// alert('La comunidad no tiene contratado el servicio de notificaciones')\r\n\r\ndocument.querySelector('#subs_btn').addEventListener('click', async function() {\r\n subscribe(groupCode.value);\r\n})\r\n\r\n// subsCode is the subscription code, as string. Can contain spaces.\r\nexport async function subscribe(subsCode) {\r\n // == validate and normalize group code\r\n if (subsCode.length < 9) {\r\n alert('Debe ingresar el código completo');\r\n return;\r\n } else if (subsCode.length > 9) {\r\n alert('El código ingresado es incorrecto');\r\n return\r\n }\r\n const code = subsCode.replace(\" \", \"\")\r\n\r\n // == Ensure we have notification persmission\r\n if (Notification.permission != \"granted\") {\r\n askForNotificationPermission();\r\n if (Notification.permission != \"granted\") {\r\n alert(\"Debe permitir las notificaciones para suscribirse\");\r\n return;\r\n }\r\n }\r\n\r\n // == Getting the subscription data\r\n const swreg = await navigator.serviceWorker.ready\r\n if (!('pushManager' in swreg)) {\r\n document.querySelector('#subscriptions').classList.add('lgrey-txt');\r\n return\r\n }\r\n let subs = await swreg.pushManager.getSubscription();\r\n \r\n if (subs === null) {\r\n // Create a new subscription\r\n var vapidPublicKey = conf.VAPID_PUB_KEY;\r\n var convertedVapidPublicKey = urlBase64ToUint8Array(vapidPublicKey);\r\n subs = await swreg.pushManager.subscribe({\r\n userVisibleOnly: true,\r\n applicationServerKey: convertedVapidPublicKey\r\n });\r\n } \r\n \r\n // Now registering the subscription in the API\r\n let reqbody = {\r\n subscription: subs,\r\n groupcode: Number(code)\r\n }\r\n\r\n let init = {\r\n method: 'PUT',\r\n headers : {\r\n 'Accept': 'application/json',\r\n 'Content-Type': 'application/json'\r\n },\r\n body: JSON.stringify(reqbody),\r\n };\r\n let res = {};\r\n try {\r\n res = await requestJSON(conf.API_BASE_URL + \"/v1/subscriptions\", init);\r\n } catch (err) {\r\n console.log(err);\r\n alert('Error de comunicación. Reintente más tarde por favor.');\r\n return;\r\n }\r\n\r\n if (res.error) {\r\n const code = res.error.status.slice(0,3);\r\n switch (code) {\r\n case \"404\":\r\n alert(\"Código Incorrecto\"); \r\n break;\r\n case \"402\":\r\n alert(\"El servicio de notificaciones no está activado para esta comunidad\"); \r\n break;\r\n default:\r\n alert(\"No se pudo registrar la suscripción\")\r\n break;\r\n }\r\n } else if (res.status) {\r\n const code = res.status.slice(0,3);\r\n switch (code) {\r\n case \"200\":\r\n case \"201\":\r\n alert(\"Suscripción ingresada.\"); \r\n break; \r\n }\r\n }\r\n}\r\n\r\n// Unsubscribe Button Click\r\ndocument.querySelector('#unsub_btn').addEventListener('click', async function() {\r\n // == validate and normalize group code\r\n if (groupCode.value.length < 9) {\r\n alert('Debe ingresar el código completo');\r\n return;\r\n }\r\n const code = groupCode.value.replace(\" \", \"\")\r\n\r\n // == Getting subscription's data\r\n const swreg = await navigator.serviceWorker.ready;\r\n const subs = await swreg.pushManager.getSubscription();\r\n \r\n if (!subs) {\r\n console.log(\"no subscription registered. We're done here\");\r\n alert(\"No hay suscripciones activas.\");\r\n return;\r\n }\r\n\r\n let reqbody = {\r\n subscription: subs,\r\n groupcode: Number(code)\r\n }\r\n let init = {\r\n method: 'DELETE',\r\n headers : {\r\n 'Accept': 'application/json',\r\n 'Content-Type': 'application/json'\r\n },\r\n body: JSON.stringify(reqbody),\r\n };\r\n try {\r\n const resp = await requestJSON(conf.API_BASE_URL + \"/v1/subscriptions\", init);\r\n if (resp.error) {\r\n const code = resp.error.status.slice(0,3);\r\n switch (code) {\r\n case \"404\":\r\n alert(\"Código Incorrecto\"); \r\n break; \r\n default:\r\n alert(\"No se pudo quitar la suscripción. Reintente más tarde por favor.\")\r\n break;\r\n }\r\n } else if (resp.status) {\r\n const code = resp.status.slice(0,3);\r\n switch (code) {\r\n case \"200\":\r\n // do not unsubscribe here because the same subscription\r\n // could be active for another group code\r\n // const unsub = await subs.unsubscribe();\r\n alert(\"Suscripción eliminada.\");\r\n break;\r\n default:\r\n alert(\"Hubo un problema. Reintente más tarde por favor.\")\r\n break;\r\n }\r\n }\r\n }\r\n catch(err) {\r\n console.log(err);\r\n alert('Error de comunicación. Reintente más tarde por favor.');\r\n return;\r\n }\r\n})\r\n\r\ngroupCode.addEventListener('input', () => {\r\n const s = groupCode.value;\r\n if (s.length > 4 && s[4] != \" \") {\r\n const first = s.slice(0,4);\r\n const second = s.slice(4);\r\n groupCode.value = first + \" \" + second\r\n }\r\n})\r\n\r\nfunction askForNotificationPermission() {\r\n Notification.requestPermission(function(result) {\r\n if (result !== 'granted') {\r\n console.log('No notification permission granted!');\r\n return false;\r\n } else {\r\n return true;\r\n // configurePushSub();\r\n // displayConfirmNotification();\r\n }\r\n });\r\n}\r\n","'use strict';\r\n\r\nimport { requestJSON, convDate } from \"./utils.js\";\r\nimport * as conf from \"./config.js\";\r\n\r\n// these are to set and get global state\r\nlet setState = () => { console.error(\"not defined yet\")};\r\nlet getState = () => { console.error(\"not defined yet\")};\r\nexport function setgetState(setST, getST) {\r\n setState = setST;\r\n getState = getST;\r\n}\r\n\r\nconst eDate = document.querySelector('#date');\r\nconst eType = document.querySelector('#type');\r\nconst eUname = document.querySelector('#uname');\r\nconst eGeoref = document.querySelector('#georef');\r\nconst eNoteSubs = document.querySelector('#notesubs');\r\n\r\nconst eMsgZone = document.querySelector('#alarms-msg-zone');\r\nconst eReport = document.querySelector('#report');\r\n\r\nconst setMsgZone = text => {\r\n eMsgZone.textContent = text;\r\n\r\n if (text == \"\") {\r\n eMsgZone.classList.add(\"hidden\");\r\n eMsgZone.classList.remove(\"warn-zone\");\r\n } else {\r\n eMsgZone.classList.remove(\"hidden\");\r\n eMsgZone.classList.add(\"warn-zone\");\r\n \r\n setTimeout(() => {\r\n setMsgZone(\"\");\r\n }, conf.msgTimeout);\r\n }\r\n};\r\n\r\nexport async function showAlert(hash) {\r\n const state = getState();\r\n // Getting alert data from local storage\r\n let AlHistory = getAlHistory();\r\n\r\n // showing the list of alerts\r\n showAlertHistory(hash);\r\n setMsgZone(\"\");\r\n\r\n let init = {\r\n headers : {\r\n 'Accept': 'application/json',\r\n 'Content-Type': 'application/json'\r\n }\r\n };\r\n\r\n if (state?.user_data?.sid) {\r\n init.headers.Authorization = `Bearer ${state.user_data.sid}`;\r\n }\r\n let res = {};\r\n try {\r\n const url = conf.API_BASE_URL + `/v1/alerts/${hash}`;\r\n // console.log(url);\r\n res = await requestJSON(url, init);\r\n } catch(err){\r\n console.log(err);\r\n setMsgZone(\"Error de comunicación. No fue posible obtener los datos de la alerta.\");\r\n return;\r\n }\r\n \r\n if (res.error) {\r\n console.log(res.error.status);\r\n setMsgZone(\"Alerta no encontrada en el servidor.\");\r\n document.querySelector(\"#alert\").classList.add(\"hidden\");\r\n return {\"errMsg\": \"Alerta no encontrada en el servidor.\"};\r\n }\r\n\r\n document.querySelector(\"#alert\").classList.remove(\"hidden\");\r\n\r\n // Checking if it's a recent alert\r\n const curTime = new Date();\r\n const alTime = new Date(res.received);\r\n if (curTime - alTime < 5*60*1000) {\r\n setMsgZone(\"⚠️ Alerta Reciente (<5min) ⚠️\");\r\n }\r\n eReport.querySelector(\"#gname\").textContent = res.gname;\r\n eDate.textContent = convDate(res.received);\r\n eType.textContent = conf.alKnd.filter(e => e.id == res.kind)[0].txt;\r\n eUname.textContent = res.lname.length>0 ? res.lname : res.sname;\r\n eGeoref.src = res.geoplan.length>0 ? res.geoplan : \"./media/no-info.png\";\r\n\r\n if (res.subcode) {\r\n let code = res.subcode.substr(0,4) + \" \" + res.subcode.substr(4,8);\r\n eNoteSubs.insertAdjacentHTML('afterbegin',`${code}`);\r\n } else {\r\n eNoteSubs.textContent = \"---- ----\";\r\n }\r\n\r\n if (AlHistory.alerts.filter(e => {return e.hash == hash}).length == 0) {\r\n // this is a new hash\r\n AlHistory.alerts.unshift({\r\n date: res.received,\r\n kind: res.kind ? res.kind : 1,\r\n hash: hash,\r\n gname: res.gname,\r\n uname: res.lname.length>0 ? res.lname : res.sname\r\n })\r\n storeHistory(AlHistory);\r\n }\r\n}\r\n\r\nfunction getAlHistory() {\r\n let AlHistory = JSON.parse(localStorage.getItem(\"AlHistory\"))\r\n if (AlHistory == null) {\r\n // There is no data stored ATM. Creating the base object\r\n AlHistory = {\r\n alerts: []\r\n }\r\n }\r\n return AlHistory;\r\n}\r\n\r\n// showAlertHistory will show the list of previous alerts in the page\r\nexport function showAlertHistory(hash) {\r\n let AlHistory = getAlHistory();\r\n\r\n if (AlHistory.alerts.length == 0) {\r\n document.querySelector(\"#oldAlerts p\").textContent = \"No se encontraron alertas anteriores.\";\r\n } else {\r\n document.querySelector(\"#oldAlerts p\").textContent = \"\";\r\n let al = document.querySelector(\"#oldAlerts #alerts\");\r\n al.innerHTML = \"\";\r\n // recent alerts will also receive a distinctive look\r\n const curTime = new Date();\r\n let recentMark = \"\";\r\n const baseKind = conf.alKnd.filter(elem => elem.id == 1)[0].txt\r\n AlHistory.alerts.forEach(e => {\r\n let alTime = new Date(e.date);\r\n if (curTime - alTime < 5*60*1000) {\r\n recentMark = \" ⚠️ \";\r\n } else {\r\n recentMark = \"\";\r\n }\r\n\r\n let kind = baseKind;\r\n if (e.kind) {\r\n kind = conf.alKnd.filter(elem => elem.id == e.kind)[0].txt;\r\n }\r\n\r\n let entry;\r\n let atxt = `${recentMark}${convDate(e.date)} - ${kind}${recentMark}`;\r\n \r\n let p = document.createElement(\"p\");\r\n if (hash == e.hash) {\r\n // the one currently selected (then no need for an anchor)\r\n entry = document.createElement(\"strong\");\r\n entry.textContent = `→ ${atxt} ←` ;\r\n p.appendChild(entry);\r\n p.appendChild(document.createElement(\"br\"));\r\n } else {\r\n entry = document.createElement(\"a\");\r\n entry.text = `${atxt}`;\r\n entry.href = `/?p=showAlert&h=${e.hash}`;\r\n p.appendChild(entry);\r\n }\r\n let info1 = document.createElement(\"span\");\r\n info1.textContent = `${e.gname}`;\r\n \r\n let info2 = document.createElement(\"span\");\r\n info2.textContent = `${e.uname}`;\r\n\r\n p.appendChild(info1);\r\n p.appendChild(document.createElement(\"br\"));\r\n p.appendChild(info2);\r\n al.appendChild(p);\r\n });\r\n }\r\n}\r\n\r\n// storeHistory sorts the given alert history list, cut the extra elements,\r\n// remove duplicates and store the result in the local history\r\nfunction storeHistory(alHistory) {\r\n // sort entries\r\n alHistory.alerts.sort((a,b) => {\r\n // doing reverse order based on date string\r\n if (a.date > b.date) return -1;\r\n if (a.date < b.date) return 1;\r\n return 0;\r\n })\r\n \r\n // console.log(\"sorted\", alHistory);\r\n\r\n // cleaning (removing duplicates)\r\n let lastHash = \"\";\r\n let filteredAlerts = [];\r\n for (let i=0; i < alHistory.alerts.length; i++) {\r\n let al = alHistory.alerts[i];\r\n if (lastHash == \"\") {\r\n lastHash = al.hash;\r\n filteredAlerts.push(al);\r\n continue;\r\n }\r\n if (lastHash == al.hash) continue; // repeated\r\n lastHash = al.hash;\r\n filteredAlerts.push(al);\r\n }\r\n alHistory.alerts = filteredAlerts;\r\n // console.log(\"cleaned\", alHistory);\r\n\r\n // ensuring max size\r\n // I want to keep up to 10 alerts only\r\n if (alHistory.alerts.length > conf.maxAlertHist) {\r\n alHistory.alerts = alHistory.alerts.slice(0,conf.maxAlertHist);\r\n }\r\n\r\n // finally storing the data\r\n localStorage.setItem(\"AlHistory\", JSON.stringify(alHistory));\r\n}\r\n\r\n// updateHistory will get the list of alerts from the API and store them\r\n// in the local storage. Will restore the list.\r\nexport async function updateHistory() {\r\n let alHistory = getAlHistory();\r\n const state = getState();\r\n state.exp = Date.now() + conf.sesExp;\r\n setState(state);\r\n \r\n let init = {\r\n headers : {\r\n 'Accept': 'application/json',\r\n 'Content-Type': 'application/json',\r\n 'Authorization': `Bearer ${state.user_data.sid}`\r\n }\r\n };\r\n let res = {};\r\n try {\r\n const url = conf.API_BASE_URL + `/v1/alerts/list`;\r\n // console.log(url);\r\n res = await requestJSON(url, init);\r\n } catch(err){\r\n console.log(err);\r\n setMsgZone(\"Error de comunicación. No fue posible obtener datos de alertas.\");\r\n return 400; // error\r\n }\r\n \r\n if (res.error) {\r\n if (res.error.status.slice(0,3) == '401') {\r\n return 401; // unauthorized\r\n } else {\r\n console.log(res.error.status);\r\n // setMsgZone(\"No se encontraron alertas en el servidor.\");\r\n // document.querySelector(\"#alert\").classList.add(\"hidden\");\r\n return 404;\r\n }\r\n }\r\n\r\n for (let i=0; i < res.alerts.length; i++) {\r\n let al = res.alerts[i];\r\n alHistory.alerts.push({\r\n date: al.received,\r\n hash: al.hash,\r\n kind: al.kind,\r\n gname: al.gname,\r\n uname: al.lname.length>0 ? al.lname : al.sname\r\n })\r\n }\r\n // console.log(alHistory);\r\n\r\n storeHistory(alHistory);\r\n return 200;\r\n}","'use strict'\r\n\r\nimport * as conf from \"./config.js\";\r\nimport {slider, setgetState as slider_setgetState } from \"./slider.js\";\r\nimport { noSubsSupport, setgetState as subs_setgetState } from \"./subs.js\";\r\nimport { showAlert, showAlertHistory, setgetState as alert_setgetState, updateHistory } from \"./alert.js\";\r\nimport { requestJSON } from \"./utils.js\";\r\n\r\nlet state = {}\r\nstate = loadState();\r\n\r\nwindow.addEventListener('load', function() {\r\n checkSessionExp(state);\r\n});\r\n\r\n// tp can be \"ok\", \"warn\", \"error\"\r\nexport const setMsgGeneral = (msg, tp) => {\r\n let eMsgZone = document.querySelector(\"#general-msg-zone\");\r\n eMsgZone.textContent = msg;\r\n eMsgZone.classList.remove(\"warn-zone\");\r\n eMsgZone.classList.remove(\"ok-zone\");\r\n\r\n if (msg == \"\") {\r\n eMsgZone.classList.add(\"hidden\");\r\n } else {\r\n eMsgZone.classList.remove(\"hidden\");\r\n if (tp == \"warn\") {\r\n eMsgZone.classList.add(\"warn-zone\");\r\n } else if (tp == \"ok\") {\r\n eMsgZone.classList.add(\"ok-zone\")\r\n }\r\n\r\n setTimeout(() => {\r\n setMsgGeneral(\"\");\r\n }, conf.msgTimeout);\r\n }\r\n};\r\n\r\nfunction saveState(state) {\r\n localStorage.setItem(\"state\", JSON.stringify(state));\r\n}\r\n\r\nfunction checkSessionExp(st) {\r\n let checkState = {};\r\n if (st) {\r\n checkState = st;\r\n } else {\r\n checkState = state; \r\n }\r\n // console.log(\"checking session exp\");\r\n let exp = checkState?.user_data?.exp;\r\n if (!exp) {\r\n return;\r\n }\r\n // console.log(`expiring in ${(exp - Date.now())/1000} seconds`);\r\n if (exp <= Date.now()) {\r\n logout();\r\n // saveState(undefined);\r\n } else {\r\n checkState.user_data.exp = Date.now() + conf.sesExp;\r\n saveState(checkState);\r\n }\r\n}\r\n\r\nfunction loadState() {\r\n let state = {}\r\n\r\n state = {\r\n notifSupport: false,\r\n // user_data: {},\r\n gidx: 0\r\n }\r\n\r\n let loaded = localStorage.getItem(\"state\")\r\n if (loaded) {\r\n try {\r\n state = JSON.parse(loaded);\r\n } catch {\r\n loaded = false;\r\n }\r\n } \r\n \r\n if (loaded == false) {\r\n saveState(state);\r\n }\r\n\r\n if (state?.user_data?.exp) {\r\n checkSessionExp(state);\r\n }\r\n\r\n return state;\r\n}\r\n\r\nfunction getState() {\r\n return state;\r\n}\r\n\r\nfunction setState(s) {\r\n state = {\r\n ...state, // original state\r\n ...s // override with new state\r\n };\r\n saveState(state);\r\n}\r\n\r\nsubs_setgetState(setState, getState);\r\nalert_setgetState(setState, getState);\r\nslider_setgetState(setState, getState);\r\n\r\n// -----------------\r\n\r\nfunction getJWTData(jwt) {\r\n if (jwt == undefined) {\r\n return undefined;\r\n }\r\n var base64Url = jwt.split('.')[1];\r\n var base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');\r\n var jsonPayload = decodeURIComponent(window.atob(base64).split('').map(function (c) {\r\n return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);\r\n }).join(''));\r\n return JSON.parse(jsonPayload);\r\n}\r\n\r\n// setControls will show/hide elements based on user's access level\r\nfunction setControls(level) {\r\n setMsgGeneral(\"\");\r\n let loginBtn = document.querySelector(\"nav .buttonS\");\r\n if (!state.user_data || !level) {\r\n level = 0;\r\n }\r\n let group = 0;\r\n try {\r\n group = state.user_data.groups[state.user_data.active_group]\r\n document.querySelector(\"#trigAlGName\").textContent = group.name;\r\n level = group.level;\r\n } catch {\r\n // console.error(\"no groups data found in user_data\");\r\n state.user_data = undefined;\r\n saveState();\r\n }\r\n\r\n // console.log(\"level:\", level);\r\n if (level >= 1) {\r\n // show level 1 elements\r\n document.querySelector(\"#navTrigAlert\").style.display = \"\";\r\n document.querySelector(\"#login\").classList.add(\"hidden\");\r\n document.querySelector(\"#alertUpdate\").classList.remove(\"hidden\");\r\n loginBtn.classList.remove(\"btn-green\");\r\n loginBtn.classList.add(\"btn-red\");\r\n loginBtn.querySelector(\"span\").innerHTML= \" Salir\";\r\n loginBtn.querySelector(\"a\").href = \"?p=logout\";\r\n } else {\r\n // hide level 1 elements\r\n document.querySelector(\"#navTrigAlert\").style.display = \"none\";\r\n document.querySelector(\"#alertUpdate\").classList.add(\"hidden\");\r\n loginBtn.classList.add(\"btn-green\");\r\n loginBtn.classList.remove(\"btn-red\");\r\n loginBtn.querySelector(\"span\").innerHTML= \" Acceso\";\r\n }\r\n\r\n if (level >= 2) {\r\n // show level 2 elements\r\n let items = document.querySelectorAll(\".level_2\");\r\n items.forEach(i => {\r\n i.classList.remove(\"hidden\");\r\n })\r\n } else {\r\n // hide level 2 elements\r\n let items = document.querySelectorAll(\".level_2\");\r\n items.forEach(i => {\r\n i.classList.add(\"hidden\");\r\n })\r\n }\r\n}\r\n\r\nasync function LogInUser(provider, data) {\r\n let resp;\r\n let auth;\r\n if (provider === \"google\") {\r\n auth = `Bearer ${data.jwt}`;\r\n } else if (provider === \"basic\") {\r\n let creds = btoa(`${data.email}:${data.pass}`);\r\n auth = `Basic ${creds}`;\r\n } else {\r\n setMsgGeneral(\"Error de comunicación [2]\", \"warn\");\r\n return;\r\n }\r\n\r\n try {\r\n resp = await requestJSON(conf.API_BASE_URL + `/v1/login/` + provider, {\r\n method: \"POST\",\r\n headers: {\r\n \"Authorization\": auth\r\n }\r\n })\r\n } catch {\r\n setMsgGeneral(\"Error de comunicación\", \"warn\");\r\n return;\r\n }\r\n // ===== THIS IS FOR DEBUG =====\r\n // ===== START =====\r\n // let resp = JSON.parse(`{\r\n // \"sid\": \"e8ed44acf4913fe2f3051f64372d3f2ec61b7a21\",\r\n // \"groups\": [\r\n // {\r\n // \"gid\": 33,\r\n // \"name\": \"Condominio Alicahue 2\",\r\n // \"level\": 2\r\n // },\r\n // {\r\n // \"gid\": 3100,\r\n // \"name\": \"Espacio Macul\",\r\n // \"level\": 1\r\n // }\r\n // ]\r\n // }`);\r\n // ===== END =====\r\n if (resp.error) {\r\n console.error(resp.error);\r\n setControls(0);\r\n setMsgGeneral(\"Usuario NO Autorizado\", \"warn\");\r\n return;\r\n }\r\n \r\n if (resp.sid.length == 0) {\r\n // not authorized\r\n // console.log(\"unauthorized user\");\r\n setMsgGeneral(\"Usuario NO Autorizado\", \"warn\");\r\n } else {\r\n // console.log(resp);\r\n // console.log(\"authorized user\")\r\n resp.active_group = 0;\r\n resp.exp = Date.now() + conf.sesExp;\r\n state.user_data = resp;\r\n saveState(state);\r\n // console.log(state);\r\n }\r\n\r\n setControls();\r\n // let data = getJWTData(jwt);\r\n // console.log(data);\r\n urlRoutes(conf.API_BASE_URL + \"/?p=trigAlert\")\r\n return\r\n}\r\n\r\n// This is the callback for google login.\r\n// From `