{"version":3,"sources":["lib/feathers.js","lib/_console.js","components/NavBar/NavBar.js","lib/UserContext.js","components/NavBar/NavBarSubMenu.js","components/RayMarker/RayMarker.js","components/MarkerList/MarkerList.js","components/MapComponent/MapComponent.js","lib/network.js","lib/myForm.js","components/SearchCard/SearchComponent.js","components/SearchCard/SearchCard.js","components/MapStats/SparklineComponent.js","components/MapStats/MapStats.js","components/LastChanges/LastChanges.js","Pages/Mapa/Grafico/Chart.js","Pages/Mapa/Grafico/ChartLogic.js","Pages/Mapa/Grafico/GraficoContainer.js","Pages/Mapa/Mapa.js","Pages/Login/LoginComponent2.js","Pages/Login/Login.js","Pages/Profile/ProfileComponent2.js","Pages/Profile/Profile.js","Pages/About/GeneralInfo.js","Pages/About/About.js","Pages/Volcanes/VolcanesList.js","Pages/Volcanes/Volcanes.js","lib/webpush.js","Pages/Admin/Admin.js","Pages/Admin/TableComponent.js","Pages/Admin/AdminUsers/AdminUsers.js","Pages/Admin/AdminEditUserComponent.js","Pages/Admin/AdminEditUser/AdminEditUser.js","Pages/Admin/AdminUsers/New/validations.js","Pages/Admin/AdminUsers/New/NewUserComponent.js","Pages/Admin/AdminUsers/New/NewUserPage.js","Pages/Admin/AdminVolcanes/AdminVolcanes.js","Pages/Admin/AdminVolcanes/New/validations.js","Pages/Admin/AdminVolcanes/New/NewVolcanComponent.js","Pages/Admin/AdminVolcanes/New/NewVolcanPage.js","Pages/Admin/AdminVolcanes/Edit/validations.js","Pages/Admin/AdminVolcanes/Edit/EditVolcanComponent.js","Pages/Admin/AdminVolcanes/Edit/EditVolcanPage.js","App.js","index.js"],"names":["socket","io","client","feathers","configure","socketio","authentication","_console","bool","console","log","NavBar","props","className","alt","src","UserContext","React","createContext","NavBarSubMenu","Consumer","context","role","links","map","link","key","to","href","authInfo","email","nombre","RayMarker","Lat","Lon","Cod_Color","Nombre","Rayos_in","Rayos_out","mapBounds","NoVolcan","selectVolcano","iconSize","_northEast","latDiff","Math","abs","lat","_southWest","redIcon","L","icon","iconUrl","yellowIcon","myIcon","imgUrl","Marker","position","onClick","Popup","target","MarkerList","rays","markerArray","Object","values","ray","i","MapComponent","onViewportChanged","state","Map","ref","animate","viewport","this","zoomControl","refs","leafletElement","getBounds","TileLayer","attribution","url","ZoomControl","sticky","Component","getHistoricalDataFromVolcano","a","async","debug","lastWeek","Date","setDate","getDate","service","find","query","$limit","$select","$sort","DateTime","$gt","toISOString","substring","catch","e","rawData","seen","data","filter","entry","getCurrentData","fetch","then","res","ok","json","getDataAsCSV","desde","hasta","accept","$lt","req","urlExists","method","status","required","string","undefined","isEmail","test","isBetween","min","max","length","isANumber","validate","formData","validations","errors","keys","forEach","field","newError","push","createFormFromSchema","schema","onSubmit","submitButton","formElement","Form","Group","controlId","Label","Control","type","name","onChange","placeholder","value","Check","label","checked","Button","variant","_createFormElement","withRouter","visibleRays","setIsSearching","useState","setFormData","filterVolcanoes","volcanoesList","lng","volcano","v","handleChange","alert","Alert","onClose","dismissible","error","visibleVolcanoes","preventDefault","style","marginLeft","color","Searching","isSearching","useEffect","timer","setInterval","exists","window","location","checkIfExists","clearInterval","width","height","SearchCard","Card","Header","Body","SparklineComponent","past","svgWidth","svgHeight","limit","margin","MapStats","statistics","onFilterChange","lastUpdated","setLastUpdated","vList","interval","fechaISO","date","diff","now","getTime","floor","parseInt","sec","msg","diffDates","numReds","NoVolcano","numYellows","numGreens","red","reds","yellow","yellows","green","greens","LastChanges","messages","colores","mm","getMinutes","hhmm","getHours","getMonth","getFullYear","Region","last_cod_color","curr_cod_color","Chart","title","chartData","labels","datasets","backgroundColor","lineTension","pointBackgroundColor","ctx","dataset","dataIndex","radius","getRayosInOutforIndex","idx","options","tooltips","enabled","callbacks","tooltipItem","rayos","index","layout","borderColor","borderWidth","scales","yAxes","ticks","reverse","xAxes","adapters","locale","es","time","displayFormats","minute","hour","maintainAspectRatio","display","text","fontSize","legend","pan","mode","zoom","drag","ChartLogic","setData","isLoading","setIsLoading","getEstadoUltimaSemana","GraficoContainer","selectedVolcanoInfo","Mapa","updateRays","setState","allRays","updateVisibleRays","newVisibleRays","item","login","reAuthenticate","newFilter","shift","avisos","center","auth","on","message","concat","assign","_id","Container","fluid","Row","Col","xs","sm","md","lg","xl","paddingTop","history","doSubmit","logout","password","authenticate","strategy","handleSubmit","setAuth","user","Login","setAction","logOut","me","patch","id","Profile","GeneralInfo","fontWeight","Leyend","About","setV","VolcanesList","Volcanes","urlBase64ToUint8Array","base64String","base64","repeat","replace","atob","outputArray","Uint8Array","charCodeAt","getSubscription","navigator","serviceWorker","register","ready","registration","pushManager","subscription","convertedVapidKey","subscribe","userVisibleOnly","applicationServerKey","headers","body","JSON","stringify","TableComponent","striped","hover","condensed","bootstrap4","users","setUsers","setAlert","getUsers","usersService","usersList","columns","dataField","headerStyle","isDummyField","align","formatter","cellContent","row","confirmDelete","doDeleteUser","remove","noDataIndication","keyField","pagination","paginationFactory","AdminEditUserComponent","success","setNombre","setEmail","isAdmin","setIsAdmin","useParams","get","userData","getUserData","updateState","isAdminYN","AdminEditUser","password2","NewUserComponent","formSchema","create","NewUserPage","volcanes","setVolcanes","getVolcanes","Astyle","AheaderStyle","indication","doDeleteVolcan","Type","NewVolcanComponent","FormData","NewVolcanPage","EditVolcanComponent","formStatus","setFormStatus","setNoVolcan","setRegion","setType","setLat","setLon","setLink","setText","setEnabled","vData","getVData","EditVolcanPage","App","handleRoutesByUser","routes","path","exact","component","Admin","AdminUsers","AdminVolcanes","errorMessage","Provider","cb","ReactDOM","render","document","getElementById"],"mappings":"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","file":"static/js/main.a98c1bc1.chunk.js","sourcesContent":["import io from 'socket.io-client';\nimport feathers from '@feathersjs/client';\n// import rest from '@feathersjs/rest-client'\n\nconst socket = io('');\nconst client = feathers();\n\n\n// Connect to the same as the browser URL (only in the browser)\n// const restClient = rest('/api/');\n// Configure an AJAX library (see below) with that client \n// client.configure(restClient.fetch(window.fetch));\nclient.configure(feathers.socketio(socket));\n\n// Defaults to localStorage, see https://docs.feathersjs.com/api/authentication/client.html#configuration\nclient.configure(feathers.authentication());\n\n\nexport default client;\n","// This is a function that returns console if bool is true and a dummy function if it's false\nconst _console = bool => {\n return bool ? console : {\n log: () => {}\n }\n}\n\nexport default _console","import React from \"react\";\nimport \"./NavBar.css\";\n\nconst NavBar = props => {\n return (\n
\n \n
\n );\n}\n\nexport default NavBar;\n","import React from 'react';\n\nconst UserContext = React.createContext();\n\nexport default UserContext","import React from \"react\";\nimport { Link } from 'react-router-dom'\nimport UserContext from '../../lib/UserContext'\nimport \"./NavBar.css\";\n\nconst NavBarSubMenu = props => {\n return (\n \n {\n context => { \n console.log(context)\n return(\n
\n \n
\n\n )}\n }\n
\n );\n}\n\nexport default NavBarSubMenu;\n","import React from 'react'\nimport { Marker, Popup } from 'react-leaflet'\nimport L from 'leaflet'\nimport './RayMarker.css'\n\nconst RayMarker = ({Lat, Lon, Cod_Color, Nombre, Rayos_in, Rayos_out, mapBounds, NoVolcan, selectVolcano, link}) => {\n let iconSize = [20, 20]\n if (mapBounds._northEast) {\n const latDiff = Math.abs(mapBounds._northEast.lat - mapBounds._southWest.lat)\n if (latDiff < 30) {\n iconSize = [40, 40]\n }\n if (latDiff < 15) {\n iconSize = [60, 60]\n }\n }\n \n const redIcon = L.icon({iconUrl: '/volcano_red.png', iconSize })\n const yellowIcon = L.icon({iconUrl: '/volcano_yellow.png', iconSize })\n const greenIcon = L.icon({iconUrl: '/volcano_green.png', iconSize })\n\n let myIcon = greenIcon\n let imgUrl = '/volcano_green.png'\n if (Cod_Color === 1) {\n myIcon = yellowIcon\n imgUrl = '/volcano_yellow.png'\n }\n if (Cod_Color === 2) {\n myIcon = redIcon\n imgUrl = '/volcano_red.png'\n }\n\n return (\n {\n selectVolcano(NoVolcan)\n }}>\n \n
\n \n
\n

{Nombre}

\n
    \n
  • Rayos internos: {Rayos_in}
  • \n
  • Rayos externos: {Rayos_out}
  • \n {\n link ? (
  • Mas informacion
  • ) : ''\n }\n \n
\n
\n \n
\n \n
\n
\n )\n}\n\nexport default RayMarker;","import React from 'react';\nimport RayMarker from '../RayMarker/RayMarker';\n\nconst MarkerList = ({rays, mapBounds, selectVolcano}) => {\n const markerArray = Object.values(rays).map((ray,i) => {\n if (! ray.Lat) { console.log('MarkerList: ray without coords?', ray); return ''}\n return \n })\n return (
{markerArray}
)\n}\n\nexport default MarkerList;","import React, {Component} from \"react\";\nimport { Map, TileLayer, ZoomControl } from 'react-leaflet'\nimport { BoxZoomControl } from 'react-leaflet-box-zoom'\nimport MarkerList from '../../components/MarkerList/MarkerList'\nimport './MapComponent.css'\n\nclass MapComponent extends Component {\n constructor(props) {\n super(props)\n this.state = {\n mapBounds: {},\n }\n }\n\n // TODO: Fix \"datos de xx volcanes\"\n onViewportChanged = mapBounds => {\n // this.setState({mapBounds})\n // this.props.onViewportChanged(mapBounds)\n }\n\n \n\n render() {\n return(\n {\n const mapBounds = this.refs.map.leafletElement.getBounds()\n this.onViewportChanged(mapBounds)\n }}\n >\n \n \n \n \n \n )}\n\n };\n\n export default MapComponent;\n","import client from './feathers'\n\n// getHistoricalDataFromVolcano: gets data from a volcano to make a graph\nexport const getHistoricalDataFromVolcano = async NoVolcan => {\n const debug = 0\n const lastWeek = new Date()\n lastWeek.setDate( lastWeek.getDate() - 7 )\n const rawData = await client.service('rayos').find({\n query: {\n $limit: 999999,\n $select: [ 'DateTime', 'Cod_Color', 'Rayos_in', 'Rayos_out' ],\n NoVolcan: NoVolcan,\n $sort: { DateTime: -1 },\n DateTime: {\n $gt: lastWeek.toISOString().substring(0,10) // e.g. '2020-02-27'\n },\n }\n }).catch(e => console.log({e})) // Maybe timeout?\n debug && console.log('getHistoricalDataFromVolcano', {rawData})\n\n // Filter duplicate times (sometimes there are)\n let seen = {}\n const data = rawData.data.filter(entry => {\n if (seen[entry.DateTime] === 1) {\n return false\n } else {\n seen[entry.DateTime] = 1\n return true\n }\n })\n // Return just the data ( a list of objects )\n return data\n}\n\n// getCurrentData: get (via rest) the data. Returns a Promise.\nexport const getCurrentData = () => {\n return fetch('/api/rayosbulk')\n .then(res => {\n if (res.ok) {\n return res.json()\n }\n })\n}\n\n// getAvisos: va a buscar los avisos\nexport const getAvisos = () => {\n return fetch('/api/avisos?$limit=10&$sort[DateTime]=-1')\n .then(res => {\n if (res.ok) {\n return res.json()\n }\n })\n}\n// TODO: Que volcanes bajar\nexport const getDataAsCSV = async (desde, hasta) => {\n const debug = 1\n debug && console.log(\"getDataAsCSV:\", {desde, hasta})\n const req = await client.service('rayos').find({\n query: {\n $limit: 999999,\n accept: 'text/csv',\n DateTime: {\n $gt: desde,\n $lt: hasta,\n },\n }\n }).catch(e => console.log({e})) // Maybe timeout?\n debug && console.log('getDataAsCSV', {req})\n return req\n} \n\n// urlExists: Revisa (via HEAD) si una URL esta disponible\nexport const urlExists = async (url) => {\n const debug = 0\n const res = await fetch(url, {method: 'HEAD'})\n debug && console.log('urlExists:' , {res})\n if (res.status === 200) {\n return true\n }\n return false\n}\n","import React from 'react'\nimport Form from 'react-bootstrap/Form'\nimport Button from 'react-bootstrap/Button'\n\nexport const required = string => string !== undefined && string !== '' && string !== null \nexport const isEmail = string => /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}$/i.test(string)\nexport const isBetween = (min,max) => string => string !== undefined && string.length >= min && string.length <= max\nexport const isEqualToField = field => (string, formData) => string !== undefined && string === formData[field]\nexport const isANumber = string => /^[0-9.-]+$/i.test(string)\n\nexport const validate = (formData, validations) => {\n console.log({validations, formData})\n let errors = []\n Object.keys(validations).forEach(field => {\n let newError;\n validations[field].forEach(test => {\n //console.log('hmmm', test)\n if (! newError && ! test[0](formData[field], formData)) {\n console.log({newError})\n if (typeof(test[1]) === 'function') {\n newError = test[1](formData[field], formData)\n } else {\n newError = test[1]\n }\n errors.push(newError)\n }\n })\n\n })\n return errors\n}\n\nconst _createFormElement = formElement => {\n //console.log('_createFormElement: got', formElement)\n if (formElement[2] === 'input') {\n return (\n \n {formElement[1] || formElement[0]}\n \n \n )\n }\n if (formElement[2] === 'checkbox') {\n return (\n \n \n \n )\n }\n if (formElement[2] === 'password') {\n return ( \n \n {formElement[1] || formElement[0]}\n \n \n )\n }\n\n if (formElement[2] === 'submit') {\n return (\n \n )\n }\n\n return

Funny element {formElement[2]}

\n}\n\nexport const createFormFromSchema = schema => { \n // A button of type submit must have the form's onSubmit\n let onSubmit = () => console.log('No submit button? See myForm.js')\n const submitButton = schema.filter(formElement => formElement[2] === 'submit')\n if (submitButton.length === 1) {\n onSubmit = submitButton[0][3]\n //console.log({onSubmit})\n }\n \n return (\n
\n { schema.map(formElement => _createFormElement(formElement)) }\n
\n )\n}","import React, {useState} from \"react\";\nimport { withRouter } from \"react-router\"\nimport UserContext from '../../lib/UserContext'\nimport Alert from 'react-bootstrap/Alert'\nimport Button from 'react-bootstrap/Button'\nimport Form from 'react-bootstrap/Form'\nimport 'bootstrap/dist/css/bootstrap.min.css';\nimport { getDataAsCSV } from '../../lib/network'\nimport {required, validate} from '../../lib/myForm'\n\nconst SearchComponent = ({visibleRays, mapBounds, setIsSearching}) => {\n const [formData, setFormData] = useState({errors: []});\n\n const filterVolcanoes = (visibleRays, mapBounds) => {\n // Enviar solo los volcanes que están en el mapa. Los bordes del mapa\n // vienen en mapBounds\n let volcanoesList = []\n if (mapBounds !== undefined){\n const lat = [ mapBounds._northEast.lat , mapBounds._southWest.lat ]\n const lng = [ mapBounds._northEast.lng , mapBounds._southWest.lng ]\n \n const visibleVolcanoes = visibleRays.filter(volcano => {\n if (\n volcano.Lat <= lat[0] && volcano.Lat >= lat[1] &&\n volcano.Lon <= lng[0] && volcano.Lon >= lng[1]\n ) {\n return true\n }\n return false\n })\n volcanoesList = visibleVolcanoes.map(v => v.NoVolcan)\n } else {\n if (visibleRays.length > 0){\n volcanoesList = visibleRays.map(v => v.NoVolcan)\n }\n }\n return volcanoesList;\n }\n\n const handleSubmit = context => async e => {\n e.preventDefault()\n const errors = validate(formData, validations)\n if (errors.length > 0) {\n setFormData({...formData, errors})\n } else {\n const volcanoesList = filterVolcanoes(visibleRays, mapBounds)\n //\n // No se si vamos a hacer que los volcanes se manden por mail o no.\n // const API_URL = '/api/rayos'\n // let url = API_URL+'?accept=text/csv&DateTime[$gt]=' + formData.desde + ' 00:00:00' +\n // '&DateTime[$lt]=' + formData.hasta + ' 00:00:00&$limit=9000000'\n\n // If we have more than 50 volcanoes, we return all of them, because we may hit the\n // max URI length or the server won't make the reply and we'll hit timeout :/\n // if (volcanoesList.length > 0 && volcanoesList.length < 50) {\n // url = url + '&v=' + volcanoesList.join(',')\n // }\n\n // req = { status: ok, url: '/storage/....csv', error: 'ERROR...' }\n const desde = formData.desde + ' 00:00:00'\n const hasta = formData.hasta + ' 00:00:00'\n const req = await getDataAsCSV(desde, hasta)\n \n if (req.status == 'ok') {\n // hacer algo con url\n setIsSearching(req.url)\n } else {\n // error \n setFormData({...formData, errors: [req.error] })\n }\n }\n }\n \n const handleChange = name => e => {\n console.log(name, e.target.value)\n setFormData({...formData, [name]: e.target.value})\n }\n\n // Each field has a list of tests. Each test is a list of two items:\n // The test itself (as a function) and the error text or a function that returns the error text.\n // No validations - Nombre puede ser vacío\n const validations = {\n desde: [\n [required, 'La fecha \"desde\" es obligatoria'],\n ],\n hasta: [\n [required, 'La fecha \"hasta\" es obligatoria'],\n ]\n }\n\n\n return(\n \n {\n context => { \n let alert = ''\n if (formData.errors.length > 0) {\n alert = (\n setFormData({...formData, errors: []})} dismissible>\n {formData.errors.map((error, i) =>

{error}

)}\n
\n )\n }\n const visibleVolcanoes = filterVolcanoes(visibleRays, mapBounds)\n \n return(\n
\n {alert}\n
\n \n Desde\n \n Hasta\n \n \n\n \n datos de {visibleVolcanoes.length} volcanes\n
\n
)}\n }\n
\n )\n}\n\nexport default withRouter(SearchComponent);\n\n","import React, {useEffect, useState} from \"react\";\nimport Card from 'react-bootstrap/Card'\nimport Button from 'react-bootstrap/Button'\nimport ReactLoading from 'react-loading';\nimport { urlExists } from '../../lib/network'\n\nimport SearchComponent from './SearchComponent'\nimport './SearchCard.css'\n\nconst checkIfExists = async (url, setIsSearching) => {\n const exists = await urlExists(url)\n console.log({exists})\n if (exists) {\n console.log('Existe! 1')\n window.location = url\n console.log('existe! 2')\n setIsSearching(false)\n console.log('existe! 3')\n }\n}\n\nconst Searching = ({isSearching, setIsSearching}) => {\n useEffect( () => {\n const timer = setInterval( () => checkIfExists(isSearching, setIsSearching), 3000)\n return () => clearInterval(timer)\n })\n\n return (\n
\n \n \n
\n )\n}\n\nconst SearchCard = (props) => {\n const [isSearching, setIsSearching] = useState(false)\n\n return (\n \n Buscar\n \n {\n isSearching ? \n : \n \n }\n \n \n )\n}\n\nexport default SearchCard;","import React from 'react'\nimport { Sparklines, SparklinesLine } from 'react-sparklines';\n\n\nconst SparklineComponent = ({past, color}) => {\n return (\n \n \n \n )\n}\n\nexport default SparklineComponent","import React, {useEffect, useState} from 'react';\nimport SparklineComponent from './SparklineComponent'\nimport Switch from 'react-input-switch';\nimport './MapStats.css'\nimport Card from 'react-bootstrap/Card'\n\n\nconst MapStats = ({rays, statistics, filter, onFilterChange}) => {\n const [lastUpdated, setLastUpdated] = useState('Cargando...')\n const vList = Object.keys(rays)\n\n const debug = 0\n debug && console.log('MapStats called')\n debug && console.log({rays})\n debug && console.log({vList})\n debug && console.log(vList.length)\n debug && vList.length > 0 && console.log('vList tiene algo')\n debug && vList.length > 0 && console.log(rays[vList[0]].DateTime)\n\n const diffDates = lastUpdated => {\n const now = new Date().getTime()\n const diff = Math.floor( (now - lastUpdated) / 1000 )\n const min = parseInt(diff / 60) \n const sec = diff % 60\n let msg = 'datos de hace'\n if (min > 0 ) { msg = msg + ' ' + min + 'min' }\n if (sec > 0 ) { msg = msg + ' ' + sec + 's' }\n return msg\n }\n\n // Last Updated: every second it should update the age of the data\n useEffect( () => {\n let interval\n if (vList.length > 0) {\n const fechaISO = rays[vList[0]].DateTime // 2020-04-22 17:08:00\n const date = new Date(fechaISO + 'Z') // a Date object. Z means UTC\n interval = setInterval( () => {\n const diff = diffDates(date.getTime())\n debug && console.log('This every 1000ms:', diff)\n setLastUpdated(diff)\n }, 1000)\n }\n return () => clearInterval(interval)\n }, [vList])\n\n // Sparklines\n debug && console.log({statistics})\n\n // Current reds, yellows and greens. The ones for sparkline come in statistics props.\n const numReds = vList.filter(NoVolcano => rays[NoVolcano].Cod_Color === 2 ).length\n const numYellows = vList.filter(NoVolcano => rays[NoVolcano].Cod_Color === 1 ).length\n const numGreens = vList.filter(NoVolcano => rays[NoVolcano].Cod_Color === 0 ).length\n debug && console.log({numReds, numYellows, numGreens})\n\n\n return (\n \n Estadísticas \n \n ({lastUpdated})\n \n \n

\n \n {numReds} rojo \n

\n

\n \n {numYellows} amarillo \n

\n

\n \n {numGreens} verde \n

\n
\n \n
\n )\n}\n\nexport default MapStats;","import React from 'react';\nimport './LastChanges.css'\nimport Card from 'react-bootstrap/Card'\n\n\nconst LastChanges = ({messages}) => {\n const colores = ['verde', 'amarillo', 'rojo']\n return (\n \n Últimos avisos\n \n {messages.map((v,i) => {\n const date = new Date(v.DateTime)\n let mm = date.getMinutes()\n mm = mm > 9 ? mm : '0' + mm\n const hhmm = date.getHours() + \":\" + mm + \"hs\"\n return(
\n \n {date.getDate()}/{date.getMonth() + 1}/{date.getFullYear()} - {hhmm}, {v.Region}\n \n {v.Nombre} pasó de {colores[v.last_cod_color]} a {colores[v.curr_cod_color]}\n
\n )\n })}\n
\n
\n )\n}\n\nexport default LastChanges;\n","import React, {Component} from 'react'\nimport { Line } from 'react-chartjs-2'\nimport * as zoom from 'chartjs-plugin-zoom'\nimport 'chartjs-adapter-date-fns';\nimport {es} from 'date-fns/locale';\n\n\n// https://stackoverflow.com/questions/59734992/using-epoch-as-time-series-on-x-axis-in-react-chartjs-2-not-showing-correct-date\n// https://github.com/chartjs/chartjs-plugin-zoom/issues/64\n// https://github.com/chartjs/chartjs-plugin-zoom\n// Time format (for the x Axis):\n// https://www.chartjs.org/docs/latest/axes/cartesian/time.html\n//\n// Alternativas:\n// https://visjs.org/\n// https://gionkunz.github.io/chartist-js/examples.html#example-line-svg-animation\n// https://medium.com/@mtiller/open-source-plotting-libraries-primarily-for-react-c43cfa4dc90f\n\n\n// Props:\n// * data: the data (list of objects)\n// * label: e.g. volcano XXXXX-XX\n// * title: The graph's color\nconst Chart = ({data, label, title}) => { \n const chartData = {\n labels: data.map(entry => new Date(entry.DateTime).getTime()),\n datasets: [{\n label: label,\n // In order to make some padding, we make 5 categories: empty, green, yellow, red and empty.\n // Thus, we need to make 0 -> 1, 1 -> 2 and 2 -> 3\n data: data.map(entry => entry.Cod_Color + 1),\n // borderColor: the Line Color.\n // borderColor: ctx => { \n // return ctx.dataset.data[ctx.dataIndex] === 1 ? '#00FF00' :\n // ctx.dataset.data[ctx.dataIndex] === 2 ? '#FFFF00' :\n // ctx.dataset.data[ctx.dataIndex] === 3 ? '#FF0000' :\n // '#0000FF'\n // },\n // backgroundColor: the area color\n backgroundColor:'rgb(0, 0, 0, 0.05', // green, almost transparent\n lineTension: 0,\n // https://www.chartjs.org/docs/latest/configuration/elements.html#point-styles\n pointBackgroundColor: ctx => { \n return ctx.dataset.data[ctx.dataIndex] === 1 ? '#00FF00' :\n ctx.dataset.data[ctx.dataIndex] === 2 ? '#FFFF00' :\n ctx.dataset.data[ctx.dataIndex] === 3 ? '#FF0000' :\n '#0000FF'\n },\n radius: 6, // the point's radius\n }]\n }\n\n const getRayosInOutforIndex = idx => [ data[idx].Rayos_in, data[idx].Rayos_out]\n\n return (\n
\n { \n const rayos = getRayosInOutforIndex(tooltipItem.index)\n return `Rayos Internos: ${rayos[0]} Rayos externos: ${rayos[1]}`\n }\n }\n },\n layout: {\n borderColor: '#FF0000',\n borderWidth: 10,\n },\n scales: {\n yAxes: [{\n // category means that it has fixed values\n type: 'category',\n labels: ['', 'verde', 'amarillo', 'rojo', ''],\n ticks: {\n reverse: true, // important, please don't change\n }\n }],\n xAxes: [{ \n adapters: {\n date: {\n locale: es\n }\n },\n type: 'time',\n time: {\n // We want the month and day in the x Axis\n displayFormats: {\n minute: 'MMM d - h:mm a',\n hour: 'MMM d - ha',\n },\n }\n }]\n },\n maintainAspectRatio: false,\n title: {\n display: !!title,\n text: title,\n fontSize: 25,\n },\n legend: {\n display: !!title,\n position: 'right'\n },\n pan: {\n enabled: false, // conflicts with zoom\n mode: 'x',\n },\n zoom: {\n enabled: true, \n mode: 'x',\n drag: true,\n },\n }}\n />\n
\n\n )\n}\n\nexport default Chart","import React, {useEffect, useState} from 'react'\nimport Chart from './Chart'\nimport { getHistoricalDataFromVolcano } from '../../../lib/network'\n\n// ChartLogic busca los datos y devuelve el grafico solo cuando esten\nconst ChartLogic = ({NoVolcan}) => {\n const debug = 1\n const [data, setData] = useState([])\n const [isLoading, setIsLoading] = useState(true)\n \n useEffect( () => {\n const getEstadoUltimaSemana = async (NoVolcan) => {\n const rawData = await getHistoricalDataFromVolcano(NoVolcan)\n console.log({rawData})\n setData(rawData)\n }\n getEstadoUltimaSemana(NoVolcan)\n setIsLoading(false)\n }, [NoVolcan])\n debug && console.log({data})\n return (\n isLoading ? \n 'Loading...' :\n // No quiero title y label por ahora\n )\n}\n\nexport default ChartLogic","import React from 'react';\nimport ChartLogic from './ChartLogic'\nimport Card from 'react-bootstrap/Card'\n\nconst GraficoContainer = ({selectedVolcanoInfo}) => {\n console.log( 'GraficoContainer', {selectedVolcanoInfo})\n return (\n \n {selectedVolcanoInfo.Nombre} - estado ultimos 7 dias\n \n \n \n \n )\n}\n\nexport default GraficoContainer;","import React, {Component} from \"react\";\nimport MapComponent from '../../components/MapComponent/MapComponent'\nimport SearchCard from '../../components/SearchCard/SearchCard'\nimport MapStats from '../../components/MapStats/MapStats'\nimport LastChanges from '../../components/LastChanges/LastChanges'\nimport GraficoContainer from './Grafico/GraficoContainer'\nimport \"./Mapa.css\";\n\nimport Container from 'react-bootstrap/Container'\nimport Row from 'react-bootstrap/Row'\nimport Col from 'react-bootstrap/Col'\n\nimport client from '../../lib/feathers'\nimport _console from '../../lib/_console'\nimport {getCurrentData, getAvisos} from '../../lib/network'\n\nconst log = _console(false)\nconst debug = 0\n\nclass Mapa extends Component {\n constructor() {\n super()\n this.state = {\n allRays: {},\n visibleRays: {},\n statistics: {\n reds: [],\n yellows: [],\n greens: [],\n },\n avisos: [],\n // filter may be renamed to show or showInFilter. 1 means do show.\n filter: {\n red: 1,\n yellow: 1,\n green: 1\n },\n viewport: {\n center: [-31, -70], \n zoom: 3\n },\n selectedVolcanoInfo: {},\n }\n }\n\n ////////////////////\n // Helper functions\n ////////////////////\n updateRays = rays => {\n debug && console.log('Setting allRays to', {rays})\n this.setState({\n allRays: rays\n }, this.updateVisibleRays)\n }\n\n // Update the visibleRays (in case we are supposed to show only the greens, or only the yellows, etc.),\n // so that the map displays only them\n updateVisibleRays = () => {\n let newVisibleRays = Object.values(this.state.allRays).filter(item => {\n if ( item.Cod_Color === 0 && this.state.filter.green === 1 ) {\n return true\n }\n if ( item.Cod_Color === 1 && this.state.filter.yellow === 1 ) {\n return true\n }\n if ( item.Cod_Color === 2 && this.state.filter.red === 1 ) {\n return true\n }\n return false\n })\n this.setState({ visibleRays: newVisibleRays })\n }\n\n login = async () => {\n try {\n // First try to log in with an existing JWT\n return await client.reAuthenticate()\n } catch (error) {\n console.log('Couldnt reauth:', error)\n }\n }\n\n onFilterChange = color => {\n return value => {\n const newFilter = { ...this.state.filter, [color]: value }\n this.setState({ filter: newFilter }, this.updateVisibleRays)\n log.log('Changed', color, 'to', value)\n }\n }\n onViewportChanged = mapBounds => {\n this.setState({mapBounds})\n }\n\n selectVolcano = NoVolcan => {\n this.setState({selectedVolcanoInfo: Object.values(this.state.visibleRays).\n filter(item => item.NoVolcan === NoVolcan).\n shift()\n })\n }\n\n\n componentDidMount() {\n ///////////////////////////////////////\n // Login and get the initial state/data\n ///////////////////////////////////////\n this.login().then( async auth => {\n const avisos = await getAvisos()\n this.setState({avisos: avisos.data})\n })\n\n debug && console.log('Fetching for the first time...')\n getCurrentData().then(json => this.updateRays(json))\n\n ////////////////////////////\n // socket.io event handlers.\n ////////////////////////////\n client.service('avisos').on('created', message => {\n debug && console.log('Received aviso', message)\n this.setState( { avisos: [message].concat(this.state.avisos) } )\n })\n\n client.service('rayosbulk')\n .on('created', message => {\n debug && console.log('Nuevo mensaje de rayosbulk!', {message})\n\n let raysStateCopy = Object.assign({}, this.state.allRays)\n delete(raysStateCopy._id)\n\n // We need to update the state\n this.setState({\n allRays: message,\n })\n this.updateVisibleRays()\n\n // Update statistics for sparkline\n const numReds = Object.keys(message).filter(NoVolcano => message[NoVolcano].Cod_Color === 2 ).length\n const numYellows = Object.keys(message).filter(NoVolcano => message[NoVolcano].Cod_Color === 1 ).length\n const numGreens = Object.keys(message).filter(NoVolcano => message[NoVolcano].Cod_Color === 0 ).length\n this.setState({\n statistics: {\n reds: this.state.statistics.reds.concat([numReds]),\n yellows: this.state.statistics.yellows.concat([numYellows]),\n greens: this.state.statistics.greens.concat([numGreens]),\n },\n })\n });\n }\n\n\n render() {\n return(\n \n \n \n \n {\n this.state.selectedVolcanoInfo.NoVolcan ? (\n
\n \n
\n ) : ''\n }\n \n \n \n \n \n \n \n
\n
\n );\n }\n};\n\nexport default Mapa;","import React, {useState} from \"react\";\nimport { withRouter } from \"react-router\"\nimport UserContext from '../../lib/UserContext'\nimport Alert from 'react-bootstrap/Alert'\nimport Button from 'react-bootstrap/Button'\nimport Form from 'react-bootstrap/Form'\nimport client from '../../lib/feathers'\nimport 'bootstrap/dist/css/bootstrap.min.css';\nimport {required, isEmail, isBetween, validate} from '../../lib/myForm'\n\nconst RegisterComponent = ({history}) => {\n const [formData, setFormData] = useState({errors: []});\n\n const doSubmit = async formData => {\n await client.logout();\n console.log('Logged out')\n const {email, password} = formData\n\n try {\n return await client.authenticate({\n strategy: 'local',\n email, password\n })\n } catch(e) {\n console.log('Error while logging in:', e)\n setFormData({...formData, errors: ['Error al iniciar sesión:', e.message]})\n }\n }\n\n const handleSubmit = context => async e => {\n e.preventDefault()\n const errors = validate(formData, validations)\n if (errors.length > 0) {\n setFormData({...formData, errors})\n } else {\n const auth = await doSubmit(formData)\n if (auth !== undefined) {\n console.log('auth es', auth)\n context.setAuth(auth.user)\n history.push('/')\n }\n \n }\n }\n \n const handleChange = name => e => {\n console.log(name, e.target.value)\n setFormData({...formData, [name]: e.target.value})\n }\n\n // Each field has a list of tests. Each test is a list of two items:\n // The test itself (as a function) and the error text or a function that returns the error text.\n const validations = {\n email: [\n [required, 'La dirección de correo es obligatoria'],\n [isEmail, string => string + ' no parece una dirección de correo']\n ],\n password: [\n [required, 'La contraseña es obligatoria'],\n [isBetween(2,60), 'La contraseña debe tener entre 2 y 60 caracteres']\n ],\n }\n\n\n return(\n \n {\n context => { \n let alert = ''\n if (formData.errors.length > 0) {\n alert = (\n setFormData({...formData, errors: []})} dismissible>\n {formData.errors.map((error, i) =>

{error}

)}\n
\n )\n }\n \n return(\n
\n {alert}\n
\n \n Dirección de email\n \n \n \n Password\n \n \n\n \n
\n
)}\n }\n
\n )\n}\n\nexport default withRouter(RegisterComponent);\n\n","import React, { useState } from \"react\";\nimport LoginComponent from './LoginComponent2'\n// import RegisterComponent from './RegisterComponent2'\nimport Container from 'react-bootstrap/Container'\nimport Row from 'react-bootstrap/Row'\nimport Col from 'react-bootstrap/Col'\n\nimport 'bootstrap/dist/css/bootstrap.min.css';\nimport \"./Login.css\";\n\nconst Login = () => {\n const [action, setAction] = useState('login');\n return (\n \n \n \n \n \n
\n

Iniciar sesión \n
setAction('register')} >
\n

\n \n
\n \n \n \n
\n
\n\n );\n};\n\nexport default Login;\n","import React, {useState} from \"react\";\nimport { withRouter } from \"react-router\"\nimport UserContext from '../../lib/UserContext'\nimport Alert from 'react-bootstrap/Alert'\nimport Button from 'react-bootstrap/Button'\nimport Form from 'react-bootstrap/Form'\nimport 'bootstrap/dist/css/bootstrap.min.css';\nimport {validate} from '../../lib/myForm'\nimport client from '../../lib/feathers'\n\nconst ProfileComponent = ({history}) => {\n const logOut = context => async () => {\n context.setAuth(false, () => history.push('/'))\n }\n\n const [formData, setFormData] = useState({errors: []});\n\n const doSubmit = async formData => {\n // En algún momento actualizará las preferencias.\n }\n\n const handleSubmit = context => async e => {\n e.preventDefault()\n const errors = validate(formData, validations)\n if (errors.length > 0) {\n setFormData({...formData, errors})\n } else {\n const me = context.authInfo\n client.service('users').patch(me.id, { nombre: formData.nombre })\n history.push('/')\n }\n }\n \n const handleChange = name => e => {\n console.log(name, e.target.value)\n setFormData({...formData, [name]: e.target.value})\n }\n\n // Each field has a list of tests. Each test is a list of two items:\n // The test itself (as a function) and the error text or a function that returns the error text.\n // No validations - Nombre puede ser vacío\n const validations = {}\n\n\n return(\n \n {\n context => { \n let alert = ''\n if (formData.errors.length > 0) {\n alert = (\n setFormData({...formData, errors: []})} dismissible>\n {formData.errors.map((error, i) =>

{error}

)}\n
\n )\n }\n \n return(\n
\n {alert}\n
\n \n Nombre\n \n \n\n \n
\n \n
)}\n }\n
\n )\n}\n\nexport default withRouter(ProfileComponent);\n\n","import React from 'react'\nimport Container from 'react-bootstrap/Container'\nimport ProfileComponent from './ProfileComponent2'\n\nimport Row from 'react-bootstrap/Row'\nimport Col from 'react-bootstrap/Col'\n\nimport 'bootstrap/dist/css/bootstrap.min.css';\nimport './Profile.css'\n\nconst Profile = () => {\n return (\n \n \n \n \n \n
\n

Configuración

\n \n
\n \n \n \n
\n
)\n}\n\nexport default Profile","import React from 'react';\nimport './GeneralInfo.css'\nimport Card from 'react-bootstrap/Card'\nimport 'bootstrap/dist/css/bootstrap.min.css';\n\nconst Contacto = () => {\n return (\n \n Contacto\n \n

Daiana Baissac: dmbaissac@gmail.com

\n

Páginas de interés:

\n
    \n
  • https://www.argentina.gob.ar/defensa/citedef
  • \n
  • http://wwlln.net/
  • \n
  • http://wwlln.net/USGS/Global/
  • \n
\n
\n
\n )}\n\nconst GeneralInfo = () => {\n return (\n \n Información general\n \n

\n Georayos - VolcanoAr es una aplicación Web que brinda información acerca de la\n actividad eléctrica detectada en cercanías de cada volcán por la red WWLLN.\n

\n\n

\n Cuando un volcán entra en erupción, emite a la atmósfera una cantidad de material\n particulado y gases (principalmente vapor de agua). Esta mezcla forma una pluma volcánica\n que puede alcanzar grandes alturas, dependiendo de la intensidad de la erupción y las\n condiciones atmosféricas en el lugar.\n

\n\n

\n La interacción de las partículas y los gases pueden generar descargas eléctricas (rayos y\n relámpagos) de distintas características en las diferentes partes de la pluma volcánica.\n Particularmente, cuando la pluma volcánica alcanza una altura considerable, la atmósfera se\n encuentra suficientemente fría como para permitir el crecimiento de cristales de hielo. Las\n descargas eléctricas que se pueden producir en estas condiciones son similares a las\n producidas durante una tormenta eléctrica meteorológica. Estas descargas eléctricas\n volcánicas, de gran intensidad, pueden ser registradas por las antenas diseñadas para detectar\n descargas atmosféricas de la red global WWLLN.\n

\n\n

\n En base a este fenómeno y dado que las descargas eléctricas volcánicas son similares a\n las descargas eléctricas atmosféricas, en VolcanoAr realizamos una clasificación de los volcanes\n según la probabilidad de que la electrificación registrada sea producto de una erupción\n volcánica explosiva. De esta manera tomamos las descargas eléctricas detectadas por\n la WWLLN-Ash Cloud Monitor, dentro de un radio de 20 km del\n centro de cada volcán y en un anillo de entre 20 y 100 km del centro del volcán, para los\n volcanes de mayor riesgo en el sector delimitado entre -10 a -90 latitud sur y -10 a – 90\n longitud oeste. Cada volcán se clasifica según la relación entre las descargas dentro del radio\n de 20 km y exteriores a este. Esta clasificación se expresa en una escala de tres colores: Rojo –\n Amarillo – Verde, correspondiéndose el rojo a las mayores posibilidades de que dicho volcán\n se encuentre en erupción y disminuyendo hacia e verde.\n

\n\n
Contacto
\n

Daiana Baissac: dmbaissac@gmail.com

\n\n
Páginas de interés:
\n \n \n
\n
\n )\n}\n\nexport default GeneralInfo;","import React, {useState, useEffect} from 'react'\nimport Container from 'react-bootstrap/Container'\n\nimport Row from 'react-bootstrap/Row'\nimport Col from 'react-bootstrap/Col'\n\nimport MapComponent from '../../components/MapComponent/MapComponent'\nimport GeneralInfo from './GeneralInfo'\nimport {getCurrentData} from '../../lib/network'\n\nimport 'bootstrap/dist/css/bootstrap.min.css';\nimport './About.css'\nimport Card from 'react-bootstrap/Card'\n\nconst Leyend = () => {\n return (\n
\n \n

Descargas eléctricas detectadas, tienen mayor probabilidad de provenir de una erupción volcánica explosiva.

\n \n

Descargas eléctricas detectadas, son probablemente provenientes de una tormenta eléctrica meteorológica cercana.

\n \n

Descargas eléctricas detectadas,tienen mayor probabilidad de provenir de una tormenta eléctrica meteorológica, \n o no hay descargas eléctricas.

\n
\n )\n}\n\nconst About = () => {\n const [v, setV] = useState([])\n const viewport = {\n center: [-31, -70], \n zoom: 3\n }\n\n useEffect( () => {\n getCurrentData().then(json => setV(json))\n }, [])\n\n return (\n \n \n {/* xs, sm, md, large, and xl) */}\n \n
\n \n
\n \n \n {}}/>\n \n \n
\n
\n )\n}\n\nexport default About","import React from 'react'\n\nimport 'bootstrap/dist/css/bootstrap.min.css';\nimport './VolcanesList.css'\n\nconst VolcanesList = () => {\n return (\n

Lista

)\n}\n\nexport default VolcanesList","import React from 'react'\nimport Container from 'react-bootstrap/Container'\n\nimport Row from 'react-bootstrap/Row'\nimport Col from 'react-bootstrap/Col'\n\nimport VolcanesList from './VolcanesList'\n\nimport 'bootstrap/dist/css/bootstrap.min.css';\nimport './Volcanes.css'\n\nconst Volcanes = () => {\n return (\n \n \n \n \n \n
\n

Lista de Volcanes

\n \n
\n \n \n \n
\n
)\n}\n\nexport default Volcanes","function urlBase64ToUint8Array(base64String) {\n const padding = '='.repeat((4 - base64String.length % 4) % 4);\n const base64 = (base64String + padding)\n .replace(/-/g, '+')\n .replace(/_/g, '/');\n \n const rawData = window.atob(base64);\n const outputArray = new Uint8Array(rawData.length);\n \n for (let i = 0; i < rawData.length; ++i) {\n outputArray[i] = rawData.charCodeAt(i);\n }\n return outputArray;\n}\n\n\n\n// if (!('PushManager' in window)) {\n// // Push isn't supported on this browser, disable or hide UI.\n// return;\n// }\n\n// Register the serviceWorker - returns registration object\n// function registerServiceWorker() {\n// return navigator.serviceWorker.register('/worker.js')\n// .then(function(registration) {\n// console.log('Service worker successfully registered.');\n// return registration;\n// })\n// .catch(function(err) {\n// console.error('Unable to register service worker.', err);\n// });\n// }\n\n// // Request Permission\n// function askPermission() {\n// return new Promise(function(resolve, reject) {\n// const permissionResult = Notification.requestPermission(function(result) {\n// resolve(result);\n// });\n\n// if (permissionResult) {\n// permissionResult.then(resolve, reject);\n// }\n// })\n// .then(function(permissionResult) {\n// if (permissionResult !== 'granted') {\n// throw new Error('We weren\\'t granted permission.');\n// }\n// });\n// }\n\nconst getSubscription = async () => {\n if (!('serviceWorker' in navigator)) {\n // Service Worker isn't supported on this browser, disable or hide UI.\n return;\n }\n navigator.serviceWorker.register('/worker.js');\n const registration = await navigator.serviceWorker.ready\n // console.log({registration})\n\n let subscription = await registration.pushManager.getSubscription()\n // console.log({subscription})\n\n // if (subscription) {\n // return subscription;\n // }\n \n const vapidPublicKey = 'BCR8msXQ-6pEROebYEeVinhRaWupKoKCfRuKxH8wcRu1tOg9wUYSGHs7gQhwyDlnyUlOGnX7kI82yh8MSntvrBo'\n const convertedVapidKey = urlBase64ToUint8Array(vapidPublicKey);\n \n // console.log('index.js: no subscription. Subscribe!')\n \n subscription = await registration.pushManager.subscribe({\n userVisibleOnly: true,\n applicationServerKey: convertedVapidKey\n });\n \n if (subscription) {\n fetch('/api/register', {\n method: 'post',\n headers: {\n 'Content-type': 'application/json'\n },\n body: JSON.stringify({\n subscription: subscription\n }),\n });\n }\n return subscription\n}\n\n// const subscription = getSubscription()\n// console.log({subscription})\n\n\n // const payload = 'Im the payload'\n // const delay = 5\n // const ttl = 200\n\n // fetch('/api/sendNotification', {\n // method: 'post',\n // headers: {\n // 'Content-type': 'application/json'\n // },\n // body: JSON.stringify({\n // subscription: subscription,\n // payload: payload,\n // delay: delay,\n // ttl: ttl,\n // }),\n // });\n\n\n\nexport default getSubscription","import React, { useState } from \"react\";\nimport { withRouter } from \"react-router\"\n\nimport Card from 'react-bootstrap/Card'\nimport Button from 'react-bootstrap/Button'\n\nimport Container from 'react-bootstrap/Container'\nimport Row from 'react-bootstrap/Row'\nimport Col from 'react-bootstrap/Col'\n\nimport 'bootstrap/dist/css/bootstrap.min.css';\nimport \"./Admin.css\";\n\nconst Admin = ({history}) => {\n const [action, setAction] = useState('login');\n return (\n \n \n \n \n Usuarios\n \n

Administrar usuarios, incluido quien es administrador.

\n \n
\n
\n \n \n \n Volcanes\n \n

Administrar la lista de volcanes, incluidos los links que aparecen en el popup.

\n \n
\n
\n \n \n \n Backup\n \n

Bajar un backup en CSV de todos los datos.

\n \n
\n
\n \n
\n
\n\n );\n};\n\nexport default withRouter(Admin);\n","import React from \"react\";\nimport BootstrapTable from 'react-bootstrap-table-next';\n\nimport 'react-bootstrap-table-next/dist/react-bootstrap-table2.min.css';\n\nconst TableComponent = props => {\n return (\n \n )\n}\n\nexport default TableComponent","import React, { useState, useEffect } from \"react\";\nimport { withRouter } from 'react-router-dom'\nimport paginationFactory from 'react-bootstrap-table2-paginator';\nimport 'react-bootstrap-table2-paginator/dist/react-bootstrap-table2-paginator.min.css';\n\nimport Container from 'react-bootstrap/Container'\nimport Row from 'react-bootstrap/Row'\nimport Col from 'react-bootstrap/Col'\nimport Button from 'react-bootstrap/Button'\nimport Alert from 'react-bootstrap/Alert'\n\nimport TableComponent from '../TableComponent'\nimport client from '../../../lib/feathers'\nimport \"./AdminUsers.css\";\n\n\n\nconst AdminUsers = ({history}) => {\n const [users, setUsers] = useState({data: []})\n const [alert, setAlert] = useState('')\n\n const getUsers = async () => {\n console.log('Getting users...')\n const usersService = client.service('users')\n\n const usersList = await usersService.find({\n query: { $limit: 9999 }\n })\n console.log('Got users:', usersList)\n setUsers({data: usersList.data})\n }\n\n useEffect( () => {\n getUsers()\n }, [])\n \n const columns = [{ dataField: 'id', text: 'id', style: { width: \"2rem\"}, headerStyle: { width: '2rem' }, },\n { dataField: 'nombre', text: 'Nombre' },\n { dataField: 'email', text: 'Email' },\n { dataField: 'isAdmin', text: 'Admin?', style: { width: \"5rem\"}, headerStyle: { width: '5rem' } }, \n { \n isDummyField: true, \n text: '', \n style: { width: \"4rem\"}, \n headerStyle: { width: '4rem' },\n align: 'right',\n formatter: (cellContent, row) => (
\n history.push('/admin/users/' + row.id)}>\n confirmDelete(row.id)}>\n
) \n } \n ]\n const indication = () => {\n return 'Tabla vacia'\n }\n \n const confirmDelete = id => {\n setAlert(\n setAlert('')} dismissible>\n ¿Está seguro/a de que quiere borrar al usuario {id}?\n \n \n )\n }\n\n const doDeleteUser = async (id) => {\n console.log('Deleting userId', id, 'after confirmation')\n try {\n await client.service('users').remove(id)\n setAlert('')\n } catch(e) {\n console.log(e)\n setAlert(\n setAlert('')} dismissible>\n {e.message}\n \n )\n }\n getUsers()\n }\n\n return (\n \n

Administrar usuarios

\n {alert}\n \n \n \n {\n users.data.length > 0 ?\n :

Loading...

\n }\n \n
\n
\n )\n};\n\nexport default withRouter(AdminUsers);\n","import React, { useState, useEffect } from 'react'\nimport { useParams } from 'react-router-dom'\nimport Form from 'react-bootstrap/Form'\nimport Button from 'react-bootstrap/Button'\nimport Alert from 'react-bootstrap/Alert'\nimport 'bootstrap/dist/css/bootstrap.min.css';\nimport client from '../../lib/feathers'\nimport {required, isEmail, isBetween, isEqualToField, validate} from '../../lib/myForm'\n\nconst AdminEditUserComponent = () => {\n const [formData, setFormData] = useState({errors: [], success: []});\n \n // Need a state for every field if I want to give it value={}. \n // Else, react will complain about controlled and uncontrolled components\n const [nombre , setNombre] = useState('')\n const [email , setEmail] = useState('')\n const [isAdmin , setIsAdmin] = useState(false)\n\n const { id } = useParams()\n useEffect( () => {\n const getUserData = async () => {\n const userData = await client.service('users').get(id)\n console.log({userData})\n setNombre(userData.nombre || '')\n setEmail(userData.email || '')\n setIsAdmin(userData.isAdmin === 'yes' ? true : false)\n }\n getUserData()\n }, [])\n\n const handleSubmit = async e => {\n e.preventDefault()\n const errors = validate({nombre, email, isAdmin}, validations)\n if (errors.length > 0) {\n setFormData({errors, success: []})\n } else {\n // OK!\n console.log('Validation ok for', {nombre, email, isAdmin})\n let isAdminYN = 'no'\n if (isAdmin) {\n isAdminYN = 'yes'\n }\n try {\n console.log({isAdminYN})\n await client.service('users').patch(id, { nombre, email, isAdmin: isAdminYN })\n setFormData({success: ['Usuario actualizado'], errors: []})\n } catch(e) {\n console.log('Error while registering:', e)\n setFormData({errors: ['Error al actualizar el nuevo usuario'], success: []})\n }\n }\n }\n\n const handleChange = updateState => e => {\n console.log(e.target.value)\n updateState(e.target.value)\n }\n\n const handleCheckbox = e => {\n console.log({isAdmin})\n setIsAdmin(!isAdmin)\n }\n\n // Each field has a list of tests. Each test is a list of two items:\n // The test itself (as a function) and the error text or a function that returns the error text.\n const validations = {\n email: [\n [required, 'La dirección de correo es obligatoria'],\n [isEmail, string => string + ' no parece una dirección de correo']\n ],\n }\n\n let alert = ''\n if (formData.errors && formData.errors.length > 0) {\n alert = (\n setFormData({...formData, errors: []})} dismissible>\n {formData.errors.map((error, i) =>

{error}

)}\n
\n )\n }\n let success = ''\n if (formData.success && formData.success.length > 0) {\n success = (\n setFormData({...formData, success: []})} dismissible>\n {formData.success.map((success, i) =>

{success}

)}\n
\n )\n }\n\n return(\n
\n {alert}{success}\n
\n \n Nombre\n \n \n \n Email\n \n \n\n \n Contraseña\n \n \n \n\n \n \n \n \n
\n
\n )\n}\n\nexport default AdminEditUserComponent","import React from \"react\";\nimport Container from 'react-bootstrap/Container'\nimport Row from 'react-bootstrap/Row'\nimport Col from 'react-bootstrap/Col'\n\nimport AdminEditUserComponent from '../AdminEditUserComponent'\nimport 'bootstrap/dist/css/bootstrap.min.css';\nimport \"./AdminEditUser.css\";\n\nconst AdminEditUser = () => {\n return (\n \n \n \n \n \n \n \n \n \n \n \n\n );\n};\n\nexport default AdminEditUser;\n","import { required, isEmail, isBetween, isEqualToField } from '../../../../lib/myForm'\n\n// Each field has a list of tests. Each test is a list of two items:\n// The test itself (as a function) and the error text or a function that returns the error text.\nexport const validations = {\n email: [\n [required, 'La dirección de correo es obligatoria'],\n [isEmail, string => string + ' no parece una dirección de correo']\n ],\n password: [\n [required, 'La contraseña es obligatoria'],\n [isBetween(2,60), 'La contraseña debe tener entre 2 y 60 caracteres']\n ],\n password2: [\n [required, 'La segunda contraseña es obligatoria'],\n [isEqualToField('password'), 'Las dos contraseñas deben ser iguales']\n ]\n}","import React, { useState } from 'react'\nimport Alert from 'react-bootstrap/Alert'\nimport 'bootstrap/dist/css/bootstrap.min.css';\nimport client from '../../../../lib/feathers'\nimport { validate, createFormFromSchema } from '../../../../lib/myForm'\nimport { validations } from './validations'\n\nconst NewUserComponent = () => {\n const [formData, setFormData] = useState({errors: [], success: []});\n\n const handleSubmit = async e => {\n e.preventDefault()\n const errors = validate(formData, validations)\n if (errors.length > 0) {\n setFormData({...formData, errors})\n } else {\n // OK!\n console.log('Validation ok for', formData)\n const { nombre, email, password } = formData\n const isAdmin = formData.isAdmin === 'on' ? 'yes' : 'no'\n try {\n await client.service('users').create({ nombre, email, password, isAdmin })\n setFormData({...formData, success: ['Nuevo usuario ' + formData.email + ' creado'], errors: []})\n } catch(e) {\n console.log('Error while registering:', e)\n setFormData({...formData, errors: ['Error al crear el nuevo usuario']})\n }\n }\n }\n\n const handleChange = name => e => {\n console.log(name, e.target.value)\n setFormData({...formData, [name]: e.target.value})\n }\n\n let alert = ''\n if (formData.errors && formData.errors.length > 0) {\n alert = (\n setFormData({...formData, errors: []})} dismissible>\n {formData.errors.map((error, i) =>

{error}

)}\n
\n )\n }\n let success = ''\n if (formData.success && formData.success.length > 0) {\n success = (\n setFormData({...formData, success: []})} dismissible>\n {formData.success.map((success, i) =>

{success}

)}\n
\n )\n }\n\n // name , label, type, onChange, placeholder\n const formSchema = [\n ['nombre', 'Nombre', 'input', handleChange('nombre'), ''],\n ['email', 'Direccion de Email', 'input', handleChange('email'), ''],\n ['password', 'Contraseña', 'password', handleChange('password'), ''],\n ['password2', 'Contraseña (de nuevo)', 'password', handleChange('password2'), ''],\n ['enabled', 'Es Administrador?', 'checkbox', handleChange('isAdmin') ],\n ['', 'Crear Usuario', 'submit', handleSubmit ],\n ]\n \n return(\n
\n {alert}{success}\n {createFormFromSchema(formSchema)}\n
\n )\n}\n\nexport default NewUserComponent","import React from \"react\";\nimport Container from 'react-bootstrap/Container'\nimport Row from 'react-bootstrap/Row'\nimport Col from 'react-bootstrap/Col'\n\nimport NewUserComponent from './NewUserComponent'\nimport 'bootstrap/dist/css/bootstrap.min.css';\n\nconst NewUserPage = () => {\n return (\n \n \n \n \n \n \n \n \n \n \n \n\n );\n};\n\nexport default NewUserPage;\n","import React, { useState, useEffect } from \"react\";\nimport { withRouter } from 'react-router-dom'\nimport paginationFactory from 'react-bootstrap-table2-paginator';\nimport 'react-bootstrap-table2-paginator/dist/react-bootstrap-table2-paginator.min.css';\n\nimport Container from 'react-bootstrap/Container'\nimport Row from 'react-bootstrap/Row'\nimport Col from 'react-bootstrap/Col'\nimport Button from 'react-bootstrap/Button'\nimport Alert from 'react-bootstrap/Alert'\n\nimport TableComponent from '../TableComponent'\nimport client from '../../../lib/feathers'\nimport \"./AdminVolcanes.css\";\n\n\n\nconst AdminVolcanes = ({history}) => {\n const [volcanes, setVolcanes] = useState({data: []})\n const [alert, setAlert] = useState('')\n\n const getVolcanes = async () => {\n console.log('Getting volcanes...')\n const service = client.service('volcanes')\n\n const vList = await service.find({\n query: { $limit: 9999 }\n })\n console.log('Got volcanes:', vList)\n setVolcanes({data: vList.data})\n }\n\n useEffect( () => {\n getVolcanes()\n }, [])\n \n const columns = [{ dataField: 'id', text: 'id', style: { width: \"2rem\"}, headerStyle: { width: '2rem' }, },\n { dataField: 'NoVolcan', text: 'NoVolcan', Astyle: { width: \"6rem\"}, AheaderStyle: { width: '6rem' } },\n { dataField: 'Nombre', text: 'Nombre' },\n { dataField: 'Region', text: 'Region' },\n { dataField: 'Type', text: 'Type' },\n { dataField: 'Lat', text: 'Lat', Astyle: { width: \"3rem\"}, AheaderStyle: { width: '3rem' } },\n { dataField: 'Lon', text: 'Lon', Astyle: { width: \"3rem\"}, AheaderStyle: { width: '3rem' } },\n { dataField: 'enabled', text: 'Usar?', Astyle: { width: \"4rem\"}, AheaderStyle: { width: '4rem' } }, \n { \n isDummyField: true, \n text: '', \n style: { width: \"6rem\"}, \n headerStyle: { width: '6rem' },\n align: 'right',\n formatter: (cellContent, row) => (
\n history.push('/admin/volcanes/' + row.id)}>\n confirmDelete(row.id)}>\n \n
)\n } \n ]\n const indication = () => {\n return 'Tabla vacia'\n }\n \n const confirmDelete = id => {\n setAlert(\n setAlert('')} dismissible>\n ¿Está seguro/a de que quiere borrar el volcan {id}?\n \n \n )\n }\n\n const doDeleteVolcan = async (id) => {\n console.log('Deleting id', id, 'after confirmation')\n try {\n await client.service('volcanes').remove(id)\n setAlert('')\n } catch(e) {\n console.log(e)\n setAlert(\n setAlert('')} dismissible>\n Hubo un error al borrar el volcan con ID {id}: {e.message}\n \n )\n }\n getVolcanes()\n }\n\n return (\n \n

Administrar volcanes

\n {alert}\n \n \n \n {\n volcanes.data.length > 0 ?\n :

{indication()}

\n }\n \n
\n
\n )\n};\n\nexport default withRouter(AdminVolcanes);\n","import { required, isANumber, isBetween } from '../../../../lib/myForm'\n\n// Each field has a list of tests. Each test is a list of two items:\n// The test itself (as a function) and the error text or a function that returns the error text.\nexport const validations = {\n NoVolcan: [\n [required, 'Por favor elija un codigo de volcan'],\n [isBetween(2,8), 'El codigo de volcan debe tener entre 2 y 8 caracteres']\n ],\n Nombre: [ [required, 'El nombre del volcan es obligatorio'] ], \n Region: [ [required, 'La region del volcan es obligatoria'] ], \n Type: [ [required, 'El tipo del volcan es obligatorio'] ], \n Lat: [\n [required, 'La latitud es obligatoria'],\n [isANumber, 'La latitud debe ser un numero'],\n ], \n Lon: [\n [required, 'La longitud es obligatoria'],\n [isANumber, 'La longitud debe ser un numero'],\n ],\n}","import React, { useState } from 'react'\n\nimport Alert from 'react-bootstrap/Alert'\nimport 'bootstrap/dist/css/bootstrap.min.css';\nimport client from '../../../../lib/feathers'\nimport { validate, createFormFromSchema } from '../../../../lib/myForm'\nimport { validations } from './validations'\n\nconst NewVolcanComponent = () => {\n const [formData, setFormData] = useState({errors: [], success: []});\n\n const handleSubmit = async e => {\n e.preventDefault()\n const errors = validate(formData, validations)\n setFormData({...FormData, errors})\n if (errors.length === 0) {\n // OK!\n setFormData({...FormData, errors: [], success: ['Validacion ok'] })\n console.log('Validation ok for', formData)\n const { NoVolcan, Nombre, Region, Type, Lat, Lon, link, text } = formData\n const enabled = formData.enabled === 'on' ? 1 : 0\n try {\n await client.service('volcanes').create({ NoVolcan, Nombre, Region, Type, Lat, Lon, link, text, enabled })\n setFormData({...formData, success: formData.success.concat(['Nuevo volcan ' + NoVolcan + ' creado']), errors: []})\n } catch(e) {\n console.log('Error while registering:', e)\n setFormData({...formData, errors: ['Error al crear el nuevo volcan']})\n } \n }\n }\n\n const handleChange = name => e => {\n console.log(name, e.target.value)\n setFormData({...formData, [name]: e.target.value})\n }\n\n let alert = ''\n if (formData.errors && formData.errors.length > 0) {\n alert = (\n setFormData({...formData, errors: []})} dismissible>\n {formData.errors.map((error, i) =>

{error}

)}\n
\n )\n }\n let success = ''\n if (formData.success && formData.success.length > 0) {\n success = (\n setFormData({...formData, success: []})} dismissible>\n {formData.success.map((success, i) =>

{success}

)}\n
\n )\n }\n\n // name , label, type, onChange, placeholder\n const formSchema = [\n ['NoVolcan', undefined, 'input', handleChange('NoVolcan'), 'El codigo del volcan. Ej: 1243-22-'],\n ['Nombre', undefined, 'input', handleChange('Nombre'), 'Ej. Payun Matru'],\n ['Region', undefined, 'input', handleChange('Region'), 'Ej. Argentina'],\n ['Type', undefined, 'input', handleChange('Type'), 'Ej. Shield Volcano'],\n ['Lat', undefined, 'input', handleChange('Lat'), ''],\n ['Lon', undefined, 'input', handleChange('Lon'), ''],\n ['link', 'Link', 'input', handleChange('link'), ''],\n ['enabled', 'Mostrar en mapa?', 'checkbox', handleChange('enabled') ],\n ['text', 'Descripcion', 'input', handleChange('text'), 'Notas...'],\n ['', 'Agregar Volcan', 'submit', handleSubmit ],\n ]\n \n return(\n
\n {alert}{success}\n {createFormFromSchema(formSchema)}\n
\n )\n}\n\nexport default NewVolcanComponent","import React from \"react\";\nimport Container from 'react-bootstrap/Container'\nimport Row from 'react-bootstrap/Row'\nimport Col from 'react-bootstrap/Col'\n\nimport NewVolcanComponent from './NewVolcanComponent'\nimport 'bootstrap/dist/css/bootstrap.min.css';\n\nconst NewVolcanPage = () => {\n return (\n \n \n \n \n \n \n \n \n \n \n \n\n );\n};\n\nexport default NewVolcanPage;\n","import {required, isANumber, isBetween} from '../../../../lib/myForm'\n// Each field has a list of tests. Each test is a list of two items:\n// The test itself (as a function) and the error text or a function that returns the error text.\nexport const validations = {\n NoVolcan: [\n [required, 'Por favor elija un codigo de volcan'],\n [isBetween(2,8), 'El codigo de volcan debe tener entre 2 y 8 caracteres']\n ],\n Nombre: [ [required, 'El nombre del volcan es obligatorio'] ], \n Region: [ [required, 'La region del volcan es obligatoria'] ], \n Type: [ [required, 'El tipo del volcan es obligatorio'] ], \n Lat: [\n [required, 'La latitud es obligatoria'],\n [isANumber, 'La latitud debe ser un numero'],\n ], \n Lon: [\n [required, 'La longitud es obligatoria'],\n [isANumber, 'La longitud debe ser un numero'],\n ],\n}","import React, { useState, useEffect } from 'react'\nimport { useParams } from 'react-router-dom'\nimport Alert from 'react-bootstrap/Alert'\nimport 'bootstrap/dist/css/bootstrap.min.css';\nimport client from '../../../../lib/feathers'\nimport { validate, createFormFromSchema } from '../../../../lib/myForm'\nimport { validations } from './validations'\n\nconst EditVolcanComponent = () => {\n const [formStatus, setFormStatus] = useState({errors: [], success: []});\n // Need a state for every field if I want to give it value={}. \n // Else, react will complain about controlled and uncontrolled components\n const [NoVolcan , setNoVolcan] = useState('')\n const [Nombre , setNombre] = useState('')\n const [Region , setRegion] = useState('')\n const [Type , setType] = useState('')\n const [Lat , setLat] = useState('')\n const [Lon , setLon] = useState('')\n const [link , setLink] = useState('')\n const [text , setText] = useState('')\n const [enabled , setEnabled] = useState(true)\n console.log('Rerun everything...')\n\n const { id } = useParams()\n\n useEffect( () => {\n const getVData = async () => {\n const vData = await client.service('volcanes').get(id)\n console.log({vData})\n setNoVolcan(vData.NoVolcan || '')\n setNombre(vData.Nombre || '')\n setRegion(vData.Region || '')\n setType(vData.Type || '')\n setLat(vData.Lat || '')\n setLon(vData.Lon || '')\n setLink(vData.link || '')\n setText(vData.text || '')\n if (vData.enabled === 1) {\n console.log('enabled is true')\n setEnabled(true)\n } else {\n console.log('enabled is false')\n setEnabled(false)\n }\n }\n getVData()\n }, [id])\n\n const handleSubmit = async e => {\n e.preventDefault()\n const formData = { NoVolcan, Nombre, Region, Type, Lat, Lon, link, text, enabled }\n const errors = validate(formData, validations)\n setFormStatus({ errors, success: []})\n if (errors.length === 0) {\n // OK!\n setFormStatus({errors: [], success: ['Validacion ok'] })\n console.log('Validation ok for', formData)\n formData.enabled = formData.enabled ? 1 : 0\n \n try {\n await client.service('volcanes').patch(id, formData)\n setFormStatus({ success: formStatus.success.concat(['Volcan ' + NoVolcan + ' actualizado']) })\n } catch(e) {\n console.log('Error while registering:', e)\n setFormStatus({ errors: formStatus.errors.concat(['Error al crear el nuevo volcan'])})\n }\n }\n }\n\n const handleChange = updateState => e => {\n console.log(e.target.value)\n updateState(e.target.value)\n }\n\n const handleCheckbox = e => setEnabled(!enabled)\n\n let alert = ''\n if (formStatus.errors && formStatus.errors.length > 0) {\n alert = (\n setFormStatus({})} dismissible>\n {formStatus.errors.map((error, i) =>

{error}

)}\n
\n )\n }\n let success = ''\n if (formStatus.success && formStatus.success.length > 0) {\n success = (\n setFormStatus({})} dismissible>\n {formStatus.success.map((success, i) =>

{success}

)}\n
\n )\n }\n\n // name , label, type, onChange, placeholder, value\n const formSchema = [\n ['NoVolcan', undefined, 'input', handleChange(setNoVolcan), 'El codigo del volcan. Ej: 1243-22-', NoVolcan],\n ['Nombre', undefined, 'input', handleChange(setNombre), 'Ej. Payun Matru', Nombre],\n ['Region', undefined, 'input', handleChange(setRegion), 'Ej. Argentina', Region],\n ['Type', undefined, 'input', handleChange(setType), 'Ej. Shield Volcano', Type],\n ['Lat', undefined, 'input', handleChange(setLat), '', Lat],\n ['Lon', undefined, 'input', handleChange(setLon), '', Lon],\n ['link', 'Link', 'input', handleChange(setLink), '', link],\n ['enabled', 'Mostrar en mapa?', 'checkbox', handleCheckbox, '', enabled],\n ['text', 'Descripcion', 'input', handleChange(setText), 'Notas...', text],\n ['', 'Modificar Volcan', 'submit', handleSubmit ],\n ]\n \n return(\n
\n {alert}{success}\n {createFormFromSchema(formSchema)}\n
\n )\n}\n\nexport default EditVolcanComponent","import React from \"react\";\nimport Container from 'react-bootstrap/Container'\nimport Row from 'react-bootstrap/Row'\nimport Col from 'react-bootstrap/Col'\n\nimport EditVolcanComponent from './EditVolcanComponent'\nimport 'bootstrap/dist/css/bootstrap.min.css';\n\nconst EditVolcanPage = () => {\n return (\n \n \n \n \n \n \n \n \n \n \n \n\n );\n};\n\nexport default EditVolcanPage;\n","import React from 'react';\nimport {BrowserRouter as Router, Switch, Route} from 'react-router-dom'\nimport client from './lib/feathers'\nimport _console from './lib/_console'\n\nimport NavBar from './components/NavBar/NavBar'\nimport NavBarSubMenu from './components/NavBar/NavBarSubMenu'\nimport Mapa from './Pages/Mapa/Mapa'\nimport Login from './Pages/Login/Login'\nimport Profile from './Pages/Profile/Profile'\nimport About from './Pages/About/About'\nimport Volcanes from './Pages/Volcanes/Volcanes'\nimport UserContext from './lib/UserContext'\nimport getSubscription from './lib/webpush'\nimport Admin from './Pages/Admin/Admin';\nimport AdminUsers from './Pages/Admin/AdminUsers/AdminUsers';\n\nimport AdminEditUser from './Pages/Admin/AdminEditUser/AdminEditUser'\nimport NewUserPage from './Pages/Admin/AdminUsers/New/NewUserPage'\n\nimport AdminVolcanes from './Pages/Admin/AdminVolcanes/AdminVolcanes';\nimport NewVolcanPage from './Pages/Admin/AdminVolcanes/New/NewVolcanPage'\nimport EditVolcanPage from './Pages/Admin/AdminVolcanes/Edit/EditVolcanPage'\n\n\nclass App extends React.Component {\n constructor(props) {\n super(props)\n const console = _console(false);\n this.state = { user: {}, isLoading: true, errorMessage: '' }\n getSubscription().then(subscription => this.state.user.subscription = subscription)\n\n // See if we have cached login information\n client.reAuthenticate().then( () => {\n // Add it to the context\n client.get('authentication').then(auth => {\n console.log('Getting auth from cache:', {auth})\n this.setState({user: auth.user, isLoading: false})\n })\n }).catch(e => {\n console.log('Couldnt reauth:', e.message)\n this.setState({isLoading: false})\n })\n\n }\n // Usuarios\n // * Anónimos: solo pantalla principal. Sin búsqueda (va info que me da Daiana) \n // ni avisos ni gráfico.\n // * Registrado: Mapa, nosotros, Perfil.\n // * Admin: Mapa, nosotros, admin de usuario y variables (qué variables son)\n handleRoutesByUser = user => {\n let routes\n if (!user || (user && !user.email)) {\n const links = [] // no extra links for not authenticated users\n routes = (\n \n \n \n \n \n \n )\n } else {\n let links = [ ['/', 'Mapa'], ['/about', 'Acerca de nosotros'] ]\n if (user.isAdmin === 'yes') { links.push(['/admin', 'Admin']) }\n routes = (\n \n \n \n \n \n \n \n \n \n { user.isAdmin === 'yes' ? : '' }\n { user.isAdmin === 'yes' ? : '' }\n { user.isAdmin === 'yes' ? : '' } // Era AdminNew\n\n { user.isAdmin === 'yes' ? : '' }\n { user.isAdmin === 'yes' ? : '' }\n { user.isAdmin === 'yes' ? : '' }\n { user.isAdmin === 'yes' ? : '' }\n \n \n )\n }\n return routes\n }\n\n\n \n render() {\n return (\n this.setState({user}, cb)}}>\n { this.state.isLoading ?

{this.state.errorMessage}

: this.handleRoutesByUser(this.state.user) }\n
\n )\n }\n}\n\nexport default App;\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.css';\nimport App from './App'\nimport 'bootstrap/dist/css/bootstrap.min.css';\n\nReactDOM.render(, document.getElementById('root'));\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\n// serviceWorker.unregister();\n"],"sourceRoot":""}