{"version":3,"sources":["serverUtils/apiUtils.js","serverUtils/authentication.js","contexts.js","serverUtils/count.js","pages/Admin/IOSSwitch.js","pages/Admin/CounterPanel.js","pages/Admin/Login.js","pages/Admin/Admin.js","pages/Display/CountDisplay.js","pages/Display/NotLive.js","pages/Display/Home.js","pages/NotFound.js","App.js","reportWebVitals.js","index.js"],"names":["serverUrl","process","fetchWithTimeout","resource","a","options","timeout","controller","AbortController","id","setTimeout","abort","fetch","signal","credentials","response","clearTimeout","getApi","endpoint","json","postApi","data","method","body","JSON","stringify","headers","Accept","getLoggedIn","login","token","CountContext","createContext","countMembers","undefined","countGuests","lastUpdate","maxCount","failed","setCountMembers","setCountGuests","getCountInfo","increaseCountMembers","increaseCountGuests","decreaseCountMembers","decreaseCountGuests","resetCount","setMaxCount","value","setLive","live","toString","IOSSwitch","withStyles","theme","root","width","height","padding","margin","spacing","switchBase","transform","color","palette","common","white","backgroundColor","opacity","border","thumb","track","borderRadius","grey","transition","transitions","create","checked","focusVisible","classes","props","Switch","focusVisibleClassName","disableRipple","CounterPanel","maxFailCount","useState","setFailed","context","useContext","showModal","setShowModal","maxCountModalState","setMaxCountModalState","onUpClickMember","useCallback","button","failCount","then","res","catch","Promise","resolve","onDownClickMember","onUpClickGuest","onDownClickGuest","onResetClick","console","log","onSetMaxClick","setMaxValue","handleModalSave","invalidModalInput","Number","isNaN","onLiveChange","event","target","className","Col","Alert","variant","FormControlLabel","control","onChange","name","label","Row","Button","size","disabled","onClick","Modal","show","onHide","backdrop","keyboard","Header","closeButton","Title","Body","InputGroup","hasValidation","Text","Form","Control","type","required","isInvalid","parseInt","defaultValue","Feedback","Footer","Login","setLoggedIn","clientId","onSuccess","callbackData","tokenId","loggedIn","error","onFailure","cookiePolicy","Admin","useEffect","Spinner","animation","CountDisplay","lastUpdateDateString","lastUpdateDate","Date","setUTCSeconds","toLocaleString","dateStyle","timeStyle","NotLive","Home","Consumer","NotFound","App","setLastUpdate","setFailCount","updateCountContext","countInfo","updateAndCountFailures","interval","setInterval","clearInterval","contextValue","basename","Provider","path","exact","reportWebVitals","onPerfEntry","Function","getCLS","getFID","getFCP","getLCP","getTTFB","ReactDOM","render","StrictMode","document","getElementById"],"mappings":"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","file":"static/js/main.1b25d6e3.chunk.js","sourcesContent":["const serverUrl = process.env.REACT_APP_SERVER_URL;\n\nasync function fetchWithTimeout(resource, options = {}) {\n const { timeout = 500 } = options;\n \n const controller = new AbortController();\n const id = setTimeout(() => controller.abort(), timeout);\n \n const response = await fetch(resource, {\n ...options,\n signal: controller.signal,\n credentials: 'include',\n });\n clearTimeout(id);\n \n return response;\n }\n\nexport const getApi = async (endpoint, timeout) => {\n const response = await fetchWithTimeout(serverUrl + endpoint, { timeout: timeout });\n return await response.json();\n}\n\nexport const postApi = async (endpoint, data, timeout) => {\n const response = await fetchWithTimeout(\n serverUrl + endpoint,\n {\n method: 'POST',\n body: JSON.stringify(data),\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json'\n },\n timeout: timeout\n }\n );\n return await response.json();\n}\n","import { getApi, postApi } from \"./apiUtils\";\n\nexport const getLoggedIn = async (timeout = 1000) => {\n return await getApi('/loggedin', timeout);\n};\n\nexport const login = async (token, timeout = 10000) => {\n return await postApi('/login', {token: token}, timeout);\n};","import { createContext } from 'react';\n\nexport const CountContext = createContext({\n countMembers: undefined,\n countGuests: undefined,\n lastUpdate: undefined,\n maxCount: undefined,\n failed: false,\n setCountMembers: (countMembers) => {},\n setCountGuests: (countGuests) => {}\n});\n","import { getApi, postApi } from \"./apiUtils\";\n\nexport const getCountInfo = async (timeout = 400) => {\n return await getApi('/countInfo', timeout);\n};\n\nexport const increaseCountMembers = async (timeout = 400) => {\n return await postApi('/count/members/up', {}, timeout);\n};\n\nexport const increaseCountGuests = async (timeout = 400) => {\n return await postApi('/count/guests/up', {}, timeout);\n};\n\nexport const decreaseCountMembers = async (timeout = 400) => {\n return await postApi('/count/members/down', {}, timeout);\n}; \n\nexport const decreaseCountGuests = async (timeout = 400) => {\n return await postApi('/count/guests/down', {}, timeout);\n}; \n\nexport const resetCount = async (timeout = 400) => {\n return await postApi('/count/reset', {}, timeout);\n};\n\nexport const setMaxCount = async (maxCount, timeout = 400) => {\n return await postApi('/maxCount/set', {value: maxCount}, timeout);\n};\n\nexport const setLive = async (live, timeout = 400) => {\n return await postApi('/setLive', {value: live.toString()}, timeout);\n};\n","import React from 'react';\nimport { withStyles } from '@material-ui/core/styles';\nimport Switch from '@material-ui/core/Switch';\n\nexport const IOSSwitch = withStyles((theme) => ({\n root: {\n width: 42,\n height: 26,\n padding: 0,\n margin: theme.spacing(1),\n },\n switchBase: {\n padding: 1,\n '&$checked': {\n transform: 'translateX(16px)',\n color: theme.palette.common.white,\n '& + $track': {\n backgroundColor: '#52d869',\n opacity: 1,\n border: 'none',\n },\n },\n '&$focusVisible $thumb': {\n color: '#52d869',\n border: '6px solid #fff',\n },\n },\n thumb: {\n width: 24,\n height: 24,\n },\n track: {\n borderRadius: 26 / 2,\n border: `1px solid ${theme.palette.grey[400]}`,\n backgroundColor: theme.palette.grey[50],\n opacity: 1,\n transition: theme.transitions.create(['background-color', 'border']),\n },\n checked: {},\n focusVisible: {},\n}))(({ classes, ...props }) => {\n return (\n \n );\n});","import React, { useCallback, useContext, useState } from \"react\";\nimport { Row, Col, Button, Alert, Modal, InputGroup, Form } from \"react-bootstrap\";\nimport './CounterPanel.css';\nimport { CountContext } from '../../contexts';\nimport { decreaseCountMembers, increaseCountMembers, decreaseCountGuests, increaseCountGuests, resetCount, setMaxCount, setLive } from \"../../serverUtils/count\";\nimport { FormControlLabel } from '@material-ui/core';\nimport { IOSSwitch } from \"./IOSSwitch\";\n\nfunction CounterPanel() {\n const maxFailCount = 10;\n const [failed, setFailed] = useState(false);\n \n const context = useContext(CountContext);\n const [showModal, setShowModal] = useState(false);\n const [maxCountModalState, setMaxCountModalState] = useState(undefined);\n\n const onUpClickMember = useCallback((button, failCount = 0) => {\n increaseCountMembers()\n .then(res => {\n context.setCountMembers(res.countMembers);\n })\n .catch(async () => {\n failCount++;\n if (failCount < maxFailCount) {\n await new Promise(resolve => setTimeout(resolve, 50));\n onUpClickMember(button, failCount);\n } else {\n setFailed(true);\n }\n });\n }, [context]);\n\n const onDownClickMember = useCallback((button, failCount = 0) => {\n if (context.countMembers > 0) {\n decreaseCountMembers()\n .then(res => {\n context.setCountMembers(res.countMembers);\n })\n .catch(async () => {\n failCount++;\n if (failCount < maxFailCount) {\n await new Promise(resolve => setTimeout(resolve, 50));\n onDownClickMember(button, failCount);\n } else {\n setFailed(true);\n }\n });\n }\n }, [context]);\n\n const onUpClickGuest = useCallback((button, failCount = 0) => {\n increaseCountGuests()\n .then(res => {\n context.setCountGuests(res.countGuests);\n })\n .catch(async () => {\n failCount++;\n if (failCount < maxFailCount) {\n await new Promise(resolve => setTimeout(resolve, 50));\n onUpClickGuest(button, failCount);\n } else {\n setFailed(true);\n }\n });\n }, [context]);\n\n const onDownClickGuest = useCallback((button, failCount = 0) => {\n if (context.countGuests > 0) {\n decreaseCountGuests()\n .then(res => {\n context.setCountGuests(res.countGuests);\n })\n .catch(async () => {\n failCount++;\n if (failCount < maxFailCount) {\n await new Promise(resolve => setTimeout(resolve, 50));\n onDownClickGuest(button, failCount);\n } else {\n setFailed(true);\n }\n });\n }\n }, [context]);\n\n const onResetClick = useCallback((button, failCount = 0) => {\n resetCount()\n .then(res => {\n context.setCountMembers(res.countMembers);\n context.setCountGuests(res.countGuests);\n })\n .catch(async () => {\n console.log(\"Fail\")\n failCount++;\n if (failCount < maxFailCount) {\n await new Promise(resolve => setTimeout(resolve, 50));\n onResetClick(button, failCount);\n } else {\n setFailed(true);\n }\n });\n }, [context]);\n\n const onSetMaxClick = useCallback(() => {\n setMaxCountModalState(context.maxCount);\n setShowModal(true);\n }, [context]);\n\n const setMaxValue = useCallback((value, failCount = 0) => {\n setMaxCount(value)\n .catch(async () => {\n failCount++;\n if (failCount < maxFailCount) {\n await new Promise(resolve => setTimeout(resolve, 50));\n setMaxValue(value, failCount);\n } else {\n setFailed(true);\n }\n });\n }, []);\n\n const handleModalSave = useCallback(() => {\n setShowModal(false);\n if (maxCountModalState !== context.maxCount) {\n setMaxValue(maxCountModalState);\n }\n }, [maxCountModalState, setMaxValue, context.maxCount]);\n \n\n const onModalInputChange = function(event) {\n setMaxCountModalState(parseInt(event.target.value));\n }\n const invalidModalInput = maxCountModalState === undefined || Number.isNaN(maxCountModalState) || maxCountModalState < 0;\n\n const onLiveChange = useCallback((event, failCount = 0) => {\n console.log(event.target.checked);\n setLive(event.target.checked)\n .catch(async () => {\n failCount++;\n if (failCount < maxFailCount) {\n await new Promise(resolve => setTimeout(resolve, 50));\n setLive(event.target.checked, failCount);\n } else {\n setFailed(true);\n }\n });\n }, []);\n\n return (\n
\n \n {failed && An error in connection to server...}\n
\n }\n label={\"Counter is \" + (context.live ? \"live\" : \"off\")}\n />\n
\n
\n \n \n
{context.countGuests === undefined || context.countMembers === undefined ? \"\" : context.countGuests + context.countMembers}
\n
\n \n \n
{context.countGuests}
\n \n \n
{context.countMembers}
\n \n
\n \n
\n \n\t\t\t\t\t\t\t\t\t\t\n Guests \n Members \n\t\t\t\t\t\t\t\t\t\t\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n setShowModal(false)}\n backdrop=\"static\"\n keyboard={false}\n >\n \n Set max count\n \n \n \n Max count:\n \n \n Please choose a positive integer.\n \n \n \n \n \n \n \n
\n );\n}\n \nexport default CounterPanel;\n","import React from \"react\";\nimport { Row, Col } from \"react-bootstrap\";\nimport GoogleLogin from 'react-google-login';\nimport { login } from \"../../serverUtils/authentication\";\nimport './Login.css'\n\nfunction Login({setLoggedIn}) {\n\n function responseGoogleSuccess(callbackData) {\n login(callbackData.tokenId)\n .then(res => { setLoggedIn(res.loggedIn) })\n .catch(console.error);\n }\n function responseGoogleFailure(callbackData) {\n console.error(callbackData);\n }\n\n return (\n \n
\n \n

Logga in här

\n
\n
\n \n
\n \n
\n \n );\n}\n\nexport default Login;","import React, { useState, useEffect } from \"react\";\nimport { Spinner } from 'react-bootstrap';\nimport { getLoggedIn } from \"../../serverUtils/authentication\";\nimport CounterPanel from \"./CounterPanel\";\nimport Login from \"./Login\";\nimport '../DivStyles.css';\n\nfunction Admin() {\n const [loggedIn, setLoggedIn] = useState();\n\n useEffect(() => {\n getLoggedIn()\n .then(data => { setLoggedIn(data.loggedIn) })\n .catch(console.error);\n }, []);\n\n return (\n
\n {loggedIn !== undefined\n ? loggedIn\n ? \n : \n :
\n }\n
\n );\n}\n \nexport default Admin;\n","import React from \"react\";\nimport { Row, Col } from \"react-bootstrap\";\nimport './CountDisplay.css';\n\nfunction CountDisplay({countMembers, countGuests, lastUpdate, maxCount} = {countMembers: 0, countGuests : 0, lastUpdate: 0, maxCount: 0}) {\n\n var lastUpdateDateString = \"--\";\n if(lastUpdate !== undefined) {\n const lastUpdateDate = new Date(0);\n lastUpdateDate.setUTCSeconds(lastUpdate);\n lastUpdateDateString = lastUpdateDate.toLocaleString(\n \"en-GB\",\n {\n dateStyle: \"long\",\n timeStyle: \"short\"\n }\n );\n }\n\n return (\n \n \n \n
\n Current count in Kons:\n
\n
\n \n
\n \n
{countGuests}
\n
{countMembers}
\n
{countGuests === undefined || countMembers === undefined ? \"\" : countGuests + countMembers}
\n
{maxCount}
\n
\n
\n
\n \n
\n Last reported on: {lastUpdateDateString}\n
\n
\n \n
\n ); \n}\n\nexport default CountDisplay;\n","import React from \"react\";\nimport { Row } from \"react-bootstrap\";\nimport './NotLive.css';\n\nfunction NotLive() {\n return (\n \n
\n \n
\n Counter is not live\n
\n
\n
\n
\n );\n};\n\nexport default NotLive;","import React from \"react\";\nimport { Alert } from \"react-bootstrap\";\nimport Spinner from 'react-bootstrap/Spinner';\nimport { CountContext } from \"../../contexts\";\nimport CountDisplay from \"./CountDisplay\";\nimport '../DivStyles.css';\nimport NotLive from \"./NotLive\";\n\nfunction Home() {\n return (\n \n {context => \n
\n {!context.failed\n ? context.live !== undefined\n ? context.live\n ? \n : \n :
\n : Failed to fetch data from server.
Either server is down or you've lost your connection.
\n }\n
\n }\n
\n );\n};\n\nexport default Home;\n","function NotFound() {\n return (\n
\n NotFound!\n
\n );\n }\n \n export default NotFound;","import {\n BrowserRouter as Router,\n Switch,\n Route\n} from \"react-router-dom\";\n\nimport Admin from './pages/Admin/Admin';\nimport Home from './pages/Display/Home';\nimport NotFound from './pages/NotFound';\nimport { useState, useEffect, useCallback } from 'react';\nimport { CountContext } from './contexts';\nimport { getCountInfo } from './serverUtils/count'\n\nfunction App() {\n const maxFailCount = 10;\n\n const [live, setLive] = useState(undefined);\n const [countMembers, setCountMembers] = useState(undefined);\n const [countGuests, setCountGuests] = useState(undefined);\n const [lastUpdate, setLastUpdate] = useState(undefined);\n const [maxCount, setMaxCount] = useState(undefined);\n const [failed, setFailed] = useState(false);\n const [failCount, setFailCount] = useState(0);\n\n const updateCountContext = useCallback(async () => {\n return await getCountInfo().then(countInfo => {\n setLive(countInfo.live === \"true\");\n setCountMembers(parseInt(countInfo?.countMembers));\n setCountGuests(parseInt(countInfo?.countGuests));\n setLastUpdate(parseInt(countInfo?.lastUpdate));\n setMaxCount(parseInt(countInfo?.maxCount));\n setFailed(false);\n\n return true;\n }).catch(() => {\n return false;\n });\n }, []);\n\n useEffect(() => {\n if (countMembers === undefined && countGuests === undefined && failCount === 0) {\n updateCountContext();\n }\n }, [countMembers, countGuests, failCount, updateCountContext]);\n\n const updateAndCountFailures = useCallback(async () => {\n if (await updateCountContext()) {\n setFailCount(0);\n } else {\n setFailCount(failCount + 1);\n if( failCount + 1 >= maxFailCount ) {\n setFailed(true);\n }\n }\n }, [failCount, updateCountContext])\n\n useEffect(() => {\n const interval = setInterval(async () => {\n updateAndCountFailures();\n }, 500);\n return () => clearInterval(interval);\n }, [updateAndCountFailures])\n\n\n const contextValue = {\n live: live,\n countMembers: countMembers,\n countGuests: countGuests,\n lastUpdate: lastUpdate,\n maxCount: maxCount,\n failed: failed,\n setCountMembers: setCountMembers,\n setCountGuests: setCountGuests\n };\n\n\n const rootPath = process.env.REACT_APP_ROOT_PATH || \"\";\n \n return (\n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n );\n}\n\nexport default App;\n","const reportWebVitals = onPerfEntry => {\n if (onPerfEntry && onPerfEntry instanceof Function) {\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\n getCLS(onPerfEntry);\n getFID(onPerfEntry);\n getFCP(onPerfEntry);\n getLCP(onPerfEntry);\n getTTFB(onPerfEntry);\n });\n }\n};\n\nexport default reportWebVitals;\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.css';\nimport App from './App';\nimport reportWebVitals from './reportWebVitals';\n\nReactDOM.render(\n \n \n ,\n document.getElementById('root')\n);\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\nreportWebVitals();\n"],"sourceRoot":""}