{"version":3,"sources":["enums/RequestStatus.ts","utils/RequestMessage.ts","configuration.ts","actions/globalActions.ts","utils/AsyncFunction.ts","actions/administratorActions.ts","models/Queue.ts","actions/queueActions.ts","actions/lobbyActions.ts","actions/userActions.ts","actions/assistantActions.ts","actions/pageActions.ts","models/Banner.ts","actions/bannerActions.ts","actions/listenerActions.ts","middlewares/SocketMiddleware.ts","models/User.ts","reducers/userReducer.ts","models/QueueEntry.ts","models/Teacher.ts","models/Assistant.ts","reducers/queueReducer.ts","models/Administrator.ts","reducers/administratorReducer.ts","actions/modalActions.ts","models/Modal.ts","viewcomponents/Modals/BroadcastFacultyModal.tsx","viewcomponents/Modals/BroadcastModal.tsx","viewcomponents/Modals/DeleteQueueModal.tsx","viewcomponents/Modals/HideQueueModal.tsx","viewcomponents/Modals/PurgeQueueModal.tsx","viewcomponents/Modals/RenameQueueModal.tsx","viewcomponents/Modals/SendBadLocationModal.tsx","viewcomponents/Modals/SendMessageModal.tsx","viewcomponents/Modals/SetMotdModal.tsx","viewcomponents/Modals/SetQueueInformationModal.tsx","viewcomponents/Modals/ServerMessageModal.tsx","viewcomponents/Modals/AddBannerModal.tsx","viewcomponents/Modals/UpdateBannerModal.tsx","viewcomponents/Modals/ShowMessageModal.tsx","viewcomponents/Modals/ShowMotdModal.tsx","viewcomponents/Modals/ShowQueueModal.tsx","reducers/modalReducer.ts","actions/titleActions.ts","reducers/titleReducer.ts","actions/soundActions.ts","reducers/bannerReducer.ts","store.ts","middlewares/ErrorHandlingMiddleware.ts","reducers/soundReducer.ts","viewcomponents/FontAwesome.tsx","pages/Home/QueueCard.tsx","viewcomponents/Search.tsx","pages/Home/index.tsx","pages/Queue/EnterQueue/EnterLocation.tsx","pages/Queue/EnterQueue/EnterComment.tsx","pages/Queue/EnterQueue/EnterCommunicationType.tsx","pages/Queue/EnterQueue/EnterInformationForm.tsx","pages/Queue/EnterQueue/LoggedInUserView.tsx","pages/Queue/EnterQueue/index.tsx","pages/Queue/QueueAdministratorOptions.tsx","pages/Queue/QueueEntryRow.tsx","pages/Queue/QueueEntryTable.tsx","img/404/Coffee.png","img/404/DarthVader.png","img/404/Inside.png","img/404/Panda.png","img/404/Penguin.png","img/404/Rabbit.png","pages/NoMatch/index.tsx","sounds/DingLing.mp3","pages/Queue/index.tsx","viewcomponents/NavBar.tsx","img/logo-stay-a-while.png","models/Contributor.ts","pages/About/GitHubLink.tsx","pages/About/LinkedInLink.tsx","pages/About/Contributor.tsx","pages/About/index.tsx","pages/Help/Administrators/index.tsx","img/remove-teacher.png","pages/Help/Teachers/index.tsx","img/edit-queue.png","pages/Help/Assistants/index.tsx","pages/Help/Users/index.tsx","img/enter-queue.png","img/location.png","pages/Help/Guests/index.tsx","pages/Help/index.tsx","utils/UtilityFunctions.ts","viewcomponents/ErrorMessage.tsx","viewcomponents/LineChart.tsx","pages/Statistics/index.tsx","pages/MockLogin/index.tsx","pages/Logout/index.tsx","pages/Administration/Administrators/BannerList.tsx","pages/Administration/Administrators/AdministrationInformation.tsx","viewcomponents/AddInput.tsx","pages/Administration/Administrators/AddAdmin.tsx","pages/Administration/Administrators/AdministratorList.tsx","pages/Administration/Administrators/Administrators.tsx","pages/Administration/Queues/AddQueue.tsx","pages/Administration/Queues/QueueList.tsx","pages/Administration/Queues/Queues.tsx","pages/Administration/Queues/Teachers/AddTeacher.tsx","pages/Administration/Queues/Teachers/TeacherList.tsx","pages/Administration/Queues/Teachers/Teachers.tsx","pages/Administration/Queues/Assistants/AddAssistant.tsx","pages/Administration/Queues/Assistants/AssistantList.tsx","pages/Administration/Queues/Assistants/Assistants.tsx","pages/Administration/Queues/QueueOptions.tsx","pages/Administration/index.tsx","viewcomponents/Modal.tsx","App.tsx","viewcomponents/Helmet.tsx","serviceWorker.ts","index.tsx"],"names":["RequestStatus","RequestMessage","path","content","_path","_token","_content","this","value","JSON","stringify","token","WEB_SOCKET_SERVER_URL","window","location","protocol","hostname","HTTP_SERVER_URL","port","ActionTypes","Object","freeze","Initialize","AsyncFunction","type","_type","toString","ActionTypeSuffix","Pending","Fulfilled","Rejected","LoadAdministrators","AddAdministrator","RemoveAdministrator","AddTeacher","RemoveTeacher","AddAssistant","RemoveAssistant","AddQueue","RemoveQueue","RenameQueue","HideQueue","RevealQueue","LoadAdditionalQueueData","SelectQueue","SetServerMessage","Queue","data","_id","_name","_info","_motd","_locked","_hiding","_queueEntries","_assistants","_teachers","id","name","info","motd","locked","hiding","assistants","teachers","queueEntries","assistant","push","filter","a","username","teacher","entry","e","ugkthid","i","length","map","clone","t","GetQueues","JoinQueue","LeaveQueue","RecievingHelp","UpdatePersonalEntry","SubscribeToQueue","UnsubscribeToQueue","loadQueues","getQueuesRequest","fetch","then","response","json","queues","res","getQueueEntriesRequest","payload","Promise","all","joinQueue","queueName","comment","help","updatePersonalEntry","SubscribeToLobby","UnsubscribeToLobby","UserDataLocation","Cookie","Response","Login","Logout","LoadUser","KickUser","SendMessage","Help","BadLocation","UnknownLocation","Broadcast","BroadcastFaculty","SetMotd","SetQueueInfo","PurgeQueue","LockQueue","UnlockQueue","toggleHelp","newStatus","setMotd","message","setQueueInformation","EnterAdminPage","LeaveAdminPage","Banner","_message","_startTime","_endTime","_isShowing","undefined","startTime","Date","parse","start_time","getTime","endTime","end_time","isShowing","AddBanner","UpdateBanner","DeleteBanner","GetBanners","HideBanner","ShowBanner","TriggerBannerRedraw","Listeners","OnAdministratorAdded","OnAdministratorRemoved","OnTeacherAdded","OnTeacherRemoved","OnAssistantAdded","OnAssistantRemoved","OnQueueAdded","OnQueueRemoved","OnQueueUpdated","OnQueueEntryAdded","OnQueueEntryRemoved","OnQueueEntryUpdated","OnMessageReceived","OnBannerAdded","OnBannerUpdated","onAdministratorAdded","onAdministratorRemoved","onTeacherAdded","onTeacherRemoved","onAssistantAdded","onAssistantRemoved","onQueueAdded","onQueueRemoved","onQueueUpdated","onQueueEntryAdded","onQueueEntryRemoved","onQueueEntryUpdated","onMessageReceived","onBannerAdded","onBannerUpdated","middleware","socket","connectionEstablished","lastJoinRequest","callbacks","pendingRequests","disconnectedAt","connect","store","WebSocket","onopen","onOpen","onclose","onClose","onmessage","onMessage","sendMessage","callback","send","some","item","request","sentAt","event","getState","requestStatus","Failed","dispatch","setTimeout","Math","floor","random","startsWith","shift","backUp","property","hasOwnProperty","regex","RegExp","split","join","match","parts","propertyParts","substring","next","action","GlobalActions","userData","localStorage","getItem","AdministratorActions","oldQueueName","newQueueName","status","BannerActions","toISOString","QueueActions","LobbyActions","UserActions","AssistantActions","badLocationType","PageActions","addSuperAdmin","removeSuperAdmin","User","_ugkthid","_username","_isAdministrator","_location","_teacherIn","_assistantIn","isAdministrator","teacherIn","assistantIn","queue","includes","LifeTime","QueueEntry","_comment","_starttime","_gettinghelp","_helper","_help","_badlocation","_realname","starttime","gettinghelp","helper","badlocation","realname","Teacher","Assistant","initialState","queueList","NotStarted","Administrator","administrators","CloseModal","RemoveModal","OpenBroadcastFacultyModal","OpenBroadcastModal","OpenDeleteQueueModal","OpenHideQueueModal","OpenPurgeQueueModal","OpenRenameQueueModal","OpenSendBadLocationModal","OpenSendMessageModal","OpenSetMotdModal","OpenSetQueueInformationModal","OpenSetServerMessageModal","OpenAddBannerModal","OpenUpdateBannerModal","OpenShowMotdModal","OpenShowQueueModal","Modal","modalType","isVisible","_modalType","_modalData","_isVisible","ModalType","props","useState","setMessage","useDispatch","size","centered","Header","closeButton","Title","Body","className","onChange","target","Footer","onClick","broadcastFaculty","onHide","broadcast","newName","setNewName","sendServerMessage","startDate","setStartDate","endDate","setEndDate","htmlFor","selected","date","showTimeSelect","timeFormat","timeIntervals","timeCaption","dateFormat","addBanner","banner","useSelector","banners","find","deleteBanner","updateBanner","sender","modalList","current","SetTitle","ResetTitle","setTitle","title","resetTitle","EnableSounds","DisableSounds","redrawTrigger","applyMiddleware","meta","localError","catch","error","promise","thunk","socketMiddleware","reducer","combineReducers","user","state","superadmin","teacher_in","assistant_in","setItem","validUntil","removeItem","prefix","cookieData","document","cookie","trim","decodedData","decodeURIComponent","substr","q","setQueueEntries","Success","AdministratorActionTypes","queueToUpdate","setTeachers","setAssistants","index","findIndex","x","console","log","addQueueEntry","removeQueueEntry","updateQueueEntry","addTeacher","removeTeacher","addAssistant","removeAssistant","administration","admin","nextState","sort","a1","a2","modals","ShowMessageModal","ModalActionTypes","hide","modal","SendMessageModal","BroadcastModal","BroadcastFacultyModal","SetMotdModal","SetQueueInformationModal","SetServerMessageModal","AddBannerModal","UpdateBannerModal","ShowQueueModal","HideQueueModal","PurgeQueueModal","DeleteQueueModal","RenameQueueModal","ShowMotdModal","SendBadLocationModal","TitleTypes","playSounds","SoundActionTypes","BannerActionTypes","seenBanners","bannerToUpdate","updatedBanner","show","messageHasBeenUpdated","createStore","composeWithDevTools","CheckMark","Markup","Copy","Cross","Download","Envelope","Information","Invisible","Lock","Megaphone","Muted","Pen","Plus","QuestionMark","Sign","Square","Star","Trashbin","Unlock","Users","VolumeUp","fontAwesomeCssClass","parseProps","styling","color","style","styles","fontSize","marginRight","setFilter","lineHeight","placeholder","queueOrdering","queue1","queue2","toLowerCase","lastVisitedUrl","setLastVisitedUrl","useEffect","urlBeforeLoginRedirect","to","Search","isTeacherIn","canSee","QueueCard","personalQueueEntry","setLocation","sendPersonalEntry","cancel","disabled","width","setComment","onKeyUp","key","button","checked","setHelp","debounce","c","l","h","EnterLocation","EnterComment","EnterCommunicationType","isLocked","doubleClickProtection","setDoubleClickProtection","enterQueue","newLocation","newComment","newHelp","EnterInformationForm","LoggedInUserView","pathname","href","isAssistantIn","isAssistant","setIsAssistant","isTeacher","setIsTeacher","queueEntry","mayAdministerQueue","setMayAdministerQueue","displayAdministrationOptions","setDisplayAdministrationOptions","checkUrlLocation","locationToCheck","scope","result","getLocationColor","rel","display","colSpan","kickUser","openSendMessageModal","openSendBadLocationModal","lowerCaseFilter","helpType","QueueEntryRow","images","Coffee","DarthVader","Inside","Panda","Penguin","Rabbit","image","src","alt","height","maxHeight","maxWidth","useParams","queuesAreLoaded","previousQueueEntryCount","setPreviousQueueEntryCount","hasShownMotd","setHasShownMotd","subscribe","unsubscribe","newEntryNumber","Audio","DingLing","play","marginTop","EnterQueue","QueueAdministratorOptions","QueueEntryTable","hideNavBar","$","collapse","useLocation","Contributor","_gravatar","_github","_linkedIn","gravatar","github","linkedIn","InitialValue","contributor","GitHubLink","LinkedInLink","contributors","Contributors","padding","smooth","downloadFile","fileName","fileContent","urlObject","URL","webkitURL","export_blob","Blob","navigator","msSaveBlob","HTMLAnchorElement","prototype","Error","saveLink","createElementNS","createObjectURL","download","obj","ev","createEvent","initMouseEvent","dispatchEvent","fakeClick","exportRaw","errorMessage","role","chartType","loader","label","time","help_amount","present_amount","options","hAxis","vAxis","series","curveType","rootProps","statistics","setStatistics","setErrorMessage","nintyDaysAgo","setDate","getDate","round","from","setFrom","until","setUntil","selectedQueue","setSelectedQueue","ErrorMessage","isValidDate","isAfter","moment","subtract","isBefore","unix","defaultValue","inputProps","updateFrom","updateUntil","axios","get","headers","LineChart","overflow","overflowY","overflowX","position","right","top","backgroundColor","element","createElement","setAttribute","left","body","appendChild","select","execCommand","removeChild","copyToClipboard","querySelector","flashCard","createTextNode","addEventListener","addFlashCard","left_queue","reduce","peopleHelped","statisticsList","queue_length","getRemainingQueueLength","runCallback","input","post","login","borderRadius","getTimestamp","ms","pad","n","s","Array","fill","slice","getFullYear","getMonth","getHours","getMinutes","getSeconds","AdministrationInformationViewComponent","BannerList","setContent","setPlaceholder","isDisabled","onFocus","onBlur","AddInput","newAdministrator","administrator","AddAdmin","addQueue","QueueList","TeacherList","AssistantList","selectedQueueName","setSelectedQueueName","selectQueue","teacherRequest","assistantRequest","loadAdditionalQueueData","Queues","QueueOptions","toJSX","modalData","ServerMessageModal","alert","useAlert","bannerRedrawTrigger","nextBanner","now","min","timeoutId","clearTimeout","NavBar","exact","Home","About","Administration","Statistics","Helmet","Boolean","alertOptions","timeout","positions","BOTTOM_CENTER","LifeCycle","loadUser","App","ReactDOM","render","StrictMode","template","AlertTemplate","getElementById","serviceWorker","ready","registration","unregister"],"mappings":"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","file":"static/js/main.1efc93de.chunk.js","sourcesContent":["enum RequestStatus {\n NotStarted = 0,\n Pending = 1,\n Success = 2,\n Failed = 3\n}\n\nexport default RequestStatus;\n","export default class RequestMessage {\n\n private _path: string;\n public get path() { return this._path; }\n\n private _token: string;\n public get token() { return this._token; }\n public set token(value: string) { this._token = value; }\n\n private _content: any;\n public get content() { return this._content; }\n\n public constructor(path: string, content?: any) {\n this._path = path;\n this._content = content || {};\n\n this._token = \"\";\n }\n\n public stringify(): string {\n return JSON.stringify(\n {\n path: this._path,\n token: this._token,\n content: this._content\n }\n );\n }\n\n}\n","export const WEB_SOCKET_SERVER_URL = `${window.location.protocol === 'http:' ? 'ws' : 'wss'}://${window.location.hostname}:7777/ws`;\nexport const HTTP_SERVER_URL = `${window.location.protocol === 'http:' ? 'http' : 'https'}://${window.location.hostname}:${window.location.port === '3000' ? '8000' : window.location.port}`;\nexport const LOGIN_CALLBACK = `${window.location.protocol === 'http:' ? 'http' : 'https'}://queue.csc.kth.se/auth`;\n","import { FluxStandardAction } from 'redux-promise-middleware';\n\nexport const ActionTypes = Object.freeze({\n Initialize: 'INITIALIZE'\n});\n\nexport const initialize = (): FluxStandardAction => ({\n type: ActionTypes.Initialize\n});\n","import { ActionType as ActionTypeSuffix } from 'redux-promise-middleware';\n\nexport default class AsyncFunction {\n\n private _type: string;\n\n public toString = () : string => this._type;\n\n public get Pending() { return `${this._type}_${ActionTypeSuffix.Pending}`; }\n public get Fulfilled() { return `${this._type}_${ActionTypeSuffix.Fulfilled}`; }\n public get Rejected() { return `${this._type}_${ActionTypeSuffix.Rejected}`; }\n\n constructor(type: string){\n this._type = type;\n }\n}\n","import { FluxStandardAction, AsyncAction } from 'redux-promise-middleware';\nimport axios from 'axios';\nimport AsyncFunction from '../utils/AsyncFunction';\nimport { HTTP_SERVER_URL } from '../configuration';\n\nexport const ActionTypes = Object.freeze({\n LoadAdministrators: new AsyncFunction('LOAD_ADMINISTRATORS'),\n AddAdministrator: 'ADD_ADMINISTRATOR',\n RemoveAdministrator: 'REMOVE_ADMINISTRATOR',\n AddTeacher: 'ADD_TEACHER',\n RemoveTeacher: 'REMOVE_TEACHER',\n AddAssistant: 'ADD_ASSISTANT',\n RemoveAssistant: 'REMOVE_ASSISTANT',\n AddQueue: 'ADD_QUEUE',\n RemoveQueue: 'REMOVE_QUEUE',\n RenameQueue: 'RENAME_QUEUE',\n HideQueue: 'HIDE_QUEUE',\n RevealQueue: 'REVEAL_QUEUE',\n LoadAdditionalQueueData: new AsyncFunction('LOAD_ADDITIONAL_QUEUE_DATA'),\n SelectQueue: 'SELECT_QUEUE',\n SetServerMessage: 'SET_SERVER_MESSAGE'\n});\n\nexport const loadAdministrators = (token: string): AsyncAction => ({\n type: ActionTypes.LoadAdministrators,\n payload: axios.get(`${HTTP_SERVER_URL}/api/superadmins`, {\n headers: { 'Authorization': `Token ${token}` }\n })\n});\n\nexport const addAdministrator = (username: string): FluxStandardAction => ({\n type: ActionTypes.AddAdministrator,\n payload: { username }\n});\n\nexport const removeAdministrator = (username: string): FluxStandardAction => ({\n type: ActionTypes.RemoveAdministrator,\n payload: { username }\n});\n\nexport const addTeacher = (queueName: string, username: string): FluxStandardAction => ({\n type: ActionTypes.AddTeacher,\n payload: { queueName, username }\n});\n\nexport const removeTeacher = (queueName: string, username: string): FluxStandardAction => ({\n type: ActionTypes.RemoveTeacher,\n payload: { queueName, username }\n});\n\nexport const addAssistant = (queueName: string, username: string): FluxStandardAction => ({\n type: ActionTypes.AddAssistant,\n payload: { queueName, username }\n});\n\nexport const removeAssistant = (queueName: string, username: string): FluxStandardAction => ({\n type: ActionTypes.RemoveAssistant,\n payload: { queueName, username }\n});\n\nexport const addQueue = (queueName: string): FluxStandardAction => ({\n type: ActionTypes.AddQueue,\n payload: { queueName }\n});\n\nexport const removeQueue = (queueName: string): FluxStandardAction => ({\n type: ActionTypes.RemoveQueue,\n payload: { queueName }\n});\n\nexport const renameQueue = (oldQueueName: string, newQueueName: string): FluxStandardAction => ({\n type: ActionTypes.RenameQueue,\n payload: { oldQueueName, newQueueName }\n});\n\nexport const hideQueue = (queueName: string): FluxStandardAction => ({\n type: ActionTypes.HideQueue,\n payload: { queueName }\n});\n\nexport const revealQueue = (queueName: string): FluxStandardAction => ({\n type: ActionTypes.RevealQueue,\n payload: { queueName }\n});\n\nexport const loadAdditionalQueueData = (queueName: string, token: string): AsyncAction => {\n const teacherRequest = axios.get(`${HTTP_SERVER_URL}/api/queues/${queueName}/teachers`, {\n headers: { 'Authorization': `Token ${token}` }\n });\n\n const assistantRequest = axios.get(`${HTTP_SERVER_URL}/api/queues/${queueName}/assistants`, {\n headers: { 'Authorization': `Token ${token}` }\n });\n\n return {\n type: ActionTypes.LoadAdditionalQueueData,\n payload: Promise.all([teacherRequest, assistantRequest]),\n meta: { queueName }\n };\n};\n\nexport const sendServerMessage = (message: string): FluxStandardAction => ({\n type: ActionTypes.SetServerMessage,\n payload: { message }\n});\n","import QueueEntry from './QueueEntry';\nimport Assistant from './Assistant';\nimport Teacher from './Teacher';\n\nexport default class Queue {\n\n private _id: number;\n public get id() { return this._id; }\n\n private _name: string;\n public get name() { return this._name; }\n\n private _info: string;\n public get info() { return this._info; }\n\n private _motd: string;\n public get motd() { return this._motd; }\n\n private _locked: boolean;\n public get locked() { return this._locked; }\n\n private _hiding: boolean;\n public get hiding() { return this._hiding; }\n\n private _queueEntries: QueueEntry[];\n public get queueEntries() { return this._queueEntries; }\n\n private _assistants: Assistant[];\n public get assistants() { return this._assistants; }\n\n private _teachers: Teacher[];\n public get teachers() { return this._teachers; }\n\n public constructor(data: any) {\n this._id = data.id || -1;\n this._name = data.name || '';\n this._info = data.info || '';\n this._motd = data.motd || '';\n this._locked = data.locked || false;\n this._hiding = data.hiding || false;\n this._assistants = data.assistants || [];\n this._teachers = data.teachers || [];\n this._queueEntries = data.queueEntries || [];\n }\n\n public addAssistant(assistant: Assistant): void {\n this._assistants.push(assistant);\n }\n\n public setAssistants(assistants: Assistant[]): void {\n this._assistants = assistants;\n }\n\n public removeAssistant(assistant: Assistant): void {\n this._assistants = this._assistants.filter(a => a.username !== assistant.username);\n }\n\n public addTeacher(teacher: Teacher): void {\n this._teachers.push(teacher);\n }\n\n public setTeachers(teachers: Teacher[]): void {\n this._teachers = teachers;\n }\n\n public removeTeacher(teacher: Teacher): void {\n this._teachers = this._teachers.filter(a => a.username !== teacher.username);\n }\n\n public setInformationText(info: string): void {\n this._info = info;\n }\n\n public addQueueEntry(entry: QueueEntry): void {\n this._queueEntries.push(entry);\n }\n\n public removeQueueEntry(entry: QueueEntry): void {\n this._queueEntries = this._queueEntries.filter(e => e.ugkthid !== entry.ugkthid);\n }\n\n public updateQueueEntry(entry: QueueEntry): void {\n for (let i = 0; i < this._queueEntries.length; i++) {\n if (this._queueEntries[i].ugkthid === entry.ugkthid) {\n this._queueEntries[i] = entry;\n }\n }\n }\n\n public setQueueEntries(queueEntries: QueueEntry[]): void {\n this._queueEntries = queueEntries;\n }\n\n public clone(): Queue {\n return new Queue({\n id: this._id,\n name: this._name,\n info: this._info,\n motd: this._motd,\n locked: this._locked,\n hiding: this._hiding,\n queueEntries: this._queueEntries.map(e => e.clone()),\n assistants: this._assistants.map(a => a.clone()),\n teachers: this._teachers.map(t => t.clone())\n });\n }\n}\n","import { FluxStandardAction, AsyncAction } from 'redux-promise-middleware';\nimport AsyncFunction from '../utils/AsyncFunction';\nimport Queue from '../models/Queue';\nimport { HTTP_SERVER_URL } from '../configuration';\n\nexport const ActionTypes = Object.freeze({\n GetQueues: new AsyncFunction('GET_QUEUES'),\n JoinQueue: 'JOIN_QUEUE',\n LeaveQueue: 'LEAVE_QUEUE',\n RecievingHelp: 'RECIEVING_HELP',\n UpdatePersonalEntry: 'UPDATE_PERSONAL_ENTRY',\n SubscribeToQueue: 'SUBSCRIBE_TO_QUEUE',\n UnsubscribeToQueue: 'UNSUBSCRIBE_TO_QUEUE'\n});\n\nexport const loadQueues = (): AsyncAction => {\n\n const getQueuesRequest = fetch(`${HTTP_SERVER_URL}/api/queues`)\n .then(response => response.json())\n .then((response: any) => response.queues.map((res: any) => new Queue(res)));\n\n const getQueueEntriesRequest = fetch(`${HTTP_SERVER_URL}/api/queue_entries`)\n .then(response => response.json());\n\n return {\n type: ActionTypes.GetQueues,\n payload: Promise.all([getQueuesRequest, getQueueEntriesRequest])\n };\n};\n\nexport const joinQueue = (queueName: string, comment: string, location: string, help: boolean): FluxStandardAction => ({\n type: ActionTypes.JoinQueue,\n payload: { queueName, comment, location, help }\n});\n\nexport const leaveQueue = (queueName: string): FluxStandardAction => ({\n type: ActionTypes.LeaveQueue,\n payload: { queueName }\n});\n\nexport const recievingHelp = (queueName: string, status: boolean): FluxStandardAction => ({\n type: ActionTypes.RecievingHelp,\n payload: { queueName, status }\n});\n\nexport const updatePersonalEntry = (queueName: string, comment: string, location: string, help: boolean): FluxStandardAction => ({\n type: ActionTypes.UpdatePersonalEntry,\n payload: { queueName, comment, location, help }\n});\n\nexport const subscribe = (queueName: string): FluxStandardAction => ({\n type: ActionTypes.SubscribeToQueue,\n payload: { queueName }\n});\n\nexport const unsubscribe = (queueName: string): FluxStandardAction => ({\n type: ActionTypes.UnsubscribeToQueue,\n payload: { queueName }\n});\n","import { FluxStandardAction } from 'redux-promise-middleware';\n\nexport const ActionTypes = Object.freeze({\n SubscribeToLobby: 'SUBSCRIBE_TO_LOBBY',\n UnsubscribeToLobby: 'UNSUBSCRIBE_TO_LOBBY'\n});\n\nexport const subscribe = (): FluxStandardAction => ({\n type: ActionTypes.SubscribeToLobby\n});\n\nexport const unsubscribe = (): FluxStandardAction => ({\n type: ActionTypes.UnsubscribeToLobby\n});\n","import { FluxStandardAction, AsyncAction } from 'redux-promise-middleware';\nimport axios from 'axios';\nimport AsyncFunction from '../utils/AsyncFunction';\nimport { HTTP_SERVER_URL } from '../configuration';\n\nexport const UserDataLocation = Object.freeze({\n Cookie: 'IN_COOKIE',\n Response: 'IN_RESPONSE'\n});\n\nexport const ActionTypes = Object.freeze({\n Login: new AsyncFunction('LOGIN'),\n Logout: 'LOGOUT',\n LoadUser: new AsyncFunction('LOAD_USER')\n});\n\nexport const login = (username: string): AsyncAction => {\n return {\n type: ActionTypes.Login,\n payload: axios.post(`${HTTP_SERVER_URL}/api/users/login`, { user: { username } })\n };\n};\n\nexport const logout = (): FluxStandardAction => ({\n type: ActionTypes.Logout\n});\n\nexport const loadUser = (): AsyncAction => {\n const prefix = 'userdata=';\n const cookieData = document.cookie.split(';').map(cookie => cookie.trim()).filter(cookie => cookie.startsWith(prefix))[0];\n\n if (cookieData) {\n return {\n type: ActionTypes.LoadUser,\n meta: { UserDataLocation: UserDataLocation.Cookie }\n };\n }\n\n const token = localStorage.getItem('Token');\n if (token === null) {\n return { type: '' };\n }\n\n const data = JSON.parse(token);\n if (data.validUntil < new Date().getTime()) {\n localStorage.removeItem('Token');\n return { type: '' };\n }\n\n return {\n type: ActionTypes.LoadUser,\n payload: axios.get(`${HTTP_SERVER_URL}/api/user`, {\n headers: { 'Authorization': `Token ${data.token}` }\n }),\n meta: { UserDataLocation: UserDataLocation.Response }\n }\n};\n","import { FluxStandardAction } from 'redux-promise-middleware';\n\nexport const ActionTypes = Object.freeze({\n KickUser: 'KICK_USER',\n SendMessage: 'SEND_MESSAGE',\n Help: 'HELP',\n BadLocation: 'BAD_LOCATION',\n UnknownLocation: 'UNKNOWN_LOCATION',\n Broadcast: 'BROADCAST',\n BroadcastFaculty: 'BROADCAST_FACULTY',\n SetMotd: 'SET_MOTD',\n SetQueueInfo: 'SET_QUEUE_INFO',\n PurgeQueue: 'PURGE_QUEUE',\n LockQueue: 'LOCK_QUEUE',\n UnlockQueue: 'UNLOCK_QUEUE'\n});\n\nexport const kickUser = (queueName: string, ugkthid: string): FluxStandardAction => ({\n type: ActionTypes.KickUser,\n payload: { queueName, ugkthid }\n});\n\nexport const sendMessage = (queueName: string, ugkthid: string, message: string): FluxStandardAction => ({\n type: ActionTypes.SendMessage,\n payload: { queueName, ugkthid, message }\n});\n\nexport const toggleHelp = (queueName: string, ugkthid: string, newStatus: boolean): FluxStandardAction => ({\n type: ActionTypes.Help,\n payload: { queueName, ugkthid, newStatus }\n});\n\nexport const badLocation = (queueName: string, ugkthid: string): FluxStandardAction => ({\n type: ActionTypes.BadLocation,\n payload: { queueName, ugkthid }\n});\n\nexport const unknownLocation = (queueName: string, ugkthid: string): FluxStandardAction => ({\n type: ActionTypes.UnknownLocation,\n payload: { queueName, ugkthid }\n});\n\nexport const broadcast = (queueName: string, message: string): FluxStandardAction => ({\n type: ActionTypes.Broadcast,\n payload: { queueName, message }\n});\n\nexport const broadcastFaculty = (queueName: string, message: string): FluxStandardAction => ({\n type: ActionTypes.BroadcastFaculty,\n payload: { queueName, message }\n});\n\nexport const setMotd = (queueName: string, message: string): FluxStandardAction => ({\n type: ActionTypes.SetMotd,\n payload: { queueName, message }\n});\n\nexport const setQueueInformation = (queueName: string, info: string): FluxStandardAction => ({\n type: ActionTypes.SetQueueInfo,\n payload: { queueName, info }\n});\n\nexport const purgeQueue = (queueName: string): FluxStandardAction => ({\n type: ActionTypes.PurgeQueue,\n payload: { queueName }\n});\n\nexport const lockQueue = (queueName: string): FluxStandardAction => ({\n type: ActionTypes.LockQueue,\n payload: { queueName }\n});\n\nexport const unlockQueue = (queueName: string): FluxStandardAction => ({\n type: ActionTypes.UnlockQueue,\n payload: { queueName }\n});\n","import { FluxStandardAction } from 'redux-promise-middleware';\n\nexport const ActionTypes = Object.freeze({\n EnterAdminPage: 'ENTER_ADMIN_PAGE',\n LeaveAdminPage: 'LEAVE_ADMIN_PAGE'\n});\n\nexport const enterAdminPage = (): FluxStandardAction => ({\n type: ActionTypes.EnterAdminPage\n});\n\nexport const leaveAdminPage = (): FluxStandardAction => ({\n type: ActionTypes.LeaveAdminPage\n});\n","export default class Banner {\n\n private _id: number;\n public get id() { return this._id; }\n\n private _message: string;\n public get message() { return this._message; }\n\n private _startTime: number;\n public get startTime() { return this._startTime; }\n\n private _endTime: number;\n public get endTime() { return this._endTime; }\n\n private _isShowing: boolean;\n public get isShowing() { return this._isShowing; }\n\n public constructor(data: any) {\n this._id = data.id;\n this._message = data.message;\n this._startTime = data.startTime === undefined ? Date.parse(data.start_time) : new Date(data.startTime).getTime();\n this._endTime = data.endTime === undefined ? Date.parse(data.end_time) : new Date(data.endTime).getTime();\n this._isShowing = false;\n }\n\n public show(): void {\n this._isShowing = true;\n }\n\n public clone(): Banner {\n return new Banner({\n id: this._id,\n message: this._message,\n startTime: this._startTime,\n endTime: this._endTime,\n isShowing: this._isShowing\n });\n }\n}\n","import { FluxStandardAction, AsyncAction } from 'redux-promise-middleware';\nimport AsyncFunction from '../utils/AsyncFunction';\nimport Banner from '../models/Banner';\nimport { HTTP_SERVER_URL } from '../configuration';\n\nexport const ActionTypes = Object.freeze({\n AddBanner: 'ADD_BANNER',\n UpdateBanner: 'UPDATE_BANNER',\n DeleteBanner: 'DELETE_BANNER',\n GetBanners: new AsyncFunction('GET_BANNERS'),\n HideBanner: 'HIDE_BANNER',\n ShowBanner: 'SHOW_BANNER',\n TriggerBannerRedraw: 'TRIGGER_BANNER_REDRAW'\n});\n\nexport const addBanner = (message: string, startTime: number, endTime: number): FluxStandardAction => ({\n type: ActionTypes.AddBanner,\n payload: { message, startTime, endTime }\n});\n\nexport const updateBanner = (id: number, message: string, startTime: number, endTime: number): FluxStandardAction => ({\n type: ActionTypes.UpdateBanner,\n payload: { id, message, startTime, endTime }\n});\n\nexport const deleteBanner = (id: number, message: string, startTime: number, endTime: number): FluxStandardAction => ({\n type: ActionTypes.DeleteBanner,\n payload: { id, message, startTime, endTime }\n});\n\nexport const loadBanners = (): AsyncAction => ({\n type: ActionTypes.GetBanners,\n payload: fetch(`${HTTP_SERVER_URL}/api/banners`)\n .then(response => response.json())\n .then((response: any) => response.banners.map((res: any) => new Banner(res)))\n});\n\nexport const hideBanner = (id: number): FluxStandardAction => ({\n type: ActionTypes.HideBanner,\n payload: { id }\n});\n\nexport const showBanner = (id: number): FluxStandardAction => ({\n type: ActionTypes.ShowBanner,\n payload: { id }\n});\n\nexport const triggerBannerRedraw = (): FluxStandardAction => ({\n type: ActionTypes.TriggerBannerRedraw\n});\n","import { FluxStandardAction } from 'redux-promise-middleware';\n\nexport const Listeners = Object.freeze({\n OnAdministratorAdded: 'ON_ADMINISTRATOR_ADDED',\n OnAdministratorRemoved: 'ON_ADMINISTRATOR_REMOVED',\n OnTeacherAdded: 'ON_TEACHER_ADDED',\n OnTeacherRemoved: 'ON_TEACHER_REMOVED',\n OnAssistantAdded: 'ON_ASSISTANT_ADDED',\n OnAssistantRemoved: 'ON_ASSISTANT_REMOVED',\n OnQueueAdded: 'ON_QUEUE_ADDED',\n OnQueueRemoved: 'ON_QUEUE_REMOVED',\n OnQueueUpdated: 'ON_QUEUE_UPDATED',\n OnQueueEntryAdded: 'ON_QUEUE_ENTRY_ADDED',\n OnQueueEntryRemoved: 'ON_QUEUE_ENTRY_REMOVED',\n OnQueueEntryUpdated: 'ON_QUEUE_ENTRY_UPDATED',\n OnMessageReceived: 'ON_MESSAGE_RECEIVED',\n OnBannerAdded: 'ON_BANNER_ADDED',\n OnBannerUpdated: 'ON_BANNER_UPDATED'\n});\n\nexport const onAdministratorAdded = (data: any): FluxStandardAction => ({\n type: Listeners.OnAdministratorAdded,\n payload: { ...data }\n});\n\nexport const onAdministratorRemoved = (data: any): FluxStandardAction => ({\n type: Listeners.OnAdministratorRemoved,\n payload: { ...data }\n});\n\nexport const onTeacherAdded = (data: any): FluxStandardAction => ({\n type: Listeners.OnTeacherAdded,\n payload: { ...data }\n});\n\nexport const onTeacherRemoved = (data: any): FluxStandardAction => ({\n type: Listeners.OnTeacherRemoved,\n payload: { ...data }\n});\n\nexport const onAssistantAdded = (data: any): FluxStandardAction => ({\n type: Listeners.OnAssistantAdded,\n payload: { ...data }\n});\n\nexport const onAssistantRemoved = (data: any): FluxStandardAction => ({\n type: Listeners.OnAssistantRemoved,\n payload: { ...data }\n});\n\nexport const onQueueAdded = (data: any): FluxStandardAction => ({\n type: Listeners.OnQueueAdded,\n payload: { ...data }\n});\n\nexport const onQueueRemoved = (data: any): FluxStandardAction => ({\n type: Listeners.OnQueueRemoved,\n payload: { ...data }\n});\n\nexport const onQueueUpdated = (data: any): FluxStandardAction => ({\n type: Listeners.OnQueueUpdated,\n payload: { ...data }\n});\n\nexport const onQueueEntryAdded = (data: any): FluxStandardAction => ({\n type: Listeners.OnQueueEntryAdded,\n payload: { ...data }\n});\n\nexport const onQueueEntryRemoved = (data: any): FluxStandardAction => ({\n type: Listeners.OnQueueEntryRemoved,\n payload: { ...data }\n});\n\nexport const onQueueEntryUpdated = (data: any): FluxStandardAction => ({\n type: Listeners.OnQueueEntryUpdated,\n payload: { ...data }\n});\n\nexport const onMessageReceived = (data: any): FluxStandardAction => ({\n type: Listeners.OnMessageReceived,\n payload: { ...data }\n});\n\nexport const onBannerAdded = (data: any): FluxStandardAction => ({\n type: Listeners.OnBannerAdded,\n payload: { ...data }\n});\n\nexport const onBannerUpdated = (data: any): FluxStandardAction => ({\n type: Listeners.OnBannerUpdated,\n payload: { ...data }\n});\n","import RequestMessage from '../utils/RequestMessage';\nimport { WEB_SOCKET_SERVER_URL } from '../configuration';\nimport { ActionTypes as GlobalActions } from '../actions/globalActions';\nimport { ActionTypes as AdministratorActions } from '../actions/administratorActions';\nimport { ActionTypes as QueueActions, loadQueues } from '../actions/queueActions';\nimport { ActionTypes as LobbyActions } from '../actions/lobbyActions';\nimport { ActionTypes as UserActions } from '../actions/userActions';\nimport { ActionTypes as AssistantActions } from '../actions/assistantActions';\nimport { ActionTypes as PageActions } from '../actions/pageActions';\nimport { ActionTypes as BannerActions } from '../actions/bannerActions';\nimport * as Listeners from '../actions/listenerActions';\nimport RequestStatus from '../enums/RequestStatus';\n\ninterface PendingRequest {\n request: RequestMessage,\n sentAt: number\n}\n\nconst middleware = () => {\n\n let socket: WebSocket | null = null;\n let connectionEstablished = false;\n let lastJoinRequest: any = null;\n const callbacks: any = {};\n let token: string | null = null;\n let pendingRequests: PendingRequest[] = [];\n let disconnectedAt: number = -1;\n\n const forcedReloadAfterInterval = 0;\n\n const connect = (store: any): void => {\n socket = new WebSocket(WEB_SOCKET_SERVER_URL);\n socket.onopen = onOpen(store);\n socket.onclose = onClose(store);\n socket.onmessage = onMessage(store);\n };\n\n const sendMessage = (message: RequestMessage, callback?: (data: any) => void): void => {\n if (callback !== undefined) {\n callbacks[message.path] = callback;\n }\n\n if (connectionEstablished && socket !== null) {\n message.token = token || \"\";\n socket.send(message.stringify());\n }\n else {\n const matchingRequestExists = pendingRequests.some(item => item.request.stringify() === message.stringify());\n\n if (!matchingRequestExists) {\n pendingRequests.push({ request: message, sentAt: new Date().getTime()});\n }\n }\n };\n\n const onOpen = (store: any) => (event: any) => {\n connectionEstablished = true;\n\n if (store.getState().queues.requestStatus === RequestStatus.Failed) {\n store.dispatch(loadQueues());\n }\n else if (disconnectedAt !== -1 && new Date().getTime() - disconnectedAt > forcedReloadAfterInterval) {\n setTimeout(() => store.dispatch(loadQueues()), Math.floor(Math.random() * 10000));\n }\n disconnectedAt = -1;\n\n if (lastJoinRequest !== null) {\n sendMessage(lastJoinRequest);\n }\n\n pendingRequests = pendingRequests.filter(item => item.sentAt >= new Date().getTime() - forcedReloadAfterInterval);\n while (pendingRequests.length > 0) {\n const request = pendingRequests[0].request;\n if (request.path.startsWith('subscribe')) {\n pendingRequests.shift();\n continue;\n } else if (request.path.startsWith('unsubscribe')) {\n pendingRequests.shift();\n continue;\n }\n sendMessage(request);\n pendingRequests.shift();\n }\n };\n\n const onClose = (store: any) => () => {\n connectionEstablished = false;\n socket = null;\n disconnectedAt = disconnectedAt === -1 ? new Date().getTime() : disconnectedAt;\n setTimeout(() => connect(store), Math.floor(1000 + Math.random() * 2000));\n };\n\n const onMessage = (store: any) => (event: any) => {\n const data = JSON.parse(event.data);\n const path: string = data.path;\n\n const callback = callbacks[path];\n if (callback !== undefined) {\n store.dispatch(callback(data.content));\n }\n else {\n const backUp = JSON.stringify(data.content);\n\n for (const property in callbacks) {\n if (!callbacks.hasOwnProperty(property)) {\n continue;\n }\n\n const regex = new RegExp(`^${property.split(new RegExp(':[^/]+')).join('[^/]+')}$`);\n if (path.match(regex) !== null) {\n data.content = JSON.parse(backUp);\n\n const parts = path.split('/');\n const propertyParts = property.split('/');\n\n for (let i = 0; i < propertyParts.length; i++) {\n if (propertyParts[i].startsWith(':')) {\n data.content[propertyParts[i].substring(1)] = parts[i];\n }\n }\n\n store.dispatch(callbacks[property](data.content));\n }\n }\n }\n };\n\n return (store: any) => (next: any) => (action: any) => {\n switch (action.type) {\n case GlobalActions.Initialize: {\n connect(store);\n\n const userData = localStorage.getItem('Token');\n token = userData ? JSON.parse(userData).token : null;\n\n callbacks.message = Listeners.onMessageReceived;\n callbacks['message/:queueName'] = Listeners.onMessageReceived;\n callbacks['updateQueue/:queueName'] = Listeners.onQueueUpdated;\n callbacks['addBanner'] = Listeners.onBannerAdded;\n callbacks['updateBanner'] = Listeners.onBannerUpdated;\n\n break;\n }\n\n case AdministratorActions.AddAdministrator: {\n sendMessage(new RequestMessage('addSuperAdmin', { username: action.payload.username }));\n break;\n }\n\n case AdministratorActions.RemoveAdministrator: {\n sendMessage(new RequestMessage('removeSuperAdmin', { username: action.payload.username }));\n break;\n }\n\n case AdministratorActions.AddTeacher: {\n sendMessage(new RequestMessage(`addTeacher/${action.payload.queueName}`, { username: action.payload.username }));\n break;\n }\n\n case AdministratorActions.RemoveTeacher: {\n sendMessage(new RequestMessage(`removeTeacher/${action.payload.queueName}`, { username: action.payload.username }));\n break;\n }\n\n case AdministratorActions.AddAssistant: {\n sendMessage(new RequestMessage(`addAssistant/${action.payload.queueName}`, { username: action.payload.username }));\n break;\n }\n\n case AdministratorActions.RemoveAssistant: {\n sendMessage(new RequestMessage(`removeAssistant/${action.payload.queueName}`, { username: action.payload.username }));\n break;\n }\n\n case AdministratorActions.AddQueue: {\n sendMessage(new RequestMessage(`addQueue/${action.payload.queueName}`));\n break;\n }\n\n case AdministratorActions.RemoveQueue: {\n sendMessage(new RequestMessage(`removeQueue/${action.payload.queueName}`));\n break;\n }\n\n case AdministratorActions.RenameQueue: {\n sendMessage(new RequestMessage(`renameQueue/${action.payload.oldQueueName}`, { newQueueName: action.payload.newQueueName }));\n break;\n }\n\n case AdministratorActions.HideQueue: {\n sendMessage(new RequestMessage(`setQueueHideStatus/${action.payload.queueName}`, {\n status: true\n }));\n break;\n }\n\n case AdministratorActions.RevealQueue: {\n sendMessage(new RequestMessage(`setQueueHideStatus/${action.payload.queueName}`, {\n status: false\n }));\n break;\n }\n\n case AdministratorActions.SetServerMessage: {\n sendMessage(new RequestMessage(`broadcastServer`, {\n message: action.payload.message\n }));\n break;\n }\n\n case BannerActions.AddBanner: {\n sendMessage(new RequestMessage(`addBanner`, {\n message: action.payload.message,\n startTime: new Date(action.payload.startTime).toISOString(),\n endTime: new Date(action.payload.endTime).toISOString()\n }));\n break;\n }\n\n case BannerActions.UpdateBanner: {\n sendMessage(new RequestMessage(`updateBanner`, {\n id: action.payload.id,\n message: action.payload.message,\n startTime: new Date(action.payload.startTime).toISOString(),\n endTime: new Date(action.payload.endTime).toISOString()\n }));\n break;\n }\n\n case BannerActions.DeleteBanner: {\n sendMessage(new RequestMessage(`updateBanner`, {\n id: action.payload.id,\n message: action.payload.message,\n startTime: new Date(action.payload.startTime).toISOString(),\n endTime: new Date(action.payload.endTime).toISOString()\n }));\n break;\n }\n\n case QueueActions.JoinQueue: {\n sendMessage(new RequestMessage(`joinQueue/${action.payload.queueName}`, {\n location: action.payload.location,\n comment: action.payload.comment,\n help: action.payload.help\n }));\n break;\n }\n\n case QueueActions.LeaveQueue: {\n sendMessage(new RequestMessage(`leaveQueue/${action.payload.queueName}`));\n break;\n }\n\n case QueueActions.RecievingHelp: {\n sendMessage(new RequestMessage(`setHelpStatus/${action.payload.queueName}`, {\n status: action.payload.status\n }));\n break;\n }\n\n case QueueActions.UpdatePersonalEntry: {\n sendMessage(new RequestMessage(`updateQueueEntry/${action.payload.queueName}`, {\n comment: action.payload.comment,\n location: action.payload.location,\n help: action.payload.help\n }));\n break;\n }\n\n case QueueActions.SubscribeToQueue: {\n callbacks['joinQueue/:queueName'] = Listeners.onQueueEntryAdded;\n callbacks['leaveQueue/:queueName'] = Listeners.onQueueEntryRemoved;\n callbacks['updateQueueEntry/:queueName'] = Listeners.onQueueEntryUpdated;\n\n const message = new RequestMessage(`subscribeQueue/${action.payload.queueName}`);\n lastJoinRequest = message;\n\n sendMessage(message);\n break;\n }\n\n case QueueActions.UnsubscribeToQueue: {\n delete callbacks['joinQueue/:queueName'];\n delete callbacks['leaveQueue/:queueName'];\n\n if (lastJoinRequest?.path === `subscribeQueue/${action.payload.queueName}`) {\n lastJoinRequest = null;\n }\n\n const message = new RequestMessage(`unsubscribeQueue/${action.payload.queueName}`);\n sendMessage(message);\n break;\n }\n\n case LobbyActions.SubscribeToLobby: {\n const message = new RequestMessage('subscribeLobby');\n lastJoinRequest = message;\n\n callbacks['joinQueue/:queueName'] = Listeners.onQueueEntryAdded;\n callbacks['leaveQueue/:queueName'] = Listeners.onQueueEntryRemoved;\n callbacks['updateQueueEntry/:queueName'] = Listeners.onQueueEntryUpdated;\n\n sendMessage(message);\n break;\n }\n\n case LobbyActions.UnsubscribeToLobby: {\n delete callbacks['joinQueue/lobby'];\n delete callbacks['leaveQueue/lobby'];\n\n if (lastJoinRequest?.path === 'subscribeLobby') {\n lastJoinRequest = null;\n }\n\n const message = new RequestMessage('unsubscribeLobby');\n sendMessage(message);\n break;\n }\n\n case UserActions.Login.Fulfilled: {\n token = action.payload.data.token;\n callbacks.message = Listeners.onMessageReceived;\n callbacks['message/:queueName'] = Listeners.onMessageReceived;\n break;\n }\n\n case UserActions.Logout: {\n sendMessage(new RequestMessage('logout'));\n token = null;\n delete callbacks.message;\n delete callbacks['message/:queueName'];\n break;\n }\n\n case UserActions.LoadUser: {\n const userData = localStorage.getItem('Token');\n token = userData ? JSON.parse(userData).token : null;\n callbacks.message = Listeners.onMessageReceived;\n callbacks['message/:queueName'] = Listeners.onMessageReceived;\n break;\n }\n\n case AssistantActions.KickUser: {\n sendMessage(new RequestMessage(`kick/${action.payload.queueName}`, {\n ugkthid: action.payload.ugkthid,\n message: action.payload.message\n }));\n break;\n }\n\n case AssistantActions.SendMessage: {\n sendMessage(new RequestMessage(`sendMessage/${action.payload.queueName}`, {\n ugkthid: action.payload.ugkthid,\n message: action.payload.message\n }));\n break;\n }\n\n case AssistantActions.Help: {\n sendMessage(new RequestMessage(`setUserHelpStatus/${action.payload.queueName}`, {\n ugkthid: action.payload.ugkthid,\n status: action.payload.newStatus\n }));\n break;\n }\n\n case AssistantActions.BadLocation: {\n sendMessage(new RequestMessage(`badLocation/${action.payload.queueName}`, {\n ugkthid: action.payload.ugkthid,\n badLocationType: 'WrongLocation'\n }));\n break;\n }\n\n case AssistantActions.UnknownLocation: {\n sendMessage(new RequestMessage(`badLocation/${action.payload.queueName}`, {\n ugkthid: action.payload.ugkthid,\n badLocationType: 'UnknownLocation'\n }));\n break;\n }\n\n case AssistantActions.Broadcast: {\n sendMessage(new RequestMessage(`broadcast/${action.payload.queueName}`, {\n message: action.payload.message\n }));\n break;\n }\n\n case AssistantActions.BroadcastFaculty: {\n sendMessage(new RequestMessage(`broadcastFaculty/${action.payload.queueName}`, {\n message: action.payload.message\n }));\n break;\n }\n\n case AssistantActions.SetMotd: {\n sendMessage(new RequestMessage(`setMOTD/${action.payload.queueName}`, {\n message: action.payload.message\n }));\n break;\n }\n\n case AssistantActions.SetQueueInfo: {\n sendMessage(new RequestMessage(`setQueueInfo/${action.payload.queueName}`, {\n message: action.payload.info\n }));\n break;\n }\n\n case AssistantActions.PurgeQueue: {\n sendMessage(new RequestMessage(`purgeQueue/${action.payload.queueName}`));\n break;\n }\n\n case AssistantActions.LockQueue: {\n sendMessage(new RequestMessage(`setQueueLockStatus/${action.payload.queueName}`, {\n status: true\n }));\n break;\n }\n\n case AssistantActions.UnlockQueue: {\n sendMessage(new RequestMessage(`setQueueLockStatus/${action.payload.queueName}`, {\n status: false\n }));\n break;\n }\n\n case PageActions.EnterAdminPage: {\n callbacks.addSuperAdmin = Listeners.onAdministratorAdded;\n callbacks.removeSuperAdmin = Listeners.onAdministratorRemoved;\n callbacks['addTeacher/:queueName'] = Listeners.onTeacherAdded;\n callbacks['removeTeacher/:queueName'] = Listeners.onTeacherRemoved;\n callbacks['addAssistant/:queueName'] = Listeners.onAssistantAdded;\n callbacks['removeAssistant/:queueName'] = Listeners.onAssistantRemoved;\n callbacks['addQueue/:queueName'] = Listeners.onQueueAdded;\n callbacks['removeQueue/:queueName'] = Listeners.onQueueRemoved;\n break;\n }\n\n case PageActions.LeaveAdminPage: {\n delete callbacks.addSuperAdmin;\n delete callbacks.removeSuperAdmin;\n delete callbacks['addTeacher/:queueName'];\n delete callbacks['removeTeacher/:queueName'];\n delete callbacks['addAssistant/:queueName'];\n delete callbacks['removeAssistant/:queueName'];\n delete callbacks['addQueue/:queueName'];\n delete callbacks['removeQueue/:queueName'];\n break;\n }\n }\n\n return next(action);\n };\n};\n\nexport default middleware();\n","export default class User {\n\n private _ugkthid: string;\n public get ugkthid() { return this._ugkthid; }\n\n private _token: string;\n public get token() { return this._token; }\n\n private _name: string;\n public get name() { return this._name; }\n\n private _username: string;\n public get username() { return this._username; }\n\n private _isAdministrator: boolean;\n public get isAdministrator() { return this._isAdministrator; }\n\n private _location: string;\n public get location() { return this._location; }\n\n private _teacherIn: string[];\n public get teacherIn() { return this._teacherIn; }\n\n private _assistantIn: string[];\n\n public constructor(data: any) {\n this._ugkthid = data.ugkthid;\n this._name = data.name;\n this._username = data.username;\n this._isAdministrator = data.isAdministrator;\n this._teacherIn = data.teacherIn;\n this._assistantIn = data.assistantIn;\n this._token = data.token;\n this._location = data.location;\n }\n\n public isTeacher(): boolean {\n return this._teacherIn.length > 0;\n }\n\n public isTeacherIn(queue: string): boolean {\n return this._teacherIn.includes(queue);\n }\n\n public isAssistant(): boolean {\n return this._assistantIn.length > 0;\n }\n\n public isAssistantIn(queue: string): boolean {\n return this._assistantIn.includes(queue);\n }\n\n public clone(): User {\n return new User({\n ugkthid: this._ugkthid,\n token: this._token,\n name: this._name,\n username: this._username,\n isAdministrator: this._isAdministrator,\n location: this._location,\n teacherIn: this._teacherIn,\n assistantIn: this._assistantIn\n });\n }\n}\n","import { FluxStandardAction } from 'redux-promise-middleware';\nimport { ActionTypes as UserActions, UserDataLocation } from '../actions/userActions';\nimport User from '../models/User';\n\nconst LifeTime = 4 * 7 * 24 * 3600 * 1000;\n\nconst initialState: User | null = null;\n\nexport default (state: User | null = initialState, action: FluxStandardAction) => {\n switch (action.type) {\n\n case UserActions.Login.Fulfilled: {\n const userData = {\n ugkthid: action.payload.data.ugkthid,\n name: action.payload.data.realname,\n username: action.payload.data.username,\n location: action.payload.data.location,\n token: action.payload.data.token,\n isAdministrator: action.payload.data.superadmin,\n teacherIn: action.payload.data.teacher_in,\n assistantIn: action.payload.data.assistant_in\n };\n localStorage.setItem('Token', JSON.stringify({ token: action.payload.data.token, validUntil: new Date().getTime() + LifeTime }));\n return new User(userData);\n }\n\n case UserActions.Logout: {\n localStorage.removeItem('Token');\n return null;\n }\n\n case UserActions.LoadUser: {\n switch (action.meta.UserDataLocation) {\n case UserDataLocation.Cookie: {\n const prefix = 'userdata=';\n const cookieData = document.cookie.split(';').map(cookie => cookie.trim()).filter(cookie => cookie.startsWith(prefix))[0];\n\n if (cookieData) {\n const decodedData = JSON.parse(decodeURIComponent(cookieData.substr(prefix.length)));\n localStorage.setItem('Token', JSON.stringify({ token: decodedData.token, validUntil: new Date().getTime() + LifeTime }));\n\n document.cookie = `${prefix}; expires=Thu, 01 Jan 1970 00:00:00 UTC;`;\n\n return new User({\n ugkthid: decodedData.ugkthid,\n name: decodedData.realname,\n username: decodedData.username,\n location: decodedData.location,\n token: decodedData.token,\n isAdministrator: decodedData.superadmin,\n teacherIn: decodedData.teacher_in,\n assistantIn: decodedData.assistant_in\n });\n }\n }\n }\n\n return state;\n }\n\n case UserActions.LoadUser.Fulfilled: {\n switch (action.meta.UserDataLocation) {\n case UserDataLocation.Response: {\n\n return new User({\n ugkthid: action.payload.data.ugkthid,\n name: action.payload.data.realname,\n username: action.payload.data.username,\n location: action.payload.data.location,\n token: action.payload.data.token,\n isAdministrator: action.payload.data.superadmin,\n teacherIn: action.payload.data.teacher_in,\n assistantIn: action.payload.data.assistant_in\n });\n }\n }\n\n return state;\n }\n\n case UserActions.LoadUser.Rejected: {\n if (action.meta.UserDataLocation !== UserDataLocation.Response) {\n break;\n }\n\n if (action.payload.message === 'Request failed with status code 403') {\n localStorage.removeItem('Token');\n }\n\n return state;\n }\n\n }\n\n return state;\n};\n","export default class QueueEntry {\n\n private _comment: string;\n public get comment() { return this._comment; }\n\n private _location: string;\n public get location() { return this._location; }\n\n private _starttime: number;\n public get starttime() { return this._starttime; }\n\n private _gettinghelp: boolean;\n public get gettinghelp() { return this._gettinghelp; }\n\n private _helper: string;\n public get helper() { return this._helper; }\n\n private _help: boolean;\n public get help() { return this._help; }\n\n private _badlocation: boolean;\n public get badlocation() { return this._badlocation; }\n\n private _username: string;\n public get username() { return this._username; }\n\n private _ugkthid: string;\n public get ugkthid() { return this._ugkthid; }\n\n private _realname: string;\n public get realname() { return this._realname; }\n\n public constructor(data: any) {\n this._comment = data.comment || '';\n this._location = data.location || '';\n this._starttime = data.starttime || 0;\n this._gettinghelp = data.gettinghelp || false;\n this._helper = data.helper || '';\n this._help = data.help || false;\n this._badlocation = data.badlocation || false;\n this._username = data.username || '';\n this._ugkthid = data.ugkthid || '';\n this._realname = data.realname || '';\n }\n\n public clone(): QueueEntry {\n return new QueueEntry({\n comment: this._comment,\n location: this._location,\n starttime: this._starttime,\n gettinghelp: this._gettinghelp,\n helper: this._helper,\n help: this._help,\n badlocation: this._badlocation,\n username: this._username,\n ugkthid: this._ugkthid,\n realname: this._realname,\n });\n }\n}\n","export default class Teacher {\n\n private _realname: string;\n public get realname() { return this._realname; }\n\n private _username: string;\n public get username() { return this._username; }\n\n public constructor(data: any) {\n this._realname = data.realname || '';\n this._username = data.username || '';\n }\n\n public clone(): Teacher {\n return new Teacher({\n realname: this._realname,\n username: this._username\n });\n }\n}\n","export default class Assistant {\n\n private _realname: string;\n public get realname() { return this._realname; }\n\n private _username: string;\n public get username() { return this._username; }\n\n public constructor(data: any) {\n this._realname = data.realname || '';\n this._username = data.username || '';\n }\n\n public clone(): Assistant {\n return new Assistant({\n realname: this._realname,\n username: this._username\n });\n }\n}\n","import { FluxStandardAction } from 'redux-promise-middleware';\nimport { ActionTypes } from '../actions/queueActions';\nimport { ActionTypes as AdministratorActionTypes } from '../actions/administratorActions';\nimport { Listeners } from '../actions/listenerActions';\nimport Queue from '../models/Queue';\nimport QueueEntry from '../models/QueueEntry';\nimport Teacher from '../models/Teacher';\nimport Assistant from '../models/Assistant';\nimport RequestStatus from '../enums/RequestStatus';\n\nconst initialState = {\n queueList: [] as Queue[],\n requestStatus: RequestStatus.NotStarted\n};\n\nexport default (state = initialState, action: FluxStandardAction) => {\n switch (action.type) {\n\n case ActionTypes.GetQueues.Rejected: {\n return { ...state, requestStatus: RequestStatus.Failed };\n }\n\n case ActionTypes.GetQueues.Pending: {\n return { ...state, requestStatus: RequestStatus.Pending };\n }\n\n case ActionTypes.GetQueues.Fulfilled: {\n const queueList: Queue[] = action.payload[0];\n\n for (const queueName in action.payload[1]) {\n if (!action.payload[1].hasOwnProperty(queueName)) {\n continue;\n }\n\n const queue = queueList.find(q => q.name === queueName);\n if (queue === undefined) {\n continue;\n }\n queue.setQueueEntries(action.payload[1][queueName].map((e: any) => new QueueEntry(e)));\n }\n\n return { queueList, requestStatus: RequestStatus.Success };\n }\n\n case AdministratorActionTypes.LoadAdditionalQueueData.Fulfilled: {\n const teachers: Teacher[] = action.payload[0].data.map((t: any) => new Teacher(t));\n const assistants: Assistant[] = action.payload[1].data.map((a: any) => new Assistant(a));\n\n const queueToUpdate = state.queueList.filter(queue => queue.name === action.meta.queueName)[0].clone();\n queueToUpdate.setTeachers(teachers);\n queueToUpdate.setAssistants(assistants);\n\n const queues = [...state.queueList.filter(queue => queue.name !== action.meta.queueName), queueToUpdate];\n\n return { ...state, queueList: queues };\n }\n\n case Listeners.OnQueueAdded: {\n return { ...state, queueList: [...state.queueList, new Queue({ name: action.payload.queueName })]};\n }\n\n case Listeners.OnQueueUpdated: {\n const queues = [...state.queueList];\n const index = queues.findIndex(q => q.name === action.payload.queueName);\n queues[index] = new Queue({\n ...action.payload,\n name: action.payload.queueName,\n queueEntries: queues[index].queueEntries\n });\n\n const x = { ...state, queueList: queues };\n console.log(x);\n\n return x;\n }\n\n case Listeners.OnQueueEntryAdded: {\n const queues = state.queueList.map(q => q.clone());\n const queue = queues.filter(q => q.name === action.payload.queueName)[0];\n\n queue.addQueueEntry(new QueueEntry(action.payload));\n\n return { ...state, queueList: queues };\n }\n\n case Listeners.OnQueueEntryRemoved: {\n const queues = state.queueList.map(q => q.clone());\n queues.filter(q => q.name === action.payload.queueName)[0].removeQueueEntry(new QueueEntry(action.payload));\n return { ...state, queueList: queues };\n }\n\n case Listeners.OnQueueEntryUpdated: {\n const queues = state.queueList.map(q => q.clone());\n const queue = queues.filter(q => q.name === action.payload.queueName)[0];\n queue.updateQueueEntry(new QueueEntry(action.payload));\n return { ...state, queueList: queues };\n }\n\n case Listeners.OnTeacherAdded: {\n const queues = state.queueList.map(q => q.clone());\n queues.filter(q => q.name === action.payload.queueName)[0].addTeacher(new Teacher(action.payload));\n return { ...state, queueList: queues };\n }\n\n case Listeners.OnTeacherRemoved: {\n const queues = state.queueList.map(q => q.clone());\n queues.filter(q => q.name === action.payload.queueName)[0].removeTeacher(new Teacher(action.payload));\n return { ...state, queueList: queues };\n }\n\n case Listeners.OnAssistantAdded: {\n const queues = state.queueList.map(q => q.clone());\n queues.filter(q => q.name === action.payload.queueName)[0].addAssistant(new Assistant(action.payload));\n return { ...state, queueList: queues };\n }\n\n case Listeners.OnAssistantRemoved: {\n const queues = state.queueList.map(q => q.clone());\n queues.filter(q => q.name === action.payload.queueName)[0].removeAssistant(new Assistant(action.payload));\n return { ...state, queueList: queues };\n }\n\n case Listeners.OnQueueRemoved: {\n return { ...state, queueList: state.queueList.filter(q => q.name !== action.payload.queueName) };\n }\n\n }\n\n return state;\n};\n","export default class Administrator {\n\n private _realname: string;\n public get realname() { return this._realname; }\n\n private _username: string;\n public get username() { return this._username; }\n\n public constructor(data: any) {\n this._realname = data.realname || '';\n this._username = data.username || '';\n }\n\n public clone(): Administrator {\n return new Administrator({\n realname: this._realname,\n username: this._username\n });\n }\n}\n","import { FluxStandardAction } from 'redux-promise-middleware';\nimport { ActionTypes as AdministratorActionTypes } from '../actions/administratorActions';\nimport { Listeners } from '../actions/listenerActions';\nimport Administrator from '../models/Administrator';\n\nconst initialState = {\n administrators: [] as Administrator[]\n};\n\nexport default (state = initialState, action: FluxStandardAction) => {\n switch (action.type) {\n\n case AdministratorActionTypes.LoadAdministrators.Fulfilled: {\n return {\n ...state,\n administrators: action.payload.data.map((admin: any) => new Administrator(admin))\n };\n }\n\n case Listeners.OnAdministratorAdded: {\n const nextState = { ...state, administrators: [...state.administrators, new Administrator(action.payload)] };\n nextState.administrators.sort((a1: Administrator, a2: Administrator) => a1 < a2 ? 1 : -1);\n return nextState;\n }\n\n case Listeners.OnAdministratorRemoved: {\n return { ...state, administrators: state.administrators.filter(a => a.username !== action.payload.username) };\n }\n\n }\n\n return state;\n};\n","import { FluxStandardAction } from 'redux-promise-middleware';\n\nexport const ActionTypes = Object.freeze({\n CloseModal: 'CLOSE_MODAL',\n RemoveModal: 'REMOVE_MODAL',\n OpenBroadcastFacultyModal: 'OPEN_BROADCAST_FACULTY_MODAL',\n OpenBroadcastModal: 'OPEN_BROADCAST_MODAL',\n OpenDeleteQueueModal: 'OPEN_DELETE_QUEUE_MODAL',\n OpenHideQueueModal: 'OPEN_HIDE_QUEUE_MODAL',\n OpenPurgeQueueModal: 'OPEN_PURGE_QUEUE_MODAL',\n OpenRenameQueueModal: 'OPEN_RENAME_QUEUE_MODAL',\n OpenSendBadLocationModal: 'OPEN_SEND_BAD_LOCATION_MODAL',\n OpenSendMessageModal: 'OPEN_SEND_MESSAGE_MODAL',\n OpenSetMotdModal: 'OPEN_SET_MOTD_MODAL',\n OpenSetQueueInformationModal: 'OPEN_SET_QUEUE_INFORMATION_MODAL',\n OpenSetServerMessageModal: 'OPEN_SET_SERVER_MESSAGE_MODAL',\n OpenAddBannerModal: 'OPEN_ADD_BANNER_MODAL',\n OpenUpdateBannerModal: 'OPEN_UPDATE_BANNER_MODAL',\n OpenShowMotdModal: 'OPEN_SHOW_MOTD_MODAL',\n OpenShowQueueModal: 'OPEN_SHOW_QUEUE_MODAL'\n});\n\nexport const closeModal = (): FluxStandardAction => ({\n type: ActionTypes.CloseModal\n});\n\nexport const removeModal = (): FluxStandardAction => ({\n type: ActionTypes.RemoveModal\n});\n\nexport const openSendMessageModal = (queueName: string, ugkthid: string, realname: string): FluxStandardAction => ({\n type: ActionTypes.OpenSendMessageModal,\n payload: { queueName, ugkthid, realname }\n});\n\nexport const openBroadcastModal = (queueName: string): FluxStandardAction => ({\n type: ActionTypes.OpenBroadcastModal,\n payload: { queueName }\n});\n\nexport const openBroadcastFacultyModal = (queueName: string): FluxStandardAction => ({\n type: ActionTypes.OpenBroadcastFacultyModal,\n payload: { queueName }\n});\n\nexport const openSetMotdModal = (queueName: string): FluxStandardAction => ({\n type: ActionTypes.OpenSetMotdModal,\n payload: { queueName }\n});\n\nexport const openSetQueueInformationModal = (queueName: string): FluxStandardAction => ({\n type: ActionTypes.OpenSetQueueInformationModal,\n payload: { queueName }\n});\n\nexport const openSetServerMessageModal = (): FluxStandardAction => ({\n type: ActionTypes.OpenSetServerMessageModal\n});\n\nexport const openAddBannerModal = (): FluxStandardAction => ({\n type: ActionTypes.OpenAddBannerModal\n});\n\nexport const openUpdateBannerModal = (id: number): FluxStandardAction => ({\n type: ActionTypes.OpenUpdateBannerModal,\n payload: { id }\n});\n\nexport const openShowQueueModal = (queueName: string): FluxStandardAction => ({\n type: ActionTypes.OpenShowQueueModal,\n payload: { queueName }\n});\n\nexport const openHideQueueModal = (queueName: string): FluxStandardAction => ({\n type: ActionTypes.OpenHideQueueModal,\n payload: { queueName }\n});\n\nexport const openPurgeQueueModal = (queueName: string): FluxStandardAction => ({\n type: ActionTypes.OpenPurgeQueueModal,\n payload: { queueName }\n});\n\nexport const openDeleteQueueModal = (queueName: string): FluxStandardAction => ({\n type: ActionTypes.OpenDeleteQueueModal,\n payload: { queueName }\n});\n\nexport const openRenameQueueModal = (queueName: string): FluxStandardAction => ({\n type: ActionTypes.OpenRenameQueueModal,\n payload: { queueName }\n});\n\nexport const openShowMotdModal = (message: string): FluxStandardAction => ({\n type: ActionTypes.OpenShowMotdModal,\n payload: { message }\n});\n\nexport const openSendBadLocationModal = (queueName: string, ugkthid: string): FluxStandardAction => ({\n type: ActionTypes.OpenSendBadLocationModal,\n payload: { queueName, ugkthid }\n});\n","export default class Modal {\n\n private _modalType: string;\n public get modalType() { return this._modalType; }\n\n private _modalData: any;\n public get modalData() { return this._modalData; }\n\n private _isVisible: any;\n public get isVisible() { return this._isVisible; }\n\n public constructor(modalType: string, data?: any, isVisible?: boolean) {\n this._modalType = modalType;\n this._modalData = data || {};\n this._isVisible = isVisible !== undefined ? isVisible : true;\n }\n\n public hide(): void {\n this._isVisible = false;\n }\n\n public clone(): Modal {\n return new Modal(this._modalType, this._modalData, this._isVisible);\n }\n}\n","import React, { useState } from 'react';\nimport { useDispatch } from 'react-redux'\nimport Modal from 'react-bootstrap/Modal';\nimport { broadcastFaculty } from '../../actions/assistantActions';\n\nexport const ModalType = 'BROADCAST_FACULTY_MODAL';\n\nexport default (props: any): JSX.Element => {\n\n const [message, setMessage] = useState('');\n\n const dispatch = useDispatch();\n\n function changeMessage(event: any): void {\n setMessage(event.target.value);\n }\n\n function submitMessage(): void {\n dispatch(broadcastFaculty(props.queueName, message));\n props.onHide();\n }\n\n return (\n \n \n \n Broadcast message\n \n \n \n \n \n \n \n Broadcast\n \n \n \n );\n};\n","import React, { useState } from 'react';\nimport { useDispatch } from 'react-redux'\nimport Modal from 'react-bootstrap/Modal';\nimport { broadcast } from '../../actions/assistantActions';\n\nexport const ModalType = 'BROADCAST_MODAL';\n\nexport default (props: any): JSX.Element => {\n\n const [message, setMessage] = useState('');\n\n const dispatch = useDispatch();\n\n function changeMessage(event: any): void {\n setMessage(event.target.value);\n }\n\n function submitMessage(): void {\n dispatch(broadcast(props.queueName, message));\n props.onHide();\n }\n\n return (\n \n \n \n Broadcast message\n \n \n \n \n \n \n \n Broadcast\n \n \n \n );\n};\n","import React from 'react';\nimport { useDispatch } from 'react-redux'\nimport Modal from 'react-bootstrap/Modal';\nimport { removeQueue } from '../../actions/administratorActions';\n\nexport const ModalType = 'DELETE_QUEUE_MODAL';\n\nexport default (props: any): JSX.Element => {\n\n const dispatch = useDispatch();\n\n function confirm(): void {\n dispatch(removeQueue(props.queueName));\n props.onHide();\n }\n\n return (\n \n \n \n Delete queue\n \n \n \n Are you sure that you wish to remove {props.queueName} permanently?\n \n \n \n No, I made a misstake\n \n \n Yes, I never want to see it ever again\n \n \n \n );\n};\n","import React from 'react';\nimport { useDispatch } from 'react-redux'\nimport Modal from 'react-bootstrap/Modal';\nimport { hideQueue } from '../../actions/administratorActions';\n\nexport const ModalType = 'HIDE_QUEUE_MODAL';\n\nexport default (props: any): JSX.Element => {\n\n const dispatch = useDispatch();\n\n function confirm(): void {\n dispatch(hideQueue(props.queueName));\n props.onHide();\n }\n\n return (\n \n \n \n Hide queue\n \n \n \n Are you sure that you wish to hide {props.queueName}? This means that only teachers and admins can enter and see the queue.\n \n \n \n No, keep it visible\n \n \n Yes, and conceal it well\n \n \n \n );\n};\n","import React from 'react';\nimport { useDispatch } from 'react-redux'\nimport Modal from 'react-bootstrap/Modal';\nimport { purgeQueue } from '../../actions/assistantActions';\n\nexport const ModalType = 'PURGE_QUEUE_MODAL';\n\nexport default (props: any): JSX.Element => {\n\n const dispatch = useDispatch();\n\n function confirm(): void {\n dispatch(purgeQueue(props.queueName));\n props.onHide();\n }\n\n return (\n \n \n \n Purge queue\n \n \n \n Are you sure that you wish to purge {props.queueName}? This means that all currently queuing students will be kicked out.\n \n \n \n Yes, purge the queue\n \n \n \n );\n};\n","import React, { useState } from 'react';\nimport { useDispatch } from 'react-redux'\nimport Modal from 'react-bootstrap/Modal';\nimport { renameQueue } from '../../actions/administratorActions';\n\nexport const ModalType = 'RENAME_QUEUE_MODAL';\n\nexport default (props: any): JSX.Element => {\n\n const [newName, setNewName] = useState('');\n\n const dispatch = useDispatch();\n\n function changeNewName(event: any): void {\n setNewName(event.target.value);\n }\n\n function submit(): void {\n dispatch(renameQueue(props.queueName, newName));\n props.onHide();\n }\n\n return (\n \n \n \n Rename {props.queueName}\n \n \n \n \n \n \n \n \n \n );\n};\n","import React from 'react';\nimport { useDispatch } from 'react-redux'\nimport Modal from 'react-bootstrap/Modal';\nimport { badLocation, unknownLocation } from '../../actions/assistantActions';\n\nexport const ModalType = 'SEND_BAD_LOCATION_MODAL';\n\nexport default (props: any): JSX.Element => {\n\n const dispatch = useDispatch();\n\n function notifyBadLocation(): void {\n dispatch(badLocation(props.queueName, props.ugkthid));\n props.onHide();\n }\n\n function notifyUnknownLocation(): void {\n dispatch(unknownLocation(props.queueName, props.ugkthid));\n props.onHide();\n }\n\n return (\n \n \n \n What is wrong with the location?\n \n \n \n
\n \n Unknown location\n \n \n Wrong location\n \n
\n
\n \n );\n};\n","import React, { useState } from 'react';\nimport { useDispatch } from 'react-redux'\nimport Modal from 'react-bootstrap/Modal';\nimport { sendMessage } from '../../actions/assistantActions';\n\nexport const ModalType = 'SEND_MESSAGE_MODAL';\n\nexport default (props: any): JSX.Element => {\n\n const [message, setMessage] = useState('');\n\n const dispatch = useDispatch();\n\n function changeMessage(event: any): void {\n setMessage(event.target.value);\n }\n\n function submitMessage(): void {\n dispatch(sendMessage(props.queueName, props.ugkthid, message));\n props.onHide();\n }\n\n return (\n \n \n \n Message to {props.realname}\n \n \n \n \n \n \n \n Send message\n \n \n \n );\n};\n","import React, { useState } from 'react';\nimport { useDispatch } from 'react-redux'\nimport Modal from 'react-bootstrap/Modal';\nimport { setMotd } from '../../actions/assistantActions';\n\nexport const ModalType = 'SET_MOTD_MODAL';\n\nexport default (props: any): JSX.Element => {\n\n const [message, setMessage] = useState('');\n\n const dispatch = useDispatch();\n\n function changeMessage(event: any): void {\n setMessage(event.target.value);\n }\n\n function submitMessage(): void {\n dispatch(setMotd(props.queueName, message));\n props.onHide();\n }\n\n function clearMessage(): void {\n dispatch(setMotd(props.queueName, ''));\n props.onHide();\n }\n\n return (\n \n \n \n Set message of the day\n \n \n \n \n \n \n \n Clear MOTD\n \n \n Set MOTD\n \n \n \n );\n};\n","import React, { useState } from 'react';\nimport { useDispatch } from 'react-redux'\nimport Modal from 'react-bootstrap/Modal';\nimport { setQueueInformation } from '../../actions/assistantActions';\n\nexport const ModalType = 'SET_QUEUE_INFORMATION_MODAL';\n\nexport default (props: any): JSX.Element => {\n\n const [message, setMessage] = useState('');\n\n const dispatch = useDispatch();\n\n function changeMessage(event: any): void {\n setMessage(event.target.value);\n }\n\n function setNewQueueInformation(): void {\n dispatch(setQueueInformation(props.queueName, message));\n props.onHide();\n }\n\n function clearQueueInformation(): void {\n dispatch(setQueueInformation(props.queueName, ''));\n props.onHide();\n }\n\n return (\n \n \n \n Set queue information\n \n \n \n \n \n \n \n Clear information\n \n \n Set information\n \n \n \n );\n};\n","import React, { useState } from 'react';\nimport { useDispatch } from 'react-redux'\nimport Modal from 'react-bootstrap/Modal';\nimport { sendServerMessage } from '../../actions/administratorActions';\n\nexport const ModalType = 'SET_SERVER_MESSAGE_MODAL';\n\nexport default (props: any): JSX.Element => {\n\n const [message, setMessage] = useState('');\n\n const dispatch = useDispatch();\n\n function changeMessage(event: any): void {\n setMessage(event.target.value);\n }\n\n function submitMessage(): void {\n dispatch(sendServerMessage(message));\n props.onHide();\n }\n\n return (\n \n \n \n Send server-wide message\n \n \n \n \n \n \n \n Send message\n \n \n \n );\n};\n","import React, { useState } from 'react';\nimport { useDispatch } from 'react-redux'\nimport Modal from 'react-bootstrap/Modal';\nimport DatePicker from 'react-datepicker';\nimport \"react-datepicker/dist/react-datepicker.css\";\nimport { addBanner } from '../../actions/bannerActions';\n\nconst defaultInterval = 20 * 60 * 1000;\n\nexport const ModalType = 'ADD_BANNER_MODAL';\n\nexport default (props: any): JSX.Element => {\n\n const [message, setMessage] = useState('');\n const [startDate, setStartDate] = useState(new Date());\n const [endDate, setEndDate] = useState(new Date(new Date().getTime() + defaultInterval));\n\n const dispatch = useDispatch();\n\n function changeMessage(event: any): void {\n setMessage(event.target.value);\n }\n\n function submitMessage(): void {\n dispatch(addBanner(message, startDate.getTime(), endDate.getTime()));\n props.onHide();\n }\n\n return (\n \n \n \n Add informational banner\n \n \n \n \n \n

\n
\n
\n \n
\n setStartDate(date as Date) }\n showTimeSelect\n timeFormat=\"HH:mm\"\n timeIntervals={1}\n timeCaption=\"time\"\n dateFormat=\"yyyy-MM-dd HH:mm\" />\n
\n
\n \n
\n setEndDate(date as Date) }\n showTimeSelect\n timeFormat=\"HH:mm\"\n timeIntervals={1}\n timeCaption=\"time\"\n dateFormat=\"yyyy-MM-dd HH:mm\" />\n
\n
\n
\n \n \n Send message\n \n \n \n );\n};\n","import React, { useState } from 'react';\nimport { useSelector, useDispatch } from 'react-redux'\nimport Modal from 'react-bootstrap/Modal';\nimport DatePicker from 'react-datepicker';\nimport \"react-datepicker/dist/react-datepicker.css\";\nimport { updateBanner, deleteBanner } from '../../actions/bannerActions';\nimport { GlobalStore } from '../../store';\nimport Banner from '../../models/Banner';\n\nexport const ModalType = 'UPDATE_BANNER_MODAL';\n\nexport default (props: any): JSX.Element | null => {\n\n const banner = useSelector(store => store.banners.banners.find(banner => banner.id === props.id));\n\n const [message, setMessage] = useState(banner?.message);\n const [startDate, setStartDate] = useState(new Date(banner?.startTime ?? new Date().getTime()));\n const [endDate, setEndDate] = useState(new Date(banner?.endTime ?? new Date().getTime()));\n\n const dispatch = useDispatch();\n\n function changeMessage(event: any): void {\n setMessage(event.target.value);\n }\n\n function submitMessage(): void {\n if (banner === undefined || message === undefined) {\n return;\n }\n\n dispatch(updateBanner(banner.id, message, startDate.getTime(), endDate.getTime()));\n props.onHide();\n }\n\n function sendDeletion(): void {\n if (banner === undefined || message === undefined) {\n return;\n }\n\n dispatch(deleteBanner(banner.id, banner.message, banner.startTime, banner.startTime));\n props.onHide();\n }\n\n return (\n banner === undefined\n ? null\n : \n \n \n Add informational banner\n \n \n \n \n \n

\n
\n
\n \n
\n setStartDate(date as Date) }\n showTimeSelect\n timeFormat=\"HH:mm\"\n timeIntervals={1}\n timeCaption=\"time\"\n dateFormat=\"yyyy-MM-dd HH:mm\" />\n
\n
\n \n
\n setEndDate(date as Date) }\n showTimeSelect\n timeFormat=\"HH:mm\"\n timeIntervals={1}\n timeCaption=\"time\"\n dateFormat=\"yyyy-MM-dd HH:mm\" />\n
\n
\n
\n \n \n Delete banner\n \n \n Update banner\n \n \n \n );\n};\n","import React from 'react';\nimport Modal from 'react-bootstrap/Modal';\n\nexport const ModalType = 'SHOW_MESSAGE_MODAL';\n\nexport default (props: any): JSX.Element => {\n\n return (\n \n \n \n Message\n \n \n \n {props.message}\n \n {\n props.sender\n ? \n - {props.sender}\n \n : null\n }\n \n );\n};\n","import React from 'react';\nimport Modal from 'react-bootstrap/Modal';\n\nexport const ModalType = 'SHOW_MOTD_MODAL';\n\nexport default (props: any): JSX.Element => {\n\n return (\n \n \n \n Message of the day\n \n \n \n {props.message}\n \n \n );\n};\n","import React from 'react';\nimport { useDispatch } from 'react-redux'\nimport Modal from 'react-bootstrap/Modal';\nimport { revealQueue } from '../../actions/administratorActions';\n\nexport const ModalType = 'SHOW_QUEUE_MODAL';\n\nexport default (props: any): JSX.Element => {\n\n const dispatch = useDispatch();\n\n function confirm(): void {\n dispatch(revealQueue(props.queueName));\n props.onHide();\n }\n\n return (\n \n \n \n Show queue\n \n \n \n Are you sure that you wish to show {props.queueName}? This means that anyone can see and enter the queue.\n \n \n \n No, keep it from prying eyes\n \n \n Yes, show yourself\n \n \n \n );\n};\n","import { FluxStandardAction } from 'redux-promise-middleware';\nimport { Listeners } from '../actions/listenerActions';\nimport { ActionTypes as ModalActionTypes } from '../actions/modalActions';\nimport Modal from '../models/Modal';\nimport { ModalType as BroadcastFacultyModal } from '../viewcomponents/Modals/BroadcastFacultyModal';\nimport { ModalType as BroadcastModal } from '../viewcomponents/Modals/BroadcastModal';\nimport { ModalType as DeleteQueueModal } from '../viewcomponents/Modals/DeleteQueueModal';\nimport { ModalType as HideQueueModal } from '../viewcomponents/Modals/HideQueueModal';\nimport { ModalType as PurgeQueueModal } from '../viewcomponents/Modals/PurgeQueueModal';\nimport { ModalType as RenameQueueModal } from '../viewcomponents/Modals/RenameQueueModal';\nimport { ModalType as SendBadLocationModal } from '../viewcomponents/Modals/SendBadLocationModal';\nimport { ModalType as SendMessageModal } from '../viewcomponents/Modals/SendMessageModal';\nimport { ModalType as SetMotdModal } from '../viewcomponents/Modals/SetMotdModal';\nimport { ModalType as SetQueueInformationModal } from '../viewcomponents/Modals/SetQueueInformationModal';\nimport { ModalType as SetServerMessageModal } from '../viewcomponents/Modals/ServerMessageModal';\nimport { ModalType as AddBannerModal } from '../viewcomponents/Modals/AddBannerModal';\nimport { ModalType as UpdateBannerModal } from '../viewcomponents/Modals/UpdateBannerModal';\nimport { ModalType as ShowMessageModal } from '../viewcomponents/Modals/ShowMessageModal';\nimport { ModalType as ShowMotdModal } from '../viewcomponents/Modals/ShowMotdModal';\nimport { ModalType as ShowQueueModal } from '../viewcomponents/Modals/ShowQueueModal';\n\nconst initialState = {\n modalList: [] as Modal[],\n current: 0\n};\n\nexport default (state = initialState, action: FluxStandardAction) => {\n switch (action.type) {\n\n case Listeners.OnMessageReceived: {\n return { ...state, modalList: [...state.modalList, new Modal(ShowMessageModal, action.payload)] }\n }\n\n case ModalActionTypes.CloseModal: {\n const nextState = {\n current: state.current + 1,\n modalList: [ ...state.modalList ]\n };\n\n nextState.modalList[state.current] = nextState.modalList[state.current].clone();\n nextState.modalList[state.current].hide();\n\n return nextState;\n }\n\n case ModalActionTypes.RemoveModal: {\n if (state.modalList.some(modal => modal.isVisible)) {\n return state;\n }\n\n return initialState;\n }\n\n case ModalActionTypes.OpenSendMessageModal: {\n return { ...state, modalList: [...state.modalList, new Modal(SendMessageModal, action.payload)] }\n }\n\n case ModalActionTypes.OpenBroadcastModal: {\n return { ...state, modalList: [...state.modalList, new Modal(BroadcastModal, action.payload)] }\n }\n\n case ModalActionTypes.OpenBroadcastFacultyModal: {\n return { ...state, modalList: [...state.modalList, new Modal(BroadcastFacultyModal, action.payload)] }\n }\n\n case ModalActionTypes.OpenSetMotdModal: {\n return { ...state, modalList: [...state.modalList, new Modal(SetMotdModal, action.payload)] }\n }\n\n case ModalActionTypes.OpenSetQueueInformationModal: {\n return { ...state, modalList: [...state.modalList, new Modal(SetQueueInformationModal, action.payload)] }\n }\n\n case ModalActionTypes.OpenSetServerMessageModal: {\n return { ...state, modalList: [...state.modalList, new Modal(SetServerMessageModal)] }\n }\n\n case ModalActionTypes.OpenAddBannerModal: {\n return { ...state, modalList: [...state.modalList, new Modal(AddBannerModal)] }\n }\n\n case ModalActionTypes.OpenUpdateBannerModal: {\n return { ...state, modalList: [...state.modalList, new Modal(UpdateBannerModal, action.payload)] }\n }\n\n case ModalActionTypes.OpenShowQueueModal: {\n return { ...state, modalList: [...state.modalList, new Modal(ShowQueueModal, action.payload)] }\n }\n\n case ModalActionTypes.OpenHideQueueModal: {\n return { ...state, modalList: [...state.modalList, new Modal(HideQueueModal, action.payload)] }\n }\n\n case ModalActionTypes.OpenPurgeQueueModal: {\n return { ...state, modalList: [...state.modalList, new Modal(PurgeQueueModal, action.payload)] }\n }\n\n case ModalActionTypes.OpenDeleteQueueModal: {\n return { ...state, modalList: [...state.modalList, new Modal(DeleteQueueModal, action.payload)] }\n }\n\n case ModalActionTypes.OpenRenameQueueModal: {\n return { ...state, modalList: [...state.modalList, new Modal(RenameQueueModal, action.payload)] }\n }\n\n case ModalActionTypes.OpenShowMotdModal: {\n return { ...state, modalList: [...state.modalList, new Modal(ShowMotdModal, action.payload)] }\n }\n\n case ModalActionTypes.OpenSendBadLocationModal: {\n return { ...state, modalList: [...state.modalList, new Modal(SendBadLocationModal, action.payload)] }\n }\n\n }\n\n return state;\n};\n","import { FluxStandardAction } from 'redux-promise-middleware';\n\nexport const ActionTypes = Object.freeze({\n SetTitle: 'SET_TITLE',\n ResetTitle: 'RESET_TITLE'\n});\n\nexport const setTitle = (title: string): FluxStandardAction => ({\n type: ActionTypes.SetTitle,\n payload: { title }\n});\n\nexport const resetTitle = (): FluxStandardAction => ({\n type: ActionTypes.ResetTitle\n});\n","import { FluxStandardAction } from 'redux-promise-middleware';\nimport { ActionTypes as TitleTypes } from '../actions/titleActions';\n\nconst initialState = 'Stay A While';\n\nexport default (state = initialState, action: FluxStandardAction) => {\n switch (action.type) {\n\n case TitleTypes.SetTitle: {\n return action.payload.title;\n }\n\n case TitleTypes.ResetTitle: {\n return initialState;\n }\n\n }\n\n return state;\n}\n","import { FluxStandardAction } from 'redux-promise-middleware';\n\nexport const ActionTypes = Object.freeze({\n EnableSounds: 'ENABLE_SOUNDS',\n DisableSounds: 'DISABLE_SOUNDS'\n});\n\nexport const enableSounds = (): FluxStandardAction => ({\n type: ActionTypes.EnableSounds\n});\n\nexport const disableSounds = (): FluxStandardAction => ({\n type: ActionTypes.DisableSounds\n});\n","import { FluxStandardAction } from 'redux-promise-middleware';\nimport { ActionTypes as BannerActionTypes } from '../actions/bannerActions';\nimport { Listeners } from '../actions/listenerActions';\nimport Banner from '../models/Banner';\n\nconst initialState = {\n redrawTrigger: 0,\n banners: [] as Banner[]\n};\n\nexport default (state = initialState, action: FluxStandardAction) => {\n switch (action.type) {\n\n case BannerActionTypes.GetBanners.Rejected: {\n return state;\n }\n\n case BannerActionTypes.GetBanners.Pending: {\n return state;\n }\n\n case BannerActionTypes.GetBanners.Fulfilled: {\n return {\n ...state,\n banners: action.payload.map((payload: any) => new Banner(payload))\n };\n }\n\n case BannerActionTypes.HideBanner: {\n const token = 'SeenBanners';\n const seenBanners = JSON.parse(localStorage.getItem('SeenBanners') ?? '[]') as number[];\n seenBanners.push(action.payload.id);\n localStorage.setItem(token, JSON.stringify(seenBanners));\n return state;\n }\n\n case BannerActionTypes.ShowBanner: {\n console.log(JSON.stringify(action));\n const bannerToUpdate = state.banners.find(banner => banner.id === action.payload.id);\n if (bannerToUpdate === undefined) {\n return state;\n }\n\n const updatedBanner = bannerToUpdate.clone();\n updatedBanner.show();\n return {\n ...state,\n banners: state.banners.map(banner => banner.id !== action.payload.id ? banner : updatedBanner)\n };\n }\n\n case BannerActionTypes.TriggerBannerRedraw: {\n return {\n ...state,\n redrawTrigger: state.redrawTrigger + 1\n };\n }\n\n case Listeners.OnBannerAdded: {\n return {\n ...state,\n banners: [...state.banners, new Banner(action.payload)]\n };\n }\n\n case Listeners.OnBannerUpdated: {\n const token = 'SeenBanners';\n let seenBanners = JSON.parse(localStorage.getItem('SeenBanners') ?? '[]') as number[];\n const bannerToUpdate = state.banners.find(banner => banner.id === action.payload.id);\n if (bannerToUpdate === undefined) {\n return state;\n }\n\n const messageHasBeenUpdated = bannerToUpdate.message !== action.payload.message;\n if (messageHasBeenUpdated) {\n seenBanners = seenBanners.filter(id => id !== bannerToUpdate.id);\n localStorage.setItem(token, JSON.stringify(seenBanners));\n }\n\n return {\n ...state,\n banners: state.banners.map(banner => banner.id !== bannerToUpdate.id ? banner : new Banner(action.payload))\n };\n }\n\n }\n\n return state;\n};\n","import { applyMiddleware, createStore, combineReducers } from 'redux';\nimport thunk from 'redux-thunk';\nimport promise from 'redux-promise-middleware';\nimport socketMiddleware from './middlewares/SocketMiddleware';\nimport errorHandlingMiddleware from './middlewares/ErrorHandlingMiddleware';\nimport { composeWithDevTools } from 'redux-devtools-extension/logOnlyInProduction';\nimport userReducer from './reducers/userReducer';\nimport queueReducer from './reducers/queueReducer';\nimport administratorReducer from './reducers/administratorReducer';\nimport modalReducer from './reducers/modalReducer';\nimport titleReducer from './reducers/titleReducer';\nimport soundReducer from './reducers/soundReducer';\nimport bannerReducer from './reducers/bannerReducer';\nimport User from './models/User';\nimport Queue from './models/Queue';\nimport Administrator from './models/Administrator';\nimport Modal from './models/Modal';\nimport Banner from './models/Banner';\nimport RequestStatus from './enums/RequestStatus';\n\nexport interface GlobalStore {\n user: User | null,\n queues: {\n queueList: Queue[],\n requestStatus: RequestStatus\n },\n administration: {\n administrators: Administrator[]\n },\n modals: {\n modalList: Modal[],\n current: number\n },\n title: string,\n playSounds: boolean,\n banners: {\n redrawTrigger: number,\n banners: Banner[]\n }\n}\n\nconst middleware = applyMiddleware(errorHandlingMiddleware, promise, thunk, socketMiddleware);\n\nconst reducer = combineReducers({\n user: userReducer,\n queues: queueReducer,\n administration: administratorReducer,\n modals: modalReducer,\n title: titleReducer,\n playSounds: soundReducer,\n banners: bannerReducer\n});\n\nconst store = createStore(\n reducer,\n composeWithDevTools(middleware));\n\nexport default store;\n","const isPromise = (value: any): boolean => value !== null && typeof value === 'object' && typeof value.then === 'function';\n\nexport default () => (next: any) => (action: any) => {\n\n // If not a promise, continue on\n if (!isPromise(action.payload)) {\n return next(action);\n }\n\n /**\n * include a property in `meta and evaluate that property to check if this error will be handled locally\n *\n * if (!action.meta.localError) {\n * // handle error\n * }\n *\n * The error middleware serves to dispatch the initial pending promise to\n * the promise middleware, but adds a `catch`.\n */\n if (!action.meta || !action.meta.localError) {\n // Dispatch initial pending promise, but catch any errors\n return next(action).catch((error: any) => error);\n }\n\n return next(action);\n};\n","import { FluxStandardAction } from 'redux-promise-middleware';\nimport { ActionTypes as SoundActionTypes } from '../actions/soundActions';\n\nconst initialState = false;\n\nexport default (state = initialState, action: FluxStandardAction) => {\n switch (action.type) {\n\n case SoundActionTypes.EnableSounds: {\n return true;\n }\n\n case SoundActionTypes.DisableSounds: {\n return false;\n }\n\n }\n\n return state;\n};\n","import React from 'react';\n\nexport const CheckMark = (props: any): JSX.Element => Markup(props, 'check');\nexport const Clock = (props: any): JSX.Element => Markup(props, 'clock');\nexport const Copy = (props: any): JSX.Element => Markup(props, 'copy');\nexport const Cross = (props: any): JSX.Element => Markup(props, 'times');\nexport const Download = (props: any): JSX.Element => Markup(props, 'download');\nexport const Envelope = (props: any): JSX.Element => Markup(props, 'envelope');\nexport const Information = (props: any): JSX.Element => Markup(props, 'info');\nexport const Invisible = (props: any): JSX.Element => Markup(props, 'eye-slash');\nexport const Lock = (props: any): JSX.Element => Markup(props, 'lock');\nexport const Megaphone = (props: any): JSX.Element => Markup(props, 'bullhorn');\nexport const Muted = (props: any): JSX.Element => Markup(props, 'volume-mute');\nexport const Pen = (props: any): JSX.Element => Markup(props, 'pen');\nexport const Plus = (props: any): JSX.Element => Markup(props, 'plus');\nexport const QuestionMark = (props: any): JSX.Element => Markup(props, 'question');\nexport const Sign = (props: any): JSX.Element => Markup(props, 'sign');\nexport const Square = (props: any): JSX.Element => Markup(props, 'stop');\nexport const Star = (props: any): JSX.Element => Markup(props, 'star');\nexport const Trashbin = (props: any): JSX.Element => Markup(props, 'trash-alt');\nexport const Unlock = (props: any): JSX.Element => Markup(props, 'unlock');\nexport const Users = (props: any): JSX.Element => Markup(props, 'users');\nexport const VolumeUp = (props: any): JSX.Element => Markup(props, 'volume-up');\n\nfunction parseProps(props: any): [string | undefined, string | undefined, ((event: React.MouseEvent) => void) | undefined] {\n\n const title: string | undefined = props.title;\n const onClick: ((event: React.MouseEvent) => void) | undefined = props.onClick;\n\n const cssClasses = [\n onClick !== undefined ? 'clickable' : null\n ];\n\n return [\n title,\n cssClasses.filter(x => x !== null).join(' ') || undefined,\n onClick\n ];\n}\n\nfunction Markup(props: any, fontAwesomeCssClass: string): JSX.Element {\n\n const [title, styling, onClick] = parseProps(props);\n\n return (\n title || styling || onClick || props.color\n ? \n \n \n : \n );\n}\n","import React from 'react';\nimport Queue from '../../models/Queue';\nimport User from '../../models/User';\nimport { Invisible, Lock, Users } from '../../viewcomponents/FontAwesome';\n\nexport default (props: any): JSX.Element => {\n\n const queue: Queue = props.queue;\n const user: User = props.user;\n\n const styles = { color: 'inherit', fontSize: '1.3em' };\n\n if (queue.hiding) {\n styles.color = 'gray';\n }\n else if (queue.locked) {\n styles.color = 'red';\n }\n\n return (\n
\n
\n
\n {queue.hiding ? : null}\n {queue.locked ? : null}\n {queue.name}\n
\n {\n queue.queueEntries\n ?
\n {\n user !== null && queue.queueEntries.some(entry => entry.ugkthid === user.ugkthid)\n ? <>\n {`${queue.queueEntries.findIndex(entry => entry.ugkthid === user.ugkthid) + 1}/${queue.queueEntries.length}`} \n \n : <>\n {queue.queueEntries.length} \n \n }\n
\n : null\n }\n
\n
\n );\n};\n","import React from 'react';\n\nexport default (props: any): JSX.Element => {\n\n return (\n
\n props.setFilter(e.target.value)}\n className=\"col-10 search-box\"\n style={{lineHeight: '3em'}}\n placeholder=\"Search\" \n />\n \n
\n \n \n );\n};\n","import React, { useState, useEffect } from 'react';\nimport { Link, Redirect } from \"react-router-dom\";\nimport { useSelector, useDispatch } from 'react-redux'\nimport { GlobalStore } from '../../store';\nimport { subscribe, unsubscribe } from '../../actions/lobbyActions';\nimport { resetTitle } from '../../actions/titleActions';\nimport User from '../../models/User';\nimport Queue from '../../models/Queue';\nimport QueueCardViewComponent from './QueueCard';\nimport SearchViewComponent from '../../viewcomponents/Search';\n\nconst queueOrdering = {\n standard: (queue1: Queue, queue2: Queue) => {\n // 1. Hidden (visible above)\n if (queue1.hiding && !queue2.hiding) { return 1; }\n if (!queue1.hiding && queue2.hiding) { return -1; }\n\n // 2. Locked (Unlocked above)\n if (queue1.locked && !queue2.locked) { return 1; }\n if (!queue1.locked && queue2.locked) { return -1; }\n\n // 3. Alphabetically (a-z)\n return queue1.name.toLowerCase() < queue2.name.toLowerCase() ? -1 : 1;\n },\n smart: (user: User | null) => (queue1: Queue, queue2: Queue) => {\n // 1. Hidden (visible above)\n if (queue1.hiding && !queue2.hiding) { return 1; }\n if (!queue1.hiding && queue2.hiding) { return -1; }\n\n // 2. Own place in queue (lowest number first)\n if (user != null) {\n const location1 = queue1.queueEntries.findIndex(e => e.ugkthid === user.ugkthid);\n const location2 = queue2.queueEntries.findIndex(e => e.ugkthid === user.ugkthid);\n if (location1 === -1 && location2 !== -1) { return 1; }\n if (location1 !== -1 && location2 === -1) { return -1; }\n if (location1 !== -1 && location2 !== -1) {\n if (location1 > location2) { return 1; }\n if (location1 < location2) { return -1; }\n }\n }\n\n // 3. Locked (Unlocked above)\n if (queue1.locked && !queue2.locked) { return 1; }\n if (!queue1.locked && queue2.locked) { return -1; }\n\n // 4. Length of queue (highest value first)\n if (queue1.queueEntries.length < queue2.queueEntries.length) { return 1; }\n if (queue1.queueEntries.length > queue2.queueEntries.length) { return -1; }\n\n // 5. Alphabetically (a-z)\n return queue1.name.toLowerCase() < queue2.name.toLowerCase() ? -1 : 1;\n }\n};\n\nexport default (): JSX.Element => {\n\n const [lastVisitedUrl, setLastVisitedUrl] = useState(null as string | null);\n\n const user = useSelector(store => store.user);\n const queues = useSelector(store => store.queues.queueList)\n .sort(queueOrdering.standard);\n\n const [filter, setFilter] = useState('');\n\n const dispatch = useDispatch();\n useEffect(() => {\n if (!dispatch) {\n return;\n }\n\n dispatch(subscribe());\n dispatch(resetTitle());\n\n return () => {\n dispatch(unsubscribe());\n };\n }, [dispatch]);\n\n useEffect(() => {\n const urlBeforeLoginRedirect = localStorage.getItem('LastVisitedUrl');\n\n if (urlBeforeLoginRedirect) {\n localStorage.removeItem('LastVisitedUrl');\n setLastVisitedUrl(urlBeforeLoginRedirect);\n }\n else if (lastVisitedUrl) {\n setLastVisitedUrl(null);\n }\n }, [lastVisitedUrl]);\n\n function canSee(queue: Queue): boolean {\n return !queue.hiding || (user !== null && (user.isAdministrator || user.isTeacherIn(queue.name)));\n }\n\n return (\n lastVisitedUrl\n ? \n :
\n
\n
\n \n
\n
\n
\n
\n \n
\n
\n {queues\n .filter(queue => filter === '' || queue.name.toLowerCase().includes(filter.toLowerCase()))\n .map(queue =>\n canSee(queue)\n ?
\n \n \n \n
\n : null\n )}\n
\n );\n\n};\n","import React from 'react';\nimport { useSelector } from 'react-redux'\nimport { GlobalStore } from '../../../store';\nimport User from '../../../models/User';\nimport QueueEntry from '../../../models/QueueEntry';\n\nexport default (props: any): JSX.Element => {\n\n const user = useSelector(store => store.user);\n const personalQueueEntry = useSelector(\n store => store.queues\n .queueList\n .filter(q => q.name === props.queueName)[0]\n .queueEntries\n .filter(e => e.ugkthid === user?.ugkthid)[0] || null);\n\n function changeLocation(event: any): void {\n if (user?.location) {\n return;\n }\n\n props.setLocation(event.target.value);\n if (personalQueueEntry !== null && event.target.value && props.comment) {\n props.sendPersonalEntry(props.queueName, props.comment, event.target.value, props.help);\n }\n else {\n props.sendPersonalEntry.cancel();\n }\n }\n\n return (\n <>\n \n
\n
\n \n {\n props.location === ''\n ? <>\n

Required

\n \n : null\n }\n
\n \n );\n};\n","import React from 'react';\nimport { useSelector, useDispatch } from 'react-redux'\nimport { GlobalStore } from '../../../store';\nimport { joinQueue } from '../../../actions/queueActions';\nimport User from '../../../models/User';\nimport QueueEntry from '../../../models/QueueEntry';\n\nexport default (props: any): JSX.Element => {\n\n const user = useSelector(store => store.user);\n const personalQueueEntry = useSelector(\n store => store.queues\n .queueList\n .filter(q => q.name === props.queueName)[0]\n .queueEntries\n .filter(e => e.ugkthid === user?.ugkthid)[0] || null);\n\n const dispatch = useDispatch();\n\n const sendPersonalEntry = props.sendPersonalEntry;\n\n function changeComment(event: any): void {\n props.setComment(event.target.value);\n if (personalQueueEntry !== null && props.location && event.target.value) {\n sendPersonalEntry(props.queueName, event.target.value, props.location, props.help);\n }\n else {\n sendPersonalEntry.cancel();\n }\n }\n\n function enterQueue(event: any) {\n if (personalQueueEntry) {\n return;\n }\n\n if (!props.location || !props.comment) {\n return;\n }\n\n if (event.key === 'Enter' || event.button === 0) {\n dispatch(joinQueue(props.queueName, props.comment, props.location, props.help));\n }\n }\n\n return (\n <>\n \n
\n
\n \n {\n props.comment === ''\n ? <>\n

Required

\n \n : null\n }\n
\n \n );\n};\n","import React from 'react';\nimport { useSelector } from 'react-redux'\nimport { GlobalStore } from '../../../store';\nimport User from '../../../models/User';\nimport QueueEntry from '../../../models/QueueEntry';\n\nexport default (props: any): JSX.Element | null => {\n\n const user = useSelector(store => store.user);\n const personalQueueEntry = useSelector(\n store => store.queues\n .queueList\n .filter(q => q.name === props.queueName)[0]\n .queueEntries\n .filter(e => e.ugkthid === user?.ugkthid)[0] || null);\n\n return (\n personalQueueEntry !== null\n ? null\n :
\n
\n \n props.setHelp(true)} />\n
\n
\n \n props.setHelp(false)} />\n
\n
\n );\n};\n","import React, { useState } from 'react';\nimport { useDispatch } from 'react-redux'\nimport debounce from 'lodash.debounce';\nimport { updatePersonalEntry } from '../../../actions/queueActions';\nimport EnterLocation from './EnterLocation';\nimport EnterComment from './EnterComment';\nimport EnterCommunicationType from './EnterCommunicationType';\n\nexport default (props: any): JSX.Element => {\n\n const dispatch = useDispatch();\n const [sendPersonalEntry] = useState(\n () => debounce((q: string, c: string, l: string, h: boolean): void => {\n dispatch(updatePersonalEntry(q, c, l, h));\n }, 750)\n );\n\n return (\n <>\n \n
\n \n
\n \n
\n \n );\n};\n","import React, { useState, useEffect } from 'react';\nimport { useSelector, useDispatch } from 'react-redux'\nimport { GlobalStore } from '../../../store';\nimport { joinQueue, leaveQueue, recievingHelp, updatePersonalEntry } from '../../../actions/queueActions';\nimport User from '../../../models/User';\nimport QueueEntry from '../../../models/QueueEntry';\nimport { Lock } from '../../../viewcomponents/FontAwesome';\nimport EnterInformationForm from './EnterInformationForm';\n\nexport default (props: any): JSX.Element => {\n\n const user = useSelector(store => store.user);\n\n const personalQueueEntry = useSelector(\n store => store.queues\n .queueList\n .filter(q => q.name === props.queueName)[0]\n .queueEntries\n .filter(e => e.ugkthid === user?.ugkthid)[0] || null);\n\n const isLocked = useSelector(\n store => store.queues\n .queueList\n .filter(queue => queue.name === props.queueName)[0]\n .locked);\n\n const dispatch = useDispatch();\n\n const [location, setLocation] = useState(user?.location || personalQueueEntry?.location || '');\n const [comment, setComment] = useState(personalQueueEntry?.comment || '');\n const [help, setHelp] = useState(personalQueueEntry !== null ? personalQueueEntry.help : true);\n const [doubleClickProtection, setDoubleClickProtection] = useState(0);\n\n useEffect(() => {\n const newLocation = user?.location || personalQueueEntry?.location || '';\n const newComment = personalQueueEntry?.comment || '';\n const newHelp = personalQueueEntry !== null ? personalQueueEntry.help : true;\n\n if (user?.location && personalQueueEntry?.location && user?.location !== personalQueueEntry?.location) {\n dispatch(updatePersonalEntry(props.queueName, newComment, newLocation, newHelp));\n }\n\n setLocation(newLocation);\n setComment(newComment);\n setHelp(newHelp);\n\n }, [personalQueueEntry, user]);\n\n function enterQueue(event: any) {\n if (personalQueueEntry) {\n return;\n }\n\n if (!location || !comment) {\n return;\n }\n\n if (event.key === 'Enter') {\n dispatch(joinQueue(props.queueName, comment, location, help));\n }\n else if (event.button === 0) {\n if (new Date().getTime() - doubleClickProtection > 750) {\n setDoubleClickProtection(new Date().getTime());\n dispatch(joinQueue(props.queueName, comment, location, help));\n }\n }\n }\n\n function receiveHelp() {\n if (new Date().getTime() - doubleClickProtection > 750) {\n setDoubleClickProtection(new Date().getTime());\n dispatch(recievingHelp(props.queueName, true));\n }\n }\n\n function leave() {\n if (new Date().getTime() - doubleClickProtection > 750) {\n setDoubleClickProtection(new Date().getTime());\n dispatch(leaveQueue(props.queueName))\n }\n }\n\n return (\n <>\n \n\n {\n personalQueueEntry !== null\n ? <>\n {\n personalQueueEntry.gettinghelp\n ? null\n : \n Receiving help\n \n }\n \n Leave queue\n \n \n : !isLocked\n ? \n Join queue\n \n : \n Queue is locked\n \n }\n \n );\n};\n","import React, { useState, useEffect } from 'react';\nimport { useSelector, useDispatch } from 'react-redux'\nimport { GlobalStore } from '../../../store';\nimport { updatePersonalEntry } from '../../../actions/queueActions';\nimport User from '../../../models/User';\nimport QueueEntry from '../../../models/QueueEntry';\nimport LoggedInUserView from './LoggedInUserView';\n\nexport default (props: any): JSX.Element | null => {\n\n const queueName: string = props.queueName;\n\n const user = useSelector(store => store.user);\n const personalQueueEntry = useSelector(\n store => store.queues\n .queueList\n .filter(q => q.name === props.queueName)[0]\n .queueEntries\n .filter(e => e.ugkthid === user?.ugkthid)[0] || null);\n\n const dispatch = useDispatch();\n\n const [, setLocation] = useState(user?.location || personalQueueEntry?.location || '');\n const [, setComment] = useState(personalQueueEntry?.comment || '');\n const [, setHelp] = useState(personalQueueEntry?.help || true);\n\n useEffect(() => {\n const newLocation = user?.location || personalQueueEntry?.location || '';\n const newComment = personalQueueEntry?.comment || '';\n const newHelp = personalQueueEntry?.help || true;\n\n if (user?.location && personalQueueEntry?.location && user?.location !== personalQueueEntry?.location) {\n dispatch(updatePersonalEntry(queueName, newComment, newLocation, newHelp));\n }\n\n setLocation(newLocation);\n setComment(newComment);\n setHelp(newHelp);\n\n }, [personalQueueEntry, user]);\n\n function login() {\n localStorage.setItem('LastVisitedUrl', window.location.pathname);\n window.location.href = `https://queue.csc.kth.se/login`;\n }\n\n return (\n user\n ? \n :
\n

Log in to see all the information and enqueue

\n \n Login\n
\n \n );\n};\n","import React, { useState, useEffect } from 'react';\nimport { useSelector, useDispatch } from 'react-redux'\nimport { GlobalStore } from '../../store';\nimport { lockQueue, unlockQueue } from '../../actions/assistantActions';\nimport {\n openBroadcastModal,\n openSetMotdModal,\n openSetQueueInformationModal,\n openPurgeQueueModal,\n openBroadcastFacultyModal\n} from '../../actions/modalActions';\nimport { enableSounds, disableSounds } from '../../actions/soundActions';\nimport User from '../../models/User';\nimport Queue from '../../models/Queue';\nimport { Information, Lock, Megaphone, Muted, Sign, Trashbin, Unlock, VolumeUp } from '../../viewcomponents/FontAwesome';\n\nexport default (props: any): JSX.Element | null => {\n\n const queue: Queue = props.queue;\n\n const user = useSelector(store => store.user);\n const playSounds = useSelector(store => store.playSounds);\n const [isAssistant, setIsAssistant] = useState(user !== null && (user.isAssistantIn(queue.name)));\n const [isTeacher, setIsTeacher] = useState(user !== null && (user.isTeacherIn(queue.name)));\n\n useEffect(() => {\n setIsAssistant(user !== null && user.isAssistantIn(queue.name));\n setIsTeacher(user !== null && user.isTeacherIn(queue.name));\n }, [user, queue.name]);\n\n const dispatch = useDispatch();\n\n return (\n !isTeacher && !isAssistant\n ? null\n :
\n \n Options\n \n
\n
dispatch(openBroadcastModal(queue.name))}> Broadcast
\n
dispatch(openBroadcastFacultyModal(queue.name))}> Broadcast faculty
\n
dispatch(openSetMotdModal(queue.name))}> Set MOTD
\n
dispatch(openSetQueueInformationModal(queue.name))}> Set queue information
\n
dispatch(openPurgeQueueModal(queue.name))}> Purge queue
\n {\n queue.locked\n ?
dispatch(unlockQueue(queue.name))}> Unlock queue
\n :
dispatch(lockQueue(queue.name))}> Lock queue
\n }\n {\n playSounds\n ?
dispatch(disableSounds())}> Disable sounds
\n :
dispatch(enableSounds())}> Enable sounds
\n }\n
\n
\n );\n};\n","import React, { useState, useEffect } from 'react';\nimport { useSelector, useDispatch } from 'react-redux'\nimport { GlobalStore } from '../../store';\nimport { kickUser, toggleHelp } from '../../actions/assistantActions';\nimport { openSendMessageModal, openSendBadLocationModal } from '../../actions/modalActions';\nimport TimeAgo from 'react-timeago';\nimport QueueEntry from '../../models/QueueEntry';\nimport User from '../../models/User';\nimport { CheckMark, Cross, Envelope, QuestionMark, Star, Square } from '../../viewcomponents/FontAwesome';\n\nexport default (props: any): JSX.Element => {\n\n const index: number = props.index;\n const queueEntry: QueueEntry = props.queueEntry;\n const queueName: string = props.queueName;\n\n const user = useSelector(store => store.user);\n const [mayAdministerQueue, setMayAdministerQueue] = useState(user !== null && (user.isAssistantIn(queueName) || user.isTeacherIn(queueName)));\n\n useEffect(() => {\n setMayAdministerQueue(user !== null && (user.isAssistantIn(queueName) || user.isTeacherIn(queueName)));\n }, [user, queueName]);\n\n const [displayAdministrationOptions, setDisplayAdministrationOptions] = useState(false);\n\n const dispatch = useDispatch();\n\n function clickRow(): void {\n setDisplayAdministrationOptions(!displayAdministrationOptions);\n }\n\n function getLocationColor(location: string) {\n location = location.toLowerCase();\n const pattern = /^(blue|blå|red|röd|orange|yellow|gul|green|grön|brown|brun|grey|gray|grå|karmosin|white|vit|magenta|violett|turkos|turquoise|game|play|spel|sport|music|musik|art|konst|food|mat)/g;\n\n let result: string | null = null;\n const match = location.match(pattern);\n if (match !== null) {\n result = match[0];\n }\n\n switch (result) {\n case \"blue\":\n return \"blue\";\n case \"blå\":\n return \"blue\";\n case \"red\":\n return \"red\";\n case \"röd\":\n return \"red\";\n case \"orange\":\n return \"#FF7F00\";\n case \"yellow\":\n return \"yellow\";\n case \"gul\":\n return \"yellow\";\n case \"green\":\n return \"green\";\n case \"grön\":\n return \"green\";\n case \"brown\":\n return \"brown\";\n case \"brun\":\n return \"brown\";\n case \"grey\":\n return \"grey\";\n case \"gray\":\n return \"grey\";\n case \"grå\":\n return \"grey\";\n case \"karmosin\":\n return \"#D91536\";\n case \"white\":\n return \"white\";\n case \"vit\":\n return \"white\";\n case \"magenta\":\n return \"magenta\";\n case \"violett\":\n return \"#AC00E6\";\n case \"turquoise\":\n return \"turquoise\";\n case \"turkos\":\n return \"turquoise\";\n case \"game\":\n return \"#E6ADAD\";\n case \"play\":\n return \"#E6ADAD\";\n case \"spel\":\n return \"#E6ADAD\";\n case \"sport\":\n return \"#ADADE6\";\n case \"music\":\n return \"#ADE7AD\";\n case \"musik\":\n return \"#ADE7AD\";\n case \"art\":\n return \"#E8E7AF\";\n case \"konst\":\n return \"#E8E7AF\";\n case \"food\":\n return \"#E8C9AF\";\n case \"mat\":\n return \"#E8C9AF\";\n default:\n return \"transparent\";\n }\n }\n\n function getRowColor() {\n if (queueEntry.badlocation) {\n return 'table-danger';\n }\n\n if (queueEntry.gettinghelp) {\n return 'table-success';\n }\n }\n\n function checkUrlLocation(locationToCheck: string): [boolean, string | null, string | null] {\n const zoomRegex = /^(https:\\/\\/)?kth-se\\.zoom\\.us\\/.+/g;\n if (locationToCheck.match(zoomRegex) !== null) {\n return [\n true,\n 'Zoom',\n !locationToCheck.startsWith('https://') ? `https://${locationToCheck}` : locationToCheck\n ];\n }\n\n return [false, null, null];\n }\n\n return (\n <>\n clickRow() : undefined}\n className={`${getRowColor()}${(mayAdministerQueue ? ' clickable' : '')}`}>\n {index + 1}\n { user === null\n ? null\n : \n \n {\n user?.ugkthid === queueEntry.ugkthid\n ? <> {`${queueEntry.realname} (${queueEntry.username})`}\n : `${queueEntry.realname} (${queueEntry.username})`\n }\n \n \n {\n \n }\n \n \n }\n \n {\n checkUrlLocation(queueEntry.location)[0]\n ? user === null\n ? Zoom (log in to access)\n : \n {checkUrlLocation(queueEntry.location)[1]}\n \n : queueEntry.location\n }\n \n {queueEntry.help ? 'help' : 'present'}\n {queueEntry.comment}\n \n \n {\n !displayAdministrationOptions\n ? null\n : <>\n \n \n \n
\n
dispatch(kickUser(queueName, queueEntry.ugkthid))}>\n \n \n
\n
\n dispatch(openSendMessageModal(queueName, queueEntry.ugkthid, queueEntry.realname))}>\n \n \n \n \n {\n queueEntry.gettinghelp\n ? dispatch(toggleHelp(queueName, queueEntry.ugkthid, !queueEntry.gettinghelp))}>\n \n \n \n \n : dispatch(toggleHelp(queueName, queueEntry.ugkthid, !queueEntry.gettinghelp))}>\n \n \n \n \n }\n
dispatch(openSendBadLocationModal(queueName, queueEntry.ugkthid))}>\n \n \n
\n \n \n \n \n \n }\n \n );\n};\n","import React from 'react';\nimport { useSelector } from 'react-redux'\nimport { GlobalStore } from '../../store';\nimport User from '../../models/User';\nimport QueueEntry from '../../models/QueueEntry';\nimport QueueEntryRowViewComponent from './QueueEntryRow';\n\nexport default (props: any): JSX.Element => {\n\n const user = useSelector(store => store.user);\n\n const queueName: string = props.queueName;\n const queueEntries: QueueEntry[] = props.queueEntries;\n const filter: string = props.filter;\n\n function filterUsers(entry: QueueEntry) {\n const lowerCaseFilter = filter.toLowerCase();\n\n const helpType = entry.help ? 'help' : 'presentation';\n\n return (\n filter === ''\n || entry.comment.toLowerCase().includes(lowerCaseFilter)\n || entry.location.toLowerCase().includes(lowerCaseFilter)\n || entry.realname.toLowerCase().includes(lowerCaseFilter)\n || helpType.includes(lowerCaseFilter));\n }\n\n return (\n
\n {\n queueEntries.length === 0\n ?

This queue is empty

\n : \n \n \n \n { user === null ? null : }\n \n \n \n \n \n \n \n {\n queueEntries.filter(filterUsers).map((queueEntry, index) =>\n )\n }\n \n
#UserLocationCommentTime
\n }\n
\n );\n};\n","export default __webpack_public_path__ + \"static/media/Coffee.e30cbb95.png\";","export default __webpack_public_path__ + \"static/media/DarthVader.7145d163.png\";","export default __webpack_public_path__ + \"static/media/Inside.69f7e15c.png\";","export default __webpack_public_path__ + \"static/media/Panda.e39a1ef5.png\";","export default __webpack_public_path__ + \"static/media/Penguin.4c50261e.png\";","export default __webpack_public_path__ + \"static/media/Rabbit.730e9f3b.png\";","import React, { useEffect } from 'react';\nimport { useDispatch } from 'react-redux'\nimport { resetTitle } from '../../actions/titleActions';\nimport Coffee from '../../img/404/Coffee.png';\nimport DarthVader from '../../img/404/DarthVader.png';\nimport Inside from '../../img/404/Inside.png';\nimport Panda from '../../img/404/Panda.png';\nimport Penguin from '../../img/404/Penguin.png';\nimport Rabbit from '../../img/404/Rabbit.png';\n\nexport default (): JSX.Element => {\n\n const images = [ Coffee, DarthVader, Inside, Panda, Penguin, Rabbit ];\n\n const image = images[Math.floor(Math.random() * images.length)];\n\n const styles = {\n maxHeight: '60vh',\n maxWidth: '60vw'\n };\n\n const dispatch = useDispatch();\n useEffect(() => {\n if (!dispatch) {\n return;\n }\n\n dispatch(resetTitle());\n }, [dispatch]);\n\n return (\n
\n
\n \"This\n
\n
\n );\n};\n","export default __webpack_public_path__ + \"static/media/DingLing.91fb71c3.mp3\";","import React, { useState, useEffect } from 'react';\nimport { useSelector, useDispatch } from 'react-redux'\nimport { GlobalStore } from '../../store';\nimport { useParams } from \"react-router-dom\";\nimport { subscribe, unsubscribe } from '../../actions/queueActions';\nimport { setTitle } from '../../actions/titleActions';\nimport { openShowMotdModal } from '../../actions/modalActions';\nimport Queue from '../../models/Queue';\nimport User from '../../models/User';\nimport RequestStatus from '../../enums/RequestStatus';\nimport EnterQueueViewComponent from './EnterQueue';\nimport QueueAdministratorOptionsViewComponent from './QueueAdministratorOptions';\nimport QueueEntryTableViewComponent from './QueueEntryTable';\nimport PageNotFound from '../NoMatch';\nimport SearchViewComponent from '../../viewcomponents/Search';\nimport { Lock } from '../../viewcomponents/FontAwesome';\nimport DingLing from '../../sounds/DingLing.mp3';\n\nexport default (): JSX.Element | null => {\n\n const { queueName } = useParams();\n\n const user = useSelector(store => store.user);\n const queue = useSelector(store => store.queues.queueList.filter(q => q.name === queueName)[0] || null);\n const queuesAreLoaded = useSelector(store => store.queues.requestStatus === RequestStatus.Success);\n const playSounds = useSelector(store => store.playSounds);\n\n const [filter, setFilter] = useState('');\n const [previousQueueEntryCount, setPreviousQueueEntryCount] = useState(0);\n const [hasShownMotd, setHasShownMotd] = useState(false);\n\n const dispatch = useDispatch();\n\n useEffect(() => {\n if (queue !== null) {\n if (queuesAreLoaded && !hasShownMotd && queue.motd) {\n dispatch(openShowMotdModal(queue.motd));\n setHasShownMotd(true);\n }\n }\n }, [queuesAreLoaded, queue, dispatch]);\n\n useEffect(() => {\n if (queueName !== null && queueName !== undefined && queuesAreLoaded) {\n dispatch(subscribe(queueName));\n return () => {\n dispatch(unsubscribe(queueName));\n };\n }\n }, [queueName, queuesAreLoaded, dispatch]);\n\n useEffect(() => {\n if (queue !== null) {\n if (user !== null) {\n for (let i = 0; i < queue.queueEntries.length; i++) {\n if (queue.queueEntries[i].ugkthid === user.ugkthid) {\n dispatch(setTitle(`[${i+1}/${queue.queueEntries.length}] ${queue.name} | Stay A While`));\n return;\n }\n }\n }\n dispatch(setTitle(`[${queue.queueEntries.length}] ${queue.name} | Stay A While`));\n }\n }, [queue, user, dispatch]);\n\n useEffect(() => {\n if (!queue) {\n return;\n }\n\n if (!user?.isTeacherIn(queue.name) && !user?.isAssistantIn(queue.name)) {\n return;\n }\n\n if (!queue.queueEntries) {\n setPreviousQueueEntryCount(0);\n }\n else {\n const newEntryNumber = queue.queueEntries.length;\n if (previousQueueEntryCount === 0 && newEntryNumber === 1 && playSounds) {\n new Audio(DingLing).play();\n }\n setPreviousQueueEntryCount(newEntryNumber);\n }\n }, [queue?.queueEntries]);\n\n return (\n !queuesAreLoaded\n ? null\n : queue === null\n ? \n :
\n
\n {\n queue.locked\n ?

{queue.name}

\n :

{queue.name}

\n }\n

{queue.info}

\n
\n \n
\n
\n
\n
\n \n \n
\n
\n \n
\n
\n
\n );\n};\n","import React from 'react';\nimport { Link, useLocation } from \"react-router-dom\";\nimport { useSelector } from 'react-redux'\nimport { GlobalStore } from '../store';\nimport User from '../models/User';\nimport Logo from '../img/logo-stay-a-while.png';\n\nexport default (): JSX.Element => {\n\n const user = useSelector(store => store.user);\n\n function hideNavBar() {\n ($('#navbarText') as any).collapse('hide');\n }\n\n function toggleNavBar() {\n ($('#navbarText') as any).collapse('toggle');\n }\n\n const location = useLocation();\n\n return (\n \n );\n};\n","export default \"data:image/png;base64,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\"","export default class Contributor {\n\n private _name: string;\n public get name() { return this._name; }\n\n private _gravatar: string;\n public get gravatar() { return this._gravatar; }\n\n private _github: string;\n public get github() { return this._github; }\n\n private _linkedIn: string;\n public get linkedIn() { return this._linkedIn; }\n\n public constructor(data: any) {\n this._name = data.name || '';\n this._gravatar = data.gravatar || '';\n this._github = data.github || '';\n this._linkedIn = data.linkedIn || '';\n }\n\n public static InitialValue: Contributor[] = [\n new Contributor({\n \"name\": \"Anton Bäckström\",\n \"gravatar\": \"7eaf43cc9a0edf01b4994318e03fe368\",\n \"github\": \"antbac\",\n \"linkedIn\": \"428598244\"\n }),\n new Contributor({\n \"name\": \"Robert Welin-Berger\",\n \"gravatar\": \"5577c2569cfb1fe29388d1e2c1a794d7\",\n \"github\": \"avacore1337\",\n \"linkedIn\": \"332859123\"\n })\n ];\n\n public clone(): Contributor {\n return new Contributor({\n name: this._name,\n gravatar: this._gravatar,\n github: this._github,\n linkedIn: this._linkedIn\n });\n }\n}\n","import React from 'react';\n\nexport default (props: any): JSX.Element | null => {\n const contributor = props.contributor;\n\n return (\n contributor.github\n ? \n {contributor.github}\n
\n
\n : null\n );\n};\n","import React from 'react';\n\nexport default (props: any): JSX.Element | null => {\n const contributor = props.contributor;\n\n return (\n contributor.linkedIn\n ? \n {contributor.name}\n
\n
\n : null\n );\n};\n","import React from 'react';\nimport GitHubLink from './GitHubLink';\nimport LinkedInLink from './LinkedInLink';\n\nexport default (props: any): JSX.Element => {\n const contributor = props.contributor;\n\n return (\n
\n
\n {contributor.name}\n
\n
\n

{contributor.name}

\n \n \n
\n
\n );\n};\n","import React, { useEffect } from 'react';\nimport { useDispatch } from 'react-redux'\nimport { resetTitle } from '../../actions/titleActions';\nimport Contributor from '../../models/Contributor';\nimport Contributors from '../../data/contributors.json';\nimport ContributorElement from './Contributor';\n\nexport default (): JSX.Element => {\n\n const contributors: Contributor[] = Contributors.Contributors.map(contributor => new Contributor(contributor));\n\n const dispatch = useDispatch();\n useEffect(() => {\n if (!dispatch) {\n return;\n }\n\n dispatch(resetTitle());\n }, [dispatch]);\n\n return (\n
\n
\n

About Stay A While

\n

\n Welcome to Stay A While, the queueing system of KTH\n

\n\n

\n Stay A While was originally developed as part of the DD1392 course back in 2015 and was a cooperation\n between students and faculty members.\n The purpose of the application was to provide a complete framework for students and teaching assistants to queue,\n and manage the queueing users during lab sessions.\n The system was designed with a sleek web interface, and was intergrated with the official KTH user-system,\n making it easy for students to use across different devices.\n As such, the system quickly replaced previous queueing systems and was adopted as the default queueing system\n of the now called EECS school and its related sister schools.\n

\n

\n Eventually, the system was adopted by other schools at KTH, at which point it was decided that the system\n would receive a rework to improve both performance, visuals, as well as security.\n Thus, Stay A While was developed in 2020 and was a complete rewrite of the original system.\n

\n

\n We hope you will enjoy the experience ~\n

\n\n

\n \n StayAWhile@GitHub\n \n
\n Admin: robertwb@kth.se\n

\n\n

Contributors

\n
\n {\n contributors.map(contributor => )\n }\n
\n
\n
\n );\n}\n","import React from 'react';\nimport { useSelector } from 'react-redux'\nimport { HashLink as Link } from 'react-router-hash-link';\nimport { GlobalStore } from '../../../store';\nimport User from '../../../models/User';\n\nexport default (): JSX.Element | null => {\n\n const user = useSelector(store => store.user);\n\n return (\n user?.isAdministrator\n ?
\n

Administrators

\n\n

\n Administrators are the supreme rulers of Stay A While, with privileges to perform just about anything.\n Their primary purpose is adding new queues, and adding teachers for those queues.\n

\n\n

Set server-message

\n

\n To add a server-message, go to the Administration page.\n Then click the Set server-message button and enter a message in the window that opens up.\n Once you have entered your message, click the Set message button to save your message.\n A server-message will then be shown to every user currently connected to Stay A While as\n well as those that connect while the message is active.\n A server-message may be useful to forewarn users upon updating the service.\n

\n

\n To remove a server-message, go to the Administration page.\n Then click the Set server-message button and then click the Remove message button\n on the window that opens up.\n

\n\n

Add an administrator

\n

\n To add an administrator, go to the Administration page.\n Then enter the username of the user you wish to add as administrator in the field which\n says Add administrator and click Add.\n If the entered username is correct, the user will immediately show up in the list of administrators\n below the input field.\n

\n

\n \n Note: New administrators will get their privileges once they login next time, so they may have to\n log out and back in again.\n \n

\n\n

Remove an administrator

\n

\n To remove an administrator, go to the Administration page.\n Then, under Administrators, click the red cross next to the name of the administrator you wish to remove.\n The user should now disappear from the administrator list.\n If not, please refresh the page.\n The administrator rights will be removed from the user immediately.\n

\n

\n \n Note: There must always be at least one administrator.\n It is therefore not possible to remove an administrator if it is the last one remaining.\n \n

\n\n

Add a queue

\n

\n To add a new queue, go to the Administration page.\n Then enter the name of the queue you wish to add in the field which says Add queue and click Add.\n The queue should now show up in the list of queues below the input field.\n

\n

\n To remove a queue, see Remove queue under the Teacher section.\n

\n\n

Add or remove teachers and assistants

\n

\n See \n Add a teacher or assistant\n and \n Remove a teacher or assistant\n under the Teacher section.\n

\n\n

Accessing statistics

\n

\n See Statistics under the Teacher section\n

\n
\n : null\n );\n};\n","export default __webpack_public_path__ + \"static/media/remove-teacher.685ef475.png\";","import React from 'react';\nimport { useSelector } from 'react-redux'\nimport { HashLink as Link } from 'react-router-hash-link';\nimport { GlobalStore } from '../../../store';\nimport User from '../../../models/User';\nimport EditQueue from '../../../img/edit-queue.png';\nimport RemoveTeacher from '../../../img/remove-teacher.png';\n\nexport default (): JSX.Element | null => {\n\n const user = useSelector(store => store.user);\n\n return (\n user?.isAdministrator || user?.isTeacher()\n ?
\n

Teacher

\n\n

\n Teachers are in charge of specific queues.\n In addition to the privileges of an assistant, they can also add and remove assistants as well\n as teachers from their queues\n and hide or remove the queue itself.\n

\n\n

Add a teacher or assistant

\n

\n To add a teacher or assistant for a queue, go to the Administration page.\n Then choose the queue you wish to add a teacher or assistant for in the dropdown as below:\n

\n
\n \"Edit\n
\n

\n Once you have selected a queue, enter the name of the user you wish to add either in the\n Add teacher or the Add assistant input fields, and click the Add button.\n If done correctly, the user should now show up in the list under the given input field.\n

\n\n

Remove a teacher or assistant

\n

\n To remove a teacher or assistant from a queue, go to the Administration page.\n Choose the queue you wish to remove a teacher or assistant from in the dropdown, the way you would\n when adding a teacher.\n Click the red cross beside the user you\n want to remove, as in the picture below.\n

\n
\n \"Remove\n
\n

\n Once the name in the list is gone, so are their privileges.\n

\n\n

Hide a queue

\n

\n Hiding a queue means both purging and hiding the queue.\n This can be used for example when there will be no labs in a queue for a longer time.\n

\n

\n To hide a queue, go to the Administration page.\n Then go into the Select queue dropdown as you would adding\n a teacher or assistant, and click the Hide queue button that shows up upon selecting a queue.\n Confirm in the popup that appears.\n

\n

\n When you want to show the queue again, follow the same procedure and click the Reveal queue button\n which is now shown instead of the Hide queue button.\n

\n\n

Removing a queue

\n

\n Removing a queue means removing it from the system.\n There is no reversing this action and all privileges will be removed along with the queue.\n

\n

\n To remove a queue, go to the Administration page.\n Then go into the Select queue dropdown as you would adding\n a teacher or assistant, and click the Remove queue button that shows up upon selecting a queue.\n Confirm in the popup that appears.\n

\n

\n \n Note: If you wish to regain a removed queue, you will have to contact an administrator.\n \n

\n\n

Statistics

\n

\n Stay A While allows the teacher to access some information about how a queue has been used.\n

\n

\n To access the statistics, first go to the Statistics page.\n Then go into the Select queue dropdown, and select the desired queue.\n Then enter a starting point and an end point.\n Once the desired time-period has been entered click, the Get statistics button and the information\n should be shown below.\n

\n
\n : null\n );\n};\n","export default \"data:image/png;base64,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\"","import React from 'react';\nimport { useSelector } from 'react-redux'\nimport { HashLink as Link } from 'react-router-hash-link';\nimport { GlobalStore } from '../../../store';\nimport User from '../../../models/User';\n\nexport default (): JSX.Element | null => {\n\n const user = useSelector(store => store.user);\n\n return (\n user?.isAdministrator || user?.isTeacher() || user?.isAssistant()\n ?
\n

Assistants

\n\n

\n Queue assistants help with moderating specific queues.\n In addition to removing specific users,\n they are also able to lock and purge queues, as well as sending messages and interact\n with the users in the queue.\n

\n

\n \n Note: All the assistants privileges are located in the queue.\n You get there by choosing the right queue from the list of queues.\n \n

\n\n

Kicking a user

\n

\n To remove a queue position, first double-click the user you wish to remove and thereafter click the appering red\n button with a cross on it.\n Be careful when removing users from the queue, as this action can not be reverted.\n

\n

\n \n Note: If you are accessing the service through a recognized smartphone device, you will only have to click once\n to show the option to kick a user.\n \n

\n\n

Message a user

\n

\n In order to send a message to a certain user in the queue, access the options as you would kicking a\n user, and click the blue button with an envelope on it.\n Enter a message in the window that opens up and click Send.\n

\n

\n To send a message to everyone in the queue, see broadcast.\n

\n\n

Help a user

\n

\n By helping a user, you mark them using the blue button with a checkmark accessed in the same way as you would access the\n button to kick someone.\n When a user is receiving help, their row will have a green background, notifing any other assistant that they can move to the next person\n in the queue.\n

\n\n

Bad location

\n

\n If an assistant is unable to find a given user because they have entered a location that is not precise enough, the\n assistant has the option to mark the user for Bad location.\n Marking a user for bad location is done by clicking the yellow button with a question-mark on it.\n The button is found at the same place as the one used to kick a user.\n

\n

\n The user will then receive a message prompting them to edit their location.\n The user will then have a red color until they have edited their location.\n

\n\n

Broadcast

\n

\n If you want every user in the queue to know something you can user the ability to broadcast information.\n

\n

\n Below the option to join the queue assistants will find a dropdown with administrative options.\n The first one being Broadcast.\n

\n

\n Broadcasting is done by clicking the dropdown with administrative options and clicking Broadcast, this will\n open a window prompting the user to enter a message to broadcast.\n Once the message is entered, click the Broadcast button to send it.\n

\n

\n \n Note: By using this function, everyone in the room will see the message.\n If you only want the assistants and teachers to see the message, use Broadcast faculty\n as described below.\n \n

\n\n

Broadcast faculty

\n

\n If you want every assistant and teacher in the given room you can user the ability to broadcast information to faculty.\n

\n

\n Broadcasting to faculty is done by clicking the dropdown with administrative options\n and clicking Broadcast faculty, this will open a window prompting the user to enter a message to broadcast.\n Once the message is entered, click the Broadcast button to send it.\n

\n

\n \n Note: By using this function, only assistants and teachers can see the message.\n If you want everyone in the queue to see the message, use Broadcast as described above.\n \n

\n\n

Purge a queue

\n

\n When a queue is being purged, all people in the queue will be removed.\n Be careful though, as this action can not be reverted.\n

\n

\n To purge a queue, start off by clicking the dropdown with administrative options\n and then clicking the Purge queue button.\n Confirm in the popup that appears.\n

\n\n

Lock a queue

\n

\n When a queue is locked, users can see the queue but not join it.\n When locking a queue, users already\n in the queue will not be removed.\n

\n

\n To lock a queue start off by clicking the dropdown with administrative options\n and clicking Lock queue.\n Confirm in the popup that appears.\n

\n

\n To unlock a queue, perform the same procedure as above, but instead of choosing Lock, you choose Unlock.\n

\n\n

Set MOTD

\n

\n MOTD stands for Message Of The Day.\n If you want users to know something once they enter the room, you can set an MOTD.\n The MOTD will be shown to every user once they enter the room and may i.e.\n be used to let them know that you only accept presentations today.\n

\n

\n The MOTD may be set by entering the queue page and clicking the dropdown with\n administrative options and clicking Set MOTD. This will open a\n window prompting the user to enter a message, as well as showing the current\n MOTD if there is one. Once the message is entered, click the Set MOTD button to save it.\n

\n

\n In order to remove the MOTD, follow the same procedure, but click Remove MOTD on the window that opens up.\n

\n

\n \n Note: If you want the user to see the information for a longer amount of time,\n use Set queue info described below.\n \n

\n\n

Set queue info

\n

\n Information that you wish to show the user continuously should be entered as queue info.\n The queue info is shown on the top of the screen on the queue page if there is one,\n and can only be removed by a teacher.\n

\n

\n You set the queue info by clicking the dropdown with administrative options\n and clicking Set queue info, this will open a window prompting the user to enter some information.\n Once the message is entered, click the Set info button to save it.\n

\n

\n In order to remove the info, follow the same procedure, but click Remove info on the window that opens up.\n

\n

\n \n Note: If you only want the user to see the info once, when they enter the room, try\n using MOTD instead.\n \n

\n
\n : null\n );\n};\n","import React from 'react';\nimport { useSelector } from 'react-redux'\nimport { HashLink as Link } from 'react-router-hash-link';\nimport { GlobalStore } from '../../../store';\nimport User from '../../../models/User';\nimport Location from '../../../img/location.png';\nimport EnterQueue from '../../../img/enter-queue.png';\nimport { Lock, Star } from '../../../viewcomponents/FontAwesome';\n\nexport default (): JSX.Element | null => {\n\n const user = useSelector(store => store.user);\n\n return (\n user\n ?
\n

Users

\n\n

Join a queue

\n

\n To join a queue, you will first need to find the queue (see Find a queue).\n When you have found the queue, let's say you want to join the queue Inda,\n click the queue name.\n

\n
\n \"Enter\n
\n

\n You now reach the queue page, where all the queueing takes place.\n If you are at a KTH computer, your\n location will be automatically filled in for you.\n

\n
\n \"Your\n
\n

\n If your location is not automatically filled in, please type your location in the location field.\n

\n

\n Now click the Join queue button, and you are done!\n

\n\n

Leave a queue

\n

\n To leave a queue, you must first join a queue.\n If you haven't joined the queue you want to leave,\n we recommend you to not join that queue.\n If you have already joined the queue you want to leave,\n go to the main page of the queue and click the Leave queue button.\n

\n\n

Receiving help

\n

\n Once you have joined a queue, you will notice that you are rewarded with a green\n button saying Receiving help, this button should be used if you are receiving help from an assistant\n who forgot to personally mark you as receiving help.\n If this is the case, click the button to prevent more assistants to come to you while you are receiving help.\n

\n\n

Colors

\n

\n When a person is standing in the queue, they may have different colored backgrounds, here are their respective description.\n

\n

White and Gray

\n

\n White and gray backgrounds indicates that the person is merely standing in the queue and the different colors are\n only used to make it easier to distinguish between the different rows.\n

\n

Golden

\n

\n If a preson has a golden star next to their name, that means that person is you.\n

\n

Green

\n

\n When a person has a green background color, that means there is currently an assistant at the person, whom is either helping or grading them.\n

\n

Red

\n

\n When a person has a red background color, that means an assistant has notified the person that they have to\n update their location since the assistant can't find them.\n

\n\n

Queue status

\n

\n The queues in Stay A While can have different statuses, which can be good to know.\n The statuses are indicated by the color and style of the queue name.\n

\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
StyleIconDescription
Active queueThe queue is active and can be joined
Locked queueThe queue is locked and can't be joined
\n\n

Find a queue

\n

\n The first step to queueing would be to find the queue you wish to join, right? So how is that done?\n Well, first go to the Queues page.\n There you can either scroll to find the queue\n you are searching for, or you could search for the queue.\n To scroll, just scroll - more info on\n scrolling will not be covered in this help section.\n\n To search for a queue, type the queue name (or parts of the queue name) in the search box at the top of the page.\n

\n\n

Banners

\n

\n Although Stay A While is a flawless system, once in a blue moon, an administrator may want to inform the users of upcoming or current issues and changes.\n If that were to ever happen, an alert box will be displayed at the bottom of the user's screen.\n Feel free to discard the message after reading it thoroughly several times over.\n

\n
\n : null\n );\n};\n","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","import React from 'react';\nimport { useSelector } from 'react-redux'\nimport { Link } from 'react-router-dom';\nimport { GlobalStore } from '../../../store';\nimport User from '../../../models/User';\n\nexport default (): JSX.Element | null => {\n\n const user = useSelector(store => store.user);\n\n return (\n !user\n ?
\n

Guests

\n

\n You are not logged in.\n

\n\n

\n If you only want to view a queue, that's cool,\n but to be able to join a queue, you will need to localStorage.setItem('LastVisitedUrl', window.location.pathname)}>log in.\n

\n\n

Viewing a queue

\n

\n If you don't want to log in, you can enter and check out any queue over at\n the home page to see the virtual line of eagerly waiting people.\n

\n
\n : null\n );\n};\n","import React, { useEffect } from 'react';\nimport { useDispatch } from 'react-redux'\nimport { resetTitle } from '../../actions/titleActions';\nimport AdministratorHelp from './Administrators';\nimport TeacherHelp from './Teachers';\nimport AssistantHelp from './Assistants';\nimport UserHelp from './Users';\nimport GuestHelp from './Guests';\n\nexport default (): JSX.Element => {\n\n const dispatch = useDispatch();\n useEffect(() => {\n if (!dispatch) {\n return;\n }\n\n dispatch(resetTitle());\n }, [dispatch]);\n\n return (\n
\n \t

Help and FAQ

\n \t

Have further questions or wish to create new queues? Contact: robertwb@kth.se

\n\n \n \n \n \n \n\n
\n)};\n","export function downloadFile(fileName: string, fileContent: string): void {\n\n function fakeClick(obj: any): void {\n const ev = document.createEvent(\"MouseEvents\");\n ev.initMouseEvent(\n \"click\",\n true,\n false,\n window,\n 0,\n 0,\n 0,\n 0,\n 0,\n false,\n false,\n false,\n false,\n 0,\n null\n );\n obj.dispatchEvent(ev);\n }\n\n function exportRaw(name: string, data: string): void {\n let urlObject = window.URL || window.webkitURL || window;\n let export_blob = new Blob([data]);\n\n if ('msSaveBlob' in navigator) {\n // Prefer msSaveBlob if available - Edge supports a[download] but\n // ignores the filename provided, using the blob UUID instead.\n // msSaveBlob will respect the provided filename\n navigator.msSaveBlob(export_blob, name);\n } else if ('download' in HTMLAnchorElement.prototype) {\n const saveLink = document.createElementNS(\n \"http://www.w3.org/1999/xhtml\",\n \"a\"\n ) as HTMLAnchorElement;\n saveLink.href = urlObject.createObjectURL(export_blob);\n saveLink.download = name;\n fakeClick(saveLink);\n } else {\n throw new Error(\"Neither a[download] nor msSaveBlob is available\");\n }\n }\n exportRaw(fileName, fileContent);\n }\n\nexport function copyToClipboard(content: string): void {\n const element = document.createElement('textarea');\n element.value = content;\n element.setAttribute('readonly', '');\n element.style.position = 'absolute';\n element.style.left = '-9999px';\n document.body.appendChild(element);\n element.select();\n document.execCommand('copy');\n document.body.removeChild(element);\n}\n\nexport function addFlashCard(message: string): void {\n\n const body = document.querySelector('body');\n if (body === null) {\n return;\n }\n\n const flashCard = document.createElement(\"div\");\n flashCard.className = \"flash-card\";\n flashCard.appendChild(document.createTextNode(message));\n\n body.appendChild(flashCard);\n flashCard.addEventListener('webkitAnimationEnd', () => {\n body.removeChild(flashCard);\n }, false);\n}\n","import React from 'react';\n\nexport default (props: any): JSX.Element | null => {\n\n const errorMessage = props.message;\n\n return (\n errorMessage\n ?
\n
\n {errorMessage}\n
\n
\n : null\n );\n};\n","import React from 'react';\nimport { Chart } from \"react-google-charts\";\n\nexport default (props: any): JSX.Element | null => {\n\n const header = [\n { type: 'date', label: 'Time' },\n 'Total',\n 'Help',\n 'Presentations'\n ];\n\n function formatData(): any[] {\n const result = props.data.map((item: any) => [\n new Date(Date.parse(item.time)),\n item.help_amount + item.present_amount,\n item.help_amount,\n item.present_amount\n ]);\n\n return result;\n }\n\n return (\n props.data\n ? Loading Chart}\n data={[\n header,\n ...formatData()\n ]}\n options={{\n hAxis: { title: 'Time', },\n vAxis: { title: 'Popularity', },\n series: { 1: { curveType: 'function' }, },\n }}\n rootProps={{ 'data-testid': '2' }} />\n : null\n );\n};\n","import React, { useState, useEffect } from 'react';\nimport { useSelector, useDispatch } from 'react-redux'\nimport axios from 'axios'\nimport moment from 'moment'\nimport DateTimePicker from 'react-datetime';\nimport { GlobalStore } from '../../store';\nimport { loadQueues } from '../../actions/queueActions';\nimport { resetTitle } from '../../actions/titleActions';\nimport { downloadFile, copyToClipboard, addFlashCard } from '../../utils/UtilityFunctions';\nimport PageNotFound from '../NoMatch';\nimport ErrorMessage from '../../viewcomponents/ErrorMessage';\nimport LineChart from '../../viewcomponents/LineChart';\nimport User from '../../models/User';\nimport { Copy, Download } from '../../viewcomponents/FontAwesome';\nimport { HTTP_SERVER_URL } from '../../configuration';\n\nexport default (): JSX.Element => {\n\n const user = useSelector(store => store.user);\n const queues = useSelector(store => store.queues.queueList.map(q => q.name))\n .sort((queue1, queue2) => queue1.toLowerCase() < queue2.toLowerCase() ? -1 : 1);\n\n const [statistics, setStatistics] = useState('');\n const [errorMessage, setErrorMessage] = useState('');\n const nintyDaysAgo = new Date();\n nintyDaysAgo.setDate(nintyDaysAgo.getDate() - 90);\n const [from, setFrom] = useState(Math.round(nintyDaysAgo.getTime() / 1000) as number | null);\n const [until, setUntil] = useState(Math.round(new Date().getTime() / 1000) as number | null);\n const [selectedQueue, setSelectedQueue] = useState(null as string | null);\n\n const dispatch = useDispatch();\n\n useEffect(() => {\n if (!dispatch) {\n return;\n }\n\n dispatch(loadQueues());\n dispatch(resetTitle());\n }, [dispatch]);\n\n function updateFrom(value: moment.Moment | string): void {\n try {\n const unix = (value as moment.Moment).unix();\n setFrom(unix);\n if (until !== null && unix > until) {\n setErrorMessage('From-date must be before until-date');\n }\n else {\n setErrorMessage('');\n }\n }\n catch {\n setFrom(null);\n }\n }\n\n function updateUntil(value: moment.Moment | string) {\n try {\n const unix = (value as moment.Moment).unix();\n setUntil(unix);\n if (from !== null && unix < from) {\n setErrorMessage('From-date must be before until-date');\n }\n else {\n setErrorMessage('');\n }\n }\n catch {\n setUntil(null);\n }\n }\n\n function isValidFromDate(time: moment.Moment): boolean {\n return (\n time.isAfter(moment().subtract(5, 'year'))\n && (until === null || time.isBefore(moment.unix(until as number)))\n && time.isBefore(moment())\n );\n }\n\n function isValidUntilDate(time: moment.Moment): boolean {\n return (\n time.isAfter(moment().subtract(5, 'year'))\n && (from === null || time.isAfter(moment.unix(from as number)))\n && time.isBefore(moment())\n );\n }\n\n function getStatistics() {\n if (user === null || selectedQueue === null || !(user.isAdministrator || user.isTeacherIn(selectedQueue))) {\n return;\n }\n\n if (errorMessage) {\n return;\n }\n\n axios.get(`${HTTP_SERVER_URL}/api/queues/${selectedQueue}/user_events${from !== null || until !== null ? '?' : ''}${from !== null ? `from=${from}` : ''}${until !== null ? `${from !== null && until !== null ? '&' : ''}until=${until}` : ''}`, {\n headers: { 'Authorization': `Token ${user.token}` }\n })\n .then(response => setStatistics(JSON.stringify(response.data, null, 2)))\n .catch(response => setStatistics(response.toString()));\n }\n\n function getHelpNumber() {\n return JSON.parse(statistics)\n .filter((entry: any) => entry.left_queue === true)\n .reduce((peopleHelped: number, entry: any) => entry.help === true ? peopleHelped + 1 : peopleHelped, 0) || 0;\n }\n\n function getPresentationNumber() {\n return JSON.parse(statistics)\n .filter((entry: any) => entry.left_queue === true)\n .reduce((peopleHelped: number, entry: any) => entry.help === false ? peopleHelped + 1 : peopleHelped, 0) || 0;\n }\n\n function getRemainingQueueLength() {\n const statisticsList = JSON.parse(statistics);\n\n if (statisticsList.length === 0) {\n return 0;\n }\n\n return statisticsList[statisticsList.length - 1].queue_length;\n }\n\n return (\n user === null\n ? \n :
\n \n\n
\n
\n \n {selectedQueue || 'Select a queue'}\n \n
\n {\n user?.isAdministrator\n ? queues.map(queueName =>\n setSelectedQueue(queueName)} >\n {queueName}\n \n )\n : user?.teacherIn.map(queueName =>\n setSelectedQueue(queueName)} >\n {queueName}\n \n )\n }\n
\n
\n
\n\n
\n updateFrom(value)} />\n updateUntil(value)} />\n
\n\n
\n
Get statistics
\n
\n\n {\n statistics\n ? JSON.parse(statistics).length === 0\n ?
\n

Nothing happened in the queue {selectedQueue} during the selected time period

\n
\n : <>\n
\n \n
\n
\n
\n
\n                        \n                          {statistics}\n                        \n                      
\n
\n {copyToClipboard(statistics); addFlashCard('Copied to clipboard')}}\n title='Copy to clipboard'>\n \n
\n downloadFile(`${selectedQueue}-statistics.json`, statistics)}\n title='Download'>\n \n
\n
\n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
DescriptionStatistics
Number of people helped{getHelpNumber()}
Number of presentations{getPresentationNumber()}
Number of people left in the queue{getRemainingQueueLength()}
\n
\n \n\n \n : null\n }\n \n );\n};\n","import React, { useEffect } from 'react';\nimport { Redirect } from \"react-router-dom\";\nimport { useSelector, useDispatch } from 'react-redux'\nimport { GlobalStore } from '../../store';\nimport { login } from '../../actions/userActions';\nimport { resetTitle } from '../../actions/titleActions';\nimport User from \"../../models/User\";\n\nexport default (): JSX.Element => {\n\n const user = useSelector(store => store.user);\n\n const dispatch = useDispatch();\n useEffect(() => {\n if (!dispatch) {\n return;\n }\n\n dispatch(resetTitle());\n }, [dispatch]);\n\n function runCallback(event: any): void {\n const input = document.querySelector('#loginField') as HTMLInputElement;\n const username: string = input?.value || '';\n if (username !== '') {\n if (event.key === 'Enter' || event.button === 0) {\n dispatch(login(username));\n }\n }\n }\n\n return (\n user !== null\n ? \n :
\n
\n
\n \n
\n \n Login\n
\n
\n \n );\n};\n","import React, { useEffect } from 'react';\nimport { Redirect } from \"react-router-dom\";\nimport { useDispatch } from 'react-redux'\nimport { logout } from '../../actions/userActions';\nimport { resetTitle } from '../../actions/titleActions';\n\nexport default (): JSX.Element => {\n\n const dispatch = useDispatch();\n useEffect(() => {\n if (!dispatch) {\n return;\n }\n\n dispatch(resetTitle());\n dispatch(logout());\n }, [dispatch]);\n\n return (\n \n );\n};\n","import React from 'react';\nimport { useSelector, useDispatch } from 'react-redux'\nimport { GlobalStore } from '../../../store';\nimport { openUpdateBannerModal } from '../../../actions/modalActions';\nimport Banner from '../../../models/Banner';\nimport { Pen } from '../../../viewcomponents/FontAwesome';\n\nexport default (): JSX.Element | null => {\n\n const banners = useSelector(store => store.banners.banners);\n\n const dispatch = useDispatch();\n\n function getTimestamp(ms: number) {\n const date = new Date(ms);\n const pad = (n: any, s = 2) => (`${new Array(s).fill(0)}${n}`).slice(-s);\n return `${pad(date.getFullYear(),4)}-${pad(date.getMonth()+1)}-${pad(date.getDate())} ${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())}`;\n }\n\n return (\n banners.filter(banner => banner.startTime !== banner.endTime).length\n ?
\n \n \n \n \n \n \n \n \n \n {\n banners.filter(banner => banner.startTime !== banner.endTime).map((banner: Banner) =>\n \n \n \n \n )\n }\n \n
MessageShown between
{ banner.message }{ getTimestamp(banner.startTime) } and { getTimestamp(banner.endTime) }\n dispatch(openUpdateBannerModal(banner.id))} />\n
\n
\n : null\n );\n};\n","import React from 'react';\nimport { useSelector, useDispatch } from 'react-redux'\nimport { GlobalStore } from '../../../store';\nimport { Link } from 'react-router-dom';\nimport { openSetServerMessageModal, openAddBannerModal } from '../../../actions/modalActions';\nimport User from '../../../models/User';\nimport Banner from '../../../models/Banner';\nimport BannerList from './BannerList';\n\nexport default function AdministrationInformationViewComponent() {\n\n const user = useSelector(store => store.user);\n const banners = useSelector(store => store.banners.banners);\n\n const dispatch = useDispatch();\n\n function displayMotd() {\n dispatch(openSetServerMessageModal());\n }\n\n function displayBanner() {\n dispatch(openAddBannerModal());\n }\n\n return (\n user === null || (!user.isAdministrator && !user.isTeacher())\n ? null\n : <>\n
\n

Administration

\n
\n
\n

Please be careful on this page. Here, you have the power to change everything.

\n
\n {\n !user.isAdministrator\n ? null\n : <>\n
\n \n Send server-message\n \n \n Add new information banner\n \n
\n {\n banners.filter(banner => banner.startTime !== banner.endTime).length === 0\n ? null\n :
\n
\n

Currently active banners ?

\n
\n \n
\n }\n \n }\n \n );\n}\n","import React, { useState } from 'react';\nimport { Plus } from './FontAwesome';\n\nexport default (props: any): JSX.Element => {\n\n const [content, setContent] = useState('');\n const [placeholder, setPlaceholder] = useState(props.placeholder as string);\n\n const callback: (...args: [any]) => any = props.callback;\n const isDisabled: boolean = props.isDisabled;\n\n function changeContent(event: any): void {\n if (!isDisabled) {\n setContent(event.target.value);\n }\n }\n\n function runCallback(event: any): void {\n if (!isDisabled) {\n if (content !== '') {\n if (event.key === 'Enter' || event.button === 0) {\n callback(content);\n setContent('')\n }\n }\n }\n }\n\n return (\n
\n {setPlaceholder('')}}\n onBlur={() => {if (content === '') setPlaceholder(props.placeholder)}}\n disabled={isDisabled} />\n\n
\n\n \n\n \n Add\n\n \n
\n\t\t
\n );\n};\n","import React from 'react';\nimport { useSelector, useDispatch } from 'react-redux'\nimport { GlobalStore } from '../../../store';\nimport { addAdministrator } from '../../../actions/administratorActions';\nimport User from '../../../models/User';\nimport AddInputViewComponent from '../../../viewcomponents/AddInput';\n\nexport default (): JSX.Element | null => {\n\n const user = useSelector(store => store.user);\n\n const dispatch = useDispatch();\n\n return (\n user === null || !user.isAdministrator\n ? null\n : <>\n

Insert the new administrator's username

\n
\n dispatch(addAdministrator(newAdministrator))}\n placeholder=\"Add admin\" />\n
\n
\n \n\n );\n};\n","import React from 'react';\nimport { useSelector, useDispatch } from 'react-redux'\nimport { GlobalStore } from '../../../store';\nimport { removeAdministrator } from '../../../actions/administratorActions';\nimport Administrator from '../../../models/Administrator';\nimport { Cross } from '../../../viewcomponents/FontAwesome';\n\nexport default (): JSX.Element => {\n\n const administrators = useSelector(store => store.administration.administrators);\n\n const dispatch = useDispatch();\n\n return (\n administrators.length\n ?
\n \n \n \n \n \n \n \n \n {\n administrators.map((administrator: Administrator) =>\n \n \n \n )\n }\n \n
NameUsername
{ administrator.realname }\n {\n administrators.length <= 1\n ? administrator.username\n : <>\n {administrator.username} dispatch(removeAdministrator(administrator.username))} />\n \n }\n
\n
\n :
\n (No admins, you are totally screwed now ... ;) )\n
\n );\n};\n","import React from 'react';\nimport { useSelector } from 'react-redux'\nimport { GlobalStore } from '../../../store';\nimport User from '../../../models/User';\nimport AddAdminViewModel from './AddAdmin';\nimport AdministrationListViewComponent from './AdministratorList';\n\nexport default (): JSX.Element | null => {\n\n const user = useSelector(store => store.user);\n\n return (\n user === null || !user.isAdministrator\n ? null\n : <>\n
\n \n
\n
\n
Administrators
\n
\n
\n \n
\n
\n \n );\n};\n","import React from 'react';\nimport { useSelector, useDispatch } from 'react-redux'\nimport { GlobalStore } from '../../../store';\nimport { addQueue } from '../../../actions/administratorActions';\nimport User from '../../../models/User';\nimport AddInputViewComponent from '../../../viewcomponents/AddInput';\n\nexport default (): JSX.Element | null => {\n\n const user = useSelector(store => store.user);\n\n const dispatch = useDispatch();\n\n return (\n user === null || !user.isAdministrator\n ? null\n : <>\n

Insert the name of the new queue

\n
\n dispatch(addQueue(queueName))}\n placeholder=\"Add queue\" />\n
\n
\n \n\n );\n};\n","import React from 'react';\nimport { useSelector } from 'react-redux'\nimport { GlobalStore } from '../../../store';\nimport Queue from '../../../models/Queue';\n\nexport default (): JSX.Element => {\n\n const queues = useSelector(store => store.queues.queueList)\n .sort((queue1: Queue, queue2: Queue) => queue1.name < queue2.name ? -1 : 1);\n\n return (\n queues.length\n ?
\n \n \n \n \n \n \n \n {\n queues.map(queue =>\n \n \n )\n }\n \n
Name
{ queue.name }
\n
\n :
\n (No queues, you might as well add some now ... o_o )\n
\n );\n};\n","import React from 'react';\nimport { useSelector } from 'react-redux'\nimport { GlobalStore } from '../../../store';\nimport User from '../../../models/User';\nimport AddQueueViewModel from './AddQueue';\nimport QueueListViewComponent from './QueueList';\n\nexport default (): JSX.Element | null => {\n\n const user = useSelector(store => store.user);\n\n return (\n user === null || (!user.isAdministrator && !user.isTeacher())\n ? null\n : <>\n
\n \n
\n
\n
Queues
\n
\n
\n \n
\n
\n \n );\n};\n","import React from 'react';\nimport { useSelector, useDispatch } from 'react-redux'\nimport { GlobalStore } from '../../../../store';\nimport { addTeacher } from '../../../../actions/administratorActions';\nimport User from '../../../../models/User';\nimport Queue from '../../../../models/Queue';\nimport AddInputViewComponent from '../../../../viewcomponents/AddInput';\n\nexport default (props: any): JSX.Element | null => {\n\n const queue: Queue = props.queue;\n const user = useSelector(store => store.user);\n\n const dispatch = useDispatch();\n\n return (\n user === null || queue === undefined || (!user.isAdministrator && !user.isTeacherIn(queue.name))\n ? null\n : <>\n

Insert the new teacher's username

\n
\n dispatch(addTeacher(queue.name, username))}\n placeholder=\"Add teacher\"\n isDisabled={queue === null} />\n
\n
\n \n\n );\n};\n","import React from 'react';\nimport { useDispatch } from 'react-redux'\nimport { removeTeacher } from '../../../../actions/administratorActions';\nimport Queue from '../../../../models/Queue';\nimport Teacher from '../../../../models/Teacher';\nimport { Cross } from '../../../../viewcomponents/FontAwesome';\n\nexport default (props: any): JSX.Element => {\n\n const queue: Queue = props.queue;\n\n const dispatch = useDispatch();\n\n return (\n queue.teachers.length\n ? <>\n \n \n \n \n \n \n \n \n {\n queue.teachers.map((teacher: Teacher) =>\n \n \n \n )\n }\n \n
NameUsername
{ teacher.realname }\n { teacher.username } dispatch(removeTeacher(queue.name, teacher.username))} />\n
\n \n : \n Well... Someone's got to teach, right?\n \n );\n};\n","import React from 'react';\nimport { Link } from \"react-router-dom\";\nimport Queue from '../../../../models/Queue';\nimport AddTeacherViewComponent from './AddTeacher';\nimport TeacherListViewComponent from './TeacherList';\n\nexport default (props: any): JSX.Element => {\n\n const queue: Queue = props.queue;\n\n return (\n <>\n
\n

Teachers of Stay A While ?

\n
\n
\n \n
\n
\n
\n \n
\n
\n \n );\n};\n","import React from 'react';\nimport { useSelector, useDispatch } from 'react-redux'\nimport { GlobalStore } from '../../../../store';\nimport { addAssistant } from '../../../../actions/administratorActions';\nimport User from '../../../../models/User';\nimport Queue from '../../../../models/Queue';\nimport AddInputViewComponent from '../../../../viewcomponents/AddInput';\n\nexport default (props: any): JSX.Element | null => {\n\n const queue: Queue = props.queue;\n const user = useSelector(store => store.user);\n\n const dispatch = useDispatch();\n\n return (\n user === null || queue === undefined || (!user.isAdministrator && !user.isTeacherIn(queue.name))\n ? null\n : <>\n

Insert the new assistant's username

\n
\n dispatch(addAssistant(queue.name, username))}\n placeholder=\"Add assistant\"\n isDisabled={queue === null} />\n
\n
\n \n\n );\n};\n","import React from 'react';\nimport { useDispatch } from 'react-redux'\nimport { removeAssistant } from '../../../../actions/administratorActions';\nimport Queue from '../../../../models/Queue';\nimport Assistant from '../../../../models/Assistant';\nimport { Cross } from '../../../../viewcomponents/FontAwesome';\n\nexport default (props: any): JSX.Element => {\n\n const queue: Queue = props.queue;\n\n const dispatch = useDispatch();\n\n return (\n queue.assistants.length\n ? <>\n \n \n \n \n \n \n \n \n {\n queue.assistants.map((assistant: Assistant) =>\n \n \n \n )\n }\n \n
NameUsername
{ assistant.realname }\n { assistant.username } dispatch(removeAssistant(queue.name, assistant.username))} />\n
\n \n : \n No assistants?\n
\n You must have plenty of time for your students ^.^\n
\n );\n};\n","import React from 'react';\nimport { Link } from \"react-router-dom\";\nimport Queue from '../../../../models/Queue';\nimport AddAssistantViewComponent from './AddAssistant';\nimport AssistantListViewComponent from './AssistantList';\n\nexport default (props: any): JSX.Element => {\n\n const queue: Queue = props.queue;\n\n return (\n <>\n
\n

Assistants of Stay A While ?

\n

New assistants will have to log out and in again in order to get all of their new privileges.

\n
\n
\n \n
\n
\n
\n \n
\n
\n \n );\n};\n","import React, { useState, useEffect } from 'react';\nimport { useSelector, useDispatch } from 'react-redux'\nimport { GlobalStore } from '../../../store';\nimport { loadAdditionalQueueData } from '../../../actions/administratorActions';\nimport { openShowQueueModal, openHideQueueModal, openDeleteQueueModal, openRenameQueueModal } from '../../../actions/modalActions';\nimport User from '../../../models/User';\nimport Queue from '../../../models/Queue';\nimport TeachersViewComponent from './Teachers/Teachers';\nimport AssistantsViewComponent from './Assistants/Assistants';\n\nexport default (): JSX.Element | null => {\n\n const user = useSelector(store => store.user);\n const queues = useSelector(store => store.queues.queueList)\n .sort((queue1: Queue, queue2: Queue) => queue1.name < queue2.name ? -1 : 1);\n\n const [selectedQueue, setSelectedQueue] = useState(null as Queue | null);\n const [selectedQueueName, setSelectedQueueName] = useState(null as string | null);\n\n function selectQueue(queueName: string): void {\n if (user !== null) {\n setSelectedQueue(queues.filter(q => q.name === queueName)[0] || null);\n setSelectedQueueName(queueName);\n dispatch(loadAdditionalQueueData(queueName, user.token));\n }\n }\n\n useEffect(() => {\n if (selectedQueueName !== null) {\n setSelectedQueue(queues.filter(q => q.name === selectedQueueName)[0] || null);\n }\n }, [queues, selectedQueueName]);\n\n const dispatch = useDispatch();\n\n return (\n queues.length === 0 || user === null\n ? null\n : <>\n
\n

Edit queue

\n

Choose which queue you wish to edit

\n
\n \n {selectedQueue?.name || 'Select a queue'}\n \n
\n {\n user.isAdministrator\n ? queues.map(queue =>\n selectQueue(queue.name)} >\n {queue.name}\n \n )\n : user.teacherIn.map(queueName =>\n selectQueue(queueName)} >\n {queueName}\n \n )\n\n }\n
\n
\n
\n {\n selectedQueue === null\n ? null\n : <>\n
\n {\n selectedQueue.hiding\n ? dispatch(openShowQueueModal(selectedQueue.name))}>\n Reveal queue\n \n : dispatch(openHideQueueModal(selectedQueue.name))}>\n Hide queue\n \n }\n dispatch(openDeleteQueueModal(selectedQueue.name))}>\n Delete queue\n \n {\n user.isAdministrator\n ? dispatch(openRenameQueueModal(selectedQueue.name))}>\n Rename queue\n \n : null\n }\n
\n
\n
\n \n
\n
\n \n
\n
\n \n }\n \n );\n};\n","import React, { useEffect } from 'react';\nimport { Link } from 'react-router-dom';\nimport { useSelector, useDispatch } from 'react-redux'\nimport { GlobalStore } from '../../store';\nimport { loadAdministrators } from '../../actions/administratorActions';\nimport { enterAdminPage, leaveAdminPage } from '../../actions/pageActions';\nimport { resetTitle } from '../../actions/titleActions';\nimport User from '../../models/User';\nimport PageNotFound from '../NoMatch';\nimport AdministrationInformationViewComponent from './Administrators/AdministrationInformation';\nimport AdministratorsViewComponent from './Administrators/Administrators';\nimport QueuesViewComponent from './Queues/Queues';\nimport QueueOptionsViewComponent from './Queues/QueueOptions';\n\nexport default (): JSX.Element => {\n\n const user = useSelector(store => store.user);\n\n const dispatch = useDispatch();\n\n useEffect(() => {\n if (!dispatch) {\n return;\n }\n\n if (user && (user.isAdministrator || user.isTeacher())) {\n dispatch(enterAdminPage());\n dispatch(loadAdministrators(user?.token));\n dispatch(resetTitle());\n }\n\n return (() => {\n dispatch(leaveAdminPage());\n });\n }, [user, dispatch]);\n\n return (\n user === null || (!user.isAdministrator && !user.isTeacher())\n ? \n :
\n \n {\n user.isAdministrator\n ? <>\n \t\t
\n
\n

Administrators of Stay A While ?

\n
\n \t\t
\n \t\t \n \t\t
\n
\n

Queues of Stay A While

\n
\n \t\t
\n \t\t \n \t\t
\n \t\t
\n \t\t \n : null\n }\n \n
\n );\n};\n","import React from 'react';\nimport { useSelector, useDispatch } from 'react-redux'\nimport { GlobalStore } from '../store';\nimport { closeModal, removeModal } from '../actions/modalActions';\nimport ModalInformation from '../models/Modal';\nimport Broadcast, { ModalType as BroadcastModal } from './Modals/BroadcastModal';\nimport BroadcastFaculty, { ModalType as BroadcastFacultyModal } from './Modals/BroadcastFacultyModal';\nimport DeleteQueue, { ModalType as DeleteQueueModal } from './Modals/DeleteQueueModal';\nimport HideQueue, { ModalType as HideQueueModal } from './Modals/HideQueueModal';\nimport PurgeQueue, { ModalType as PurgeQueueModal } from './Modals/PurgeQueueModal';\nimport RenameQueue, { ModalType as RenameQueueModal } from './Modals/RenameQueueModal';\nimport SendBadLocation, { ModalType as SendBadLocationModal } from './Modals/SendBadLocationModal';\nimport SendMessage, { ModalType as SendMessageModal } from './Modals/SendMessageModal';\nimport ServerMessage, { ModalType as ServerMessageModal } from './Modals/ServerMessageModal';\nimport AddBanner, { ModalType as AddBannerModal } from './Modals/AddBannerModal';\nimport UpdateBanner, { ModalType as UpdateBannerModal } from './Modals/UpdateBannerModal';\nimport SetMotd, { ModalType as SetMotdModal } from './Modals/SetMotdModal';\nimport SetQueueInformation, { ModalType as SetQueueInformationModal } from './Modals/SetQueueInformationModal';\nimport ShowMessage, { ModalType as ShowMessageModal } from './Modals/ShowMessageModal';\nimport ShowMotd, { ModalType as ShowMotdModal } from './Modals/ShowMotdModal';\nimport ShowQueue, { ModalType as ShowQueueModal } from './Modals/ShowQueueModal';\n\nexport default (): JSX.Element => {\n\n const modals = useSelector(store => store.modals);\n\n const dispatch = useDispatch();\n\n function onHide(): void {\n dispatch(closeModal());\n setTimeout(() => dispatch(removeModal()), 1000);\n }\n\n function toJSX(modal: ModalInformation, isVisible: boolean): JSX.Element | null {\n const props = {\n ...modal.modalData,\n show: isVisible,\n onHide: isVisible ? () => onHide() : undefined\n };\n\n switch (modal.modalType) {\n\n case BroadcastModal: {\n return ();\n }\n\n case BroadcastFacultyModal: {\n return ();\n }\n\n case DeleteQueueModal: {\n return ();\n }\n\n case HideQueueModal: {\n return ();\n }\n\n case PurgeQueueModal: {\n return ();\n }\n\n case RenameQueueModal: {\n return ();\n }\n\n case SendBadLocationModal: {\n return ();\n }\n\n case SendMessageModal: {\n return ();\n }\n\n case ServerMessageModal: {\n return ();\n }\n\n case AddBannerModal: {\n return ();\n }\n\n case UpdateBannerModal: {\n return ();\n }\n\n case SetMotdModal: {\n return ();\n }\n\n case SetQueueInformationModal: {\n return ();\n }\n\n case ShowMessageModal: {\n return ();\n }\n\n case ShowMotdModal: {\n return ();\n }\n\n case ShowQueueModal: {\n return ();\n }\n\n }\n\n return null;\n }\n\n return (\n <>\n {\n modals.modalList.map((modal, index) =>\n
\n { toJSX(modal, index === modals.current) }\n
\n )\n }\n \n );\n};\n","import React, { useEffect } from 'react';\nimport { BrowserRouter as Router, Switch, Route } from \"react-router-dom\";\nimport { useSelector, useDispatch } from 'react-redux'\nimport { useAlert } from 'react-alert';\nimport { loadQueues } from './actions/queueActions';\nimport { showBanner, hideBanner, triggerBannerRedraw } from './actions/bannerActions';\nimport HomePage from './pages/Home';\nimport Queue from './pages/Queue';\nimport NavBar from './viewcomponents/NavBar';\nimport AboutPage from './pages/About';\nimport HelpPage from './pages/Help';\nimport StatisticsPage from './pages/Statistics';\nimport PageNotFound from './pages/NoMatch';\nimport LoginPage from './pages/MockLogin';\nimport LogoutPage from './pages/Logout';\nimport AdministrationPage from './pages/Administration';\nimport Modal from './viewcomponents/Modal';\nimport { GlobalStore } from './store';\nimport Banner from './models/Banner';\n\nexport default (): JSX.Element => {\n\n const alert = useAlert();\n const banners = useSelector(store => store.banners.banners);\n const bannerRedrawTrigger = useSelector(store => store.banners.redrawTrigger);\n\n const dispatch = useDispatch();\n dispatch(loadQueues());\n\n useEffect(() => {\n let nextBanner = -1;\n\n const seenBanners = JSON.parse(localStorage.getItem('SeenBanners') ?? '[]') as number[];\n for (let banner of banners) {\n if (banner.isShowing || banner.endTime < Date.now() || seenBanners.some(id => id === banner.id)) {\n continue;\n }\n\n if (banner.startTime > Date.now()) {\n nextBanner = nextBanner === -1 ? banner.startTime : Math.min(nextBanner, banner.startTime);\n continue;\n }\n\n console.log(JSON.stringify(banner));\n alert.show(banner.message,\n {\n onOpen: () => dispatch(showBanner(banner.id)),\n onClose: () => dispatch(hideBanner(banner.id))\n });\n }\n\n if (nextBanner !== -1) {\n const timeoutId = setTimeout(() => { dispatch(triggerBannerRedraw()); }, nextBanner - Date.now());\n return () => { clearTimeout(timeoutId) };\n }\n }, [banners, bannerRedrawTrigger]);\n\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n )\n};\n","import React from 'react'\nimport { useSelector } from 'react-redux'\nimport { Helmet } from 'react-helmet';\nimport { GlobalStore } from '../store';\n\nexport default (): JSX.Element => {\n\n const title = useSelector(store => store.title);\n\n return (\n \n { title }\n \n )\n};\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.0/8 are considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\ntype Config = {\n onSuccess?: (registration: ServiceWorkerRegistration) => void;\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\n};\n\nexport function register(config?: Config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(\n process.env.PUBLIC_URL,\n window.location.href\n );\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n // console.log(\n // 'This web app is being served cache-first by a service ' +\n // 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n // );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl: string, config?: Config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n // console.log(\n // 'New content is available and will be used when all ' +\n // 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n // );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n // console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n // console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl: string, config?: Config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl, {\n headers: { 'Service-Worker': 'script' }\n })\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n // console.log(\n // 'No internet connection found. App is running in offline mode.'\n // );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready\n .then(registration => {\n registration.unregister();\n })\n .catch(error => {\n // console.error(error.message);\n });\n }\n}\n","import React, { useEffect } from 'react';\nimport ReactDOM from 'react-dom';\nimport { Provider } from 'react-redux';\nimport { useDispatch } from 'react-redux'\nimport store from './store';\nimport App from './App';\nimport Helmet from './viewcomponents/Helmet';\nimport { positions, Provider as AlertProvider } from 'react-alert';\nimport AlertTemplate from 'react-alert-template-basic';\nimport * as serviceWorker from './serviceWorker';\nimport { loadQueues } from './actions/queueActions';\nimport { loadBanners } from './actions/bannerActions';\nimport { initialize } from './actions/globalActions';\nimport { loadUser } from './actions/userActions';\n\nconst alertOptions = {\n timeout: 0,\n position: positions.BOTTOM_CENTER\n};\n\nfunction LifeCycle() {\n const dispatch = useDispatch();\n\n useEffect(() => {\n if (!dispatch) {\n return;\n }\n\n dispatch(loadUser());\n dispatch(loadQueues());\n dispatch(loadBanners());\n dispatch(initialize());\n }, [dispatch]);\n\n return (\n \n );\n}\n\nReactDOM.render(\n \n \n \n \n \n \n \n ,\n document.getElementById('root')\n);\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\n"],"sourceRoot":""}