{"version":3,"sources":["contexts/rest/context.js","contexts/rest/use.js","contexts/config/context.js","contexts/config/use.js","components/landing_page/office_list.js","components/landing_page/landing_page_bottom.js","components/helpers/object.js","contexts/i18n/context.js","contexts/i18n/use.js","components/helpers/dropdownmenu.js","components/landing_page/landing_page_top.js","components/landing_page/landing_page.js","services/service-communicator.js","services/dto/serviceinfo.dto.js","services/dto/ticketinfo.dto.js","services/dto/officeinfo.dto.js","services/service-gala.js","services/service-nqc.js","contexts/rest/provider.js","components/helpers/geographic_distance.js","contexts/config/provider.js","components/queue_selection_page/queue_listitem.js","components/queue_selection_page/redirectbutton.js","components/logotype.js","components/header.js","components/footer.js","components/queue_selection_page/queue_emptylistitem.js","components/queue_selection_page/ticketfailuremodal.js","services/dto/queuedata.dto.js","components/queue_selection_page/queue_display.js","components/ticketinfo_page/ticket_cancelled.js","components/ticketinfo_page/dynamictickettextitem.js","components/ticketinfo_page/ticket_called.js","components/ticketinfo_page/ticket_waiting.js","components/ticketinfo_page/cancel_ticket_info.js","components/helpers/search.js","components/ticketinfo_page/ticketpage.js","contexts/theme/provider.js","contexts/i18n/provider.js","components/missingpage.js","components/forms_page/confirmationitem.js","components/forms_page/confirmation.js","components/forms_page/formspage.js","App.js","serviceWorker.js","index.js"],"names":["RestContext","createContext","state","actions","useRest","useContext","ConfigContext","useConfig","OfficeList","offices","filter","handleOfficeSelection","config","useState","filteredoffices","setFilteredOffices","theme","useTheme","classes","useStyles","useEffect","filteredOffices","x","name","Object","values","address","some","y","List","dense","style","width","tmp_offices","sort","a","b","distance","map","i","ListItem","key","Paper","elevation","className","paper","onClick","officeID","ListItemText","primary","Typography","secondary","street","zipcode","city","ListItemSecondaryAction","distancecontainer","String","distanceUnit","substr","toLowerCase","IconButton","icon","join","id","generate","makeStyles","color","palette","main","transform","display","flexDirection","alignItems","paddingLeft","LandingPageBottom","container","wrapper","flex","maxHeight","overflow","backgroundColor","background","height","isFalsyOrEmpty","obj","TranslationContext","useTranslation","DropdownMenu","languages","anchorEl","setAnchorEl","t","updateLanguage","edge","event","currentTarget","root","menuicon","keepMounted","open","Boolean","onClose","MenuItem","window","menu","padding","LandingPageTop","organization","searchboxlabel","searchbuttontext","findnearmetext","ortext","noresulttext","searchparams","setSearchParams","menuitems","setMenuItems","handleGeolocationUpdate","updateSearchFilter","submitHandler","preventDefault","searchParamsHandler","autofill","target","textContent","value","innercontainer","menuwrapper","menutextwrapper","variant","heading","menubuttonwrapper","form","onSubmit","e","Autocomplete","searchbox","onChange","freeSolo","options","renderInput","params","TextField","autoComplete","label","size","onKeyDown","buttonwrapper","Button","type","button","betweenbuttons","iconbutton","aria-label","marginLeft","marginRight","textAlign","marginTop","justifyContent","marginBottom","fontSize","button_text","border","minWidth","breakpoints","up","down","fontWeight","searchboxwrapper","position","paddingBottom","secondary_text","searchicon","top","left","LandingPage","ticket","searchfilter","toExistingTicket","loadedpalette","GetUrlIDFromOfficeID","useStyle","history","useHistory","cancelled","uselandingpage","push","office","localStorage","getItem","spinnercontainer","CircularProgress","spinner","backdrop","instance","axios","create","retrytimes","RefreshToken","JSON","parse","sessionStorage","tokenconfig","then","res","token","data","access_token","catch","error","console","debug","CallWithConfig","timeout","log","result","interceptors","request","use","headers","Authorization","baseURL","includes","response","status","code","_retry","statusText","removeItem","Promise","reject","ServiceInfo","peoplewaiting","actualwaittime","active","queueid","segmentid","serviceid","this","peopleWaiting","actualWaitTime","queueID","toString","segmentID","serviceID","TicketInfo","peopleahead","ticketid","meetuplocation","ticketnumber","tickettime","splitticketnumber","split","peopleAhead","ticketID","meetUpLocation","timestamp","concat","padStart","OfficeInfo","officeid","latitude","longitude","phone","geolocation","lat","lng","toFixed","Gala","baseurl","configs","getAllOffices","method","url","Accept","responseType","getAvailableQueues","branchID","getTicketInfo","cancelTicket","stringify","idTicket","takeTicket","tickettext","setReminder","listOfAllOffices","idBranches","trim","telephone","queuesResult","listOfAllServiceTypes","queueName","waiting","maxWaiting","idQueues","ticketResult","ticketsFirstWaiting","ticketWorkstationAttending","ticketNumber","created","ticketStateName","ended","queuedata","NQC","getSpecificQueueuInfo","serviceTypeID","workstationid","getWaitingTicketList","queuetype","unitnumber","unittype","qs","QueueType","UnitNumber","UnitType","servicetype","customertext","printerNumber","printerTextNumber","unitType","unitNumber","printerCopies","logo","delay","customerText","icu","ticketText","resolve","setTimeout","guid","adminInfo","serviceType","queues","waitingTickets","longestWaitingTicketTime","dayjs","diff","activeWorkstations","length","queueType","alltickets","findIndex","turnNumber","cashier","ticketTime","format","endTime","RestProvider","children","Queuefilter","GetResources","GetPrinterData","UpdateQueueDataFromConfig","GetQueuenameFromQueueID","service","setService","setOffices","selectedoffice","setSelectedOfficeID","setTicket","setQueues","setSearchFilter","selectedqueuename","setSelectedQueueName","ticketupdatetimeout","setTicketUpdateTimeout","queuesupdatetimeout","setQueuesUpdateTimeout","wasticketfailure","setWasTicketFailure","location","useLocation","updatedOffices","seloffice","isOlderThanToday","handleCancelTicket","setItem","PeriodicConfigUpdate","getServiceFromConfig","setAuthToken","GetAllOffices","PeriodicTicketUpdate","PeriodicQueueUpdate","pathname","clearTimeout","updateconfigtimer","run","lsticket","getIndividualTicketInfo","tmpTicket","timeoutArray","updatetimers","configuredtimeobject","find","parseInt","seconds","queuetimeout","updatequeuetimer","GetQueues","handleTakeTicket","svc","printerdata","grabATicket","r","j","queuename","filteredqueues","TakeTicket","selected","datastring","year","month","date","isBefore","provider","username","password","officeguid","grant_type","client_id","getAvailableQueuesForSelectedOffice","servicetimeout","tmpqueues","renamedqueues","qrToQueueSelection","qrToFormsSelection","qrToDirectTicket","handleChangeOffice","navigator","getCurrentPosition","sortedList","lat1","lon1","lat2","lon2","unit","radlat1","Math","PI","radlat2","theta","radtheta","dist","sin","cos","acos","geodistance","coords","maximumAge","resetTicketFailureStatus","Provider","backgroundImage","custombackgroundlink","backgroundPosition","backgroundSize","backgroundRepeat","ConfigProvider","setConfig","setLoadedPalette","setPalette","LoadAll","GetConfiguration","GetPalette","GetVersion","configurl","Date","now","rez","err","rex","stored","newversion","version","reload","tmpresources","queuetemplates","templateresults","GetTemplate","queueresource","day","hour","minute","firstfilter","gala_segment","gala_service","openhourtemplates","flat","openhours","z","days","open_hour","open_minute","close_hour","close_minute","isAfter","selectedtemplate","templates","item","GetOfficeIDFromUrlID","urlid","CheckIfHasForm","serviceinfo","hasforms","GetFormData","formtemplate","forms","updatedqueues","q","GetQueueIDfromUrlID","oid","qid","GetUrlIDFromQueueID","QueueListItem","bookTicket","disabled","disablecallback","hasform","component","primarytext","secodarytext","floor","maxWidth","listitem","paddingTop","borderRadius","secondarytext","margin","RedirectButton","text","startIcon","disableElevation","LogoType","styles","src","process","alt","Header","officename","setOfficeName","OfficeSelection","officebutton","queuetext","AppBar","Toolbar","gutters","title","officetext","Divider","divider","flexGrow","minHeight","Footer","setOffice","contentwrapper","content","contenttext","replace","flexShrink","footer_color","QueueEmptyListItem","TicketFailureModal","Dialog","modal","DialogTitle","DialogContent","DialogActions","confirmbutton","Queuedata","_queueID","_segmentID","_serviceID","QueueDisplay","disablebuttons","setDisableButtons","setOfficeID","failure","setFailure","hasloaded","setHasLoaded","oldbaseurl","savedticket","GetOfficeIDFromHash","hash","replaceState","origin","keys","queryparams","handleDisable","spinnerwrapper","outerbox","innerbox","list","shouldHaveRedirectButton","redirectionLink","TicketCancelled","cancelTicketCallback","timeouttext","throwtickettext","Box","semicontainer","align","valuetext","timestamptext","ticket_cancelled","DynamicTicketTextItem","TicketCalled","successtext","meetuptext","infotext","dynamicinfotext","infotextcontainer","ticket_called","TicketWaiting","peopleaheadtext","ticketnumbertext","leavequeuetext","LinearProgress","barColorPrimary","colorPrimary","ticket_waiting","loadingbar_front","loadingbar_back","CancelTicketInfo","cancelticketcallback","closemodalcallback","cancelbutton","info","GetParametersFromHash","buffer","dict","currentkey","currentvalue","reduce","c","TicketPage","setDynamicInfoText","dt","setModal","cancelTicketModal","closeModalCallback","searchParams","ActualTicket","MaterialThemeProvider","createMuiTheme","tertiary","warning","success","xs","sm","md","lg","xl","xxl","setTheme","newtheme","footer_text","responsiveFontSizes","ThemeProvider","TranslationProvider","resources","setResources","language","setLanguage","storedlang","document","documentElement","lang","defaultLanguage","splitted","textname","officetranslations","textobj","templatetext","newlang","MissingPage","picture","ConfirmationItem","head","body","Confirmation","items","cancel","confirm","FormsPage","setQueueData","required","setRequired","formdata","setFormData","setForms","ispristine","setIsPristine","tmpqueuedata","cancelModal","getConfirmationText","notranslate","tmpforms","filtereditems","validate","pristine","validateAll","valid","reqs","oldformdata","vals","GenerateConfirmation","formswrapper","FormControl","formcontrol","defaultValue","helperText","index","forbiddenInputs","maxInputLength","before","after","object","slice","handleChange","textfield","InputProps","focused","inputProps","fullWidth","justifyItems","App","handleWindowResize","vh","innerHeight","setProperty","scrollTo","addEventListener","removeEventListener","path","hostname","match","ReactDOM","render","StrictMode","getElementById","serviceWorker","ready","registration","unregister","message"],"mappings":"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","file":"static/js/main.fb01011f.chunk.js","sourcesContent":["import { createContext } from 'react'\r\nexport const RestContext = createContext({state: {}, actions: {}});","import { useContext } from 'react'\r\nimport { RestContext } from './context'\r\n\r\nexport const useRest = () => {\r\n return useContext(RestContext);\r\n}","import { createContext } from 'react'\r\nexport const ConfigContext = createContext({state: {}});","import { useContext } from 'react'\r\nimport { ConfigContext } from './context'\r\n\r\nexport const useConfig = () => { \r\n return useContext(ConfigContext);\r\n}","import React, { useEffect, useState } from 'react'\r\nimport List from '@material-ui/core/List'\r\nimport ListItem from '@material-ui/core/ListItem'\r\nimport ListItemText from '@material-ui/core/ListItemText'\r\nimport Paper from '@material-ui/core/Paper'\r\nimport { useRest } from '../../contexts/rest/use'\r\nimport { useConfig } from '../../contexts/config/use'\r\nimport Typography from '@material-ui/core/Typography'\r\nimport Room from '@material-ui/icons/Room'\r\nimport IconButton from '@material-ui/core/IconButton'\r\nimport ListItemSecondaryAction from '@material-ui/core/ListItemSecondaryAction' \r\nimport useTheme from '@material-ui/core/styles/useTheme'\r\nimport makeStyles from '@material-ui/core/styles/makeStyles'\r\n\r\nexport const OfficeList = ({offices, filter}) => {\r\n const { actions: { handleOfficeSelection }} = useRest();\r\n const { state: { config }} = useConfig();\r\n const [filteredoffices, setFilteredOffices] = useState();\r\n const theme = useTheme();\r\n const classes = useStyles(theme);\r\n\r\n const handleClick = (officeID) => {\r\n handleOfficeSelection(officeID);\r\n }\r\n\r\n const getDistanceText = () => {\r\n return config ? config.distanceUnit.substr(0,2).toLowerCase() === \"ki\" || config.distanceUnit.substr(0,2).toLowerCase() === \"km\" ? \"km\" : \"mi\" : \"mi\"\r\n }\r\n\r\n useEffect(() => {\r\n let filteredOffices = filter ? offices.filter(x => x.name === filter || Object.values(x.address).some(y => y === filter)) : offices;\r\n setFilteredOffices(filteredOffices);\r\n }, [offices, filter])\r\n\r\n const generate = ({offices}) => {\r\n let tmp_offices = filteredoffices || offices;\r\n tmp_offices = tmp_offices.sort((a,b) => (a.distance - b.distance));\r\n return tmp_offices.map((x, i) => {return \r\n handleClick(x.officeID)}>\r\n {x.name}}\r\n secondary={
\r\n {x.address.street}\r\n { x.address.zipcode + \" \" + x.address.city} \r\n
\r\n }\r\n />\r\n { x.distance \r\n ? \r\n \r\n \r\n { String(x.distance + getDistanceText())}\r\n \r\n \r\n \r\n \r\n \r\n : }\r\n
\r\n
\r\n })\r\n }\r\n\r\n return (\r\n \r\n {offices ? generate({offices}) : }\r\n \r\n )\r\n}\r\n\r\nconst useStyles = makeStyles({\r\n icon: theme => ({\r\n color: theme.palette.primary.main,\r\n transform:\"scale(1.5)\"\r\n }),\r\n distancecontainer: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'center'\r\n },\r\n paper: {\r\n width: '100%',\r\n paddingLeft: '1rem'\r\n }\r\n})","import React from 'react'\r\nimport { OfficeList } from './office_list'\r\nimport useTheme from '@material-ui/core/styles/useTheme'\r\nimport makeStyles from '@material-ui/core/styles/makeStyles'\r\n\r\nexport const LandingPageBottom = ({offices, filter}) => {\r\n const theme = useTheme();\r\n const classes = useStyles(theme);\r\n\r\n return (\r\n
\r\n
\r\n \r\n
\r\n
\r\n )\r\n}\r\n\r\nconst useStyles = makeStyles({\r\n container: () => ({\r\n display: 'flex',\r\n flexDirection: 'column',\r\n width: '100%',\r\n flex: '1 1 auto',\r\n maxHeight: '100%',\r\n overflow: 'auto'\r\n }),\r\n wrapper: theme => ({\r\n backgroundColor: theme.palette.background.main,\r\n height: '100%',\r\n display: 'flex',\r\n maxHeight: '100%',\r\n overflow: 'auto'\r\n })\r\n})","export function isFalsyOrEmpty(obj) \r\n{\r\n if(!obj)\r\n return true;\r\n for(var key in obj) {\r\n return false;\r\n }\r\n return true;\r\n} ","import { createContext } from 'react'\r\nexport const TranslationContext = createContext({state: {}, actions: {}});","import { useContext } from 'react'\r\nimport { TranslationContext } from './context'\r\n\r\nexport const useTranslation = () => {\r\n return useContext(TranslationContext);\r\n}","import React, { useState } from 'react'\r\nimport IconButton from '@material-ui/core/IconButton'\r\nimport MenuIcon from '@material-ui/icons/Menu'\r\nimport Menu from '@material-ui/core/Menu'\r\nimport MenuItem from '@material-ui/core/MenuItem'\r\nimport useTheme from '@material-ui/core/styles/useTheme'\r\nimport makeStyles from '@material-ui/core/styles/makeStyles'\r\nimport { isFalsyOrEmpty } from './object'\r\nimport { useTranslation } from '../../contexts/i18n/use'\r\n\r\nexport const DropdownMenu = ({languages}) => {\r\n const theme = useTheme();\r\n const classes = useStyles(theme);\r\n const [anchorEl, setAnchorEl] = useState(null);\r\n const { actions: {t, updateLanguage }} = useTranslation();\r\n\r\n const handleOpenMenu = (event) => {\r\n setAnchorEl(event.currentTarget)\r\n }\r\n\r\n const handlePickMenuItem = (lang) => {\r\n updateLanguage(lang);\r\n setAnchorEl(null);\r\n }\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n {setAnchorEl(null)}}\r\n >\r\n { !isFalsyOrEmpty(languages) ? languages.map(x => { return {handlePickMenuItem(x)}}>{x}}) : }\r\n
\r\n window.open(t('header.visitproviderlink'))}>{t('header.visitprovider')}\r\n \r\n \r\n )\r\n}\r\n\r\nconst useStyles = makeStyles({\r\n menuicon: theme => ({\r\n color: theme.palette.menu.main,\r\n }),\r\n root: {\r\n padding: '0.5rem'\r\n }\r\n})\r\n\r\n\r\n\r\n","import React, { useEffect, useState } from 'react'\r\nimport Button from '@material-ui/core/Button'\r\nimport IconButton from '@material-ui/core/IconButton'\r\nimport Room from '@material-ui/icons/Room'\r\nimport Typography from '@material-ui/core/Typography'\r\nimport useTheme from '@material-ui/core/styles/useTheme'\r\nimport makeStyles from '@material-ui/core/styles/makeStyles'\r\nimport TextField from '@material-ui/core/TextField'\r\nimport { useRest } from '../../contexts/rest/use'\r\nimport Autocomplete from '@material-ui/lab/Autocomplete'\r\nimport { DropdownMenu } from '../helpers/dropdownmenu'\r\nimport { useConfig } from '../../contexts/config/use'\r\n\r\nexport const LandingPageTop = ({organization, searchboxlabel, searchbuttontext, findnearmetext, ortext, noresulttext }) => {\r\n const theme = useTheme();\r\n const classes = useStyles(theme);\r\n const [searchparams, setSearchParams] = useState();\r\n const [menuitems, setMenuItems] = useState();\r\n const { state: {config}} = useConfig();\r\n const { state: { offices }, actions: { handleGeolocationUpdate, updateSearchFilter } } = useRest();\r\n\r\n useEffect(() => {\r\n if (config)\r\n {\r\n setMenuItems();\r\n }\r\n else\r\n setMenuItems();\r\n }, [config])\r\n\r\n const FindClosestOffice = () => {\r\n handleGeolocationUpdate();\r\n }\r\n\r\n const submitHandler = (event) => {\r\n if (event)\r\n event.preventDefault();\r\n const result = offices.some(x => x.name === searchparams || Object.values(x.address).some(y => y === searchparams));\r\n if (result || searchparams === \"\")\r\n updateSearchFilter(searchparams);\r\n }\r\n\r\n const searchParamsHandler = (event, autofill) => {\r\n if (autofill)\r\n setSearchParams(event.target.textContent);\r\n else\r\n setSearchParams(event.target.value);\r\n }\r\n\r\n useEffect(() => {\r\n if (searchparams === \"\")\r\n submitHandler();\r\n }, [searchparams])\r\n\r\n return (\r\n
\r\n
\r\n
\r\n
\r\n \r\n {organization || \"\"}\r\n \r\n
\r\n
\r\n { menuitems }\r\n
\r\n
\r\n
submitHandler(e)}>\r\n searchParamsHandler(e, true)}\r\n freeSolo={true}\r\n noresulttext={noresulttext || \"Inga träffar\"}\r\n options={offices ? offices.map(x => x.name) : []}\r\n renderInput={(params) => (\r\n { if (e.key === \"Enter\" && e.target.value) \r\n {\r\n submitHandler(e);\r\n }}}\r\n />\r\n )}\r\n />\r\n
\r\n \r\n \r\n { ortext || \"ELLER\" }\r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n )\r\n}\r\n\r\nconst useStyles = makeStyles({\r\n container: theme => ({\r\n backgroundColor: theme.palette.background.main,\r\n marginLeft: '1rem',\r\n marginRight: '1rem',\r\n textAlign: 'left',\r\n flex: '0 1 auto',\r\n marginTop: '1rem',\r\n justifyContent: 'center'\r\n }),\r\n innercontainer: {\r\n padding: '0 1rem',\r\n marginBottom: '1.5rem'\r\n },\r\n menuwrapper: {\r\n display: 'flex', \r\n width: '100%'\r\n },\r\n menutextwrapper: {\r\n display: 'flex', \r\n width: '90%', \r\n flex: '0 1 auto'\r\n },\r\n menubuttonwrapper: {\r\n display: 'flex', \r\n flex: '1 0 auto',\r\n justifyContent: 'flex-end'\r\n\r\n },\r\n button: theme => ({\r\n fontSize: '2 rem',\r\n display: 'flex',\r\n flexDirection: 'row',\r\n backgroundColor: theme.palette.primary.main,\r\n color: theme.palette.button_text.main,\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n border: 'none',\r\n minWidth: '40%',\r\n [theme.breakpoints.up('lg')]: {\r\n '&:hover': {\r\n backgroundColor: 'black',\r\n color: 'white'\r\n }\r\n },\r\n [theme.breakpoints.down('lg')]: {\r\n '&:hover': {\r\n backgroundColor: theme.palette.primary.main,\r\n color: theme.palette.button_text.main\r\n }\r\n }\r\n }),\r\n icon: theme => ({\r\n color: theme.palette.button_text.main\r\n }),\r\n iconbutton: {\r\n padding: 0\r\n },\r\n heading: {\r\n fontWeight: '500',\r\n color: 'black',\r\n padding: '0.2rem 0'\r\n },\r\n searchboxwrapper: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n position: 'relative'\r\n },\r\n searchbox: {\r\n marginTop: '0.5rem'\r\n },\r\n label: {\r\n fontSize: '1rem',\r\n paddingBottom: '0.2rem'\r\n },\r\n form: {\r\n display: 'flex',\r\n flexDirection: 'column'\r\n },\r\n betweenbuttons: theme => ({\r\n fontWeight: '500',\r\n padding: '0 0.5rem',\r\n color: theme.palette.secondary_text.main\r\n }),\r\n buttonwrapper: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n padding: '1rem 0',\r\n justifyContent: 'space-between',\r\n alignItems: 'center'\r\n },\r\n searchicon: theme => ({\r\n position: 'absolute',\r\n top: '0.2rem',\r\n left: '0.2rem',\r\n width: '1rem',\r\n color: theme.palette.secondary_text.main,\r\n height: '1.2rem'\r\n })\r\n })\r\n","import React, { useEffect } from 'react'\r\nimport { LandingPageBottom } from './landing_page_bottom'\r\nimport { LandingPageTop } from './landing_page_top'\r\nimport { useRest } from '../../contexts/rest/use'\r\nimport { useTranslation } from '../../contexts/i18n/use'\r\nimport useTheme from '@material-ui/core/styles/useTheme'\r\nimport makeStyles from '@material-ui/core/styles/makeStyles'\r\nimport { useConfig } from '../../contexts/config/use'\r\nimport { isFalsyOrEmpty } from '../helpers/object'\r\nimport { useHistory } from \"react-router-dom\"\r\nimport { CircularProgress } from '@material-ui/core'\r\n\r\nexport const LandingPage = () => {\r\n const { state: {offices, ticket, searchfilter}, actions: {toExistingTicket}} = useRest();\r\n const { actions: {t}} = useTranslation();\r\n const { state: { config, loadedpalette }, actions: { GetUrlIDFromOfficeID }} = useConfig();\r\n const theme = useTheme();\r\n const classes = useStyle(theme);\r\n const history = useHistory();\r\n\r\n useEffect(() => {\r\n if (!isFalsyOrEmpty(ticket) && !ticket.cancelled)\r\n toExistingTicket(ticket);\r\n if(!isFalsyOrEmpty(config) && !config.uselandingpage)\r\n {\r\n history.push(\"queues\")\r\n\r\n }\r\n },[ticket])\r\n\r\n useEffect(() => {\r\n if(config)\r\n {\r\n var office = localStorage.getItem(\"selectedoffice\");\r\n if(!isFalsyOrEmpty(ticket) && !ticket.cancelled)\r\n history.push('ticket')\r\n else if(office)\r\n history.push('queues?officeID=' + GetUrlIDFromOfficeID(office));\r\n else if (!config.uselandingpage)\r\n history.push('404')\r\n }\r\n }, [config])\r\n\r\n if ( loadedpalette && !isFalsyOrEmpty(config) && config.uselandingpage)\r\n {\r\n return (\r\n
\r\n \r\n \r\n
\r\n )\r\n }\r\n else\r\n return (\r\n
\r\n \r\n
\r\n )\r\n}\r\n\r\nconst useStyle = makeStyles({\r\n container: theme => ({\r\n backgroundColor: '#f4f4f4',\r\n height: '100%',\r\n display: 'flex',\r\n flexDirection: 'column'\r\n }),\r\n spinnercontainer: {\r\n backgroundColor: '#f4f4f4',\r\n height: '100%',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n justifyContent: 'center'\r\n },\r\n spinner: theme => ({\r\n color: theme.palette.primary.main\r\n }),\r\n backdrop: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center'\r\n }\r\n})\r\n","import axios from 'axios'\r\n\r\n/*\r\n This communication object is responsible for sending requests as per the configurations provided by the service-gala and service-nqc classes.\r\n*/\r\n\r\nconst instance = axios.create();\r\nvar retrytimes = 0;\r\n\r\n// Take any request and add our token to it if authorization is needed\r\ninstance.interceptors.request.use(\r\n async function (config) {\r\n if (config.headers.Authorization)\r\n {\r\n var token = sessionStorage.getItem(\"token\");\r\n if(!token || config.baseURL.includes(\"NQWebServices\")) // sessionStorage.token === null || sessionStorage.token === undefined <-- this would do if NQC didn't need a new token for every office\r\n {\r\n await RefreshToken().then(res => { return true;}).catch(error => console.log(error));\r\n }\r\n config.headers.Authorization = \"Bearer \" + sessionStorage.token;\r\n }\r\n\r\n return config;\r\n }, function (error) {\r\n console.log(error)\r\n }\r\n)\r\n// If we get a 403-response this means we need to refresh our bearer token\r\ninstance.interceptors.response.use(\r\n function (res) {\r\n retrytimes = 0;\r\n return res;\r\n },\r\n async function (error) {\r\n console.log(error)\r\n const config = error.config;\r\n if (error.response.status === 401 || error.response.status === 403 || error.code === 'ECONNABORTED')\r\n {\r\n if (retrytimes < 3)\r\n {\r\n sessionStorage.token = null;\r\n config._retry = false;\r\n retrytimes++;\r\n await RefreshToken().then(res => { return true;}).catch(error => console.log(error));\r\n config.headers.Authorization = 'Bearer ' + sessionStorage.token;\r\n return instance(config)\r\n }\r\n else\r\n retrytimes = 0;\r\n }\r\n else if (error.response.statusText.includes('no ticket'))\r\n {\r\n if (retrytimes < 3)\r\n {\r\n sessionStorage.token = null;\r\n config._retry = false;\r\n retrytimes++;\r\n await RefreshToken().then(res => { return true;}).catch(error => console.log(error));\r\n config.headers.Authorization = 'Bearer ' + sessionStorage.token;\r\n return instance(config)\r\n }\r\n else\r\n {\r\n retrytimes = 0;\r\n localStorage.removeItem(\"ticket\");\r\n }\r\n }\r\n \r\n return Promise.reject(error)\r\n }\r\n)\r\n\r\n// Refreshes the bearer token\r\n// To be called automatically when needed\r\n// Due to how I have constructed it, the token config will have to be saved in the session state by the active service file\r\nasync function RefreshToken() {\r\n\r\n const config = JSON.parse(sessionStorage.tokenconfig);\r\n return await axios ( config ).then(res => { sessionStorage.token = res.data.access_token; return true;}).catch(error => console.debug(error));\r\n}\r\n\r\n// Returns data based on configuration input\r\nexport async function CallWithConfig(config, timeout) {\r\n config.timeout = timeout || 5000;\r\n //config.cancelToken = axios.CancelToken.source();\r\n const result = await instance( config ).then(res => { return res.data;}).catch(error => console.log(error));\r\n return result;\r\n}","export class ServiceInfo {\r\n constructor(name, peoplewaiting, actualwaittime, active, queueid, segmentid, serviceid)\r\n {\r\n this.name = name || null;\r\n this.peopleWaiting = peoplewaiting;\r\n this.actualWaitTime = actualwaittime ? actualwaittime : 0;\r\n this.active = active === 'Y' ? true : active === 'N' ? false : active ; // TODO: This is 'Y' or 'N' for Gala, true or false for NQC. Find a good way to convert.\r\n this.queueID = queueid ? queueid.toString() : null;\r\n this.segmentID = segmentid || null;\r\n this.serviceID = serviceid || null;\r\n }\r\n}","export class TicketInfo {\r\n constructor(peopleahead, ticketid, meetuplocation, ticketnumber, tickettime, cancelled)\r\n {\r\n var splitticketnumber = ticketnumber.split(/(\\d+)/)\r\n this.peopleAhead = peopleahead;\r\n this.ticketID = ticketid;\r\n this.meetUpLocation = meetuplocation ? meetuplocation : \"\"; // What values will this take depending on Gala/NQC?\r\n this.timestamp = tickettime;\r\n this.ticketnumber = splitticketnumber[0].concat(splitticketnumber[1].padStart(3,'0'));\r\n this.cancelled = cancelled || false; // This should be set to true when canceled manually or if it's older than one day\r\n }\r\n}","export class OfficeInfo {\r\n constructor(name, officeid, street, city, zipcode, latitude, longitude, distance, phone)\r\n {\r\n this.name = name;\r\n this.officeID = officeid;\r\n this.address = { street: \"\", zipcode: \"\", city: \"\", geolocation: { latitude: 0, longitude: 0 }}\r\n this.address.street = street;\r\n this.address.zipcode = zipcode;\r\n this.address.city = city;\r\n this.address.geolocation.lat = latitude;\r\n this.address.geolocation.lng = longitude;\r\n this.distance = distance ? distance.toFixed(1) : null;\r\n this.phone = phone || \"\";\r\n }\r\n}","import { CallWithConfig } from './service-communicator'\r\nimport { ServiceInfo } from './dto/serviceinfo.dto'\r\nimport { TicketInfo } from './dto/ticketinfo.dto'\r\nimport { OfficeInfo } from './dto/officeinfo.dto'\r\n\r\nexport class Gala {\r\n constructor(baseurl)\r\n { \r\n this.configs = {\r\n getAllOffices: () => {\r\n return {\r\n method: 'get',\r\n url: '/branches',\r\n baseURL: baseurl,\r\n headers: {\r\n Authorization: 'bearer',\r\n Accept: 'application/json'\r\n },\r\n responseType: 'json'\r\n }\r\n },\r\n getAvailableQueues: (branchID) => {\r\n return {\r\n method: 'get',\r\n url: '/supervision/table1?idBranches=' + branchID,\r\n baseURL: baseurl,\r\n headers: {\r\n Authorization: 'bearer',\r\n Accept: 'application/json'\r\n },\r\n responseType: 'json'\r\n }\r\n },\r\n getTicketInfo: ticketID => {\r\n return {\r\n method: 'get',\r\n url: '/tickets/details/' + ticketID,\r\n baseURL: baseurl,\r\n headers: {\r\n Authorization: 'bearer',\r\n Accept: 'application/json'\r\n },\r\n responseType: 'json'\r\n }\r\n },\r\n cancelTicket: (ticketID) => {\r\n return {\r\n method: 'post',\r\n url: 'supervision/cancelTicket',\r\n baseURL: baseurl,\r\n data: JSON.stringify({\r\n idTicket: ticketID\r\n }),\r\n headers: {\r\n Authorization: 'bearer',\r\n Accept: 'application/json',\r\n 'content-type': 'application/json'\r\n },\r\n responseType: 'json'\r\n } \r\n },\r\n takeTicket: (branchID, segmentID, serviceID, tickettext) => {\r\n return {\r\n method: 'post',\r\n url: '/branches/' + branchID + '/ticketsByShort?idShortSegment=' + segmentID + '&idShortService=' + serviceID + '&customerName=eticket¬es=' + tickettext,\r\n baseURL: baseurl,\r\n headers: {\r\n Authorization: 'bearer',\r\n Accept: 'application/json'\r\n },\r\n responseType: 'json'\r\n }\r\n },\r\n setReminder: ticketID => {\r\n throw 'set reminder function not implemented'\r\n }\r\n }\r\n }\r\n \r\n async getAllOffices() {\r\n const result = await CallWithConfig(this.configs.getAllOffices());\r\n var listOfAllOffices = [];\r\n try \r\n {\r\n listOfAllOffices = result.map(x => new OfficeInfo(x.name, x.idBranches, x.address, x.city, x.address.split('-')[1] ? x.address.split('-')[1].trim() : \"\", x.latitude, x.longitude, null, x.telephone))\r\n }\r\n catch\r\n {\r\n throw \"We caught this bug before it could do any harm!\"\r\n }\r\n return listOfAllOffices;\r\n }\r\n\r\n async getAvailableQueuesForSelectedOffice(branchID) {\r\n const queuesResult = await CallWithConfig(this.configs.getAvailableQueues(branchID));\r\n var listOfAllServiceTypes = null;\r\n try\r\n {\r\n // TODO: Vi måste hämta en del info från config, t.ex. namn, service och segment.\r\n listOfAllServiceTypes = queuesResult.map((x, i) => {\r\n return new ServiceInfo(x.queueName, x.waiting, x.maxWaiting, true, x.idQueues, null, null)\r\n });\r\n }\r\n catch\r\n {\r\n throw \"This isn't the queue we're looking for\"\r\n }\r\n return listOfAllServiceTypes;\r\n }\r\n\r\n async getIndividualTicketInfo(ticketID) {\r\n const ticketResult = await CallWithConfig(this.configs.getTicketInfo(ticketID));\r\n let ticket;\r\n if ( ticketResult )\r\n ticket = new TicketInfo(ticketResult.ticketsFirstWaiting, ticketResult.id, ticketResult.ticketWorkstationAttending, ticketResult.ticketNumber, ticketResult.created, (ticketResult.ticketStateName === 'assisted' || ticketResult.ended));\r\n return ticket;\r\n }\r\n\r\n async cancelTicket(ticketID) {\r\n var result = await CallWithConfig(this.configs.cancelTicket(ticketID));\r\n return result;\r\n }\r\n\r\n // TODO: Extenda denna med serviceID och segmentID direkt istället för att använda den här konstiga lookupen\r\n async grabATicket(queuedata, branchID, tickettext) {\r\n var result;\r\n try\r\n {\r\n result = await CallWithConfig(this.configs.takeTicket(branchID, queuedata.segmentID, queuedata.serviceID, tickettext));\r\n }\r\n catch\r\n {\r\n throw \"Something, somewhere, went very wrong.\"\r\n }\r\n if (result)\r\n return result.id;\r\n return null;\r\n }\r\n\r\n async setReminder(ticketID) {\r\n const result = await CallWithConfig(this.configs.setReminder(ticketID));\r\n } \r\n}\r\n\r\n\r\n","import { CallWithConfig } from './service-communicator'\r\nimport { OfficeInfo } from './dto/officeinfo.dto'\r\nimport { TicketInfo } from './dto/ticketinfo.dto'\r\nimport { ServiceInfo } from './dto/serviceinfo.dto'\r\nimport dayjs from 'dayjs'\r\nimport qs from 'qs'\r\n\r\nexport class NQC {\r\n constructor(baseurl)\r\n {\r\n //TODO: Ta reda på exakta anrop och fyll i informationen\r\n this.configs = {\r\n getAllOffices: () => ({\r\n method: 'get',\r\n url: '/api/offices',\r\n baseURL: baseurl,\r\n headers: {\r\n Authorization: '',\r\n Accept: 'application/json'\r\n },\r\n responseType: 'json'\r\n }),\r\n getAvailableQueues: () => ({\r\n method: 'get',\r\n url: '/api/queueinfo/servicetype',\r\n baseURL: baseurl,\r\n headers: {\r\n Authorization: 'bearer',\r\n Accept: 'application/json'\r\n },\r\n responseType: 'json'\r\n }),\r\n getSpecificQueueuInfo: serviceTypeID => ({\r\n method: 'get',\r\n url: '/api/queueinfo/servicetype/' + serviceTypeID,\r\n baseURL: baseurl,\r\n headers: {\r\n Authorization: 'bearer',\r\n Accept: 'application/json'\r\n },\r\n responseType: 'json'\r\n }),\r\n getTicketInfo: ticketNumber => ({\r\n method: 'get',\r\n url: '/api/office/getticketinfo/?ticketnumber=' + ticketNumber,\r\n baseURL: baseurl,\r\n headers: {\r\n Authorization: 'bearer',\r\n Accept: 'application/json'\r\n },\r\n responseType: 'json'\r\n }),\r\n cancelTicket: (workstationid) => ({\r\n }),\r\n getWaitingTicketList: (queuetype, unitnumber, unittype) => ({\r\n method: 'post', \r\n url: '/api/office/GetWaitingTicketList',\r\n baseURL: baseurl,\r\n data: qs.stringify({\r\n QueueType: queuetype,\r\n UnitNumber: unitnumber,\r\n UnitType: unittype\r\n }),\r\n headers: {\r\n Authorization: 'bearer',\r\n Accept: 'application/json'\r\n },\r\n responseType: 'json'\r\n }),\r\n takeTicket: (servicetype, customertext, printerNumber, printerTextNumber) => ({\r\n method: 'post',\r\n url: '/api/office/ticket',\r\n baseURL: baseurl,\r\n data: JSON.stringify ({\r\n unitType: 1,\r\n unitNumber: servicetype,\r\n printerTextNumber: printerTextNumber,\r\n printerNumber: printerNumber,\r\n printerCopies: 0,\r\n logo: 1,\r\n delay: 0,\r\n customerText: customertext || \"\",\r\n icu: \"\",\r\n ticketText: []\r\n }),\r\n headers: {\r\n Authorization: 'bearer',\r\n Accept: 'application/json',\r\n 'content-type': 'application/json'\r\n },\r\n responseType: 'json'\r\n }),\r\n setReminder: ticketID => { console.log('set reminder function not implemented'); }\r\n }\r\n }\r\n\r\n // Support function, it takes some time before the submitted ticket gets into the system\r\n async wait(delay) {\r\n return new Promise(resolve => setTimeout(resolve, delay));\r\n }\r\n \r\n async getAllOffices() {\r\n const result = await CallWithConfig(this.configs.getAllOffices());\r\n var listOfAllOffices = null;\r\n try \r\n {\r\n listOfAllOffices = result.map(x => new OfficeInfo(x.name, x.guid, x.address.street, x.address.city, x.address.zipcode, x.address.latitude,x.address.longitude, null, x.adminInfo.phone))\r\n }\r\n catch\r\n {\r\n return null;\r\n }\r\n return listOfAllOffices;\r\n }\r\n\r\n async getAvailableQueuesForSelectedOffice(officeID, timeout) {\r\n const result = await CallWithConfig(this.configs.getAvailableQueues(), timeout);\r\n var listOfAllServiceTypes = null;\r\n try\r\n {\r\n listOfAllServiceTypes = result.map((x, i) => new ServiceInfo(x.serviceType.name, x.queues.main.waitingTickets, x.queues.main.longestWaitingTicketTime ? dayjs().diff(x.queues.main.longestWaitingTicketTime, \"second\") : 0, x.activeWorkstations, x.serviceType.id)); //det står både longestWaitingTimeMQ och longestWaitingTimeTicketMQ\r\n }\r\n catch\r\n {\r\n return null;\r\n }\r\n return listOfAllServiceTypes;\r\n }\r\n\r\n // TODO: Se över detta, kan bli tvungen att skapa en ny modell\r\n async getIndividualTicketInfo(ticketNumber) {\r\n var ticketResult;\r\n var ticket = null;\r\n ticketResult = await CallWithConfig(this.configs.getTicketInfo(ticketNumber)); // The source is incorrectly formated, needs an extra parse\r\n\r\n if (ticketResult && ticketResult.length > 0)\r\n {\r\n let alltickets;\r\n let peopleAhead = 0;\r\n alltickets = await CallWithConfig(this.configs.getWaitingTicketList(ticketResult[0].queueType, ticketResult[0].serviceType, 1));\r\n if (alltickets)\r\n {\r\n if (alltickets.length > 0)\r\n {\r\n // If we recieve a non-empty array but our number is not in the array then we have been precalled or missed an update.\r\n peopleAhead = alltickets.findIndex(x => x.turnNumber === ticketResult[0].ticket);\r\n if (peopleAhead < 0)\r\n peopleAhead = 0;\r\n }\r\n ticket = new TicketInfo(peopleAhead, ticketResult[0].ticket, ticketResult[0].cashier, ticketResult[0].ticket, dayjs(ticketResult[0].ticketTime).format('YYYY-MM-DD HH:mm'), ticketResult[0].endTime);\r\n }\r\n }\r\n return ticket;\r\n }\r\n\r\n async cancelTicket() {\r\n return true;\r\n }\r\n\r\n // branchID exists simply because Gala needs it, refactor later\r\n async grabATicket(queuedata, branchID, customertext, printerNumber, printerTextNumber) {\r\n const result = await CallWithConfig(this.configs.takeTicket(queuedata.queueID, customertext, printerNumber, printerTextNumber));\r\n let ticketNumber = null;\r\n if (result)\r\n ticketNumber = result.turnNumber;\r\n return ticketNumber;\r\n }\r\n async setReminder(ticketID) {\r\n const result = await CallWithConfig(this.configs.setReminder(ticketID));\r\n }\r\n}\r\n\r\n\r\n","import React, { useEffect, useState } from 'react'\r\nimport { RestContext } from './context';\r\nimport { Gala } from '../../services/service-gala'\r\nimport { NQC } from '../../services/service-nqc'\r\nimport { useConfig } from '../config/use'\r\nimport * as dayjs from 'dayjs'\r\nimport qs from 'qs'\r\nimport { useHistory, useLocation } from \"react-router-dom\"\r\nimport { geodistance } from '../../components/helpers/geographic_distance'\r\nimport { OfficeInfo } from '../../services/dto/officeinfo.dto';\r\nimport { isFalsyOrEmpty } from '../../components/helpers/object'\r\nimport { TicketInfo } from '../../services/dto/ticketinfo.dto';\r\n\r\nexport const RestProvider = ({children}) => {\r\n const { state: { config }, actions: { Queuefilter, GetResources, GetPrinterData, UpdateQueueDataFromConfig, GetQueuenameFromQueueID }} = useConfig();\r\n const [service, setService] = useState();\r\n const [offices, setOffices] = useState(null);\r\n const [selectedoffice, setSelectedOfficeID] = useState();\r\n const [ticket, setTicket] = useState(null);\r\n const [queues, setQueues] = useState(null);\r\n const [searchfilter, setSearchFilter] = useState(\"\");\r\n const [selectedqueuename, setSelectedQueueName] = useState();\r\n const [ticketupdatetimeout, setTicketUpdateTimeout] = useState();\r\n const [queuesupdatetimeout, setQueuesUpdateTimeout] = useState();\r\n const [wasticketfailure, setWasTicketFailure] = useState(false);\r\n const history = useHistory();\r\n const location = useLocation();\r\n\r\n // Step 1: Load previous data from local storage\r\n useEffect(() => {\r\n let ticket = {}\r\n let seloffice = null;\r\n try\r\n {\r\n ticket = JSON.parse(localStorage.getItem(\"ticket\"));\r\n if (isFalsyOrEmpty(ticket))\r\n ticket = {}\r\n } catch(error) { console.debug(error) }\r\n\r\n try\r\n {\r\n seloffice = localStorage.getItem(\"selectedoffice\");\r\n if (isFalsyOrEmpty(seloffice))\r\n seloffice = null;\r\n } catch(error) { console.debug(error) }\r\n // If ticket is older than today 0:01 then mark it as ended\r\n if (!isFalsyOrEmpty(ticket) && isOlderThanToday(ticket.timestamp))\r\n {\r\n handleCancelTicket();\r\n ticket = {}\r\n }\r\n \r\n localStorage.setItem(\"ticket\", JSON.stringify(ticket));\r\n setSelectedQueueName(localStorage.getItem(\"selectedqueuename\"));\r\n setSelectedOfficeID(seloffice);\r\n setTicket(ticket); \r\n PeriodicConfigUpdate();\r\n },[])\r\n\r\n // Step 2: Ensure config file is loaded from Config context\r\n useEffect(() => {\r\n if (config)\r\n {\r\n setService(getServiceFromConfig());\r\n setAuthToken(localStorage.getItem(\"selectedoffice\"));\r\n }\r\n }, [config]);\r\n\r\n // Step 3: Make sure service has been generated, then populate offices\r\n useEffect(() => {\r\n if (service)\r\n {\r\n GetAllOffices();\r\n if (!ticketupdatetimeout)\r\n PeriodicTicketUpdate();\r\n if (!queuesupdatetimeout)\r\n PeriodicQueueUpdate();\r\n }\r\n }, [service])\r\n\r\n // When we change location, start/stop relevant services.\r\n useEffect(() => {\r\n if (location.pathname === \"/queues\")\r\n {\r\n localStorage.setItem(\"updateQueues\", true);\r\n localStorage.removeItem(\"updateTicket\");\r\n clearTimeout(ticketupdatetimeout);\r\n clearTimeout(queuesupdatetimeout);\r\n if (config && service)\r\n PeriodicQueueUpdate();\r\n }\r\n else if (location.pathname === \"/ticket\")\r\n {\r\n localStorage.setItem(\"updateTicket\", true);\r\n localStorage.removeItem(\"updateQueues\");\r\n clearTimeout(queuesupdatetimeout);\r\n clearTimeout(ticketupdatetimeout);\r\n if (config && service)\r\n PeriodicTicketUpdate();\r\n }\r\n else if (location.pathname === \"\")\r\n {\r\n localStorage.removeItem(\"updateTicket\");\r\n localStorage.removeItem(\"updateQueues\");\r\n clearTimeout(ticketupdatetimeout);\r\n clearTimeout(queuesupdatetimeout);\r\n }\r\n }, [location])\r\n\r\n async function GetAllOffices() {\r\n if(isFalsyOrEmpty(offices))\r\n {\r\n const updatedOffices = await service.getAllOffices();\r\n setOffices(updatedOffices);\r\n }\r\n }\r\n\r\n const PeriodicConfigUpdate = async () => {\r\n let timeout = config ? config.updateconfigtimer : 60000;\r\n await GetResources();\r\n\r\n const timer = setTimeout(() => {\r\n PeriodicConfigUpdate();\r\n }, timeout)\r\n }\r\n\r\n const PeriodicTicketUpdate = async () => {\r\n let run = localStorage.getItem(\"updateTicket\");\r\n let lsticket = JSON.parse(localStorage.getItem(\"ticket\"));\r\n let tmpTicket;\r\n if(lsticket && !isFalsyOrEmpty(lsticket) && !lsticket.cancelled && service && config && run)\r\n {\r\n tmpTicket = await service.getIndividualTicketInfo(lsticket.ticketID);\r\n run = localStorage.getItem(\"updateTicket\");\r\n if (tmpTicket)\r\n {\r\n if (run)\r\n {\r\n setTicket(tmpTicket);\r\n localStorage.setItem(\"ticket\", JSON.stringify(tmpTicket));\r\n }\r\n }\r\n else\r\n {\r\n //TODO: Vi har fått tillbaka null, kanske förklara för kunden att vi inte lyckades hämta data\r\n var errorticket = JSON.parse(localStorage.getItem(\"ticket\"));\r\n if (isFalsyOrEmpty(errorticket))\r\n handleCancelTicket();\r\n }\r\n }\r\n let timeoutArray = config ? config.updatetimers : [];\r\n let timeout = 15000;\r\n let configuredtimeobject = null;\r\n if (!isFalsyOrEmpty(timeoutArray) && !isFalsyOrEmpty(tmpTicket))\r\n {\r\n if(!tmpTicket.meetUpLocation)\r\n {\r\n configuredtimeobject = timeoutArray.find(x => x.length <= parseInt(tmpTicket.peopleAhead));\r\n timeout = (configuredtimeobject && tmpTicket) ? configuredtimeobject.seconds : 15000;\r\n }\r\n }\r\n \r\n setTicketUpdateTimeout(setTimeout(() => { \r\n PeriodicTicketUpdate();\r\n }, timeout ));\r\n }\r\n\r\n const PeriodicQueueUpdate = async () => {\r\n let run = localStorage.getItem(\"updateQueues\");\r\n let queuetimeout = config ? config.updatequeuetimer : 15000;\r\n var seloffice = localStorage.getItem(\"selectedoffice\");\r\n if (seloffice && run)\r\n await GetQueues(seloffice);\r\n setQueuesUpdateTimeout(setTimeout(() => { \r\n PeriodicQueueUpdate();\r\n }, queuetimeout ));\r\n }\r\n \r\n\r\n // Callback function to set selected office\r\n const handleOfficeSelection = (officeID) => {\r\n setAuthToken(officeID);\r\n setSelectedOfficeID(officeID);\r\n localStorage.setItem(\"selectedoffice\", officeID);\r\n GetQueues(officeID);\r\n history.push(\"queues\");\r\n }\r\n\r\n const handleGeolocationUpdate = () => {\r\n if(navigator.geolocation)\r\n {\r\n navigator.geolocation.getCurrentPosition((position) => {\r\n var distanceList = offices.map(x => { return new OfficeInfo(x.name, x.officeID, x.address.street, x.address.city, x.address.zipcode, x.address.geolocation.lat, x.address.geolocation.lng, geodistance(x.address.geolocation.lat, x.address.geolocation.lng, position.coords.latitude, position.coords.longitude, config.distanceUnit), x.phone)});\r\n var sortedList = distanceList.sort((a,b) => (a.distance - b.distance));\r\n setOffices(sortedList);\r\n sessionStorage.setItem(\"offices\", JSON.stringify(sortedList));\r\n }, \r\n () => {\r\n // TODO: Berätta för användaren att de inte kan få information som baseras på geodata\r\n // TODO: Kanske fixa en konverterar-funktion som tar bort / lägger till distance till officedata?\r\n },\r\n { maximumAge: 120000, timeout: 2000 })\r\n }\r\n }\r\n\r\n const handleTakeTicket = (officeID, queuedata, svc, customertext) => {\r\n async function TakeTicket(officeID, queuedata) {\r\n var ticketID;\r\n var tmpTicket;\r\n let printerdata;\r\n\r\n\r\n if (!isFalsyOrEmpty(svc))\r\n {\r\n printerdata = await GetPrinterData(officeID);\r\n if (!isFalsyOrEmpty(printerdata))\r\n {\r\n ticketID = await svc.grabATicket(queuedata, officeID, customertext, printerdata.printerNumber, printerdata.printerTextNumber );\r\n if (ticketID)\r\n {\r\n for(var i = 0; i < 5; i++)\r\n {\r\n await new Promise(r => setTimeout(r, 300));\r\n tmpTicket = await svc.getIndividualTicketInfo(ticketID);\r\n if (!isFalsyOrEmpty(tmpTicket))\r\n break;\r\n }\r\n }\r\n else\r\n setWasTicketFailure(true);\r\n }\r\n }\r\n else\r\n {\r\n printerdata = await GetPrinterData(officeID);\r\n if (!isFalsyOrEmpty(printerdata))\r\n {\r\n ticketID = await service.grabATicket(queuedata, officeID, customertext, printerdata.printerNumber, printerdata.printerTextNumber );\r\n if (ticketID)\r\n {\r\n for(var j = 0; j < 5; j++)\r\n {\r\n await new Promise(r => setTimeout(r, 300));\r\n tmpTicket = await service.getIndividualTicketInfo(ticketID);\r\n if (!isFalsyOrEmpty(tmpTicket))\r\n break;\r\n }\r\n }\r\n else\r\n setWasTicketFailure(true);\r\n }\r\n }\r\n\r\n if (!isFalsyOrEmpty(tmpTicket))\r\n {\r\n var queuename;\r\n if (queues)\r\n {\r\n var res = queues.find(x => x.queueID === queuedata.queueID);\r\n queuename = res ? res.name : null;\r\n }\r\n else\r\n {\r\n const filteredqueues = await GetQueues(officeID, svc); \r\n const res = filteredqueues.find(x => x.queueID === queuedata.queueID);\r\n queuename = res ? res.name : null;\r\n }\r\n if (!isFalsyOrEmpty(queuename))\r\n {\r\n setTicket(tmpTicket);\r\n localStorage.setItem(\"ticket\", JSON.stringify(tmpTicket));\r\n localStorage.setItem(\"selectedqueuename\", GetQueuenameFromQueueID(officeID, queuedata.queueID));\r\n setSelectedQueueName(queuename);\r\n sessionStorage.setItem(\"queuename\", queuename);\r\n history.push(\"ticket\")\r\n }\r\n else\r\n setWasTicketFailure(true);\r\n }\r\n else\r\n {\r\n localStorage.removeItem(\"tickettext\");\r\n setWasTicketFailure(true);\r\n }\r\n }\r\n\r\n\r\n if (!isFalsyOrEmpty(config))\r\n TakeTicket(officeID, queuedata, svc);\r\n else\r\n console.log(\"ojdå\")\r\n }\r\n \r\n const handleCancelTicket = (ticketID) => {\r\n localStorage.removeItem(\"updateTicket\");\r\n localStorage.removeItem(\"selectedqueuename\");\r\n setSelectedQueueName(null);\r\n if (ticketID)\r\n service.cancelTicket(ticketID);\r\n setTicket(null);\r\n localStorage.setItem(\"ticket\", JSON.stringify({}));\r\n sessionStorage.setItem(\"queuename\", \"\");\r\n setSelectedQueueName(\"\");\r\n var selected = selectedoffice;\r\n localStorage.removeItem(\"tickettext\");\r\n if (!selected)\r\n selected = localStorage.getItem(\"selectedoffice\");\r\n if (selected)\r\n history.push(\"queues\")\r\n else if (config && config.uselandingpage)\r\n history.push(\"/\")\r\n }\r\n\r\n const handleChangeOffice = () => {\r\n sessionStorage.removeItem(\"formdata\");\r\n setSelectedOfficeID(null);\r\n sessionStorage.setItem(\"queues\", null);\r\n setQueues(null);\r\n sessionStorage.setItem(\"queuename\", \"\");\r\n setSelectedQueueName(\"\");\r\n localStorage.setItem(\"selectedoffice\", \"\");\r\n history.push(\"/\");\r\n }\r\n\r\n\r\n // Helper functions, refactor when possible\r\n const isOlderThanToday = (timestamp) => {\r\n var year = dayjs().year()\r\n var month = dayjs().month() + 1\r\n var date = dayjs().date()\r\n var datastring = year + \"-\" + month + \"-\" + date;\r\n return dayjs(timestamp).isBefore(String(datastring));\r\n }\r\n\r\n const isOlderThanMinutes = (timestamp, minutes) => {\r\n return dayjs(timestamp).isBefore(String(dayjs().subtract(minutes, 'minutes')));\r\n }\r\n\r\n const getServiceFromConfig = () => {\r\n if (config)\r\n {\r\n if (config.provider === \"Gala\")\r\n return new Gala(config.baseurl);\r\n else if (config.provider === \"NQC\")\r\n return new NQC(config.baseurl);\r\n }\r\n else\r\n return null;\r\n }\r\n\r\n const setAuthToken = guid => {\r\n\r\n if (config)\r\n {\r\n if (config.provider === \"Gala\")\r\n {\r\n sessionStorage.tokenconfig = JSON.stringify({\r\n method: 'post',\r\n url: '/users/authenticate',\r\n baseURL: config.baseurl,\r\n data: JSON.stringify({\r\n username: \"nqutvapi\",\r\n password: \"nqutvapi\"\r\n }),\r\n headers: {\r\n 'content-type': 'application/json'\r\n },\r\n })\r\n }\r\n else if (config.provider === \"NQC\" && guid)\r\n {\r\n sessionStorage.tokenconfig = JSON.stringify({ \r\n method: 'post',\r\n url: 'oauth2/token',\r\n baseURL: config.baseurl,\r\n data: qs.stringify({\r\n officeguid: guid,\r\n grant_type: 'password',\r\n client_id: '099153c2625149bc8ecb3e85e03f0022'\r\n }),\r\n headers: {\r\n 'content-type' : 'application/x-www-form-urlencoded'\r\n },\r\n })\r\n }\r\n }\r\n }\r\n\r\n const updateSearchFilter = (filter) => {\r\n setSearchFilter(filter);\r\n }\r\n\r\n async function GetQueues(officeID, svc = null) {\r\n var tmpqueues;\r\n if (svc)\r\n tmpqueues = await svc.getAvailableQueuesForSelectedOffice(officeID, config.servicetimeout);\r\n else\r\n tmpqueues = await service.getAvailableQueuesForSelectedOffice(officeID, config.servicetimeout);\r\n const renamedqueues = UpdateQueueDataFromConfig(officeID, tmpqueues);\r\n const filteredqueues = await Queuefilter(officeID, renamedqueues);\r\n setQueues(filteredqueues);\r\n sessionStorage.setItem(\"queues\", JSON.stringify(filteredqueues));\r\n return filteredqueues;\r\n }\r\n\r\n // Redirects\r\n const qrToQueueSelection = async (officeID) => {\r\n const svc = getServiceFromConfig();\r\n setService(svc);\r\n svc.getAllOffices();\r\n setSelectedOfficeID(officeID);\r\n localStorage.setItem(\"selectedoffice\", officeID);\r\n setAuthToken(officeID);\r\n await GetQueues(officeID, svc);\r\n }\r\n\r\n const qrToFormsSelection = async (officeID, queuedata) => {\r\n const svc = getServiceFromConfig();\r\n setService(svc);\r\n svc.getAllOffices();\r\n setSelectedOfficeID(officeID);\r\n localStorage.setItem(\"selectedoffice\", officeID);\r\n sessionStorage.setItem(\"selectedqueue\", queuedata.queueID);\r\n setAuthToken(officeID);\r\n await GetQueues(officeID, svc);\r\n }\r\n\r\n const qrToDirectTicket = async (officeID, queuedata, customertext ) => {\r\n // TODO: Handle if queueID is undefined or if segmentID and serviceID is undefined.\r\n const svc = getServiceFromConfig();\r\n setService(svc);\r\n svc.getAllOffices();\r\n setSelectedOfficeID(officeID);\r\n localStorage.setItem(\"selectedoffice\", officeID);\r\n sessionStorage.setItem(\"selectedqueue\", queuedata.queueID);\r\n setAuthToken(officeID);\r\n var filteredqueues = await GetQueues(officeID, svc);\r\n if (filteredqueues.some(x => x.queueID === queuedata.queueID))\r\n handleTakeTicket(officeID, queuedata, svc, customertext);\r\n else\r\n {\r\n sessionStorage.setItem(\"selectedqueue\", null);\r\n history.push(\"queues\");\r\n }\r\n }\r\n\r\n const toExistingTicket = (ticket) => {\r\n if (!isOlderThanToday(ticket.timestamp) && !ticket.cancelled)\r\n history.push(\"ticket\")\r\n }\r\n\r\n const resetTicketFailureStatus = () => {\r\n setWasTicketFailure(false);\r\n }\r\n\r\n\r\n const value = {\r\n state: {offices, selectedoffice, queues, selectedqueuename, ticket, service, searchfilter, wasticketfailure },\r\n actions: {handleOfficeSelection, handleChangeOffice, handleTakeTicket, handleGeolocationUpdate, handleCancelTicket, qrToQueueSelection, qrToDirectTicket,qrToFormsSelection, toExistingTicket, updateSearchFilter, resetTicketFailureStatus }\r\n }\r\n\r\n return (\r\n \r\n
\r\n { children }\r\n
\r\n
\r\n )\r\n}","export function geodistance(lat1, lon1, lat2, lon2, unit) {\r\n\tif ((lat1 === lat2) && (lon1 === lon2)) {\r\n\t\treturn 0;\r\n\t}\r\n\telse {\r\n\t\tvar radlat1 = Math.PI * lat1/180;\r\n\t\tvar radlat2 = Math.PI * lat2/180;\r\n\t\tvar theta = lon1-lon2;\r\n\t\tvar radtheta = Math.PI * theta/180;\r\n\t\tvar dist = Math.sin(radlat1) * Math.sin(radlat2) + Math.cos(radlat1) * Math.cos(radlat2) * Math.cos(radtheta);\r\n\t\tif (dist > 1) {\r\n\t\t\tdist = 1;\r\n\t\t}\r\n\t\tdist = Math.acos(dist);\r\n\t\tdist = dist * 180/Math.PI;\r\n\t\tdist = dist * 60 * 1.1515;\r\n\t\tif (unit.toLowerCase() === \"kilometers\") { dist = dist * 1.609344 }\r\n\t\treturn dist;\r\n\t}\r\n}","import React, { useState, useEffect } from 'react'\r\nimport { ConfigContext } from './context'\r\nimport { isFalsyOrEmpty } from '../../components/helpers/object'\r\nimport axios from 'axios'\r\nimport dayjs from 'dayjs';\r\nimport { ServiceInfo } from '../../services/dto/serviceinfo.dto';\r\nimport {version} from '../../../package.json'\r\n\r\nexport const ConfigProvider = ({children}) => {\r\n const [config, setConfig] = useState();\r\n const [loadedpalette, setLoadedPalette] = useState(false);\r\n const [palette, setPalette] = useState();\r\n\r\n useEffect(() => {\r\n LoadAll();\r\n }, [])\r\n\r\n const LoadAll = async () => {\r\n GetConfiguration();\r\n GetResources();\r\n GetPalette();\r\n GetVersion();\r\n }\r\n\r\n async function GetConfiguration() {\r\n await axios({\r\n method: 'get',\r\n url: './config.json',\r\n responseType: 'json'\r\n })\r\n .then(res => { \r\n axios({\r\n method: 'get', \r\n url: res.data.configurl + \"config.json?apa=\" + Date.now(),\r\n headers : { \r\n 'Content-Type': 'application/json',\r\n 'Accept': 'application/json'\r\n },\r\n responseType: 'json'\r\n })\r\n .then(rez => { \r\n if (!isFalsyOrEmpty(config))\r\n {\r\n if (JSON.stringify(config) !== rez.data)\r\n setConfig(rez.data);\r\n }\r\n setConfig(rez.data);\r\n })\r\n .catch(err => console.log(err))\r\n })\r\n }\r\n\r\nconst GetPalette = async () => {\r\n return await axios({\r\n method: 'get',\r\n url: './theme.json',\r\n responseType: 'json'\r\n })\r\n .then(res => { setPalette(res.data); setLoadedPalette(true);})\r\n}\r\n\r\nconst GetResources = async () => {\r\n await axios({\r\n method: 'get',\r\n url: './config.json',\r\n responseType: 'json'\r\n })\r\n .then(rez => {\r\n axios({\r\n method: 'get', \r\n url: rez.data.configurl + \"offices.json?apa=\" + Date.now(),\r\n headers : { \r\n 'Content-Type': 'application/json',\r\n 'Accept': 'application/json'\r\n },\r\n responseType: 'json'\r\n }).then(rex => {\r\n if (!isFalsyOrEmpty(rex))\r\n sessionStorage.setItem(\"resources\", JSON.stringify(rex.data));\r\n })\r\n })\r\n .catch(error => console.log(error))\r\n}\r\n\r\nconst GetVersion = () => {\r\n var stored = localStorage.getItem(\"version\");\r\n var newversion = version;\r\n console.log(\"VERSION CONTROL\")\r\n if (isFalsyOrEmpty(stored) || stored === \"undefined\")\r\n {\r\n console.log(\"NO VERSION FOUND\")\r\n localStorage.setItem(\"version\", newversion);\r\n localStorage.removeItem(\"language\");\r\n window.location.reload();\r\n }\r\n else\r\n {\r\n if (stored < newversion)\r\n {\r\n console.log(\"OLD VERSION FOUND\")\r\n localStorage.removeItem(\"version\");\r\n localStorage.removeItem(\"language\");\r\n window.location.reload();\r\n }\r\n console.log(\"CURRENT VERSION FOUND\")\r\n }\r\n}\r\n\r\n// Vad ska den här klassen/interfejset göra?\r\n// Vi ska kunna kolla vilka köer som ska vara öppna för vilka kontor, under vilka dagar och timmar.\r\n// Sedan ska vi filtrera bort de resultat som inte faller innom ramarna\r\n\r\n// Det som kommer in är en lista på köer (queues) samt ett kontors-ID (officeID).\r\n// Vår referens är en json-fil över kontor, med kö-information. (resource)\r\n// Vi slår upp kontoret i \"resource\" och kollar vilka köer som finns där\r\n// Första sorteringen är ifall köerna i \"queues\" finns med i \"resources\"\r\n// Andra sorteringen är att kolla ifall gala/nqc informationen under \"resources\" matchar informationen i \"queues\"\r\n// Tredje sorteringen är att kolla ifall det är rätt dag\r\n// Fjärde sorteringen är att kolla ifall det är rätt tid på dagen\r\n// Varje gång som ett entry i \"queues\" failar så tar vi bort den ur listan och går vidare till nästa objekt, tills vi returnerar något\r\n\r\nconst Queuefilter = async (officeID, queues) => {\r\n let tmpresources = JSON.parse(sessionStorage.getItem(\"resources\"));\r\n if (!isFalsyOrEmpty(tmpresources) && officeID && queues)\r\n {\r\n const offices = tmpresources[\"offices\"].find(x => x.id === officeID);\r\n if (offices)\r\n {\r\n const qs = offices[\"queues\"];\r\n const queuetemplates = offices[\"queuetemplates\"];\r\n var templateresults = queuetemplates.map(x => GetTemplate(\"queue\", x));\r\n var queueresource = templateresults.concat(qs);\r\n if (queueresource)\r\n {\r\n const day = dayjs().format('ddd').toLowerCase();\r\n const hour = dayjs().format('H');\r\n const minute = dayjs().format('m');\r\n // var kek = queueresource.map(x => x.openhourtemplates.map(a => GetTemplate(\"openhour\", a)))\r\n // var fef = kek.flat();\r\n // var beb = kek.concat(queueresource.map(x => x.openhours).filter(x => !isFalsyOrEmpty(x))).flat();\r\n // var fuf = kek.concat(beb)\r\n const firstfilter = queues.filter(x => \r\n queueresource.find(\r\n ((y,i) => (y.id === x.queueID\r\n || (y.gala_segment === x.segmentID && y.gala_service === x.serviceID))\r\n && y.openhourtemplates.map(a => GetTemplate(\"openhour\", a)).flat().concat(y.openhours).filter(x => !isFalsyOrEmpty(x)).some(z => z.days.some(a => a === day) \r\n && dayjs().hour(z.open_hour).minute(z.open_minute).isBefore(dayjs().hour(hour).minute(minute)) \r\n && dayjs().hour(z.close_hour).minute(z.close_minute).isAfter(dayjs().hour(hour).minute(minute)) \r\n ))));\r\n return firstfilter;\r\n }\r\n }\r\n }\r\n else return null;\r\n}\r\n\r\nconst UpdateQueueDataFromConfig = (officeID, queuedata) => {\r\n let tmpresources = JSON.parse(sessionStorage.getItem(\"resources\"));\r\n var updatedqueues = null;\r\n try {\r\n const office = tmpresources[\"offices\"].find(x => x.id === officeID);\r\n if (isFalsyOrEmpty(office))\r\n return null;\r\n const qtemplates = office[\"queuetemplates\"];\r\n const qs = qtemplates.map(x => GetTemplate(\"queue\", x));\r\n const queues = qs.concat(office[\"queues\"]).filter(x => queuedata.find(y => y.queueID === x.id));\r\n updatedqueues = queues.map(x => { \r\n var q = queuedata.find(y => y.queueID === x.id);\r\n return new ServiceInfo(x.name, q.peopleWaiting, q.actualWaitTime, q.active, q.queueID, x.gala_service, x.gala_service);\r\n });\r\n }\r\n catch{\r\n\r\n }\r\n return updatedqueues;\r\n}\r\n\r\nconst GetOfficeIDFromUrlID = urlid => {\r\n let tmpresources = JSON.parse(sessionStorage.getItem(\"resources\"));\r\n if (!isFalsyOrEmpty(tmpresources))\r\n {\r\n const result = tmpresources[\"offices\"].find(x => x.urlid.toString() === urlid);\r\n if (result)\r\n return result.id;\r\n }\r\n else\r\n return null;\r\n}\r\n\r\nconst GetUrlIDFromOfficeID = officeid => {\r\n let tmpresources = JSON.parse(sessionStorage.getItem(\"resources\"));\r\n if (!isFalsyOrEmpty(tmpresources))\r\n {\r\n const result = tmpresources[\"offices\"].find(x => x.id === officeid);\r\n if (result)\r\n return result.urlid;\r\n }\r\n else\r\n return null;\r\n}\r\n\r\nconst GetQueueIDfromUrlID = (oid, qid) => {\r\n let tmpresources = JSON.parse(sessionStorage.getItem(\"resources\"));\r\n if (!isFalsyOrEmpty(tmpresources))\r\n {\r\n var office = tmpresources[\"offices\"].find(x => x.id === oid);\r\n const templatenames = office[\"queuetemplates\"];\r\n var templateresults = templatenames.map(x => GetTemplate(\"queue\", x));\r\n var queues = office[\"queues\"];\r\n const result = templateresults.concat(queues).find(x => x.urlid.toString() === qid);\r\n if (result)\r\n return result.id;\r\n }\r\n else\r\n return null;\r\n}\r\n\r\nconst GetUrlIDFromQueueID = (oid, qid) => {\r\n let tmpresources = JSON.parse(sessionStorage.getItem(\"resources\"));\r\n if (!isFalsyOrEmpty(tmpresources))\r\n {\r\n var office = tmpresources[\"offices\"].find(x => x.id === oid);\r\n const templatenames = office[\"queuetemplates\"];\r\n var templateresults = templatenames.map(x => GetTemplate(\"queue\", x));\r\n const result = templateresults.concat(office[\"queues\"]).find(x => x.id === qid);\r\n if (result)\r\n return result.urlid;\r\n }\r\n else\r\n return null;\r\n}\r\n\r\nconst GetQueuenameFromQueueID = (oid, qid) => {\r\n let tmpresources = JSON.parse(sessionStorage.getItem(\"resources\"));\r\n if (!isFalsyOrEmpty(tmpresources))\r\n {\r\n var office = tmpresources[\"offices\"].find(x => x.id === oid);\r\n const templatenames = office[\"queuetemplates\"];\r\n var templateresults = templatenames.map(x => GetTemplate(\"queue\", x));\r\n const result = templateresults.concat(office[\"queues\"]).find(x => x.id === qid);\r\n if (result)\r\n return result.name;\r\n }\r\n else\r\n return null;\r\n}\r\n\r\nconst GetPrinterData = async officeID => {\r\n let tmpresources = JSON.parse(sessionStorage.getItem(\"resources\"));\r\n if (!isFalsyOrEmpty(tmpresources) && officeID)\r\n {\r\n const offices = tmpresources[\"offices\"].find(x => x.id === officeID);\r\n if (offices)\r\n {\r\n const printerNumber = offices[\"NQCPrinterNumber\"];\r\n const printerTextNumber = offices[\"NQCPrinterTextNumber\"];\r\n if (printerNumber && printerTextNumber)\r\n return { printerNumber, printerTextNumber };\r\n else\r\n return null;\r\n }\r\n }\r\n}\r\n\r\nconst CheckIfHasForm = ( officeID, serviceinfo ) => {\r\n let tmpresources = JSON.parse(sessionStorage.getItem(\"resources\"));\r\n if (!isFalsyOrEmpty(tmpresources) && officeID && serviceinfo)\r\n {\r\n const office = tmpresources[\"offices\"].find(x => x.id === officeID);\r\n if (office)\r\n {\r\n const templatenames = office[\"queuetemplates\"];\r\n var templateresults = templatenames.map(x => GetTemplate(\"queue\", x));\r\n var servicetype = templateresults.concat(office[\"queues\"]).find(x => x.id === serviceinfo.queueID || (x.gala_segment === serviceinfo.segmentID && x.gala_service === serviceinfo.serviceID));\r\n if (servicetype && servicetype.hasforms === true)\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nconst GetFormData = ( officeID, serviceinfo ) => {\r\n let tmpresources = JSON.parse(sessionStorage.getItem(\"resources\"));\r\n if (!isFalsyOrEmpty(tmpresources) && officeID && serviceinfo)\r\n {\r\n const office = tmpresources[\"offices\"].find(x => x.id === officeID.toString());\r\n if (office)\r\n {\r\n const templatenames = office[\"queuetemplates\"];\r\n var templateresults = templatenames.map(x => GetTemplate(\"queue\", x));\r\n var servicetype = templateresults.concat(office[\"queues\"]).find(x => x.id === serviceinfo.queueID || (x.gala_segment === serviceinfo.segmentID && x.gala_service === serviceinfo.serviceID));\r\n if (servicetype && servicetype.hasforms === true)\r\n {\r\n var templates = GetTemplate(\"form\", servicetype.formtemplate);\r\n return templates.concat(servicetype.forms).flat();\r\n }\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nconst GetTemplate = (type, name) => {\r\n let tmpresources = JSON.parse(sessionStorage.getItem(\"resources\"));\r\n let templates = tmpresources[\"templates\"];\r\n let selectedtemplate;\r\n var item = null;\r\n if (type === \"queue\")\r\n {\r\n selectedtemplate = templates[\"queuetemplates\"];\r\n if (selectedtemplate.length > 0)\r\n item = selectedtemplate.filter(x => x.name === name)\r\n }\r\n else if (type === \"form\")\r\n {\r\n selectedtemplate = templates[\"formtemplates\"];\r\n if (selectedtemplate.length > 0)\r\n item = selectedtemplate.filter(x => x.name === name)\r\n }\r\n else if (type === \"openhour\")\r\n {\r\n selectedtemplate = templates[\"openhourtemplates\"];\r\n if (selectedtemplate.length > 0)\r\n item = selectedtemplate.filter(x => x.name === name)\r\n }\r\n if (isFalsyOrEmpty(item))\r\n {\r\n return null;\r\n } \r\n else\r\n {\r\n return item[0].value;\r\n }\r\n}\r\n\r\n\r\n const value = {\r\n state: { config, loadedpalette, palette},\r\n actions: { Queuefilter, GetPalette, GetOfficeIDFromUrlID, GetResources, LoadAll, GetPrinterData, CheckIfHasForm, GetFormData, GetUrlIDFromOfficeID, UpdateQueueDataFromConfig, GetQueueIDfromUrlID, GetUrlIDFromQueueID, GetQueuenameFromQueueID }\r\n }\r\n\r\n return (\r\n \r\n { children }\r\n \r\n )\r\n}","import React from 'react'\r\nimport ListItem from '@material-ui/core/ListItem'\r\nimport ListItemText from '@material-ui/core/ListItemText'\r\nimport Button from '@material-ui/core/Button'\r\nimport useTheme from '@material-ui/core/styles/useTheme'\r\nimport makeStyles from '@material-ui/core/styles/makeStyles'\r\nimport Typography from '@material-ui/core/Typography'\r\nimport { useTranslation } from '../../contexts/i18n/use'\r\nimport { useHistory } from 'react-router-dom'\r\nimport { useConfig } from '../../contexts/config/use'\r\n\r\nexport const QueueListItem = ({queuedata, officeID, bookTicket, disabled, disablecallback, hasform = false}) => {\r\n const theme = useTheme();\r\n const classes = useStyles(theme);\r\n const history = useHistory();\r\n const { actions: {GetUrlIDFromOfficeID, GetUrlIDFromQueueID}} = useConfig();\r\n const { actions: {t}} = useTranslation();\r\n\r\n const calcTime = (seconds) => {\r\n if ( seconds === 0)\r\n return (t('queuepage.nowaitingtime'))\r\n if ( seconds < 60)\r\n return t('queuepage.lessthan') + \" 1 \" + t('queuepage.timeunits.minute')\r\n if ( seconds < 120)\r\n return \"1 \" + t ('queuepage.timeunits.minute')\r\n if ( seconds < 3600 )\r\n return Math.floor(seconds / 60).toString() + \" \" + t('queuepage.timeunits.minutes')\r\n else\r\n return t('queuepage.morethan') + \" 1 \" + t('queuepage.timeunits.hour')\r\n }\r\n\r\n const handleSubmit = () => {\r\n disablecallback(true);\r\n if (hasform)\r\n {\r\n history.push(\"forms?officeID=\" + GetUrlIDFromOfficeID(officeID) + \"&queueID=\" + GetUrlIDFromQueueID(officeID, queuedata.queueID) + \"&segmentID=\" + queuedata.segmentID + \"&serviceID=\" + queuedata.serviceID);\r\n return;\r\n }\r\n else\r\n bookTicket(officeID, queuedata, null, t('queuepage.customertext'));\r\n }\r\n\r\n return (\r\n \r\n {queuedata.name}}\r\n secondary={ <>\r\n {t('queuepage.peoplewaiting') + \" \" + queuedata.peopleWaiting + t('queuepage.peoplewaitingsuffix')}\r\n {t('queuepage.currentwaitingtime') + \" \" + calcTime(queuedata.actualWaitTime)}\r\n \r\n }/>\r\n \r\n \r\n ) \r\n}\r\n\r\nconst useStyles = makeStyles({\r\n container: theme => ({\r\n maxWidth: '500px',\r\n backgroundColor: theme.palette.listitem.main,\r\n paddingTop: '0.25rem',\r\n paddingBottom: 0\r\n }),\r\n button: theme => ({\r\n borderRadius: 0,\r\n color: theme.palette.button_text.main,\r\n backgroundColor: theme.palette.primary.main,\r\n padding: '0.8rem 0.5rem',\r\n [theme.breakpoints.up('lg')]: {\r\n '&:hover': {\r\n backgroundColor: 'black',\r\n color: 'white'\r\n }\r\n },\r\n [theme.breakpoints.down('lg')]: {\r\n '&:hover': {\r\n backgroundColor: theme.palette.primary.main,\r\n color: theme.palette.button_text.main\r\n }\r\n }\r\n }),\r\n primarytext: theme => ({\r\n color: theme.palette.primary.main\r\n }),\r\n secondarytext: theme => ({\r\n color: theme.palette.secondary_text.main\r\n }),\r\n root: {\r\n margin: '0.25rem 0 0.25rem'\r\n }\r\n})","import React from 'react'\r\nimport Button from '@material-ui/core/Button';\r\nimport Schedule from '@material-ui/icons/Schedule'\r\nimport useTheme from '@material-ui/core/styles/useTheme'\r\nimport makeStyles from '@material-ui/core/styles/makeStyles'\r\nimport { Typography } from '@material-ui/core';\r\n\r\nexport const RedirectButton = ({url, text}) => {\r\n const theme = useTheme();\r\n const classes = useStyles(theme);\r\n\r\n return (\r\n }\r\n className={[classes.button, \"buttons\"].join(' ')}\r\n id=\"queues-redirectbutton-id\"\r\n disableElevation\r\n onClick={() => window.open(url)}\r\n >\r\n { {text || \"Boka tid\"} }\r\n \r\n )\r\n}\r\n\r\nconst useStyles = makeStyles({\r\n button: theme => ({\r\n color: theme.palette.button_text.main,\r\n backgroundColor: theme.palette.secondary.main,\r\n borderRadius: 0,\r\n [theme.breakpoints.up('lg')]: {\r\n '&:hover': {\r\n backgroundColor: 'black',\r\n color: 'white'\r\n }\r\n },\r\n [theme.breakpoints.down('lg')]: {\r\n '&:hover': {\r\n backgroundColor: theme.palette.primary.main,\r\n color: theme.palette.button_text.main\r\n }\r\n }\r\n })\r\n})","import React from 'react'\r\n\r\nexport const LogoType = () => {\r\n\r\n return (\r\n
\r\n {\"Företagets\r\n
\r\n )\r\n}\r\n\r\nconst styles = {\r\n container: () => ({\r\n display: 'flex', \r\n justifyContent: 'center'\r\n })\r\n}","import React, { useState, useEffect } from 'react'\r\nimport AppBar from '@material-ui/core/AppBar'\r\nimport Toolbar from '@material-ui/core/Toolbar'\r\nimport Typography from '@material-ui/core/Typography'\r\nimport { LogoType } from './logotype'\r\nimport Button from '@material-ui/core/Button'\r\nimport Divider from '@material-ui/core/Divider'\r\nimport useTheme from '@material-ui/core/styles/useTheme'\r\nimport makeStyles from '@material-ui/core/styles/makeStyles'\r\nimport { useRest } from '../contexts/rest/use'\r\nimport { useTranslation } from '../contexts/i18n/use'\r\nimport { DropdownMenu } from './helpers/dropdownmenu'\r\nimport { useConfig } from '../contexts/config/use'\r\nimport { isFalsyOrEmpty } from './helpers/object'\r\n\r\nexport const Header = () => {\r\n const theme = useTheme();\r\n const classes = useStyles(theme)\r\n const { state: {config}} = useConfig();\r\n const { state: { selectedoffice, offices, ticket, selectedqueuename }, actions: { handleChangeOffice } } = useRest();\r\n const { actions: {t }} = useTranslation();\r\n const [menuitems, setMenuItems] = useState();\r\n const [officename, setOfficeName] = useState();\r\n\r\n useEffect(() => {\r\n if (!isFalsyOrEmpty(offices))\r\n {\r\n OfficeSelection();\r\n var office = offices.find(x => x.officeID === selectedoffice);\r\n if (office)\r\n setOfficeName(office.name);\r\n else \r\n setOfficeName(t('header.noneselected'));\r\n }\r\n }, [offices])\r\n\r\n useEffect(() => {\r\n if (config)\r\n {\r\n setMenuItems();\r\n }\r\n else\r\n setMenuItems();\r\n }, [config])\r\n\r\n const OfficeSelection = () => {\r\n if (config)\r\n {\r\n if ((!isFalsyOrEmpty(ticket)) || !config.uselandingpage)\r\n {\r\n return (\r\n \r\n { selectedqueuename || \"\"}\r\n \r\n )\r\n }\r\n else\r\n {\r\n return (\r\n handleChangeOffice()}\r\n disabled={!isFalsyOrEmpty(ticket) && !ticket.cancelled}\r\n >\r\n { \r\n \r\n {t('header.changeoffice') || \"Välj kontor\"}\r\n \r\n }\r\n \r\n )\r\n }\r\n }\r\n else\r\n return \r\n }\r\n\r\n return (\r\n
\r\n
\r\n \r\n \r\n \r\n { menuitems }\r\n \r\n \r\n
\r\n \r\n
\r\n \r\n { officename }\r\n \r\n
\r\n
\r\n { OfficeSelection() }\r\n
\r\n {\r\n (config && config.custombackgroundlink !== '') ? : \r\n }\r\n
\r\n )\r\n}\r\n\r\nconst useStyles = makeStyles({\r\n container: {\r\n display: 'flex',\r\n flex: '1 1 auto'\r\n },\r\n root: theme => ({\r\n flexGrow: 1,\r\n backgroundColor: theme.palette.background.main\r\n }),\r\n gutters: {\r\n minHeight: 'auto'\r\n },\r\n title: {\r\n flexGrow: 1\r\n },\r\n wrapper: {\r\n display: 'flex',\r\n justifyContent: 'center'\r\n },\r\n officetext: theme => ({\r\n margin: 0, \r\n padding: '0.5rem 0 0 0',\r\n color: theme.palette.primary.main\r\n }),\r\n officebutton: theme => ({\r\n backgroundColor: theme.palette.secondary.main,\r\n color: theme.palette.button_text.main,\r\n borderRadius: 0,\r\n [theme.breakpoints.up('lg')]: {\r\n '&:hover': {\r\n backgroundColor: 'black',\r\n color: 'white'\r\n }\r\n },\r\n [theme.breakpoints.down('lg')]: {\r\n '&:hover': {\r\n backgroundColor: theme.palette.primary.main,\r\n color: theme.palette.button_text.main\r\n }\r\n }\r\n }),\r\n divider: {\r\n marginTop: '0.5rem'\r\n },\r\n queuetext: {\r\n\r\n }\r\n});","import React, { useState, useEffect} from 'react'\r\nimport Room from '@material-ui/icons/Room'\r\nimport Home from '@material-ui/icons/Home'\r\nimport useTheme from '@material-ui/core/styles/useTheme'\r\nimport makeStyles from '@material-ui/core/styles/makeStyles'\r\nimport Typography from '@material-ui/core/Typography'\r\nimport { useRest } from '../contexts/rest/use'\r\nimport { useTranslation } from '../contexts/i18n/use'\r\n\r\nexport const Footer = () => {\r\n const theme = useTheme();\r\n const classes = useStyles(theme);\r\n const { state: {offices, selectedoffice }} = useRest();\r\n const { actions: {t}} = useTranslation();\r\n const [office, setOffice] = useState();\r\n\r\n useEffect(() => {\r\n if (offices && selectedoffice)\r\n setOffice(offices.find(x => x.officeID === selectedoffice))\r\n }, [offices, selectedoffice])\r\n\r\n return (\r\n
\r\n
\r\n
\r\n \r\n
\r\n \r\n { office ? office.address.street : t('footer.loading') }\r\n \r\n \r\n { office ? office.address.zipcode + \" \" + office.address.city : t('footer.loading')}\r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n { e.preventDefault(); window.open(t('footer.customerurl'))}}>\r\n { t('footer.customerurl').replace(/^https?:\\/\\//, '') || \"\" }\r\n \r\n
\r\n
\r\n
\r\n
\r\n )\r\n}\r\n\r\nconst useStyles = makeStyles({\r\n container: {\r\n display: 'flex', \r\n flexShrink: 0,\r\n flexDirection: 'row', \r\n width: '100%'\r\n },\r\n map: {\r\n backgroundColor: 'pink',\r\n display: 'flex',\r\n flex: '0 1 auto'\r\n },\r\n wrapper: theme => ({\r\n display: 'flex', \r\n flexDirection: 'column',\r\n paddingTop: '0.25rem',\r\n width: '100%',\r\n justifyContent: 'space-between',\r\n backgroundColor: theme.palette.primary.main,\r\n }),\r\n contentwrapper: {\r\n display: 'flex', \r\n flex: '1 0 auto',\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n textAlign: 'start',\r\n padding: '2px',\r\n height: '2rem'\r\n },\r\n content: theme => ({\r\n width: '100%',\r\n display: 'flex', \r\n flexDirection: 'column',\r\n color: theme.palette.footer_color.main\r\n }),\r\n icon: theme => ({\r\n color: theme.palette.footer_color.main,\r\n width: 'auto',\r\n height: '65%'\r\n }),\r\n contenttext: {\r\n padding: 0, \r\n margin: 0, \r\n paddingLeft: '1rem'\r\n }\r\n})\r\n","import React from 'react'\r\nimport ListItem from '@material-ui/core/ListItem'\r\nimport ListItemText from '@material-ui/core/ListItemText'\r\nimport useTheme from '@material-ui/core/styles/useTheme'\r\nimport makeStyles from '@material-ui/core/styles/makeStyles'\r\nimport Typography from '@material-ui/core/Typography'\r\nimport { useTranslation } from '../../contexts/i18n/use'\r\n\r\nexport const QueueEmptyListItem = () => {\r\n const theme = useTheme();\r\n const classes = useStyles(theme);\r\n const { actions: {t}} = useTranslation();\r\n\r\n return (\r\n \r\n {t('queuepage.noqueuesavailable')}}>\r\n \r\n \r\n ) \r\n}\r\n\r\nconst useStyles = makeStyles({\r\n container: theme => ({\r\n maxWidth: '500px',\r\n backgroundColor: theme.palette.listitem.main,\r\n paddingTop: 0,\r\n paddingBottom: 0,\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n textAlign: 'center'\r\n }),\r\n primarytext: theme => ({\r\n color: theme.palette.secondary_text.main\r\n })\r\n})","import React from 'react'\r\nimport useTheme from '@material-ui/core/styles/useTheme'\r\nimport makeStyles from '@material-ui/core/styles/makeStyles'\r\nimport Button from '@material-ui/core/Button';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport DialogActions from '@material-ui/core/DialogActions';\r\nimport DialogContent from '@material-ui/core/DialogContent';\r\nimport DialogTitle from '@material-ui/core/DialogTitle';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport { useTranslation } from '../../contexts/i18n/use'\r\nimport { useRest } from '../../contexts/rest/use'\r\n\r\nexport const TicketFailureModal = ({disablecallback}) => {\r\n const { actions: { resetTicketFailureStatus } } = useRest();\r\n const theme = useTheme();\r\n const classes = useStyles(theme);\r\n const { actions: {t}} = useTranslation();\r\n\r\n return (\r\n \r\n { t('queuepage.taketicketfail.title')}\r\n \r\n { t('queuepage.taketicketfail.text')}\r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nconst useStyles = makeStyles({\r\n modal: theme => ({\r\n border: '1px solid '+ theme.palette.primary.main,\r\n alignItems: 'center'\r\n }),\r\n buttonwrapper: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n padding: '1rem 0',\r\n justifyContent: 'space-between',\r\n alignItems: 'center',\r\n width: '80%'\r\n },\r\n confirmbutton: theme => ({\r\n backgroundColor: theme.palette.error.main,\r\n color: theme.palette.button_text.main,\r\n [theme.breakpoints.up('lg')]: {\r\n '&:hover': {\r\n backgroundColor: 'black',\r\n color: 'white'\r\n }\r\n },\r\n [theme.breakpoints.down('lg')]: {\r\n '&:hover': {\r\n backgroundColor: theme.palette.error.main,\r\n color: theme.palette.button_text.main\r\n }\r\n }\r\n })\r\n})","export class Queuedata {\r\n constructor(_queueID, _segmentID, _serviceID)\r\n {\r\n this.queueID = _queueID;\r\n this.segmentID = _segmentID || null;\r\n this.serviceID = _serviceID || null;\r\n }\r\n}","import React, { useEffect, useState } from 'react'\r\nimport List from '@material-ui/core/List'\r\nimport { useRest } from '../../contexts/rest/use'\r\nimport { useConfig } from '../../contexts/config/use'\r\nimport { QueueListItem } from './queue_listitem'\r\nimport { RedirectButton } from './redirectbutton'\r\nimport { Header } from '../header'\r\nimport { Footer } from '../footer'\r\nimport useTheme from '@material-ui/core/styles/useTheme'\r\nimport makeStyles from '@material-ui/core/styles/makeStyles'\r\nimport { useTranslation } from '../../contexts/i18n/use'\r\nimport CircularProgress from '@material-ui/core/CircularProgress'\r\nimport { QueueEmptyListItem } from './queue_emptylistitem'\r\nimport { useHistory } from \"react-router-dom\"\r\nimport { isFalsyOrEmpty } from '../helpers/object'\r\nimport { TicketFailureModal } from './ticketfailuremodal'\r\nimport { Queuedata } from '../../services/dto/queuedata.dto'\r\n\r\nexport const QueueDisplay = () => {\r\n const { state: { selectedoffice, queues, wasticketfailure }, actions: { handleTakeTicket, qrToQueueSelection } } = useRest();\r\n const { state: { config }, actions: {GetOfficeIDFromUrlID, CheckIfHasForm, LoadAll }} = useConfig();\r\n const [disablebuttons, setDisableButtons] = useState(false);\r\n const [officeid, setOfficeID] = useState();\r\n const [failure, setFailure] = useState(null);\r\n const [hasloaded, setHasLoaded] = useState(false);\r\n const theme = useTheme();\r\n const classes = useStyles(theme);\r\n const { actions: {t}} = useTranslation();\r\n const history = useHistory();\r\n\r\n useEffect(() => {\r\n if (config)\r\n {\r\n sessionStorage.removeItem(\"formdata\");\r\n\r\n var oldbaseurl = localStorage.getItem(\"baseurl\");\r\n if (window.location.pathname !== oldbaseurl)\r\n {\r\n setHasLoaded(false);\r\n localStorage.removeItem(\"ticket\");\r\n localStorage.removeItem(\"tickettext\");\r\n localStorage.removeItem(\"selectedoffice\");\r\n localStorage.removeItem(\"selectedqueuename\");\r\n sessionStorage.removeItem(\"resources\");\r\n sessionStorage.removeItem(\"queuename\");\r\n sessionStorage.removeItem(\"formdata\");\r\n sessionStorage.removeItem(\"token\");\r\n sessionStorage.removeItem(\"tokenconfig\");\r\n localStorage.setItem(\"baseurl\", window.location.pathname);\r\n LoadAll();\r\n window.location.reload();\r\n return;\r\n }\r\n\r\n const savedticket = JSON.parse(localStorage.getItem(\"ticket\"));\r\n if (!isFalsyOrEmpty(savedticket) && !savedticket.cancelled)\r\n history.push(\"ticket\");\r\n else\r\n {\r\n let urlid = GetOfficeIDFromHash();\r\n if(urlid)\r\n {\r\n var result = GetOfficeIDFromUrlID(urlid);\r\n if (!result)\r\n history.push(\"404\")\r\n else\r\n setOfficeID(result);\r\n }\r\n }\r\n setHasLoaded(true);\r\n }\r\n },[config])\r\n\r\n useEffect(() => {\r\n if (officeid)\r\n {\r\n var hash = window.location.hash.split(\"?\")\r\n window.history.replaceState({}, '', window.location.origin + window.location.pathname + hash[0])\r\n qrToQueueSelection(officeid);\r\n }\r\n }, [officeid])\r\n\r\n useEffect(() => {\r\n if (wasticketfailure)\r\n setFailure(true);\r\n else \r\n setFailure(null);\r\n },[wasticketfailure])\r\n\r\n const GetOfficeIDFromHash = () => {\r\n if ( window.location.hash && Object.keys(window.location.hash).length > 0)\r\n {\r\n var hashpath = window.location.hash.substr(1);\r\n var queryparams = hashpath.split('?');\r\n if (queryparams && queryparams.length > 1)\r\n {\r\n var result = queryparams[1].split('=');\r\n if (result[0] === \"officeID\")\r\n return result[1];\r\n else\r\n return null;\r\n }\r\n }\r\n }\r\n\r\n const handleDisable = value => {\r\n setDisableButtons(value);\r\n }\r\n\r\n if ((disablebuttons && !wasticketfailure) || !hasloaded)\r\n {\r\n return (\r\n
\r\n \r\n
\r\n )\r\n }\r\n else\r\n {\r\n return (\r\n
\r\n
\r\n
\r\n
\r\n {\r\n !isFalsyOrEmpty(config) \r\n ? \r\n \r\n { (!isFalsyOrEmpty(queues) && queues.length > 0) \r\n ? queues.map((x,i) => { return }) \r\n : \r\n }\r\n \r\n : \r\n }\r\n { failure ? : <>}\r\n
\r\n { (config && config.shouldHaveRedirectButton) ? : }\r\n
\r\n
\r\n
\r\n
\r\n
\r\n )\r\n }\r\n}\r\n\r\nconst useStyles = makeStyles({\r\n container: {\r\n width: '100%',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n height: '100%',\r\n flex: '1 0 auto',\r\n },\r\n outerbox: {\r\n display: 'flex', \r\n flexDirection: 'column', \r\n height: '100%',\r\n overflow: 'auto'\r\n },\r\n innerbox: {\r\n display: 'flex', \r\n flexDirection: 'column', \r\n flex: '1 0 auto', \r\n height: '100%'\r\n },\r\n buttonwrapper: {\r\n marginTop: 'auto',\r\n marginBottom: '1rem',\r\n },\r\n list: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n margin: '0 0.5rem'\r\n },\r\n spinner: theme => ({\r\n color: theme.palette.primary.main,\r\n height: '80%',\r\n width: '80%'\r\n }),\r\n spinnerwrapper: {\r\n height: '100%',\r\n width: '100%',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n display: 'flex',\r\n flexDirection: 'column'\r\n }\r\n})\r\n","import React, { useEffect } from 'react'\r\nimport Paper from '@material-ui/core/Paper'\r\nimport Typography from '@material-ui/core/Typography';\r\nimport Button from '@material-ui/core/Button';\r\nimport useTheme from '@material-ui/core/styles/useTheme'\r\nimport makeStyles from '@material-ui/core/styles/makeStyles'\r\nimport Box from '@material-ui/core/Box'\r\n\r\nexport const TicketCancelled = ({ticket, cancelTicketCallback, timeouttext, throwtickettext}) => {\r\n const theme = useTheme();\r\n const classes = useStyles(theme);\r\n\r\n useEffect(() => {\r\n localStorage.removeItem(\"selectedqueuename\");\r\n },[])\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n { timeouttext || \"Din tid är ute\"}\r\n \r\n \r\n { ticket.ticketnumber}\r\n \r\n \r\n { ticket.timestamp }\r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n
\r\n )\r\n}\r\n\r\nconst useStyles = makeStyles({\r\n container: theme => ({\r\n backgroundColor: theme.palette.background.main,\r\n display: 'flex',\r\n flexDirection: 'column',\r\n flex: '1 1 auto',\r\n position: 'relative',\r\n alignItems: 'center',\r\n overflow: 'auto'\r\n }),\r\n wrapper: {\r\n display: 'flex', \r\n flexDirection: 'column', \r\n height: '100%',\r\n overflow: 'auto'\r\n },\r\n semicontainer: theme => ({\r\n minWidth: '300px',\r\n maxWidth: '80%',\r\n borderRadius: '20px',\r\n backgroundColor: theme.palette.ticket_cancelled.main,\r\n margin: '0.5rem 0',\r\n padding: '0 0.5rem 0.5rem 0.5rem'\r\n }),\r\n title: theme => ({\r\n color: theme.palette.secondary_text.main,\r\n marginTop: '0.5rem'\r\n }),\r\n valuetext: theme => ({\r\n color: theme.palette.secondary_text.main,\r\n fontSize: '4rem',\r\n fontWeight: '900',\r\n [theme.breakpoints.down('xs')]: {\r\n fontSize: '3rem' \r\n }\r\n }),\r\n timestamptext: theme => ({\r\n color: theme.palette.secondary_text.main,\r\n fontSize: 'small'\r\n }),\r\n button: theme => ({\r\n backgroundColor: theme.palette.secondary.main,\r\n color: theme.palette.button_text.main,\r\n borderRadius: 0,\r\n [theme.breakpoints.up('lg')]: {\r\n '&:hover': {\r\n backgroundColor: 'black',\r\n color: 'white'\r\n }\r\n },\r\n [theme.breakpoints.down('lg')]: {\r\n '&:hover': {\r\n backgroundColor: theme.palette.secondary.main,\r\n color: theme.palette.button_text.main\r\n }\r\n }\r\n }),\r\n buttonwrapper: {\r\n marginTop: 'auto',\r\n marginBottom: '0.5rem',\r\n },\r\n\r\n})","import React from 'react'\r\nimport makeStyles from '@material-ui/core/styles/makeStyles'\r\nimport Typography from '@material-ui/core/Typography'\r\n\r\nexport const DynamicTicketTextItem = ({label, text}) => {\r\n const classes = useStyles();\r\n return (\r\n <>\r\n \r\n { label }\r\n \r\n \r\n { text }\r\n \r\n \r\n )\r\n}\r\n\r\nconst useStyles = makeStyles({\r\n label: {\r\n fontSize: '1rem',\r\n fontWeight: '500'\r\n },\r\n text: {\r\n fontSize: '0.8rem'\r\n }\r\n})","import React from 'react'\r\nimport Paper from '@material-ui/core/Paper'\r\nimport Box from '@material-ui/core/Box'\r\nimport Typography from '@material-ui/core/Typography';\r\nimport useTheme from '@material-ui/core/styles/useTheme'\r\nimport makeStyles from '@material-ui/core/styles/makeStyles'\r\nimport { DynamicTicketTextItem } from './dynamictickettextitem'\r\n\r\n\r\nexport const TicketCalled = ({ticket, successtext, meetuptext, infotext, dynamicinfotext}) => {\r\n const theme = useTheme();\r\n const classes = useStyles(theme);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n { successtext || \"Det är din tid nu!\" }\r\n \r\n \r\n { ticket.ticketnumber}\r\n \r\n \r\n { ticket.timestamp}\r\n \r\n \r\n \r\n \r\n { meetuptext || \"Gå till plats \"}\r\n \r\n \r\n { ticket.meetUpLocation }\r\n \r\n \r\n \r\n { infotext }\r\n { dynamicinfotext ? dynamicinfotext.map(x => { return }) : }\r\n \r\n \r\n \r\n )\r\n}\r\n\r\nconst useStyles = makeStyles({\r\n container: theme => ({\r\n backgroundColor: theme.palette.background.main,\r\n display: 'flex',\r\n flexDirection: 'column',\r\n flex: '1 1 auto',\r\n position: 'relative',\r\n alignItems: 'center',\r\n overflow: 'auto'\r\n }),\r\n wrapper: {\r\n display: 'flex', \r\n flexDirection: 'column', \r\n height: '100%',\r\n overflow: 'auto'\r\n },\r\n semicontainer: theme => ({\r\n minWidth: '300px',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n maxWidth: '80%',\r\n borderRadius: '20px',\r\n backgroundColor: theme.palette.ticket_called.main,\r\n margin: '10px 0',\r\n padding: '0 0.5rem 0.5rem 0.5rem'\r\n }),\r\n title: theme => ({\r\n color: theme.palette.secondary_text.main,\r\n marginTop: '0.5rem'\r\n }),\r\n valuetext: theme => ({\r\n color: theme.palette.button_text.main,\r\n fontSize: '4rem',\r\n fontWeight: '900',\r\n [theme.breakpoints.down('xs')]: {\r\n fontSize: '3rem' \r\n }\r\n }),\r\n timestamptext: theme => ({\r\n color: theme.palette.secondary_text.main,\r\n fontSize: 'small'\r\n }),\r\n infotextcontainer: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n minWidth: '300px',\r\n maxWidth: '80%'\r\n }\r\n})","import React from 'react'\r\nimport Paper from '@material-ui/core/Paper'\r\nimport Box from '@material-ui/core/Box'\r\nimport Typography from '@material-ui/core/Typography';\r\nimport Button from '@material-ui/core/Button';\r\nimport useTheme from '@material-ui/core/styles/useTheme'\r\nimport makeStyles from '@material-ui/core/styles/makeStyles'\r\nimport LinearProgress from '@material-ui/core/LinearProgress';\r\nimport { DynamicTicketTextItem } from './dynamictickettextitem'\r\n\r\nexport const TicketWaiting = ({ticket, cancelTicketCallback, peopleaheadtext, ticketnumbertext, leavequeuetext, infotext, dynamicinfotext}) => {\r\n const theme = useTheme();\r\n const classes = useStyles(theme);\r\n\r\n const handleCancelTicket = () => {\r\n cancelTicketCallback(ticket.id);\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n { peopleaheadtext || \"Kunder före dig\"}\r\n \r\n \r\n { ticket.peopleAhead >= 0 ? ticket.peopleAhead : \"-\" }\r\n \r\n \r\n \r\n \r\n { ticketnumbertext || \"Ditt turnummer\" }\r\n \r\n \r\n { ticket.ticketnumber}\r\n \r\n \r\n { ticket.timestamp }\r\n \r\n \r\n \r\n { infotext }\r\n { dynamicinfotext ? dynamicinfotext.map(x => { return }) : }\r\n \r\n \r\n
\r\n \r\n
\r\n \r\n
\r\n )\r\n}\r\n\r\nconst useStyles = makeStyles({\r\n container: theme => ({\r\n backgroundColor: theme.palette.background.main,\r\n display: 'flex',\r\n flexDirection: 'column',\r\n flex: '1 1 auto',\r\n position: 'relative',\r\n alignItems: 'center',\r\n overflow: 'auto'\r\n }),\r\n wrapper: {\r\n display: 'flex', \r\n flexDirection: 'column', \r\n height: '100%',\r\n overflow: 'auto'\r\n },\r\n semicontainer: theme => ({\r\n minWidth: '300px',\r\n maxWidth: '80%',\r\n borderRadius: '20px',\r\n backgroundColor: theme.palette.ticket_waiting.main,\r\n margin: '0.5rem 0 0.25rem 0',\r\n padding: '0 0.5rem 0.5rem 0.5rem'\r\n }),\r\n infotextcontainer: {\r\n minWidth: '300px',\r\n maxWidth: '80%'\r\n },\r\n title: theme => ({\r\n color: theme.palette.primary.main,\r\n marginTop: '0.5rem'\r\n }),\r\n valuetext: theme => ({\r\n color: theme.palette.primary.main,\r\n fontSize: '4rem',\r\n fontWeight: '900',\r\n [theme.breakpoints.down('xs')]: {\r\n fontSize: '3rem' \r\n }\r\n }),\r\n timestamptext: theme => ({\r\n color: theme.palette.secondary_text.main,\r\n fontSize: 'small'\r\n }),\r\n button: theme => ({\r\n backgroundColor: theme.palette.secondary.main,\r\n color: theme.palette.button_text.main,\r\n borderRadius: 0,\r\n [theme.breakpoints.up('lg')]: {\r\n '&:hover': {\r\n backgroundColor: 'black',\r\n color: 'white'\r\n }\r\n },\r\n [theme.breakpoints.down('lg')]: {\r\n '&:hover': {\r\n backgroundColor: theme.palette.secondary.main,\r\n color: theme.palette.button_text.main\r\n }\r\n }\r\n }),\r\n buttonwrapper: {\r\n marginTop: 'auto',\r\n marginBottom: '0.5rem'\r\n },\r\n barColorPrimary: theme => ({\r\n backgroundColor: theme.palette.loadingbar_front.main\r\n }),\r\n colorPrimary: theme => ({\r\n backgroundColor: theme.palette.loadingbar_back.main\r\n }),\r\n spinner: {\r\n width: '100%',\r\n height: '0.5rem'\r\n },\r\n})","import React from 'react'\r\nimport useTheme from '@material-ui/core/styles/useTheme'\r\nimport makeStyles from '@material-ui/core/styles/makeStyles'\r\nimport Button from '@material-ui/core/Button';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport DialogActions from '@material-ui/core/DialogActions';\r\nimport DialogContent from '@material-ui/core/DialogContent';\r\nimport DialogTitle from '@material-ui/core/DialogTitle';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport { useTranslation } from '../../contexts/i18n/use'\r\n\r\nexport const CancelTicketInfo = ({cancelticketcallback, closemodalcallback}) => {\r\n const theme = useTheme();\r\n const classes = useStyles(theme);\r\n const { actions: {t}} = useTranslation();\r\n\r\n return (\r\n \r\n { t('ticketpage.leavequeueconfirmation.title')}\r\n \r\n { t('ticketpage.leavequeueconfirmation.text')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nconst useStyles = makeStyles({\r\n modal: theme => ({\r\n border: '1px solid '+ theme.palette.primary.main,\r\n alignItems: 'center'\r\n }),\r\n buttonwrapper: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n padding: '1rem 0',\r\n justifyContent: 'space-between',\r\n alignItems: 'center',\r\n width: '80%'\r\n },\r\n confirmbutton: theme => ({\r\n backgroundColor: theme.palette.error.main,\r\n color: theme.palette.button_text.main,\r\n [theme.breakpoints.up('lg')]: {\r\n '&:hover': {\r\n backgroundColor: 'black',\r\n color: 'white'\r\n }\r\n },\r\n [theme.breakpoints.down('lg')]: {\r\n '&:hover': {\r\n backgroundColor: theme.palette.error.main,\r\n color: theme.palette.button_text.main\r\n }\r\n }\r\n }),\r\n cancelbutton: theme => ({\r\n backgroundColor: theme.palette.info.main,\r\n color: theme.palette.button_text.main,\r\n [theme.breakpoints.up('lg')]: {\r\n '&:hover': {\r\n backgroundColor: 'black',\r\n color: 'white'\r\n }\r\n },\r\n [theme.breakpoints.down('lg')]: {\r\n '&:hover': {\r\n backgroundColor: theme.palette.info.main,\r\n color: theme.palette.button_text.main\r\n }\r\n }\r\n })\r\n})","export const GetParametersFromHash = () => {\r\n if ( window.location.hash && Object.keys(window.location.hash).length > 0)\r\n {\r\n var hashpath = window.location.hash.substr(1);\r\n var queryparams = hashpath.split('?');\r\n if (queryparams.length < 2)\r\n return null;\r\n var buffer = [];\r\n var dict = {};\r\n var currentkey = [];\r\n var currentvalue = [];\r\n for(var i = 0; i < queryparams[1].length; i++)\r\n {\r\n if (queryparams[1][i] === \"&\" || i === queryparams[1].length-1)\r\n {\r\n if (i === queryparams[1].length -1)\r\n buffer.push(queryparams[1][i])\r\n if (buffer.length > 0)\r\n currentvalue = buffer.reduce((a, c) => a + c);\r\n else\r\n currentvalue = null;\r\n dict[currentkey] = currentvalue;\r\n currentvalue = [];\r\n currentkey = [];\r\n buffer = [];\r\n }\r\n else if (queryparams[1][i] === \"=\")\r\n {\r\n currentkey = buffer.reduce((a, c) => a + c);\r\n buffer = []; \r\n }\r\n else \r\n buffer.push(queryparams[1][i]);\r\n }\r\n if (dict)\r\n return dict;\r\n else return null;\r\n }\r\n}","import React, { useEffect, useState } from 'react'\r\nimport { useRest } from '../../contexts/rest/use'\r\nimport { useConfig } from '../../contexts/config/use'\r\nimport { TicketCancelled } from './ticket_cancelled';\r\nimport { TicketCalled } from './ticket_called'\r\nimport { TicketWaiting } from './ticket_waiting'\r\nimport { useTranslation } from '../../contexts/i18n/use'\r\nimport useTheme from '@material-ui/core/styles/useTheme'\r\nimport makeStyles from '@material-ui/core/styles/makeStyles'\r\nimport { Header } from '../header'\r\nimport { Footer } from '../footer'\r\nimport { CancelTicketInfo } from './cancel_ticket_info';\r\nimport CircularProgress from '@material-ui/core/CircularProgress';\r\nimport { useHistory } from \"react-router-dom\"\r\nimport { isFalsyOrEmpty } from '../helpers/object';\r\nimport { GetParametersFromHash } from '../helpers/search';\r\nimport { Queuedata } from '../../services/dto/queuedata.dto';\r\n\r\nexport const TicketPage = () => {\r\n const { state: { ticket }, actions: { handleCancelTicket, qrToDirectTicket } } = useRest();\r\n const { state: { config }, actions: {GetOfficeIDFromUrlID, GetQueueIDfromUrlID, LoadAll }} = useConfig();\r\n const [searchparams, setSearchParams] = useState();\r\n const [dynamicinfotext, setDynamicInfoText] = useState();\r\n const { actions: {t, dt}} = useTranslation();\r\n const [modal, setModal] = useState();\r\n const history = useHistory();\r\n const theme = useTheme();\r\n const classes = useStyles(theme);\r\n \r\n const cancelTicketModal = () => {\r\n if (!modal)\r\n setModal(true);\r\n }\r\n\r\n const cancelTicketCallback = () => {\r\n setModal(false);\r\n handleCancelTicket();\r\n }\r\n\r\n const closeModalCallback = () => {\r\n setModal(false);\r\n }\r\n\r\n useEffect(() => {\r\n var tickettext = JSON.parse(localStorage.getItem(\"tickettext\"));\r\n sessionStorage.removeItem(\"formdata\");\r\n if ( tickettext )\r\n setDynamicInfoText(tickettext)\r\n },[])\r\n\r\n useEffect(() => {\r\n if (config) \r\n {\r\n\r\n var oldbaseurl = localStorage.getItem(\"baseurl\");\r\n if (window.location.pathname !== oldbaseurl)\r\n {\r\n localStorage.removeItem(\"ticket\");\r\n localStorage.removeItem(\"tickettext\");\r\n localStorage.removeItem(\"selectedoffice\");\r\n localStorage.removeItem(\"selectedqueuename\");\r\n sessionStorage.removeItem(\"resources\");\r\n sessionStorage.removeItem(\"queuename\");\r\n sessionStorage.removeItem(\"formdata\");\r\n sessionStorage.removeItem(\"token\");\r\n sessionStorage.removeItem(\"tokenconfig\");\r\n localStorage.setItem(\"baseurl\", window.location.pathname);\r\n LoadAll();\r\n window.location.reload();\r\n return;\r\n }\r\n\r\n if (isFalsyOrEmpty(ticket) || ticket.cancelled)\r\n {\r\n const searchParams = GetParametersFromHash();\r\n if (searchParams)\r\n {\r\n searchParams.officeID = GetOfficeIDFromUrlID(searchParams.officeID);\r\n searchParams.queueID = GetQueueIDfromUrlID(searchParams.officeID, searchParams.queueID);\r\n setSearchParams(searchParams);\r\n }\r\n else\r\n {\r\n let officeID = localStorage.getItem(\"selectedoffice\");\r\n let queueID = sessionStorage.getItem(\"selectedqueue\");\r\n let segmentID = sessionStorage.getItem(\"segementID\");\r\n let serviceID = sessionStorage.getItem(\"serviceID\");\r\n \r\n if (config && config.uselandingpage && !officeID && (!queueID || (!segmentID && !serviceID)))\r\n history.push(\"/\");\r\n else\r\n history.push(\"queues\");\r\n }\r\n }\r\n }\r\n }, [config])\r\n\r\n useEffect(() => {\r\n if(searchparams)\r\n {\r\n var hash = window.location.hash.split(\"?\")\r\n window.history.replaceState({}, '', window.location.origin + window.location.pathname + hash[0])\r\n var queuedata = new Queuedata(searchparams['queueID'], searchparams['segmentID'], searchparams['serviceID']);\r\n if (searchparams.officeID && (queuedata.queueID || (queuedata.segmentID && queuedata.serviceID)))\r\n qrToDirectTicket(searchparams.officeID, queuedata, t('queuepage.customertext'));\r\n else\r\n history.push(\"404\")\r\n }\r\n },[searchparams])\r\n\r\n const ActualTicket = () => {\r\n var savedticket = JSON.parse(localStorage.getItem(\"ticket\"));\r\n let officeID = localStorage.getItem(\"selectedoffice\");\r\n if (!isFalsyOrEmpty(savedticket))\r\n {\r\n if (savedticket.cancelled)\r\n return \r\n else if (savedticket.meetUpLocation)\r\n return { return {label: dt(officeID, x.label), value: x.value}}) : \"\"}\r\n />\r\n else\r\n return (\r\n <>\r\n { modal ? : }\r\n { return {label: dt(officeID, x.label), value: x.value}}) : \"\"}\r\n />\r\n \r\n )\r\n }\r\n else\r\n return (\r\n
\r\n \r\n
\r\n )\r\n }\r\n\r\n return (\r\n
\r\n
\r\n { ActualTicket() }\r\n
\r\n
\r\n )\r\n}\r\n\r\nconst useStyles = makeStyles({\r\n container: {\r\n width: '100%',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n height: '100%',\r\n flex: '1 0 auto'\r\n },\r\n spinner: theme => ({\r\n color: theme.palette.primary.main,\r\n height: '80%',\r\n width: '80%'\r\n }),\r\n spinnerwrapper: {\r\n height: '100%',\r\n width: '100%',\r\n flex: '1 0 auto',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n display: 'flex',\r\n flexDirection: 'column'\r\n }\r\n})\r\n\r\n","import React, { useState, useEffect } from 'react'\r\nimport { createMuiTheme, ThemeProvider, responsiveFontSizes } from '@material-ui/core/styles';\r\nimport { useConfig } from '../config/use'\r\n\r\n\r\nexport const MaterialThemeProvider = ({children}) => {\r\n const { state: {loadedpalette, palette}, actions: {GetPalette} } = useConfig();\r\n const [theme, setTheme] = useState(createMuiTheme({\r\n palette: {\r\n primary: {\r\n main: \"#fff\",\r\n },\r\n secondary: {\r\n main: \"#fff\"\r\n },\r\n tertiary: {\r\n main: \"#fff\"\r\n },\r\n button_text: {\r\n main: \"#fff\"\r\n },\r\n secondary_text: {\r\n main: \"#fff\"\r\n },\r\n footer_color: {\r\n main: \"#fff\"\r\n },\r\n menu: {\r\n main: \"#fff\"\r\n },\r\n background: {\r\n main: \"#fff\"\r\n },\r\n ticket_waiting: {\r\n main: \"#fff\"\r\n },\r\n ticket_called: {\r\n main: \"#fff\"\r\n },\r\n ticket_cancelled: {\r\n main: \"#fff\"\r\n },\r\n listitem: {\r\n main: \"#fff\"\r\n },\r\n error: {\r\n main: \"#fff\"\r\n },\r\n warning: {\r\n main: \"#fff\"\r\n },\r\n info: {\r\n main: \"#fff\"\r\n },\r\n success: {\r\n main: \"#fff\"\r\n },\r\n loadingbar_front: {\r\n main: \"#fff\"\r\n },\r\n loadingbar_back: {\r\n main: \"#fff\"\r\n }\r\n },\r\n breakpoints: {\r\n values: {\r\n xs: 0,\r\n sm: 640,\r\n md: 960, \r\n lg: 1280,\r\n xl: 1920,\r\n xxl: 2000\r\n }\r\n }\r\n }));\r\n\r\n useEffect(() => {\r\n if (loadedpalette)\r\n {\r\n var newtheme = createMuiTheme({\r\n palette: {\r\n primary: {\r\n main: palette ? palette.primary : \"#000\",\r\n },\r\n secondary: {\r\n main: palette ? palette.secondary : \"#000\",\r\n },\r\n tertiary: {\r\n main: palette ? palette.tertiary : \"#000\"\r\n },\r\n button_text: {\r\n main: palette ? palette.button_text : \"#000\"\r\n },\r\n secondary_text: {\r\n main: palette ? palette.secondary_text : \"#000\"\r\n },\r\n footer_color: {\r\n main: palette ? palette.footer_text : \"#000\"\r\n },\r\n menu: {\r\n main: palette ? palette.menu : \"#000\"\r\n },\r\n background: {\r\n main: palette ? palette.background : \"#000\"\r\n },\r\n ticket_waiting: {\r\n main: palette ? palette.ticket_waiting : \"#000\"\r\n },\r\n ticket_called: {\r\n main: palette ? palette.ticket_called : \"#000\"\r\n },\r\n ticket_cancelled: {\r\n main: palette ? palette.ticket_cancelled : \"#000\"\r\n },\r\n listitem: {\r\n main: palette ? palette.listitem : \"#000\"\r\n },\r\n error: {\r\n main: palette ? palette.error : \"#000\"\r\n },\r\n warning: {\r\n main: palette ? palette.warning : \"#000\"\r\n },\r\n info: {\r\n main: palette ? palette.info : \"#000\"\r\n },\r\n success: {\r\n main: palette ? palette.success : \"#000\"\r\n },\r\n loadingbar_front: {\r\n main: palette ? palette.loadingbar_front : \"#000\"\r\n },\r\n loadingbar_back: {\r\n main: palette ? palette.loadingbar_back : \"#000\"\r\n }\r\n },\r\n breakpoints: {\r\n values: {\r\n xs: 0,\r\n sm: 640,\r\n md: 960, \r\n lg: 1280,\r\n xl: 1920,\r\n xxl: 2000\r\n }\r\n }\r\n });\r\n\r\n setTheme(responsiveFontSizes(newtheme))\r\n }\r\n else\r\n GetPalette()\r\n },[loadedpalette])\r\n\r\n\r\n return (\r\n \r\n {children}\r\n \r\n )\r\n}","import React, { useState, useEffect } from 'react'\r\nimport { TranslationContext } from './context'\r\nimport { useConfig } from '../config/use'\r\nimport axios from 'axios'\r\n\r\nexport const TranslationProvider = ({children}) => {\r\n const [resources, setResources] = useState();\r\n const [language, setLanguage] = useState('Svenska');\r\n const { state: { config }} = useConfig();\r\n useEffect(() => {\r\n async function GetResources() {\r\n await axios({\r\n method: 'get',\r\n url: './translations.json',\r\n responseType: 'json'\r\n })\r\n .then(res => {setResources(res.data);})\r\n }\r\n GetResources();\r\n var storedlang = localStorage.getItem('language');\r\n if (storedlang)\r\n {\r\n setLanguage(storedlang);\r\n document.documentElement.lang = storedlang;\r\n }\r\n }, [])\r\n\r\n useEffect(() => {\r\n if (config)\r\n {\r\n var storedlang = localStorage.getItem('language');\r\n if (storedlang)\r\n {\r\n setLanguage(storedlang);\r\n document.documentElement.lang = storedlang;\r\n }\r\n else\r\n {\r\n setLanguage(config.defaultLanguage);\r\n document.documentElement.lang = config.defaultLanguage;\r\n localStorage.setItem('language', config.defaultLanguage);\r\n }\r\n }\r\n }, [config])\r\n\r\n const t = text => {\r\n if (resources && language)\r\n {\r\n const splitted = text.split(\".\");\r\n if (splitted.length > 0)\r\n {\r\n var result = resources[language];\r\n try{\r\n for(var i = 0; i < splitted.length; i++)\r\n {\r\n result = result[splitted[i]]\r\n }\r\n }\r\n catch{\r\n return \"Please fix your translation file\"\r\n }\r\n return result\r\n }\r\n }\r\n return \"\"\r\n }\r\n\r\n const dt = (officeid, textname) => {\r\n if (resources && language)\r\n {\r\n const result = resources[language];\r\n try {\r\n var res = result[\"formspage\"];\r\n var officetranslations = res[\"offices\"].find(x => x.officeid === officeid);\r\n if (officetranslations)\r\n {\r\n var textobj = officetranslations[\"texts\"].find(x => x.label === textname)\r\n if (textobj)\r\n return textobj.text;\r\n }\r\n else\r\n {\r\n var templatetext = result[\"formspage\"][\"templates\"][\"texts\"].find(x => x.label === textname)\r\n if (templatetext)\r\n return templatetext.text;\r\n }\r\n }\r\n catch {\r\n console.error(\"Please fix your dynamic translations\");\r\n return null;\r\n }\r\n console.error(\"Please fix your dynamic translations\");\r\n return null;\r\n }\r\n }\r\n\r\n const updateLanguage = newlang => {\r\n if (resources && language)\r\n {\r\n var result = Object.keys(resources).find(x => x === newlang);\r\n if (result)\r\n {\r\n setLanguage(newlang);\r\n localStorage.setItem('language', newlang);\r\n document.documentElement.lang = newlang;\r\n }\r\n }\r\n }\r\n\r\n const value = {\r\n state: { resources },\r\n actions: {t, dt, updateLanguage}\r\n }\r\n\r\n return (\r\n \r\n { children }\r\n \r\n )\r\n}\r\n","import React, { useEffect, useState } from 'react'\r\nimport useTheme from '@material-ui/core/styles/useTheme'\r\nimport makeStyles from '@material-ui/core/styles/makeStyles'\r\nimport Typography from '@material-ui/core/Typography'\r\nimport Button from '@material-ui/core/Button'\r\nimport { useTranslation } from '../contexts/i18n/use'\r\nimport { useHistory } from \"react-router-dom\"\r\n\r\nexport const MissingPage = () => {\r\n const theme = useTheme();\r\n const classes = useStyles(theme)\r\n const history = useHistory();\r\n const { actions: {t}} = useTranslation();\r\n\r\n useEffect(() => {\r\n console.log(\"I was here\")\r\n },[])\r\n \r\n return (\r\n
\r\n \r\n { t('404.explanation')}\r\n \r\n \r\n
\r\n )\r\n}\r\n\r\nconst useStyles = makeStyles({\r\n container: {\r\n backgroundColor: '#f4f4f4',\r\n height: '100%',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n justifyContent: 'center'\r\n },\r\n buttonwrapper: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n padding: '1rem 0',\r\n justifyContent: 'space-between',\r\n alignItems: 'center',\r\n width: '80%'\r\n },\r\n picture: {\r\n maxWidth: '300px'\r\n },\r\n confirmbutton: theme => ({\r\n backgroundColor: theme.palette.error.main,\r\n color: theme.palette.button_text\r\n }),\r\n cancelbutton: theme => ({\r\n backgroundColor: theme.palette.info.main,\r\n color: theme.palette.button_text\r\n })\r\n})","import React from 'react'\r\nimport Box from '@material-ui/core/Box'\r\nimport makeStyles from '@material-ui/core/styles/makeStyles'\r\nimport { Typography } from '@material-ui/core'\r\n\r\nexport const ConfirmationItem = ({head, body}) => {\r\n const classes = useStyles();\r\n return (\r\n \r\n \r\n {head}\r\n \r\n \r\n {body}\r\n \r\n \r\n )\r\n}\r\n\r\nconst useStyles = makeStyles({\r\n wrapper: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n flexDirection: 'column',\r\n padding: '0.25rem 0'\r\n }\r\n})","import React from 'react'\r\nimport { Button, Dialog, DialogActions, DialogContent, DialogTitle, Modal, Typography } from '@material-ui/core'\r\nimport { useTranslation } from '../../contexts/i18n/use'\r\nimport useTheme from '@material-ui/core/styles/useTheme'\r\nimport makeStyles from '@material-ui/core/styles/makeStyles'\r\nimport { ConfirmationItem } from './confirmationitem'\r\n\r\nexport const Confirmation = ({items, cancel, confirm}) => {\r\n const theme = useTheme();\r\n const classes = useStyles(theme);\r\n const { actions: {t, dt}} = useTranslation();\r\n\r\n return (\r\n \r\n { t('formspage.confirmation.title')}\r\n \r\n { items ? items.map(x => {return }): }\r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nconst useStyles = makeStyles({\r\n modal: theme => ({\r\n border: '1px solid '+ theme.palette.primary.main,\r\n alignItems: 'center'\r\n }),\r\n buttonwrapper: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n padding: '1rem 0',\r\n justifyContent: 'space-between',\r\n alignItems: 'center',\r\n width: '80%'\r\n },\r\n confirmbutton: theme => ({\r\n backgroundColor: theme.palette.error.main,\r\n color: theme.palette.button_text.main,\r\n [theme.breakpoints.up('lg')]: {\r\n '&:hover': {\r\n backgroundColor: 'black',\r\n color: 'white'\r\n }\r\n },\r\n [theme.breakpoints.down('lg')]: {\r\n '&:hover': {\r\n backgroundColor: theme.palette.error.main,\r\n color: theme.palette.button_text.main\r\n }\r\n }\r\n }),\r\n cancelbutton: theme => ({\r\n backgroundColor: theme.palette.info.main,\r\n color: theme.palette.button_text.main,\r\n [theme.breakpoints.up('lg')]: {\r\n '&:hover': {\r\n backgroundColor: 'black',\r\n color: 'white'\r\n }\r\n },\r\n [theme.breakpoints.down('lg')]: {\r\n '&:hover': {\r\n backgroundColor: theme.palette.info.main,\r\n color: theme.palette.button_text.main\r\n }\r\n }\r\n })\r\n})","import React, { useEffect, useState } from 'react'\r\nimport { useConfig } from '../../contexts/config/use'\r\nimport useTheme from '@material-ui/core/styles/useTheme'\r\nimport { useTranslation } from '../../contexts/i18n/use'\r\nimport { Box, Button, CircularProgress, Divider, FormControl, TextField, Typography } from '@material-ui/core';\r\nimport { Confirmation } from './confirmation'\r\nimport makeStyles from '@material-ui/core/styles/makeStyles'\r\nimport { Header } from '../header';\r\nimport { Footer } from '../footer';\r\nimport { isFalsyOrEmpty } from '../helpers/object'\r\nimport { GetParametersFromHash } from '../helpers/search'\r\nimport { useHistory } from \"react-router-dom\"\r\nimport { Queuedata } from '../../services/dto/queuedata.dto'\r\nimport { useRest } from '../../contexts/rest/use';\r\nimport { TicketFailureModal } from '../queue_selection_page/ticketfailuremodal'\r\n\r\nexport const FormsPage = () => {\r\n const { state: { config }, actions: {GetFormData, GetOfficeIDFromUrlID, GetQueueIDfromUrlID, LoadAll}} = useConfig();\r\n const { state: { selectedoffice, wasticketfailure }, actions: { handleTakeTicket, qrToFormsSelection}} = useRest();\r\n const { actions: {t, dt}} = useTranslation();\r\n const [disablebuttons, setDisableButtons] = useState(false);\r\n const [failure, setFailure] = useState(null);\r\n const [queuedata, setQueueData] = useState();\r\n const [required, setRequired] = useState();\r\n const [formdata, setFormData] = useState();\r\n const [forms, setForms] = useState();\r\n const [modal, setModal] = useState();\r\n const [ispristine, setIsPristine] = useState(true);\r\n const theme = useTheme();\r\n const history = useHistory();\r\n const classes = useStyles(theme);\r\n\r\n useEffect(() => {\r\n if (config)\r\n {\r\n var oldbaseurl = localStorage.getItem(\"baseurl\");\r\n if (window.location.pathname !== oldbaseurl)\r\n {\r\n localStorage.removeItem(\"ticket\");\r\n localStorage.removeItem(\"tickettext\");\r\n localStorage.removeItem(\"selectedoffice\");\r\n localStorage.removeItem(\"selectedqueuename\");\r\n sessionStorage.removeItem(\"resources\");\r\n sessionStorage.removeItem(\"queuename\");\r\n sessionStorage.removeItem(\"formdata\");\r\n sessionStorage.removeItem(\"token\");\r\n sessionStorage.removeItem(\"tokenconfig\");\r\n localStorage.setItem(\"baseurl\", window.location.pathname);\r\n LoadAll();\r\n window.location.reload();\r\n return;\r\n }\r\n \r\n var ticket = JSON.parse(localStorage.getItem(\"ticket\"));\r\n if(!isFalsyOrEmpty(ticket) && !ticket.cancelled)\r\n {\r\n history.push('ticket')\r\n return;\r\n }\r\n const searchParams = GetParametersFromHash();\r\n if (searchParams)\r\n {\r\n if (searchParams.officeID && searchParams.queueID)\r\n {\r\n searchParams.officeID = GetOfficeIDFromUrlID(searchParams.officeID);\r\n searchParams.queueID = GetQueueIDfromUrlID(searchParams.officeID, searchParams.queueID);\r\n var tmpqueuedata = new Queuedata(searchParams.queueID, searchParams.segmentID, searchParams.serviceID);\r\n setQueueData(tmpqueuedata);\r\n qrToFormsSelection(searchParams.officeID, tmpqueuedata);\r\n }\r\n else\r\n history.push(\"404\");\r\n }\r\n else\r\n {\r\n let officeID = localStorage.getItem(\"selectedoffice\");\r\n let queueID = sessionStorage.getItem(\"selectedqueue\");\r\n let segmentID = sessionStorage.getItem(\"segementID\");\r\n let serviceID = sessionStorage.getItem(\"serviceID\");\r\n \r\n if (!officeID && (!queueID || (!segmentID && !serviceID)))\r\n history.push(\"/\");\r\n }\r\n }\r\n }, [config])\r\n\r\n useEffect(() => {\r\n if (queuedata)\r\n generate(queuedata);\r\n \r\n },[queuedata])\r\n\r\n useEffect(() => {\r\n if (wasticketfailure)\r\n setFailure(true);\r\n else \r\n setFailure(null);\r\n },[wasticketfailure])\r\n\r\n const handleSubmit = (e) => {\r\n e.preventDefault();\r\n setIsPristine(false);\r\n if (validateAll())\r\n {\r\n setDisableButtons(true);\r\n setModal(true);\r\n }\r\n }\r\n\r\n const cancelModal = () => {\r\n setModal(false);\r\n setDisableButtons(false);\r\n }\r\n\r\n const takeTicket = () => {\r\n setModal(false);\r\n var officeid = localStorage.getItem(\"selectedoffice\");\r\n var text = getConfirmationText(officeid, queuedata, true);\r\n var tickettext;\r\n if (text)\r\n {\r\n tickettext = text.map(x => x.value.toString()).join(',');\r\n localStorage.setItem(\"tickettext\", JSON.stringify(text));\r\n }\r\n handleTakeTicket(officeid, queuedata, null, tickettext);\r\n }\r\n\r\n const getConfirmationText = (officeID, serviceinfo, notranslate = false) => {\r\n var tmpforms = GetFormData(officeID, serviceinfo);\r\n var items = null;\r\n var values = JSON.parse(sessionStorage.getItem(\"formdata\"));\r\n if (values)\r\n {\r\n items = tmpforms.map((x, i) => { \r\n if (x.type === \"textbox\")\r\n return {label: notranslate ? x.label : dt(officeID, x.label), value: values[i]}\r\n else\r\n return {}\r\n })\r\n }\r\n var filtereditems = items.filter(x => !isFalsyOrEmpty(x));\r\n return filtereditems;\r\n }\r\n\r\n const GenerateConfirmation = (officeID, serviceinfo) => {\r\n var items = getConfirmationText(officeID, serviceinfo);\r\n\r\n if (isFalsyOrEmpty(items))\r\n return \r\n else\r\n return (\r\n \r\n )\r\n }\r\n\r\n const validate = (required, value, pristine = true) => {\r\n if (pristine)\r\n return true;\r\n if (required && !value)\r\n return false;\r\n return true;\r\n }\r\n\r\n const validateAll = () => {\r\n var values = JSON.parse(sessionStorage.getItem(\"formdata\"));\r\n setIsPristine(false);\r\n var valid = true;\r\n for(var i = 0; i <= values.length; i++)\r\n {\r\n if (!validate(required[i], values[i], false))\r\n valid = false;\r\n }\r\n return valid;\r\n }\r\n\r\n const handleGoBack = () => {\r\n sessionStorage.removeItem(\"formdata\");\r\n history.push(\"queues\");\r\n }\r\n\r\n const handleChange = (e, index) => {\r\n if (config)\r\n {\r\n // TODO: Add error messages\r\n if (config.forbiddenInputs.some(x => e.target.value.includes(x)))\r\n return;\r\n if (e.target.value.length > config.maxInputLength)\r\n return;\r\n\r\n var values = JSON.parse(sessionStorage.getItem(\"formdata\"));\r\n var before;\r\n var object = [e.target.value];\r\n var after;\r\n if (index === 0)\r\n {\r\n if (values.length > 1)\r\n {\r\n after = values.slice(index+1);\r\n sessionStorage.setItem(\"formdata\", JSON.stringify(object.concat(after)));\r\n setFormData(object.concat(after));\r\n return;\r\n }\r\n else\r\n {\r\n sessionStorage.setItem(\"formdata\", JSON.stringify(object));\r\n setFormData(object);\r\n } \r\n }\r\n else if (index === values.length -1)\r\n {\r\n before = values.slice(0, index);\r\n sessionStorage.setItem(\"formdata\", JSON.stringify(before.concat(object)));\r\n setFormData(before.concat(object));\r\n return;\r\n }\r\n else\r\n {\r\n before = values.slice(0, index);\r\n sessionStorage.setItem(\"formdata\", JSON.stringify(before.concat(object).concat(values.slice(index +1))));\r\n setFormData(before.concat(object).concat(values.slice(index +1)));\r\n return;\r\n }\r\n }\r\n }\r\n\r\n const generate = (queuedata) => {\r\n let officeID = localStorage.getItem(\"selectedoffice\");\r\n var forms = GetFormData(officeID, queuedata);\r\n\r\n if (isFalsyOrEmpty(forms))\r\n return null;\r\n var reqs = forms.map(x => x.required);\r\n setRequired(reqs);\r\n setForms(forms);\r\n var oldformdata = JSON.parse(sessionStorage.getItem(\"formdata\"));\r\n if (isFalsyOrEmpty(oldformdata))\r\n {\r\n var vals = forms.map(x => {return \"\"});\r\n sessionStorage.setItem(\"formdata\", JSON.stringify(vals));\r\n setFormData(vals);\r\n }\r\n else\r\n setFormData(oldformdata);\r\n }\r\n\r\n\r\nif (forms && formdata && config)\r\n {\r\n return (\r\n <>\r\n
\r\n \r\n { modal ? GenerateConfirmation(selectedoffice, queuedata) : }\r\n { failure ? : <>}\r\n
\r\n { forms.map((x,i) => {\r\n if (x.type === \"label\")\r\n return (\r\n \r\n {dt(selectedoffice, x.label)}\r\n \r\n )\r\n if (x.type === \"textbox\")\r\n return (\r\n \r\n handleChange(e, i)}\r\n className={[classes.textfield, \"formspage-textboxes\"].join(' ')}\r\n InputProps={{ classes: {root: classes.root, focused: classes.focused}}}\r\n inputProps={{title: t('formspage.input.errorhelp')}}\r\n variant=\"outlined\"\r\n size=\"small\"\r\n value={formdata[i]}\r\n fullWidth={true}\r\n />\r\n \r\n )\r\n else\r\n return null;\r\n })}\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n