{"version":3,"sources":["services/date.js","store/visit.slice.js","services/geolocation.js","store/settings.slice.js","components/Markdown/index.js","components/HelpDrawer/index.js","pages/Question.js","services/visit.js","components/Menu/MenuDrawer.js","components/Menu/IDBadge.js","components/Modal/index.js","images/login-logo.png","pages/Login.js","components/Visit/PermissionModal.js","services/permissions.js","components/Visit/DeleteModal.js","components/Visit/ErrorModal.js","components/Visit/ResetModal.js","components/Visit/ContinueModal.js","components/Visit/CancelModal.js","components/Visit/VisitDisplay.js","pages/Visits.js","store/auth.slice.js","components/Permissions/index.js","components/AuthRoute/index.js","images/splashscreen.jpg","pages/LoadingSplash.js","pages/Steps.js","pages/404.js","pages/Categories.js","pages/FollowOnVisits.js","store/index.js","components/UpdateBar/index.js","pages/Debug.js","App.js","serviceWorkerRegistration.js","index.js","components/Meta/index.js","store/user.slice.js","components/Layout/LayoutTop.js","services/auth.js","components/Layout/LayoutBottom.js","components/Button/BackButton.js","components/Menu/Menu.js","services/axios.js","services/data.js","components/Answer/index.js","components/Question/MultipleChoiceMultipleAnswers.js","components/Question/CaptureIcon.js","components/Question/ImageQuestion.js","services/image.js","components/Question/MultipleChoiceOneAnswer.js","components/Question/FreeTextQuestion.js","components/Question/UnexpectedQuestion.js","components/Question/MoreVisits.js","components/Question/index.js"],"names":["dateToServerTimeString","dateObj","toISOString","initialState","visitSlice","createSlice","name","reducers","addVisit","state","action","visit","payload","id","data","answers","started","dateTime","lat","lng","serverConfirmed","finished","sealed","cancelled","reason","inFlight","errors","deleteVisit","setVisitStarted","visitId","e","console","error","setVisitStartedServerConfirmed","setAnswer","questionId","answer","type","setAnswerServerConfirmed","setVisitFinished","setVisitFinishedServerConfirmed","setVisitSealed","setVisitSealedServerConfirmed","setVisitCancelled","setVisitCancelledServerConfirmed","setVisitInFlight","addError","resetVisit","clearVisits","actions","selectVisits","selectCurrentVisit","createSelector","selectCurrentVisitId","visits","selectPreviousVisit","selectPreviousVisitId","previousVisitId","selectCurrentVisitData","selectPreviousVisitData","selectCurrentQuestions","questions","selectCurrentQuestion","selectCurrentQuestionId","currentQuestionId","find","question","selectCurrentLocation","questionCategories","location","selectPreviousLocation","selectCurrentVisitLocationId","selectPreviousVisitLocationId","selectVisitsInCurrentVisitLocation","currentVisitLocationId","currentVisitId","Object","keys","filter","sameLocation","notCurrentVisit","notExpired","isVisitExpired","map","selectCurrentStore","selectCurrentProduct","product","selectCurrentProdName","selectCurrentSKU","sku","selectCurrentAnswers","selectCurrentQuestionAnswer","selectIsCurrentVisitFinished","Boolean","selectPreviousAnswer","previousVisit","selectCategoryProgress","excludeFromCategoryList","category","questionsInCategory","completedQuestions","completedWithOutcome","some","Outcome","Intervention","steps","length","completed","withOutcome","selectIsCurrentCategoryComplete","selectCurrentCategory","progress","selectVisitType","visitType","selectCurrentCategoryData","selectIsCurrentCategoryExcluded","selectAutoPromptHelp","autoPromptHelp","selectHelpLink","helpLink","selectHelpText","helpText","selectHelpTitle","helpTitle","selectHelpVideoLink","helpVideoLink","selectIsQuestionOptional","allowNoInput","selectFinishedVisits","output","entries","forEach","isVisitCancelled","isVisitFinished","isVisitErrored","push","selectUnfinishedVisits","isVisitStarted","selectCancelledVisits","selectCurrentVisitErrors","getLatLng","Promise","resolve","reject","navigator","getPosition","then","position","coords","latitude","longitude","catch","geolocation","getCurrentPosition","settingsSlice","preferredCameraId","updateAvailable","branchInfo","lastUpdated","currentCategory","dismissedModals","permissionModalShown","setPreferredCameraId","setUpdateAvailable","setBranchInfo","setLastUpdated","Date","getTime","setCurrentVisitId","setPreviousVisitId","setCurrentQuestionId","setCurrentCategory","setModalDismissal","setPermissionModalShown","clearSettings","selectSlice","selectPreferredCameraId","slice","selectUpdateAvailable","selectVisitLastUpdated","selectDismissedModal","selectIsSelectedQuestionDismissedModal","selectPermissionModalShown","StyledMarkdown","styled","ReactMarkdown","Markdown","text","children","remarkPlugins","remarkGfm","Overlay","div","props","show","SwipeHandleWrap","SwipeHandle","DrawerContainer","deltaY","CloseWrap","ContentWrap","CloseButton","CloseIcon","theme","colours","purple","HelpTitle","h1","VideoPlayer","video","CheckboxStyling","span","white","Input","input","attrs","Label","label","MoreDetail","Button","HelpDrawer","setShow","useState","setDeltaY","containerRef","useRef","useEffect","swipeHandlers","useSwipeable","onSwiping","current","getBoundingClientRect","dir","dragDownToCloseDistance","height","onSwiped","trackMouse","autoPrompt","useSelector","link","title","videoLink","isModalDismissed","inputChecked","setInputChecked","dispatch","useDispatch","ref","onClick","className","width","controls","src","secondary","startIcon","checked","value","onChange","target","ShowHelpButton","QuestionHeading","QuestionAdditionalText","p","QuestionWrap","SubmitContainer","SubmitButton","Question","helpOpen","setHelpOpen","submitButtonDisabled","setSubmitButtonDisabled","history","useHistory","currentQuestion","previousVisitLocationId","visitsInCurrentLocation","previousAnswer","helplink","helptext","helptitle","isOptional","unstartedFollowOnVisits","currentAnswer","setCurrentAnswer","questionWrapRef","additionalText","questionType","metaData","canReuseAnswers","disabled","QUESTION_TYPES","freeText","freetext","choices","JSON","parse","handleSubmit","a","StartVisit","EndVisit","NextQuestion","BackToTasks","EndPreviousVisit","ShowFollowOnVisits","FollowOnVisitQuestion","endVisit","startVisit","postAnswer","Meta","LayoutTop","Menu","LayoutBottom","tertiary","handleChange","checkbox","setTimeout","scrollIntoView","block","behavior","photo","primary","fullWidth","isVisitComplete","memoized","isStarted","isVisitStartedConfirmed","isFinished","isVisitFinishedConfirmed","allQuestionsSynced","isVisitSealedConfirmed","isVisitInFlight","isVisitCancelledConfirmed","plannedEndDate","questionIds","every","attemptResync","startTime","startConfirmed","finishTime","finishConfirmed","sealedTime","sealedConfirmed","log","promises","allSettled","results","allFufilled","result","status","time","sealVisit","dataService","apiResponse","success","response","includes","message","attemptCancelResync","cancelTime","cancelVisit","code","postPromise","postPhotoResponse","postTextResponse","postChoiceResponse","MenuButton","Container","HelloHeader","HelloText","h2","LoggedIn","AppVersion","ModalTitle","ModalText","ModalButton","ModalButtonWrap","VersionWrap","MenuDrawer","showLogoutModal","setShowLogoutModal","showIDBadge","setShowIdBadge","debugCount","setDebugCount","debugTimeout","LoggedInName","email","LoggedInEmail","clearTimeout","buildDate","process","REACT_APP_BUILD_DATE","endIcon","prev","open","authService","logOut","ProfilePicture","$src","Name","HR","hr","Title","Body","CompanyLogo","IDBadge","selectFullName","profileUrl","selectProfileUrl","plannedStartDate","hirerName","hirerLogoUrl","date","toLocaleDateString","black","ContentPosition","Modal","Background","LoginContainer","breakpoints","values","sm","Logo","img","Form","form","EmailField","TextInput","PasswordField","WelcomeText","InstructionText","ForgottenLink","ErrorWrapper","ErrorMessage","Login","password","formInput","setFormInput","setError","loading","setLoading","isAuthenticated","useContext","AuthContext","currentUserData","selectUserData","handleLogin","preventDefault","logIn","getUserData","userDataResponse","setUserData","emailAddress","handleInputChange","LoginLogo","alt","onSubmit","autoComplete","icon","href","PermissionErrorIcon","ReportProblemOutlined","red","PermissionWrap","BackButton","HelpLink","PermissionList","ul","PermissionModal","setOpen","setHelpLink","isChrome","isFirefox","isSafari","isOpera","isEdge","rel","OpenInNewOutlined","checkCameraPermission","mediaDevices","getUserMedia","stream","getTracks","track","stop","checkLocationPermission","d","DeleteVisitModal","handleDelete","ErrorList","pre","ErrorModal","handleRemove","stringify","ModalQuestion","ResetVisitModal","handleReset","ContinueVisitModal","handleEnd","handleContinue","KeyboardTabOutlined","CancelVisitModal","handleCancel","MODES","complete","selectable","continue","cancelledConfirmed","VisitContainer","Paper","mode","gradients","purpleToPink","salmon","VisitInfo","DisplayName","Address","Product","Expires","spin","keyframes","SyncIcon","SyncOutlinedIcon","css","SealedIcon","CloudDoneOutlinedIcon","ErrorIcon","ReportProblemOutlinedIcon","DeleteIcon","DeleteOutlinedIcon","VisitIcons","isCancelable","VisitDisplay","cancelConfirmed","sealedDate","cancelledDate","resync","setResync","resetVisitOpen","setResetVisitOpen","continueVisitOpen","setContinueVisitOpen","errorsOpen","setErrorsOpen","permissionsOpen","setPermissionsOpen","deleteVisitOpen","setDeleteVisitOpen","cancelVisitOpen","setCancelVisitOpen","setMode","handleVisitSelect","handleSync","handleCancelSync","handleDeleteConfirm","handleClick","Icon","prettyDate","weekday","day","month","year","postcode","DisplayDate","defaultProps","inProgress","SwipeToRefreshContainer","RefreshSpinnerContainer","VisitsContainer","$loading","$refreshHeight","$deltaY","VisitsPageContainer","LastUpdated","CompletedToggle","NoVisits","Header","NoVisitsIcon","StyledCircularProgress","CircularProgress","CompletedVisits","Visits","triggeredRefresh","setTriggeredRefresh","showCompleted","setShowCompleted","showCancelled","setShowCancelled","swiping","setSwiping","visitPageContainerRef","refreshSpinnerContainerRef","visitsContainerRef","currentVisit","finishedVisits","unfinishedVisits","cancelledVisits","refreshHeight","scrollTop","getVisits","visitsList","now","hidden","visibilityChange","document","msHidden","document_hidden","triggerRefreshOnTabFocus","addEventListener","removeEventListener","isCurrentVisitFinished","isCurrentVisitStarted","sortedUnfinishedVisits","sort","b","aStarted","bStarted","aEndDate","bEndDate","localeCompare","sortedFinishedVisits","home","hour","minute","second","el","authSlice","authenticated","setAuthenticated","selectAuthenticated","NoCameraWrap","GenericWrap","Permissions","cameras","setCameras","getCameraDevices","enumerateDevices","videoDevices","device","kind","AuthRoute","to","SplashBackground","splashImage","Circle","LoadingSplash","logo","QuestionContainer","QuestionButton","ContinueButton","CategoryTitle","Steps","currentVisitAnswers","currentCategoryName","isCategoryComplete","questionsInCurrentCategory","isAnswered","backButtonPath","index","subcategory","previousQuestion","isThisAnswered","isPrevAnswered","isThisHasOutcome","hasOutcome","Page404","FinishButton","CategoryContainer","CategoryButton","ProgressContainer","VisitTitle","Categories","categoryProgress","prevSteps","prevCompleted","handleSelectCategory","FollowOnVisits","storage","localforage","createInstance","rootReducer","combineReducers","reducer","userSlice","persistConfig","key","blacklist","persistedReducer","persistReducer","store","configureStore","middleware","getDefaultMiddleware","serializableCheck","ignoredActions","FLUSH","REHYDRATE","PAUSE","PERSIST","PURGE","REGISTER","persistor","persistStore","selectRehydrated","_persist","persist","rehydrated","Bar","pink","UpdateAction","DismissAction","UpdateBar","isUpdateAvailable","handleUpdate","Details","details","Debug","geoLocationOutput","setGeolocationOutput","geoPermission","setGeoPermissions","cameraOutput","setCameraOutput","cameraPermission","setCameraPermission","cloneAsObject","obj","temp","Array","getPermission","callback","permissions","query","finally","createContext","App","authReady","setAuthReady","forcedWaitComplete","setForcedWaitComplete","registerListener","token","silentLogIn","expiry","silentLogin","window","screen","orientation","lock","path","exact","component","isLocalhost","hostname","match","registerValidSW","swUrl","config","serviceWorker","register","registration","onupdatefound","installingWorker","installing","onstatechange","controller","onUpdate","getElementById","postMessage","onSuccess","refreshing","reload","ReactDOM","render","StrictMode","URL","origin","fetch","headers","contentType","get","indexOf","ready","unregister","checkValidServiceWorker","serviceWorkerRegistration","description","content","fullName","split","this","listener","refreshTimeout","getItem","setItem","removeItem","expiryTime","func","getRefreshToken","refreshToken","getAccessToken","params","URLSearchParams","append","OIDC_CONSTS","clientId","scope","axios","post","access_token","expires_in","refresh_token","setAccessToken","setRefreshToken","registerTokenRefresh","nextSilentRefresh","username","Error","Wrap","rest","StyledButton","goBack","viewBox","fill","xmlns","Heading","VisitHeading","ProductName","ProductSKU","HeadingContainer","LogoutButton","VisitType","HomeContainer","menuOpen","setMenuOpen","currStore","currProdName","currSKU","hideProgressBar","showErrorModal","setShowErrorModal","currentVisitErrors","instance","create","timeout","interceptors","request","use","authorization","VISIT_PATH","REPLACEMENTS","API_ENDPOINTS","me","info","textResponse","photoResponse","choiceResponse","template","replacements","i","replacement","regex","RegExp","replace","axiosInstance","isoDateTime","endpoint","getEndpoint","dateTimeStarted","dateTimeEnded","isArray","AnswerCopy","StyledPaper","selected","RadioButtonStyling","ThumbsUpIcon","ThumbUpOutlinedIcon","TextWrap","Answer","inputStyling","answerIcon","MultipleChoiceMultipleAnswers","answerGroup","setAnswerGroup","choice","Choice","AnswerGroup","AnswerIcon","isSelected","alreadySelectedIndex","findIndex","removeAnswer","updatedAnswer","splice","parseInt","handleMultiSelect","CaptureIcon","cx","cy","r","stroke","strokeWidth","CameraWrap","WebcamWrap","WebcamContainer","VideoContainer","style","maxHeight","shortestEdge","maxWidth","VideoWrap","aspectRatio","StyledVideo","StyledCanvas","canvas","AnswerPreview","actionButtonStyles","CloseCameraButton","CaptureButton","SwapCameraButton","Loading","TopActions","RetryButton","getOrientation","availHeight","availWidth","ImageQuestion","loaded","setLoaded","reloadCamera","setReloadCamera","streamSettings","setStreamSettings","devices","setDevices","setShortestEdge","webcamRef","canvasRef","IMAGE_SIZE_SQUARE","stopCamera","useCallback","srcObject","capture","imageSrc","canvasSize","clientAspectRatio","getVideoTracks","getSettings","videoWidth","videoHeight","videoAspectRatio","sourceX","sourceY","sourceWidth","sourceHeight","canvasHeight","canvasWidth","getContext","drawImage","toDataURL","getSquareScreenshotFromVideo","captureOrientation","toggleFullscreen","handleDevices","getVideoContainerWidth","Math","min","handleUserMediaError","handleUserMedia","constraints","deviceId","ideal","facingMode","audio","grabWebcam","grabWebcamDebounced","debounce","element","fullscreenEnabled","fullscreenElement","cancelFullScreen","webkitCancelFullScreen","mozCancelFullScreen","exitFullscreen","webkitExitFullscreen","call","documentElement","requestFullScreen","webkitRequestFullScreen","mozRequestFullScreen","msRequestFullScreen","nextDeviceId","currentIndex","autoPlay","onPlay","playsInline","muted","MultipleChoiceOneAnswer","StyledTextArea","textarea","FreeTextQuestion","rows","columns","placeholder","UnexpectedQuestion","MoreVisits","radio","moreVisits","QuestionField","QuestionComponent"],"mappings":"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","file":"static/js/main.f6b97bfd.chunk.js","sourcesContent":["export const dateToServerTimeString = (dateObj) => {\r\n return dateObj.toISOString();\r\n};\r\n","import { createSelector, createSlice } from \"@reduxjs/toolkit\";\r\nimport {\r\n isVisitCancelled,\r\n isVisitErrored,\r\n isVisitExpired,\r\n isVisitFinished,\r\n isVisitStarted,\r\n} from \"../services/visit\";\r\nimport {\r\n selectCurrentCategory,\r\n selectCurrentQuestionId,\r\n selectCurrentVisitId,\r\n selectPreviousVisitId,\r\n} from \"./settings.slice\";\r\n\r\nconst initialState = {};\r\n\r\nconst visitSlice = createSlice({\r\n name: \"visit\",\r\n initialState,\r\n reducers: {\r\n addVisit: (state, action) => {\r\n const visit = action.payload;\r\n\r\n if (!state[visit.id]) {\r\n state[visit.id] = {\r\n data: visit,\r\n answers: {},\r\n started: {\r\n dateTime: null,\r\n lat: null,\r\n lng: null,\r\n serverConfirmed: false,\r\n },\r\n finished: {\r\n dateTime: false,\r\n serverConfirmed: false,\r\n },\r\n sealed: {\r\n dateTime: false,\r\n serverConfirmed: false,\r\n },\r\n cancelled: {\r\n dateTime: false,\r\n serverConfirmed: false,\r\n reason: null,\r\n },\r\n inFlight: false,\r\n errors: [],\r\n };\r\n } else {\r\n state[visit.id].data = visit;\r\n }\r\n },\r\n deleteVisit: (state, action) => {\r\n const visitId = action.payload;\r\n delete state[visitId];\r\n },\r\n setVisitStarted: (state, action) => {\r\n try {\r\n const { visitId, lat, lng, dateTime } = action.payload;\r\n\r\n state[visitId].started.dateTime = dateTime;\r\n state[visitId].started.lat = lat;\r\n state[visitId].started.lng = lng;\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n },\r\n setVisitStartedServerConfirmed: (state, action) => {\r\n try {\r\n const { visitId, serverConfirmed } = action.payload;\r\n state[visitId].started.serverConfirmed = serverConfirmed;\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n },\r\n\r\n setAnswer: (state, action) => {\r\n try {\r\n const { questionId, visitId, answer, type } = action.payload;\r\n state[visitId].answers[questionId] = {\r\n answer,\r\n type,\r\n serverConfirmed: false,\r\n };\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n },\r\n\r\n setAnswerServerConfirmed: (state, action) => {\r\n try {\r\n const { questionId, visitId, serverConfirmed } = action.payload;\r\n state[visitId].answers[questionId].serverConfirmed = serverConfirmed;\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n },\r\n\r\n setVisitFinished: (state, action) => {\r\n try {\r\n const { visitId, dateTime } = action.payload;\r\n state[visitId].finished.dateTime = dateTime;\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n },\r\n\r\n setVisitFinishedServerConfirmed: (state, action) => {\r\n try {\r\n const { visitId, serverConfirmed } = action.payload;\r\n state[visitId].finished.serverConfirmed = serverConfirmed;\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n },\r\n setVisitSealed: (state, action) => {\r\n try {\r\n const { visitId, dateTime } = action.payload;\r\n state[visitId].sealed.dateTime = dateTime;\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n },\r\n\r\n setVisitSealedServerConfirmed: (state, action) => {\r\n try {\r\n const { visitId, serverConfirmed } = action.payload;\r\n state[visitId].sealed.serverConfirmed = serverConfirmed;\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n },\r\n\r\n setVisitCancelled: (state, action) => {\r\n try {\r\n const { visitId, dateTime, reason } = action.payload;\r\n state[visitId].cancelled.dateTime = dateTime;\r\n state[visitId].cancelled.reason = reason;\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n },\r\n\r\n setVisitCancelledServerConfirmed: (state, action) => {\r\n try {\r\n const { visitId, serverConfirmed } = action.payload;\r\n state[visitId].cancelled.serverConfirmed = serverConfirmed;\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n },\r\n\r\n setVisitInFlight: (state, action) => {\r\n try {\r\n const { visitId, inFlight } = action.payload;\r\n state[visitId].inFlight = inFlight;\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n },\r\n\r\n addError: (state, action) => {\r\n const { visitId, error } = action.payload;\r\n state[visitId].errors = [...state[visitId].errors, error];\r\n },\r\n resetVisit: (state, action) => {\r\n const visitId = action.payload;\r\n\r\n state[visitId].answers = {};\r\n state[visitId].started = {\r\n dateTime: null,\r\n lat: null,\r\n lng: null,\r\n serverConfirmed: false,\r\n };\r\n state[visitId].errors = [];\r\n\r\n state[visitId].finished = { dateTime: false, serverConfirmed: false };\r\n state[visitId].cancelled = {\r\n dateTime: false,\r\n serverConfirmed: false,\r\n reason: null,\r\n };\r\n },\r\n clearVisits: () => initialState,\r\n },\r\n});\r\n\r\nexport const {\r\n setVisitStarted,\r\n setVisitStartedServerConfirmed,\r\n setAnswer,\r\n setAnswerServerConfirmed,\r\n setVisitFinished,\r\n setVisitFinishedServerConfirmed,\r\n setVisitSealed,\r\n setVisitSealedServerConfirmed,\r\n setVisitInFlight,\r\n setVisitCancelled,\r\n setVisitCancelledServerConfirmed,\r\n addVisit,\r\n resetVisit,\r\n clearVisits,\r\n addError,\r\n deleteVisit,\r\n} = visitSlice.actions;\r\n\r\nexport const selectVisits = (state) => state?.[visitSlice.name] ?? {};\r\n\r\nexport const selectCurrentVisit = createSelector(\r\n selectVisits,\r\n selectCurrentVisitId,\r\n (visits, visitId) => {\r\n return visits?.[visitId] ?? {};\r\n }\r\n);\r\nexport const selectPreviousVisit = createSelector(\r\n selectVisits,\r\n selectPreviousVisitId,\r\n (visits, previousVisitId) => {\r\n return visits?.[previousVisitId];\r\n }\r\n);\r\n\r\nexport const selectCurrentVisitData = createSelector(\r\n selectCurrentVisit,\r\n (visit) => {\r\n return visit?.data ?? {};\r\n }\r\n);\r\n\r\nexport const selectPreviousVisitData = createSelector(\r\n selectPreviousVisit,\r\n (visit) => {\r\n return visit?.data ?? {};\r\n }\r\n);\r\n\r\nexport const selectCurrentQuestions = createSelector(\r\n selectCurrentVisitData,\r\n (visit) => visit?.questions ?? []\r\n);\r\n\r\nexport const selectCurrentQuestion = createSelector(\r\n selectCurrentQuestions,\r\n selectCurrentQuestionId,\r\n (questions, currentQuestionId) =>\r\n questions?.find((question) => question.id === currentQuestionId) ?? {}\r\n);\r\n\r\nexport const selectCurrentCategories = createSelector(\r\n selectCurrentVisitData,\r\n (visit) => visit?.questionCategories ?? []\r\n);\r\n\r\nexport const selectCurrentLocation = createSelector(\r\n selectCurrentVisitData,\r\n (visit) => visit?.location ?? {}\r\n);\r\n\r\nexport const selectPreviousLocation = createSelector(\r\n selectPreviousVisitData,\r\n (visit) => visit?.location ?? {}\r\n);\r\n\r\nexport const selectCurrentVisitLocationId = createSelector(\r\n selectCurrentLocation,\r\n (location) => location?.id\r\n);\r\n\r\nexport const selectPreviousVisitLocationId = createSelector(\r\n selectPreviousLocation,\r\n (location) => location?.id\r\n);\r\n\r\nexport const selectVisitsInCurrentVisitLocation = createSelector(\r\n selectCurrentVisitLocationId,\r\n selectCurrentVisitId,\r\n selectVisits,\r\n (currentVisitLocationId, currentVisitId, visits) => {\r\n return Object.keys(visits)\r\n .filter((visitId) => {\r\n const visit = visits?.[visitId].data ?? {};\r\n const sameLocation = visit?.location?.id === currentVisitLocationId;\r\n const notCurrentVisit = visit?.id !== currentVisitId;\r\n const notExpired = !isVisitExpired(visits[visitId]);\r\n return sameLocation && notCurrentVisit && notExpired;\r\n })\r\n .map((visitId) => visits[visitId]);\r\n }\r\n);\r\n\r\nexport const selectCurrentStore = createSelector(\r\n selectCurrentLocation,\r\n (location) => location?.name\r\n);\r\n\r\nexport const selectCurrentProduct = createSelector(\r\n selectCurrentVisitData,\r\n (visit) => visit?.product ?? {}\r\n);\r\n\r\nexport const selectCurrentProdName = createSelector(\r\n selectCurrentProduct,\r\n (product) => product?.name\r\n);\r\n\r\nexport const selectCurrentSKU = createSelector(\r\n selectCurrentProduct,\r\n (product) => product?.sku\r\n);\r\n\r\nexport const selectCurrentAnswers = createSelector(\r\n selectCurrentVisit,\r\n (visit) => visit?.answers ?? {}\r\n);\r\n\r\nexport const selectCurrentQuestionAnswer = createSelector(\r\n selectCurrentAnswers,\r\n selectCurrentQuestionId,\r\n (answers, questionId) => {\r\n return answers?.[questionId]?.answer ?? null;\r\n }\r\n);\r\n\r\nexport const selectIsCurrentVisitFinished = createSelector(\r\n selectCurrentVisit,\r\n (visit) => Boolean(visit?.finished?.dateTime)\r\n);\r\n\r\nexport const selectIsCurrentVisitSealed = createSelector(\r\n selectCurrentVisit,\r\n (visit) => Boolean(visit?.sealed?.dateTime)\r\n);\r\n\r\nexport const selectPreviousAnswer = createSelector(\r\n selectCurrentQuestionId,\r\n selectPreviousVisit,\r\n (questionId, previousVisit) => previousVisit?.answers?.[questionId]?.answer\r\n);\r\n\r\nexport const selectCategoryProgress = createSelector(\r\n selectCurrentAnswers,\r\n selectCurrentVisitData,\r\n (answers, visit) => {\r\n const { questionCategories = [], questions = [] } = visit;\r\n\r\n return questionCategories\r\n .filter(({ excludeFromCategoryList }) => !excludeFromCategoryList)\r\n .map(({ category }) => {\r\n const questionsInCategory = questions.filter(\r\n (question) => question.category === category\r\n );\r\n\r\n const completedQuestions = questionsInCategory.filter(\r\n ({ id: questionId }) => answers?.[questionId]\r\n );\r\n\r\n const completedWithOutcome = completedQuestions.some(\r\n ({ id: questionId }) =>\r\n answers?.[questionId]?.answer?.Outcome &&\r\n answers?.[questionId]?.answer?.Intervention\r\n );\r\n\r\n return {\r\n name: category,\r\n steps: questionsInCategory.length,\r\n completed: completedQuestions.length,\r\n withOutcome: completedWithOutcome,\r\n };\r\n });\r\n }\r\n);\r\n\r\nexport const selectIsCurrentCategoryComplete = createSelector(\r\n selectCurrentCategory,\r\n selectCategoryProgress,\r\n (name, progress) => {\r\n const { steps = 10, completed = 1 } =\r\n progress?.find((category) => category.name === name) ?? {};\r\n\r\n return steps === completed;\r\n }\r\n);\r\n\r\nexport const selectVisitType = createSelector(\r\n selectCurrentVisitData,\r\n (visit) => visit?.visitType\r\n);\r\n\r\nexport const selectCurrentCategoryData = createSelector(\r\n selectCurrentCategory,\r\n selectCurrentVisitData,\r\n\r\n (name, visit) =>\r\n visit?.questionCategories?.find((category) => category.category === name) ??\r\n {}\r\n);\r\n\r\nexport const selectIsCurrentCategoryExcluded = createSelector(\r\n selectCurrentCategoryData,\r\n\r\n (data) => data?.excludeFromCategoryList\r\n);\r\n\r\nexport const selectAutoPromptHelp = createSelector(\r\n selectCurrentQuestion,\r\n (question) => question?.autoPromptHelp\r\n);\r\n\r\nexport const selectHelpLink = createSelector(\r\n selectCurrentQuestion,\r\n (question) => question?.helpLink\r\n);\r\n\r\nexport const selectHelpText = createSelector(\r\n selectCurrentQuestion,\r\n (question) => question?.helpText\r\n);\r\n\r\nexport const selectHelpTitle = createSelector(\r\n selectCurrentQuestion,\r\n (question) => question?.helpTitle\r\n);\r\n\r\nexport const selectHelpVideoLink = createSelector(\r\n selectCurrentQuestion,\r\n (question) => question?.helpVideoLink\r\n);\r\n\r\nexport const selectIsQuestionOptional = createSelector(\r\n selectCurrentQuestion,\r\n (question) => question?.allowNoInput\r\n);\r\n\r\nexport const selectFinishedVisits = createSelector(selectVisits, (visits) => {\r\n const output = [];\r\n Object.entries(visits).forEach(([visitId, visit]) => {\r\n if (\r\n !isVisitCancelled(visit) &&\r\n (isVisitFinished(visit) || isVisitErrored(visit))\r\n ) {\r\n output.push(visit);\r\n }\r\n });\r\n return output;\r\n});\r\n\r\nexport const selectUnfinishedVisits = createSelector(selectVisits, (visits) => {\r\n const output = [];\r\n Object.entries(visits).forEach(([visitId, visit]) => {\r\n if (\r\n !isVisitCancelled(visit) &&\r\n !isVisitFinished(visit) &&\r\n !isVisitErrored(visit) &&\r\n (!isVisitExpired(visit) ||\r\n (isVisitExpired(visit) && isVisitStarted(visit)))\r\n ) {\r\n output.push(visit);\r\n }\r\n });\r\n return output;\r\n});\r\n\r\nexport const selectCancelledVisits = createSelector(selectVisits, (visits) => {\r\n const output = [];\r\n Object.entries(visits).forEach(([visitId, visit]) => {\r\n if (isVisitCancelled(visit)) {\r\n output.push(visit);\r\n }\r\n });\r\n return output;\r\n});\r\n\r\nexport const selectCurrentVisitErrors = createSelector(\r\n selectCurrentVisit,\r\n (visit) => visit?.errors ?? []\r\n);\r\n\r\nexport default visitSlice;\r\n","export const getLatLng = () => {\r\n return new Promise((resolve, reject) => {\r\n if (\"geolocation\" in navigator) {\r\n return getPosition()\r\n .then((position) => {\r\n resolve({\r\n lat: position.coords.latitude,\r\n lng: position.coords.longitude,\r\n });\r\n })\r\n .catch((e) => {\r\n console.error(e);\r\n resolve({});\r\n });\r\n } else {\r\n resolve({});\r\n }\r\n });\r\n};\r\n\r\nexport const getPosition = () => {\r\n return new Promise((resolve, reject) => {\r\n navigator.geolocation.getCurrentPosition(resolve, reject);\r\n });\r\n};\r\n","import { createSelector, createSlice } from \"@reduxjs/toolkit\";\r\n\r\nconst settingsSlice = createSlice({\r\n name: \"settings\",\r\n initialState: {\r\n preferredCameraId: null,\r\n updateAvailable: false,\r\n branchInfo: {},\r\n lastUpdated: null,\r\n currentVisitId: null,\r\n previousVisitId: null,\r\n currentQuestionId: null,\r\n currentCategory: null,\r\n dismissedModals: {},\r\n permissionModalShown: false,\r\n },\r\n reducers: {\r\n setPreferredCameraId: (state, action) => {\r\n state.preferredCameraId = action.payload;\r\n },\r\n setUpdateAvailable: (state, action) => {\r\n state.updateAvailable = action.payload;\r\n },\r\n setBranchInfo: (state, action) => {\r\n state.branchInfo = action.payload;\r\n },\r\n setLastUpdated: (state) => {\r\n state.lastUpdated = new Date().getTime();\r\n },\r\n setCurrentVisitId: (state, action) => {\r\n state.currentVisitId = action.payload;\r\n },\r\n setPreviousVisitId: (state, action) => {\r\n state.previousVisitId = action.payload;\r\n },\r\n setCurrentQuestionId: (state, action) => {\r\n state.currentQuestionId = action.payload;\r\n },\r\n setCurrentCategory: (state, action) => {\r\n state.currentCategory = action.payload;\r\n },\r\n setModalDismissal: (state, action) => {\r\n try {\r\n const questionId = action.payload;\r\n state.dismissedModals[questionId] = true;\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n },\r\n setPermissionModalShown: (state, action) => {\r\n state.permissionModalShown = action.payload;\r\n },\r\n\r\n clearSettings: (state) => {\r\n // camera preferences & branch info can remain\r\n\r\n state.lastUpdated = null;\r\n state.currentVisitId = null;\r\n state.previousVisitId = null;\r\n state.currentQuestionId = null;\r\n state.currentQuestionId = null;\r\n },\r\n },\r\n});\r\n\r\nexport const {\r\n setPreferredCameraId,\r\n setUpdateAvailable,\r\n setBranchInfo,\r\n setLastUpdated,\r\n setCurrentVisitId,\r\n setPreviousVisitId,\r\n setCurrentQuestionId,\r\n setCurrentCategory,\r\n setModalDismissal,\r\n clearSettings,\r\n setPermissionModalShown,\r\n} = settingsSlice.actions;\r\n\r\nconst selectSlice = (state) => state?.[settingsSlice.name];\r\n\r\nexport const selectPreferredCameraId = createSelector(\r\n selectSlice,\r\n (slice) => slice.preferredCameraId\r\n);\r\n\r\nexport const selectUpdateAvailable = createSelector(\r\n selectSlice,\r\n (slice) => slice.updateAvailable\r\n);\r\n\r\nexport const selectVisitLastUpdated = createSelector(\r\n selectSlice,\r\n (state) => state.lastUpdated\r\n);\r\n\r\nexport const selectCurrentVisitId = createSelector(\r\n selectSlice,\r\n (state) => state.currentVisitId\r\n);\r\n\r\nexport const selectPreviousVisitId = createSelector(\r\n selectSlice,\r\n (state) => state.previousVisitId\r\n);\r\n\r\nexport const selectCurrentQuestionId = createSelector(\r\n selectSlice,\r\n (state) => state?.currentQuestionId\r\n);\r\n\r\nexport const selectCurrentCategory = createSelector(\r\n selectSlice,\r\n (state) => state.currentCategory\r\n);\r\n\r\nexport const selectDismissedModal = createSelector(\r\n selectSlice,\r\n (state) => state?.dismissedModals ?? {}\r\n);\r\n\r\nexport const selectIsSelectedQuestionDismissedModal = createSelector(\r\n selectDismissedModal,\r\n selectCurrentQuestionId,\r\n\r\n (dismissedModals, currentQuestionId) => dismissedModals[currentQuestionId]\r\n);\r\n\r\nexport const selectPermissionModalShown = createSelector(\r\n selectSlice,\r\n (state) => state?.permissionModalShown\r\n);\r\n\r\nexport default settingsSlice;\r\n","import React from \"react\";\r\nimport ReactMarkdown from \"react-markdown\";\r\nimport remarkGfm from \"remark-gfm\";\r\nimport styled from \"styled-components\";\r\n\r\n// const exampleText = `## Headings\r\n// # h1 Heading \r\n// ## h2 Heading\r\n// ### h3 Heading\r\n// #### h4 Heading\r\n// ##### h5 Heading\r\n// ###### h6 Heading\r\n\r\n// ## Emphasis\r\n\r\n// **This is bold text**\r\n// __This is bold text__\r\n// *This is italic text*\r\n// _This is italic text_\r\n// ~~Strikethrough~~\r\n\r\n// ## Lists\r\n\r\n// Unordered\r\n\r\n// + Create a list by starting a line with \\` +\r\n// \\`, \\` -\r\n// \\`, or \\` *\r\n// \\`\r\n// + Sub-lists are made by indenting 2 spaces:\r\n// - Marker character change forces new list start:\r\n// * Ac tristique libero volutpat at\r\n// + Facilisis in pretium nisl aliquet\r\n// - Nulla volutpat aliquam velit\r\n// + Very easy!\r\n\r\n// Ordered\r\n\r\n// 1. Lorem ipsum dolor sit amet\r\n// 2. Consectetur adipiscing elit\r\n// 3. Integer molestie lorem at massa\r\n\r\n\r\n// 1. You can use sequential numbers...\r\n// 1. ...or keep all the numbers as 1.\r\n\r\n// ## Links\r\n\r\n// [link text](http://dev.nodeca.com)\r\n\r\n// [link with title](http://nodeca.github.io/pica/demo/ \"title text!\")\r\n\r\n// ## Tables\r\n\r\n// | Tables | Are | Cool |\r\n// |----------|:-------------:|------:|\r\n// | col 1 is | left-aligned | $1600 |\r\n// | col 2 is | centered | $12 |\r\n// | col 3 is | right-aligned | $1 |\r\n\r\n// ## Image\r\n\r\n// ![Stormtroopocat](https://octodex.github.com/images/stormtroopocat.jpg \"The Stormtroopocat\")\r\n\r\n// `;\r\n\r\nconst StyledMarkdown = styled(ReactMarkdown)`\r\n max-width: 600px;\r\n margin: 0 auto;\r\n img {\r\n height: 250px;\r\n margin: 0 auto;\r\n display: block;\r\n }\r\n\r\n table {\r\n display: block;\r\n width: 100%;\r\n overflow: auto;\r\n border-spacing: 0;\r\n border-collapse: collapse;\r\n\r\n th {\r\n font-weight: 600;\r\n }\r\n th,\r\n td {\r\n padding: 6px 13px;\r\n border: 1px solid #dfe2e5;\r\n }\r\n tr {\r\n background-color: #fff;\r\n border-top: 1px solid #c6cbd1;\r\n\r\n &:nth-child(2n) {\r\n background-color: #f6f8fa;\r\n }\r\n }\r\n }\r\n`;\r\nconst Markdown = ({ text }) => (\r\n \r\n);\r\n\r\nexport default Markdown;\r\n","import React, { useEffect, useRef, useState } from \"react\";\r\nimport { useSwipeable } from \"react-swipeable\";\r\nimport styled from \"styled-components\";\r\nimport CloseIcon from \"@material-ui/icons/Close\";\r\nimport { Button } from \"@redwigwam/redalerts.elements.button\";\r\nimport InfoOutlinedIcon from \"@material-ui/icons/InfoOutlined\";\r\nimport CheckIcon from \"@material-ui/icons/Check\";\r\nimport {\r\n selectAutoPromptHelp,\r\n selectHelpLink,\r\n selectHelpText,\r\n selectHelpTitle,\r\n selectHelpVideoLink,\r\n} from \"../../store/visit.slice\";\r\nimport {\r\n setModalDismissal,\r\n selectCurrentQuestionId,\r\n selectIsSelectedQuestionDismissedModal,\r\n} from \"../../store/settings.slice\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport Markdown from \"../Markdown\";\r\n\r\nconst Overlay = styled.div`\r\n position: fixed;\r\n width: 100%;\r\n height: 100%;\r\n bottom: 0;\r\n left: 0;\r\n background-color: #ffffffaa;\r\n touch-action: none;\r\n transition: opacity 0.2s;\r\n top: ${(props) => !props.show && \"100%\"};\r\n`;\r\n\r\nconst SwipeHandleWrap = styled.div`\r\n position: absolute;\r\n top: 50%;\r\n left: 50%;\r\n transform: translate(-50%, -50%);\r\n padding: 16px;\r\n`;\r\n\r\nconst SwipeHandle = styled.div`\r\n height: 5px;\r\n width: 100px;\r\n background-color: #77777777;\r\n border-radius: 16px;\r\n`;\r\n\r\nconst DrawerContainer = styled.div`\r\n background-color: white;\r\n position: absolute;\r\n width: 100%;\r\n height: 90%;\r\n border-top-left-radius: 16px;\r\n border-top-right-radius: 16px;\r\n padding: 24px;\r\n box-sizing: border-box;\r\n overflow: hidden;\r\n transition: bottom 0.2s, top 0.2s;\r\n bottom: ${(props) => (props?.show ? `${props?.deltaY * -1}px` : \"-100%\")};\r\n`;\r\n\r\nconst CloseWrap = styled.div`\r\n position: relative;\r\n height: 24px;\r\n margin-bottom: 24px;\r\n`;\r\nconst ContentWrap = styled.div`\r\n overflow-y: auto;\r\n touch-action: pan-y; /* ensures that background is not scrolled*/\r\n height: calc(100% - 48px);\r\n\r\n &.show-checkbox {\r\n height: calc(100% - 88px);\r\n }\r\n`;\r\n\r\nconst CloseButton = styled(CloseIcon)`\r\n color: ${(props) => props?.theme?.colours?.purple};\r\n`;\r\n\r\nconst HelpTitle = styled.h1`\r\n color: ${(props) => props?.theme?.colours?.purple};\r\n font-weight: 600;\r\n text-align: center;\r\n font-size: 16px;\r\n`;\r\n\r\n\r\nconst VideoPlayer = styled.video`\r\n border-radius: 8px;\r\n`;\r\n\r\nconst CheckboxStyling = styled.span`\r\n display: block;\r\n position: relative;\r\n min-width: 24px;\r\n width: 24px;\r\n height: 24px;\r\n margin-right: 10px;\r\n border-radius: 4px;\r\n background-color: white;\r\n border: 2px solid ${(props) => props?.theme?.colours?.purple};\r\n\r\n .icon {\r\n position: absolute;\r\n top: 50%;\r\n left: 50%;\r\n transform: translate(-50%, -50%);\r\n font-size: 20px;\r\n color: ${(props) => props?.theme?.colours?.white};\r\n }\r\n`;\r\n\r\nconst Input = styled.input.attrs((props) => ({\r\n type: props.type,\r\n}))`\r\n display: none;\r\n\r\n &:checked ~ ${CheckboxStyling} {\r\n &::after {\r\n content: \"\";\r\n display: block;\r\n width: 100%;\r\n height: 100%;\r\n background: ${(props) => props?.theme?.colours?.purple};\r\n }\r\n }\r\n`;\r\n\r\nconst Label = styled.label`\r\n width: 100%;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n margin-top: 16px;\r\n`;\r\n\r\nconst MoreDetail = styled(Button)`\r\n width: calc(100% - 12px);\r\n`;\r\n\r\nconst HelpDrawer = ({ show, setShow }) => {\r\n const [deltaY, setDeltaY] = useState(0);\r\n\r\n const containerRef = useRef();\r\n\r\n useEffect(() => {\r\n if (show) {\r\n setDeltaY(0);\r\n }\r\n }, [show]);\r\n\r\n const handleSwiping = (e) => {\r\n if (containerRef?.current?.getBoundingClientRect) {\r\n const { dir, deltaY } = e;\r\n\r\n const dragDownToCloseDistance =\r\n containerRef.current.getBoundingClientRect().height * 0.25;\r\n\r\n if (dir === \"Down\" && deltaY > 0) {\r\n if (deltaY > dragDownToCloseDistance) {\r\n setShow(false);\r\n } else {\r\n setDeltaY(deltaY);\r\n }\r\n } else {\r\n setDeltaY(0);\r\n }\r\n }\r\n };\r\n\r\n const handleSwiped = () => {\r\n setDeltaY(0);\r\n };\r\n\r\n const swipeHandlers = useSwipeable({\r\n onSwiping: handleSwiping,\r\n onSwiped: handleSwiped,\r\n trackMouse: true,\r\n });\r\n\r\n const autoPrompt = useSelector(selectAutoPromptHelp);\r\n const link = useSelector(selectHelpLink);\r\n const text = useSelector(selectHelpText);\r\n const title = useSelector(selectHelpTitle);\r\n const videoLink = useSelector(selectHelpVideoLink);\r\n const currentQuestionId = useSelector(selectCurrentQuestionId);\r\n const isModalDismissed = useSelector(selectIsSelectedQuestionDismissedModal);\r\n\r\n const [inputChecked, setInputChecked] = useState(false);\r\n\r\n const dispatch = useDispatch();\r\n\r\n const handleOnChange = (e) => {\r\n setInputChecked(e.target.checked);\r\n };\r\n\r\n const closeModal = () => {\r\n setShow(false);\r\n\r\n dispatch(setModalDismissal(currentQuestionId));\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {videoLink && (\r\n \r\n \r\n Your browser does not support the video tag.\r\n \r\n )}\r\n\r\n {title && {title}}\r\n\r\n {text && }\r\n\r\n {link && (\r\n }\r\n />\r\n )}\r\n \r\n {autoPrompt && !isModalDismissed && (\r\n \r\n )}\r\n \r\n \r\n );\r\n};\r\n\r\nexport default HelpDrawer;\r\n","import { Button } from \"@redwigwam/redalerts.elements.button\";\r\nimport React, { useEffect, useRef, useState } from \"react\";\r\nimport { useHistory } from \"react-router\";\r\nimport LayoutBottom from \"../components/Layout/LayoutBottom\";\r\nimport LayoutTop from \"../components/Layout/LayoutTop\";\r\nimport Meta from \"../components/Meta\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport {\r\n selectCurrentQuestion,\r\n selectCurrentVisitLocationId,\r\n selectPreviousVisitLocationId,\r\n selectVisitsInCurrentVisitLocation,\r\n selectCurrentQuestionAnswer,\r\n selectPreviousAnswer,\r\n setAnswer,\r\n selectHelpLink,\r\n selectHelpText,\r\n selectHelpTitle,\r\n selectHelpVideoLink,\r\n setVisitStarted,\r\n setVisitFinished,\r\n selectAutoPromptHelp,\r\n selectIsQuestionOptional,\r\n} from \"../store/visit.slice\";\r\nimport { selectIsSelectedQuestionDismissedModal } from \"../store/settings.slice\";\r\n\r\nimport HelpDrawer from \"../components/HelpDrawer\";\r\nimport Menu from \"../components/Menu/Menu\";\r\n\r\nimport HelpOutlineOutlinedIcon from \"@material-ui/icons/HelpOutlineOutlined\";\r\nimport CheckCircleOutlinedIcon from \"@material-ui/icons/CheckCircleOutlined\";\r\nimport styled from \"styled-components\";\r\nimport QuestionField, { QUESTION_TYPES } from \"../components/Question\";\r\n\r\nimport { dateToServerTimeString } from \"../services/date\";\r\nimport {\r\n endVisit,\r\n isVisitStarted,\r\n postAnswer,\r\n startVisit,\r\n} from \"../services/visit\";\r\nimport {\r\n selectCurrentVisitId,\r\n selectPreviousVisitId,\r\n setCurrentCategory,\r\n setCurrentQuestionId,\r\n setPreviousVisitId,\r\n} from \"../store/settings.slice\";\r\nimport { getLatLng } from \"../services/geolocation\";\r\n\r\nconst ShowHelpButton = styled(Button)`\r\n font-size: 12px;\r\n height: 24px;\r\n padding: 0 8px;\r\n box-shadow: 0px 2px 8px 0px #25101033;\r\n margin-bottom: 16px;\r\n`;\r\n\r\nconst QuestionHeading = styled.h1`\r\n font-size: 24px;\r\n line-height: 29px;\r\n margin: 16px 0 8px 0;\r\n color: ${(props) => props.theme.colours.purple};\r\n font-weight: 600;\r\n text-align: center;\r\n`;\r\nconst QuestionAdditionalText = styled.p`\r\n font-size: 12px;\r\n line-height: 14px;\r\n margin: 0 0 8px 0;\r\n text-align: center;\r\n`;\r\n\r\nconst QuestionWrap = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n`;\r\nconst SubmitContainer = styled.div`\r\n width: 100%;\r\n box-sizing: border-box;\r\n padding-bottom: 48px;\r\n`;\r\n\r\nexport const SubmitButton = styled(Button)`\r\n margin: 16px 0 0 0;\r\n`;\r\n\r\nconst Question = () => {\r\n const [helpOpen, setHelpOpen] = useState(false);\r\n const [submitButtonDisabled, setSubmitButtonDisabled] = useState(false);\r\n const dispatch = useDispatch();\r\n const history = useHistory();\r\n const currentQuestion = useSelector(selectCurrentQuestion);\r\n const currentVisitId = useSelector(selectCurrentVisitId);\r\n const answer = useSelector(selectCurrentQuestionAnswer);\r\n\r\n const previousVisitId = useSelector(selectPreviousVisitId);\r\n\r\n const previousVisitLocationId = useSelector(selectPreviousVisitLocationId);\r\n\r\n const currentVisitLocationId = useSelector(selectCurrentVisitLocationId);\r\n\r\n const visitsInCurrentLocation = useSelector(\r\n selectVisitsInCurrentVisitLocation\r\n );\r\n\r\n const previousAnswer = useSelector(selectPreviousAnswer);\r\n\r\n const helplink = useSelector(selectHelpLink);\r\n const helptext = useSelector(selectHelpText);\r\n const helptitle = useSelector(selectHelpTitle);\r\n const videoLink = useSelector(selectHelpVideoLink);\r\n const autoPrompt = useSelector(selectAutoPromptHelp);\r\n const isModalDismissed = useSelector(selectIsSelectedQuestionDismissedModal);\r\n const isOptional = useSelector(selectIsQuestionOptional);\r\n\r\n const unstartedFollowOnVisits = visitsInCurrentLocation.filter(\r\n (visit) => !isVisitStarted(visit)\r\n );\r\n\r\n const [currentAnswer, setCurrentAnswer] = useState();\r\n\r\n const questionWrapRef = useRef();\r\n\r\n const {\r\n id: questionId,\r\n additionalText,\r\n questionType,\r\n question,\r\n metaData,\r\n canReuseAnswers,\r\n } = currentQuestion;\r\n\r\n useEffect(() => {\r\n if (previousAnswer && !answer && canReuseAnswers) {\r\n setCurrentAnswer(previousAnswer);\r\n }\r\n }, [answer, questionId, canReuseAnswers, previousAnswer]);\r\n\r\n useEffect(() => {\r\n if (\r\n autoPrompt &&\r\n !isModalDismissed &&\r\n (helplink || helptext || helptitle || videoLink)\r\n ) {\r\n setHelpOpen(true);\r\n }\r\n }, [\r\n autoPrompt,\r\n setHelpOpen,\r\n isModalDismissed,\r\n helplink,\r\n helptext,\r\n helptitle,\r\n videoLink,\r\n ]);\r\n\r\n useEffect(() => {\r\n let disabled = false;\r\n if (!isOptional) {\r\n // cases that define if a question is answered correctly or not when its required\r\n switch (questionType) {\r\n case QUESTION_TYPES.freeText:\r\n disabled = !currentAnswer?.freetext || currentAnswer?.freetext === \"\";\r\n break;\r\n default:\r\n disabled = !currentAnswer;\r\n break;\r\n }\r\n }\r\n\r\n setSubmitButtonDisabled(disabled);\r\n }, [currentAnswer, isOptional, questionType]);\r\n\r\n if (!questionId) {\r\n history.push(\"/\");\r\n return null;\r\n }\r\n\r\n let choices = [];\r\n try {\r\n choices = JSON.parse(metaData);\r\n } catch (e) {\r\n console.error(e, metaData);\r\n }\r\n\r\n const scrollToSubmit = () => {\r\n setTimeout(() => {\r\n try {\r\n questionWrapRef.current.scrollIntoView({\r\n block: \"end\",\r\n behavior: \"smooth\",\r\n });\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n }, 100); // delay as layout may shift (photo retake button)\r\n };\r\n\r\n const handleChange = (answer) => {\r\n setCurrentAnswer(answer);\r\n\r\n if (questionType !== QUESTION_TYPES.checkbox) {\r\n scrollToSubmit();\r\n }\r\n };\r\n\r\n const handleSubmit = async () => {\r\n const {\r\n StartVisit,\r\n EndVisit,\r\n NextQuestion,\r\n BackToTasks,\r\n EndPreviousVisit,\r\n ShowFollowOnVisits,\r\n FollowOnVisitQuestion,\r\n } = currentAnswer;\r\n\r\n if (BackToTasks) {\r\n history.push(\"/\");\r\n return;\r\n }\r\n\r\n const dateTime = dateToServerTimeString(new Date());\r\n\r\n if (EndPreviousVisit && previousVisitId) {\r\n dispatch(setVisitFinished({ visitId: previousVisitId, dateTime }));\r\n endVisit(previousVisitId, dateTime, dispatch);\r\n }\r\n\r\n if (StartVisit) {\r\n dispatch(setCurrentCategory());\r\n const { lat, lng } = await getLatLng();\r\n\r\n dispatch(\r\n setVisitStarted({ visitId: currentVisitId, lat, lng, dateTime })\r\n );\r\n startVisit(currentVisitId, lat, lng, dateTime, dispatch);\r\n\r\n if (currentVisitLocationId !== previousVisitLocationId) {\r\n dispatch(setPreviousVisitId());\r\n }\r\n }\r\n\r\n dispatch(\r\n setAnswer({\r\n questionId: questionId,\r\n visitId: currentVisitId,\r\n answer: currentAnswer,\r\n type: questionType,\r\n })\r\n );\r\n\r\n postAnswer(\r\n questionType,\r\n currentVisitId,\r\n questionId,\r\n currentAnswer,\r\n dispatch\r\n );\r\n\r\n setCurrentAnswer();\r\n\r\n if (EndVisit) {\r\n dispatch(setVisitFinished({ visitId: currentVisitId, dateTime }));\r\n endVisit(currentVisitId, dateTime, dispatch);\r\n history.push(\"/\");\r\n return;\r\n }\r\n\r\n if (FollowOnVisitQuestion) {\r\n if (unstartedFollowOnVisits.length > 0) {\r\n dispatch(setPreviousVisitId(currentVisitId));\r\n\r\n dispatch(setCurrentQuestionId(FollowOnVisitQuestion));\r\n return;\r\n }\r\n }\r\n\r\n if (ShowFollowOnVisits) {\r\n history.push(\"/visit/follow-on\");\r\n return;\r\n }\r\n\r\n if (NextQuestion) {\r\n dispatch(setCurrentQuestionId(NextQuestion));\r\n } else {\r\n history.push(\"/visit/steps\");\r\n return;\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n {question}\r\n {additionalText}\r\n\r\n {(helplink || helptext || helptitle || videoLink) && (\r\n }\r\n onClick={() => setHelpOpen(true)}\r\n />\r\n )}\r\n\r\n \r\n {questionType !== QUESTION_TYPES.photo && (\r\n \r\n }\r\n fullWidth\r\n />\r\n \r\n )}\r\n \r\n\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default Question;\r\n","import memoized from \"memoizee\";\r\nimport { QUESTION_TYPES } from \"../components/Question\";\r\nimport {\r\n addError,\r\n setAnswerServerConfirmed,\r\n setVisitCancelledServerConfirmed,\r\n setVisitFinishedServerConfirmed,\r\n setVisitInFlight,\r\n setVisitSealed,\r\n setVisitSealedServerConfirmed,\r\n setVisitStartedServerConfirmed,\r\n} from \"../store/visit.slice\";\r\nimport dataService from \"./data\";\r\nimport { dateToServerTimeString } from \"./date\";\r\n\r\nexport const isVisitComplete = memoized((visit) => {\r\n const isStarted = isVisitStarted(visit) && isVisitStartedConfirmed(visit);\r\n\r\n const isFinished = isVisitFinished(visit) && isVisitFinishedConfirmed(visit);\r\n\r\n if (isStarted && isFinished) {\r\n return allQuestionsSynced(visit);\r\n }\r\n return false;\r\n});\r\n\r\nexport const isVisitFinished = (visit) => {\r\n return Boolean(visit?.finished?.dateTime);\r\n};\r\n\r\nexport const isVisitErrored = (visit) => {\r\n return visit?.errors?.length > 0;\r\n};\r\n\r\nexport const isVisitFinishedConfirmed = (visit) => {\r\n return Boolean(visit?.finished?.serverConfirmed);\r\n};\r\n\r\nexport const isVisitStarted = (visit) => {\r\n return Boolean(visit?.started?.dateTime);\r\n};\r\n\r\nexport const isVisitStartedConfirmed = (visit) => {\r\n return Boolean(visit?.started?.serverConfirmed);\r\n};\r\n\r\nexport const isVisitSealed = (visit) => {\r\n return Boolean(visit?.sealed?.dateTime);\r\n};\r\n\r\nexport const isVisitSealedConfirmed = (visit) => {\r\n return Boolean(visit?.sealed?.serverConfirmed);\r\n};\r\n\r\nexport const isVisitInFlight = (visit) => {\r\n return Boolean(visit?.inFlight);\r\n};\r\n\r\nexport const isVisitCancelled = (visit) => {\r\n return Boolean(visit?.cancelled?.dateTime);\r\n};\r\n\r\nexport const isVisitCancelledConfirmed = (visit) => {\r\n return Boolean(visit?.cancelled?.serverConfirmed);\r\n};\r\n\r\nexport const isVisitExpired = (visit) => {\r\n return new Date() > new Date(visit?.data?.plannedEndDate);\r\n};\r\n\r\n// export const isVisitThisWeek = (visit) => {\r\n// const now = new Date();\r\n// isWithinInterval(new Date(visit?.data?.plannedEndDate), {\r\n// start: startOfWeek(now),\r\n// end: endOfWeek(now),\r\n// });\r\n// };\r\n\r\nexport const allQuestionsSynced = (visit) => {\r\n const answers = visit?.answers ?? {};\r\n const questionIds = Object.keys(answers);\r\n\r\n return questionIds?.every?.(\r\n (questionId) => answers?.[questionId]?.serverConfirmed === true\r\n );\r\n};\r\n\r\nexport const attemptResync = async (visit, dispatch) => {\r\n const {\r\n answers,\r\n started: {\r\n lat,\r\n lng,\r\n dateTime: startTime,\r\n serverConfirmed: startConfirmed,\r\n } = {},\r\n finished: { dateTime: finishTime, serverConfirmed: finishConfirmed } = {},\r\n sealed: { dateTime: sealedTime, serverConfirmed: sealedConfirmed } = {},\r\n data: { id: visitId } = {},\r\n errors,\r\n } = visit;\r\n\r\n console.log(\"[resync] - start\", visitId);\r\n\r\n if (errors?.length > 0) {\r\n console.log(\"[resync] - Skipped due to errors\", {\r\n visitId,\r\n errors,\r\n });\r\n return;\r\n }\r\n\r\n dispatch(setVisitInFlight({ visitId, inFlight: true }));\r\n\r\n let promises = [];\r\n // confirm start time / coords have been recieved\r\n if (!startConfirmed) {\r\n promises.push(\r\n new Promise((resolve, reject) => {\r\n startVisit(visitId, lat, lng, startTime, dispatch)\r\n .then(() => {\r\n resolve({ type: \"Start\" });\r\n })\r\n .catch((e) => {\r\n reject({ type: \"Start\", e });\r\n });\r\n })\r\n );\r\n } else {\r\n promises.push(\r\n Promise.resolve({ type: \"Start\", data: \"Already Confirmed\" })\r\n );\r\n }\r\n\r\n // confirm end time has been recieved\r\n if (!finishConfirmed) {\r\n promises.push(\r\n new Promise((resolve, reject) => {\r\n endVisit(visitId, finishTime, dispatch)\r\n .then(() => {\r\n resolve({ type: \"Finish\" });\r\n })\r\n .catch((e) => {\r\n reject({ type: \"Finish\", e });\r\n });\r\n })\r\n );\r\n } else {\r\n promises.push(\r\n Promise.resolve({ type: \"Finish\", data: \"Already Confirmed\" })\r\n );\r\n }\r\n\r\n // confirm every answer has been recieved\r\n Object.entries(answers).forEach(([questionId, value]) => {\r\n const { answer, serverConfirmed, type } = value;\r\n if (!serverConfirmed) {\r\n promises.push(\r\n new Promise((resolve, reject) => {\r\n postAnswer(type, visitId, questionId, answer, dispatch)\r\n .then(() => {\r\n resolve({\r\n type: \"Question\",\r\n questionType: type,\r\n questionId,\r\n });\r\n })\r\n .catch((e) => {\r\n reject({\r\n type: \"Question\",\r\n questionType: type,\r\n questionId,\r\n e,\r\n });\r\n });\r\n })\r\n );\r\n } else {\r\n promises.push(\r\n Promise.resolve({\r\n type: \"Question\",\r\n questionId,\r\n questionType: type,\r\n data: \"Already Confirmed\",\r\n })\r\n );\r\n }\r\n });\r\n\r\n // waits for all the promises to finish, wether they resolve or reject\r\n const results = await Promise.allSettled(promises);\r\n const allFufilled = results.every((result) => result.status === \"fulfilled\");\r\n\r\n console.log(\"[resync] - results\", results);\r\n\r\n if (allFufilled && !sealedConfirmed) {\r\n let time = sealedTime;\r\n if (!time) {\r\n time = dateToServerTimeString(new Date());\r\n dispatch(setVisitSealed({ visitId, dateTime: time }));\r\n }\r\n try {\r\n await sealVisit(visitId, time, dispatch);\r\n setVisitSealedServerConfirmed({ visitId, serverConfirmed: true });\r\n console.log(\"[resync] Visit Sealed\", visitId);\r\n } catch (e) {\r\n console.error(\"[resync] Error Sealing visit\", visitId, e);\r\n }\r\n }\r\n\r\n dispatch(setVisitInFlight({ visitId, inFlight: false }));\r\n};\r\n\r\nexport const endVisit = (visitId, dateTime, dispatch) => {\r\n return new Promise((resolve, reject) => {\r\n dataService\r\n .endVisit(visitId, dateTime)\r\n .then((apiResponse) => {\r\n const { success, response } = apiResponse?.data ?? {};\r\n if (\r\n success ||\r\n [\"Visit already ended\", \"Visit is already sealed\"].includes(response)\r\n ) {\r\n dispatch(\r\n setVisitFinishedServerConfirmed({\r\n visitId: visitId,\r\n serverConfirmed: true,\r\n })\r\n );\r\n }\r\n resolve();\r\n })\r\n .catch((e) => {\r\n const statusCode = e?.response?.response?.status;\r\n if (statusCode === 404) {\r\n // 404 means that visit ID is no longer valid\r\n dispatch(\r\n addError({\r\n visitId,\r\n error: {\r\n location: \"Finish Visit\",\r\n message: e?.response?.message,\r\n },\r\n })\r\n );\r\n }\r\n reject(e);\r\n });\r\n });\r\n};\r\n\r\nexport const startVisit = async (visitId, lat, lng, dateTime, dispatch) => {\r\n return new Promise((resolve, reject) => {\r\n dataService\r\n .startVisit(visitId, lat, lng, dateTime)\r\n .then((apiResponse) => {\r\n const { success, response } = apiResponse?.data ?? {};\r\n if (\r\n success ||\r\n [\"Visit already started\", \"Visit is already sealed\"].includes(\r\n response\r\n )\r\n ) {\r\n dispatch(\r\n setVisitStartedServerConfirmed({\r\n visitId: visitId,\r\n serverConfirmed: true,\r\n })\r\n );\r\n }\r\n resolve();\r\n })\r\n .catch((e) => {\r\n const statusCode = e?.response?.response?.status;\r\n if (statusCode === 404) {\r\n // 404 means that visit ID is no longer valid\r\n dispatch(\r\n addError({\r\n visitId,\r\n error: { location: \"Start Visit\", message: e?.response?.message },\r\n })\r\n );\r\n }\r\n reject(e);\r\n });\r\n });\r\n};\r\n\r\nexport const sealVisit = (visitId, dateTime, dispatch) => {\r\n return new Promise((resolve, reject) => {\r\n dataService\r\n .sealVisit(visitId, dateTime)\r\n .then((apiResponse) => {\r\n const { success, response } = apiResponse?.data ?? {};\r\n if (success || response === \"Visit already sealed\") {\r\n dispatch(\r\n setVisitSealedServerConfirmed({\r\n visitId: visitId,\r\n serverConfirmed: true,\r\n })\r\n );\r\n }\r\n resolve();\r\n })\r\n .catch((e) => {\r\n const statusCode = e?.response?.response?.status;\r\n if (statusCode === 404) {\r\n // 404 means that visit ID is no longer valid\r\n dispatch(\r\n addError({\r\n visitId,\r\n error: { location: \"Seal Visit\", message: e?.response?.message },\r\n })\r\n );\r\n }\r\n reject(e);\r\n });\r\n });\r\n};\r\n\r\nexport const attemptCancelResync = async (visit, dispatch) => {\r\n const {\r\n cancelled: { dateTime: cancelTime } = {},\r\n data: { id: visitId } = {},\r\n } = visit;\r\n\r\n dispatch(setVisitInFlight({ visitId, inFlight: true }));\r\n\r\n try {\r\n await cancelVisit(visitId, cancelTime, dispatch);\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n\r\n dispatch(setVisitInFlight({ visitId, inFlight: false }));\r\n};\r\n\r\nexport const cancelVisit = (visitId, dateTime, dispatch) => {\r\n return new Promise((resolve, reject) => {\r\n dataService\r\n .cancelVisit(visitId, dateTime)\r\n .then((apiResponse) => {\r\n const { success, response, code } = apiResponse?.data ?? {};\r\n if (\r\n success ||\r\n response === \"Visit already cancelled\" ||\r\n code === \"WRONG_USER\"\r\n ) {\r\n dispatch(\r\n setVisitCancelledServerConfirmed({\r\n visitId: visitId,\r\n serverConfirmed: true,\r\n })\r\n );\r\n }\r\n resolve();\r\n })\r\n .catch((e) => {\r\n const statusCode = e?.response?.response?.status;\r\n if (statusCode === 404) {\r\n // 404 means that visit ID is no longer valid\r\n dispatch(\r\n addError({\r\n visitId,\r\n error: {\r\n location: \"Cancel Visit\",\r\n message: e?.response?.message,\r\n },\r\n })\r\n );\r\n }\r\n reject(e);\r\n });\r\n });\r\n};\r\n\r\nexport const postAnswer = (\r\n questionType,\r\n visitId,\r\n questionId,\r\n answer,\r\n dispatch\r\n) => {\r\n return new Promise((resolve, reject) => {\r\n let postPromise;\r\n switch (questionType) {\r\n case QUESTION_TYPES.photo:\r\n postPromise = dataService.postPhotoResponse(\r\n visitId,\r\n questionId,\r\n answer\r\n );\r\n break;\r\n case QUESTION_TYPES.freeText:\r\n postPromise = dataService.postTextResponse(visitId, questionId, answer);\r\n break;\r\n default:\r\n postPromise = dataService.postChoiceResponse(\r\n visitId,\r\n questionId,\r\n answer\r\n );\r\n }\r\n\r\n postPromise\r\n .then(() => {\r\n dispatch(\r\n setAnswerServerConfirmed({\r\n visitId,\r\n questionId,\r\n serverConfirmed: true,\r\n })\r\n );\r\n resolve();\r\n })\r\n .catch((e) => {\r\n const statusCode = e?.response?.response?.status;\r\n if (statusCode === 404) {\r\n // 404 means that visit ID is no longer valid\r\n dispatch(\r\n addError({\r\n visitId,\r\n error: {\r\n location: \"Question\",\r\n questionId,\r\n message: e?.response?.message,\r\n },\r\n })\r\n );\r\n }\r\n reject(e);\r\n });\r\n });\r\n};\r\n","import React, { useEffect, useRef, useState } from \"react\";\r\nimport styled from \"styled-components\";\r\nimport CloseIcon from \"@material-ui/icons/Close\";\r\nimport { Button } from \"@redwigwam/redalerts.elements.button\";\r\nimport ArrowForwardIcon from \"@material-ui/icons/ArrowForward\";\r\nimport authService from \"../../services/auth\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { LoggedInName, LoggedInEmail } from \"../../store/user.slice\";\r\nimport Modal from \"../Modal\";\r\nimport IDBadge from \"./IDBadge\";\r\nimport { selectCurrentVisitData } from \"../../store/visit.slice\";\r\nimport { useHistory } from \"react-router\";\r\n\r\nconst Overlay = styled.div`\r\n position: fixed;\r\n width: 100%;\r\n height: 100%;\r\n z-index: 1;\r\n bottom: 0;\r\n left: 0;\r\n background-color: ${(props) => props?.theme?.colours?.purple};\r\n touch-action: none;\r\n transition: opacity 0.2s;\r\n top: ${(props) => !props.show && \"100%\"};\r\n`;\r\n\r\nconst DrawerContainer = styled.div`\r\n width: 100%;\r\n height: 100%;\r\n padding: 24px;\r\n box-sizing: border-box;\r\n overflow: hidden;\r\n transition: bottom 0.2s, top 0.2s;\r\n`;\r\n\r\nconst CloseWrap = styled.div`\r\n position: relative;\r\n height: 24px;\r\n text-align: right;\r\n`;\r\nconst ContentWrap = styled.div`\r\n overflow-y: auto;\r\n touch-action: pan-y; /* ensures that background is not scrolled*/\r\n height: calc(100% - 24px);\r\n padding-top: 8px;\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: space-between;\r\n text-align: center;\r\n`;\r\n\r\nconst MenuButton = styled(Button)`\r\n width: 100%;\r\n margin: 6px 0;\r\n`;\r\n\r\nconst CloseButton = styled(CloseIcon)`\r\n color: ${(props) => props?.theme?.colours?.white};\r\n`;\r\n\r\nconst Container = styled.div`\r\n font-weight: 500;\r\n color: ${(props) => props?.theme?.colours?.white};\r\n`;\r\n\r\nconst HelloHeader = styled.h1`\r\n font-size: 24px;\r\n font-weight: 600;\r\n`;\r\n\r\nconst HelloText = styled.h2`\r\n font-weight: 16px;\r\n`;\r\n\r\nconst LoggedIn = styled.div`\r\n color: ${(props) => props?.theme?.colours?.white};\r\n opacity: 0.5;\r\n margin-bottom: 16px;\r\n`;\r\n\r\nconst AppVersion = styled.div`\r\n color: ${(props) => props?.theme?.colours?.white};\r\n opacity: 0.25;\r\n`;\r\n\r\nconst ModalTitle = styled.h2`\r\n color: ${(props) => props?.theme?.colours?.purple};\r\n font-size: 16px;\r\n font-weight: 600;\r\n text-align: center;\r\n`;\r\n\r\nconst ModalText = styled.p`\r\n hyphens: auto;\r\n text-align: justify;\r\n`;\r\n\r\nconst ModalButton = styled(Button)`\r\n padding: 0 36px;\r\n`;\r\n\r\nconst ModalButtonWrap = styled.div`\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n flex-wrap: wrap;\r\n`;\r\n\r\nconst VersionWrap = styled.div`\r\n user-select: none;\r\n`;\r\n\r\nconst MenuDrawer = ({ show, setShow }) => {\r\n const [showLogoutModal, setShowLogoutModal] = useState(false);\r\n const [showIDBadge, setShowIdBadge] = useState(false);\r\n\r\n const [debugCount, setDebugCount] = useState(0);\r\n const debugTimeout = useRef();\r\n\r\n const history = useHistory();\r\n\r\n const name = useSelector(LoggedInName);\r\n const email = useSelector(LoggedInEmail);\r\n\r\n const visit = useSelector(selectCurrentVisitData);\r\n\r\n const handleLogout = () => {\r\n authService.logOut();\r\n };\r\n\r\n const handleClose = () => {\r\n if (showIDBadge) {\r\n setShowIdBadge(false);\r\n } else {\r\n setShow(false);\r\n }\r\n };\r\n\r\n const triggerDebug = () => {\r\n clearTimeout(debugTimeout.current);\r\n setDebugCount((prev) => prev + 1);\r\n if (debugCount >= 10) {\r\n setDebugCount(0);\r\n history.push(\"/debug\");\r\n setShow(false);\r\n } else {\r\n debugTimeout.current = setTimeout(() => {\r\n setDebugCount(0);\r\n }, 1000);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n return clearTimeout(debugTimeout.current);\r\n }, []);\r\n\r\n const buildDate = process?.env?.REACT_APP_BUILD_DATE;\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n {showIDBadge ? (\r\n \r\n ) : (\r\n <>\r\n \r\n Hello {name}\r\n What are you looking for?\r\n \r\n
\r\n }\r\n onClick={() => setShowIdBadge(true)}\r\n disabled={!visit?.id}\r\n />\r\n }\r\n onClick={() => setShowLogoutModal(true)}\r\n />\r\n
\r\n \r\n Logged in as {email}\r\n {buildDate && Version: {buildDate}}\r\n \r\n \r\n )}\r\n
\r\n
\r\n \r\n Are you sure you want to logout?\r\n \r\n All your task information saved locally will be permanently removed\r\n from this device. This includes any recordings for tasks you have in\r\n progress and also any completed tasks not yet synchronised with our\r\n servers.\r\n \r\n \r\n setShowLogoutModal(false)}\r\n />\r\n \r\n \r\n \r\n
\r\n );\r\n};\r\n\r\nexport default MenuDrawer;\r\n","import React from \"react\";\r\nimport { useSelector } from \"react-redux\";\r\nimport styled from \"styled-components\";\r\nimport { selectFullName, selectProfileUrl } from \"../../store/user.slice\";\r\nimport { selectCurrentVisitData } from \"../../store/visit.slice\";\r\n\r\nconst Container = styled.div`\r\n padding-top: 80px;\r\n padding-bottom: 50px;\r\n background: #a1348c;\r\n border-radius: 8px;\r\n color: white;\r\n position: relative;\r\n max-width: 400px;\r\n width: 100%;\r\n margin: 60px auto 0 auto;\r\n filter: drop-shadow(0px 2px 8px rgba(37, 16, 16, 0.2));\r\n`;\r\n\r\nconst ProfilePicture = styled.div`\r\n width: 120px;\r\n height: 120px;\r\n border-radius: 50%;\r\n border: 2px solid white;\r\n background-color: #a1348c;\r\n position: absolute;\r\n top: -60px;\r\n left: 50%;\r\n transform: translateX(-50%);\r\n filter: drop-shadow(0px 2px 8px rgba(37, 16, 16, 0.2));\r\n\r\n background-image: url(${(props) => props.$src});\r\n background-size: contain;\r\n background-position: center;\r\n background-repeat: no-repeat;\r\n`;\r\n\r\nconst Name = styled.p`\r\n font-family: Montserrat;\r\n font-size: 24px;s\r\n font-weight: 500;\r\n line-height: 29px;\r\n margin: 0;\r\n`;\r\n\r\nconst HR = styled.hr`\r\n opacity: 0.2;\r\n width: 80%;\r\n`;\r\nconst Title = styled.p`\r\n font-family: Arimo;\r\n font-size: 12px;\r\n font-style: normal;\r\n font-weight: 600;\r\n line-height: 14px;\r\n opacity: 50%;\r\n margin-bottom: 4px;\r\n`;\r\nconst Body = styled.p`\r\n font-family: Arimo;\r\n font-size: 14px;\r\n font-style: normal;\r\n font-weight: 400;\r\n margin-top: 0;\r\n text-align: center;\r\n`;\r\nconst CompanyLogo = styled.div`\r\n height: 72px;\r\n width: 72px;\r\n border-radius: 8px;\r\n border: 2px solid white;\r\n\r\n position: absolute;\r\n bottom: -32px;\r\n left: 50%;\r\n transform: translateX(-50%);\r\n background: #a1348c;\r\n filter: drop-shadow(0px 2px 8px rgba(37, 16, 16, 0.2));\r\n\r\n background-image: url(${(props) => props.$src});\r\n background-size: contain;\r\n background-position: center;\r\n background-repeat: no-repeat;\r\n`;\r\n\r\nconst IDBadge = () => {\r\n const name = useSelector(selectFullName);\r\n const visit = useSelector(selectCurrentVisitData);\r\n const profileUrl = useSelector(selectProfileUrl);\r\n const {\r\n plannedStartDate,\r\n plannedEndDate,\r\n location: { name: location = \"Unknown\" } = {},\r\n hirerName = \"Unknown\",\r\n hirerLogoUrl,\r\n } = visit;\r\n\r\n const date = `${new Date(plannedStartDate).toLocaleDateString(\r\n \"en-gb\"\r\n )} - ${new Date(plannedEndDate).toLocaleDateString(\"en-gb\")} `;\r\n\r\n return (\r\n \r\n \r\n {name}\r\n
\r\n Authorised to be working on behalf of\r\n {hirerName}\r\n\r\n At the following location\r\n {location}\r\n\r\n Between the following dates\r\n {date}\r\n \r\n
\r\n );\r\n};\r\n\r\nexport default IDBadge;\r\n","import styled from \"styled-components\";\r\nimport React from \"react\";\r\n\r\nconst Overlay = styled.div`\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n background-color: #25101099;\r\n z-index: 9999;\r\n color: ${(props) => props.theme.colours.black};\r\n`;\r\n\r\nconst ContentPosition = styled.div`\r\n position: absolute;\r\n top: 50%;\r\n left: 50%;\r\n transform: translate(-50%, -50%);\r\n width: 100%;\r\n`;\r\n\r\nconst ContentWrap = styled.div`\r\n background: white;\r\n border-radius: 8px;\r\n width: 90%;\r\n max-width: 500px;\r\n margin: 0 auto;\r\n padding: 16px;\r\n`;\r\n\r\nconst Modal = ({ children, open }) => {\r\n return open ? (\r\n \r\n \r\n {children}\r\n \r\n \r\n ) : null;\r\n};\r\n\r\nexport default Modal;\r\n","export default __webpack_public_path__ + \"static/media/login-logo.b442b71b.png\";","import React, { useContext, useEffect, useState } from \"react\";\r\nimport { useHistory } from \"react-router\";\r\nimport { AuthContext } from \"../App\";\r\nimport authService from \"../services/auth\";\r\nimport { TextInput } from \"@redwigwam/redalerts.fields.text\";\r\nimport { Button } from \"@redwigwam/redalerts.elements.button\";\r\nimport styled from \"styled-components\";\r\n\r\nimport ArrowForwardIcon from \"@material-ui/icons/ArrowForward\";\r\nimport EmailOutlinedIcon from \"@material-ui/icons/EmailOutlined\";\r\nimport LockOutlinedIcon from \"@material-ui/icons/LockOutlined\";\r\nimport Meta from \"../components/Meta\";\r\n\r\nimport LoginLogo from \"../images/login-logo.png\";\r\nimport dataService from \"../services/data\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport { selectUserData, setUserData } from \"../store/user.slice\";\r\nimport { clearVisits } from \"../store/visit.slice\";\r\nimport { clearSettings } from \"../store/settings.slice\";\r\n\r\nconst Background = styled.div`\r\n width: 100%;\r\n height: 100%;\r\n background-color: ${(props) => props?.theme?.colours?.purple};\r\n overflow: auto;\r\n position: relative;\r\n`;\r\n\r\nconst LoginContainer = styled.div`\r\n position: absolute;\r\n top: 48px;\r\n left: 50%;\r\n transform: translateX(-50%);\r\n text-align: center;\r\n max-width: ${(props) => props?.theme?.breakpoints?.values?.sm}px;\r\n width: 100%;\r\n height: calc(100% - 48px);\r\n background-color: white;\r\n border-top-right-radius: 16px;\r\n border-top-left-radius: 16px;\r\n padding: 0 24px;\r\n`;\r\n\r\nconst Logo = styled.img`\r\n width: 70px;\r\n height: 48px;\r\n margin-bottom: 24px;\r\n margin-top: 48px;\r\n`;\r\n\r\nconst Form = styled.form`\r\n width: 100%;\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: center;\r\n`;\r\n\r\nconst EmailField = styled(TextInput)`\r\n margin: 0 0 24px;\r\n`;\r\n\r\nconst PasswordField = styled(TextInput)`\r\n margin: 0 0 24px;\r\n`;\r\n\r\nconst WelcomeText = styled.p`\r\n font-family: Montserrat;\r\n font-style: normal;\r\n font-weight: 600;\r\n font-size: 32px;\r\n line-height: 39px;\r\n color: ${(props) => props.theme.colours.purple};\r\n margin: 0 0 8px 0;\r\n`;\r\n\r\nconst InstructionText = styled.p`\r\n margin: 0 0 32px 0;\r\n`;\r\n\r\nconst ForgottenLink = styled.a`\r\n display: block;\r\n font-weight: 600;\r\n font-size: 12px;\r\n line-height: 14px;\r\n text-decoration: none;\r\n color: ${(props) => props.theme.colours.purple};\r\n text-align: center;\r\n margin-top: 24px;\r\n`;\r\n\r\nconst ErrorWrapper = styled.div`\r\n margin-bottom: 10px;\r\n`;\r\n\r\nconst ErrorMessage = styled.span`\r\n color: red;\r\n font-size: 14px;\r\n`;\r\n\r\nconst Login = () => {\r\n const [formInput, setFormInput] = useState({ email: \"\", password: \"\" });\r\n const [error, setError] = useState(false);\r\n const [loading, setLoading] = useState(false);\r\n const history = useHistory();\r\n const dispatch = useDispatch();\r\n const isAuthenticated = useContext(AuthContext);\r\n const currentUserData = useSelector(selectUserData);\r\n\r\n useEffect(() => {\r\n if (isAuthenticated) {\r\n history.push(\"/\");\r\n }\r\n }, [isAuthenticated, history]);\r\n\r\n const handleLogin = async (e) => {\r\n e.preventDefault();\r\n try {\r\n setLoading(true);\r\n await authService.logIn(formInput.email, formInput.password);\r\n const userDataResponse = await dataService.getUserData();\r\n dispatch(setUserData(userDataResponse?.data ?? {}));\r\n\r\n if (\r\n userDataResponse?.data?.emailAddress !== currentUserData?.emailAddress\r\n ) {\r\n // different user, clear old visits\r\n dispatch(clearVisits());\r\n dispatch(clearSettings());\r\n }\r\n\r\n setLoading(false);\r\n history.push(\"/\");\r\n } catch (e) {\r\n console.error(e);\r\n setError(e.message);\r\n setLoading(false);\r\n }\r\n };\r\n\r\n const handleInputChange = (e) => {\r\n const value = e.target.value;\r\n const name = e.target.name;\r\n setFormInput((prev) => ({ ...prev, [name]: value }));\r\n };\r\n\r\n return (\r\n \r\n \r\n\r\n \r\n \r\n Welcome back\r\n Enter your details below to continue\r\n
\r\n {error &&\r\n \r\n The email and password you entered did not match our records. Please try again.\r\n \r\n }\r\n\r\n }\r\n value={formInput.email}\r\n onChange={handleInputChange}\r\n />\r\n\r\n }\r\n value={formInput.password}\r\n onChange={handleInputChange}\r\n />\r\n\r\n }\r\n onClick={() => {}}\r\n />\r\n \r\n Forgotten details?\r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\nexport default Login;\r\n","import React, { useEffect, useState } from \"react\";\r\nimport Modal from \"../Modal\";\r\nimport styled from \"styled-components\";\r\nimport ReportProblemOutlined from \"@material-ui/icons/ReportProblemOutlined\";\r\nimport { Button } from \"@redwigwam/redalerts.elements.button\";\r\nimport { OpenInNewOutlined } from \"@material-ui/icons\";\r\nimport {\r\n isChrome,\r\n isEdge,\r\n isFirefox,\r\n isOpera,\r\n isSafari,\r\n} from \"react-device-detect\";\r\nimport ArrowForward from \"@material-ui/icons/ArrowForward\";\r\n\r\nconst PermissionErrorIcon = styled(ReportProblemOutlined)`\r\n width: 48px !important;\r\n height: 48px !important;\r\n color: ${(props) => props?.theme?.colours?.red};\r\n margin-bottom: 16px;\r\n align-self: center;\r\n`;\r\n\r\nconst PermissionWrap = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: center;\r\n\r\n p {\r\n margin: 8px 0;\r\n }\r\n`;\r\n\r\nconst BackButton = styled(Button)`\r\n margin-top: 16px;\r\n`;\r\n\r\nconst HelpLink = styled.a`\r\n svg {\r\n font-size: inherit;\r\n }\r\n`;\r\n\r\nconst PermissionList = styled.ul`\r\n margin: 0;\r\n`;\r\n\r\nconst PermissionModal = ({ open, setOpen }) => {\r\n const [helpLink, setHelpLink] = useState();\r\n const handleClose = () => {\r\n setOpen(false);\r\n };\r\n\r\n useEffect(() => {\r\n let link;\r\n\r\n if (isChrome) {\r\n link = \"https://support.google.com/chrome/answer/2693767\";\r\n } else if (isFirefox) {\r\n link =\r\n \"https://support.mozilla.org/en-US/kb/how-manage-your-camera-and-microphone-permissions#w_changing-camera-permissions\";\r\n } else if (isSafari) {\r\n link = \"https://support.apple.com/en-gb/guide/safari/ibrwe2159f50/mac\";\r\n } else if (isOpera) {\r\n link = \"https://help.opera.com/en/latest/web-preferences/#camera\";\r\n } else if (isEdge) {\r\n link =\r\n \"https://www.windowscentral.com/how-manage-site-permissions-new-microsoft-edge#set_site_permissions_edge_chromium\";\r\n }\r\n setHelpLink(link);\r\n }, []);\r\n\r\n return (\r\n \r\n \r\n \r\n

The following permissions are required:

\r\n \r\n
  • Camera
  • \r\n
  • Location
  • \r\n
    \r\n

    Please allow these permissions in your devices settings

    \r\n {helpLink && (\r\n

    \r\n For information on how to do this,{\" \"}\r\n \r\n click here \r\n \r\n

    \r\n )}\r\n\r\n }\r\n />\r\n
    \r\n
    \r\n );\r\n};\r\n\r\nexport default PermissionModal;\r\n","export const checkCameraPermission = () => {\r\n return new Promise((resolve, reject) => {\r\n try {\r\n navigator.mediaDevices\r\n .getUserMedia({ video: true })\r\n .then((stream) => {\r\n stream.getTracks().forEach((track) => track.stop());\r\n resolve();\r\n })\r\n .catch((e) => reject(e));\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n};\r\n\r\nexport const checkLocationPermission = () => {\r\n return new Promise((resolve, reject) => {\r\n try {\r\n navigator.geolocation.getCurrentPosition(\r\n (d) => resolve(d),\r\n (e) => reject(e)\r\n );\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n};\r\n\r\nexport const checkAllPermissions = () => {\r\n return new Promise(async (resolve, reject) => {\r\n try {\r\n const promises = [checkCameraPermission(), checkLocationPermission()];\r\n\r\n const results = await Promise.allSettled(promises);\r\n console.log(results);\r\n\r\n if (results.every((result) => result.status === \"fulfilled\")) {\r\n resolve();\r\n }\r\n reject();\r\n } catch (e) {\r\n reject();\r\n }\r\n });\r\n};\r\n\r\nexport const checkPermissionState = (name) => {\r\n return new Promise((resolve, reject) => {\r\n try {\r\n navigator.permissions\r\n .query({ name })\r\n .then((data) => resolve(data?.state))\r\n .catch((e) => reject(e));\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n};\r\n","import { Button } from \"@redwigwam/redalerts.elements.button\";\r\nimport React from \"react\";\r\nimport styled from \"styled-components\";\r\nimport Modal from \"../Modal\";\r\n\r\nconst ModalButton = styled(Button)`\r\n margin-bottom: 16px;\r\n`;\r\n\r\nconst Question = styled.p`\r\n text-align: center;\r\n`;\r\n\r\nconst DeleteVisitModal = ({ open, setOpen, handleDelete }) => {\r\n return (\r\n \r\n Remove this task?\r\n setOpen(false)}\r\n fullWidth\r\n />\r\n \r\n \r\n );\r\n};\r\n\r\nexport default DeleteVisitModal;\r\n","import { Button } from \"@redwigwam/redalerts.elements.button\";\r\nimport React from \"react\";\r\nimport styled from \"styled-components\";\r\nimport Modal from \"../Modal\";\r\n\r\nconst ModalButton = styled(Button)`\r\n margin-bottom: 16px;\r\n`;\r\n\r\nconst ModalButtonWrap = styled.div`\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n flex-wrap: wrap;\r\n flex-direction: column;\r\n`;\r\n\r\nconst ErrorList = styled.pre`\r\n max-height: 200px;\r\n overflow-y: auto;\r\n touch-action: pan-x;\r\n`;\r\n\r\nconst ErrorModal = ({ open, setOpen, errors, handleRemove }) => {\r\n return (\r\n \r\n

    Error Log

    \r\n {JSON.stringify(errors, null, 2)}\r\n

    \r\n For assistance please reach out via \r\n \r\n live chat\r\n \r\n

    \r\n \r\n setOpen(false)} />\r\n \r\n \r\n
    \r\n );\r\n};\r\n\r\nexport default ErrorModal;\r\n","import ArrowBack from \"@material-ui/icons/ArrowBack\";\r\nimport ExitToApp from \"@material-ui/icons/ExitToApp\";\r\nimport { Button } from \"@redwigwam/redalerts.elements.button\";\r\nimport React from \"react\";\r\nimport styled from \"styled-components\";\r\nimport Modal from \"../Modal\";\r\n\r\nconst ModalButton = styled(Button)`\r\n margin-bottom: 16px;\r\n`;\r\n\r\nconst ModalQuestion = styled.p`\r\n text-align: center;\r\n`;\r\n\r\nconst ModalButtonWrap = styled.div`\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n flex-wrap: wrap;\r\n flex-direction: column;\r\n`;\r\n\r\nconst ResetVisitModal = ({ open, setOpen, handleReset }) => {\r\n return (\r\n \r\n \r\n All previous submitted answers for this task will be deleted and you\r\n will have to start over. Are you sure?\r\n \r\n\r\n \r\n }\r\n fullWidth\r\n />\r\n setOpen(false)}\r\n startIcon={}\r\n fullWidth\r\n />\r\n \r\n \r\n );\r\n};\r\n\r\nexport default ResetVisitModal;\r\n","import { KeyboardTabOutlined } from \"@material-ui/icons\";\r\nimport ArrowBack from \"@material-ui/icons/ArrowBack\";\r\nimport ExitToApp from \"@material-ui/icons/ExitToApp\";\r\nimport { Button } from \"@redwigwam/redalerts.elements.button\";\r\nimport React from \"react\";\r\nimport styled from \"styled-components\";\r\nimport Modal from \"../Modal\";\r\n\r\nconst ModalButton = styled(Button)`\r\n margin: 8px 0;\r\n`;\r\n\r\nconst ModalButtonWrap = styled.div`\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n flex-wrap: wrap;\r\n flex-direction: column;\r\n`;\r\n\r\nconst ContinueVisitModal = ({ open, setOpen, handleEnd, handleContinue }) => {\r\n return (\r\n \r\n \r\n }\r\n fullWidth\r\n />\r\n }\r\n fullWidth\r\n />\r\n setOpen(false)}\r\n startIcon={}\r\n fullWidth\r\n />\r\n \r\n \r\n );\r\n};\r\n\r\nexport default ContinueVisitModal;\r\n","import { Button } from \"@redwigwam/redalerts.elements.button\";\r\nimport React from \"react\";\r\nimport styled from \"styled-components\";\r\nimport Modal from \"../Modal\";\r\n\r\nconst ModalButton = styled(Button)`\r\n margin-bottom: 16px;\r\n`;\r\n\r\nconst Question = styled.p`\r\n text-align: center;\r\n`;\r\n\r\nconst CancelVisitModal = ({ open, setOpen, handleCancel }) => {\r\n return (\r\n \r\n \r\n Cancel working on this task and allow it to be picked up by another\r\n worker?\r\n \r\n setOpen(false)}\r\n fullWidth\r\n />\r\n \r\n \r\n );\r\n};\r\n\r\nexport default CancelVisitModal;\r\n","import { shape, string, bool } from \"prop-types\";\r\nimport React, { useEffect, useState } from \"react\";\r\nimport { useHistory } from \"react-router-dom\";\r\nimport styled, { css, keyframes } from \"styled-components\";\r\nimport ReportProblemOutlinedIcon from \"@material-ui/icons/ReportProblemOutlined\";\r\nimport ArrowForwardIcon from \"@material-ui/icons/ArrowForward\";\r\nimport CloseIcon from \"@material-ui/icons/Close\";\r\nimport DeleteOutlinedIcon from \"@material-ui/icons/DeleteOutlined\";\r\n\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport {\r\n deleteVisit,\r\n resetVisit,\r\n selectVisits,\r\n setVisitCancelled,\r\n} from \"../../store/visit.slice\";\r\nimport {\r\n attemptCancelResync,\r\n attemptResync,\r\n cancelVisit,\r\n} from \"../../services/visit\";\r\n\r\nimport CloudDoneOutlinedIcon from \"@material-ui/icons/CloudDoneOutlined\";\r\nimport KeyboardTabIcon from \"@material-ui/icons/KeyboardTab\";\r\nimport SyncOutlinedIcon from \"@material-ui/icons/SyncOutlined\";\r\nimport { Paper } from \"@redwigwam/redalerts.elements.paper\";\r\nimport {\r\n setCurrentCategory,\r\n setCurrentQuestionId,\r\n setCurrentVisitId,\r\n} from \"../../store/settings.slice\";\r\n\r\nimport PermissionModal from \"./PermissionModal\";\r\nimport { checkAllPermissions } from \"../../services/permissions\";\r\nimport DeleteVisitModal from \"./DeleteModal\";\r\nimport ErrorModal from \"./ErrorModal\";\r\nimport ResetVisitModal from \"./ResetModal\";\r\nimport ContinueVisitModal from \"./ContinueModal\";\r\nimport CancelVisitModal from \"./CancelModal\";\r\nimport { dateToServerTimeString } from \"../../services/date\";\r\n\r\nconst MODES = {\r\n complete: \"COMPLETE\",\r\n selectable: \"SELECTABLE\",\r\n continue: \"CONTINUE\",\r\n finished: \"FINISHED\",\r\n errors: \"ERRORS\",\r\n sealed: \"SEALED\",\r\n cancelled: \"CANCELLED\",\r\n cancelledConfirmed: \"CANCELLED-CONFIRMED\",\r\n};\r\n\r\nconst VisitContainer = styled(Paper)`\r\n display: grid;\r\n grid-template-columns: auto 30px;\r\n align-items: center;\r\n padding: 8px;\r\n cursor: pointer;\r\n\r\n ${(props) =>\r\n [MODES.finished, MODES.complete, MODES.errors].includes(props.mode) &&\r\n `\r\n color:${props?.theme?.colours?.black};\r\n `}\r\n\r\n ${(props) =>\r\n [MODES.selectable, MODES.continue].includes(props.mode) &&\r\n `\r\n color:white;\r\n background: ${props?.theme?.gradients?.purpleToPink};\r\n box-shadow:unset;\r\n `}\r\n\r\n ${(props) =>\r\n props.disabled &&\r\n `\r\n opacity:0.2;\r\n pointer-events:none;\r\n `}\r\n\r\n ${(props) =>\r\n [MODES.cancelled, MODES.cancelledConfirmed].includes(props.mode) &&\r\n `\r\n color:black;\r\n background: ${props?.theme?.colours?.salmon};\r\n box-shadow:unset;\r\n `}\r\n`;\r\n\r\nconst VisitInfo = styled.div`\r\n flex-grow: 1;\r\n > p {\r\n margin: 0 0 4px 0;\r\n }\r\n`;\r\n\r\nconst DisplayName = styled.p`\r\n font-family: \"Montserrat\";\r\n font-weight: 600;\r\n\r\n ${(props) =>\r\n [MODES.finished, MODES.complete, MODES.errors].includes(props.mode) &&\r\n `\r\n color:${props?.theme?.colours?.purple};\r\n `}\r\n`;\r\n\r\nconst Address = styled.p`\r\n font-size: 14px;\r\n font-weight: 600;\r\n`;\r\nconst Product = styled.p`\r\n font-size: 12px;\r\n font-weight: 600;\r\n opacity: 0.5;\r\n`;\r\n\r\nconst Expires = styled.p`\r\n font-size: 12px;\r\n`;\r\n\r\nconst spin = keyframes`\r\n from {\r\n transform: rotate(360deg);\r\n }\r\n\r\n to {\r\n transform: rotate(0deg);\r\n }\r\n`;\r\n\r\nconst SyncIcon = styled(SyncOutlinedIcon)`\r\n color: ${(props) => props?.theme?.colours?.purple};\r\n\r\n ${(props) =>\r\n props.loading &&\r\n css`\r\n animation: 1s ${spin} linear infinite;\r\n `}\r\n`;\r\n\r\nconst SealedIcon = styled(CloudDoneOutlinedIcon)`\r\n color: #8bc34a;\r\n`;\r\n\r\nconst ErrorIcon = styled(ReportProblemOutlinedIcon)`\r\n color: #eb4332;\r\n`;\r\n\r\nconst DeleteIcon = styled(DeleteOutlinedIcon)`\r\n color: #eb4332;\r\n`;\r\n\r\nconst VisitIcons = styled.div`\r\n padding-left: 8px;\r\n text-align: center;\r\n color: white;\r\n\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: ${(props) =>\r\n props?.isCancelable ? \"space-between\" : \"center\"};\r\n align-items: flex-end;\r\n height: 100%;\r\n > svg {\r\n width: 24px;\r\n }\r\n`;\r\n\r\nconst VisitDisplay = ({\r\n visit,\r\n started,\r\n finished,\r\n sealed,\r\n cancelled,\r\n cancelConfirmed,\r\n errors,\r\n disabled,\r\n}) => {\r\n const {\r\n data: {\r\n id: visitId,\r\n visitType,\r\n plannedEndDate,\r\n location,\r\n product,\r\n questions = [],\r\n } = {},\r\n sealed: { dateTime: sealedDate } = {},\r\n cancelled: { dateTime: cancelledDate } = {},\r\n } = visit;\r\n const dispatch = useDispatch();\r\n const history = useHistory();\r\n\r\n const [resync, setResync] = useState(false);\r\n\r\n const [resetVisitOpen, setResetVisitOpen] = useState(false);\r\n const [continueVisitOpen, setContinueVisitOpen] = useState(false);\r\n const [errorsOpen, setErrorsOpen] = useState(false);\r\n const [permissionsOpen, setPermissionsOpen] = useState(false);\r\n const [deleteVisitOpen, setDeleteVisitOpen] = useState(false);\r\n const [cancelVisitOpen, setCancelVisitOpen] = useState(false);\r\n\r\n const [mode, setMode] = useState();\r\n\r\n const visits = useSelector(selectVisits);\r\n\r\n const isCancelable = !cancelled && !finished && !errors;\r\n\r\n const handleVisitSelect = async () => {\r\n setContinueVisitOpen(false);\r\n if (sealed) return;\r\n\r\n try {\r\n await checkAllPermissions();\r\n } catch (e) {\r\n setPermissionsOpen(true);\r\n return;\r\n }\r\n\r\n dispatch(setCurrentVisitId(visitId));\r\n\r\n const { id, category } = questions?.[0];\r\n\r\n if (!visits[visitId]?.answers?.[id]) {\r\n // first question is unanswered, jump to it\r\n dispatch(setCurrentQuestionId(id));\r\n dispatch(setCurrentCategory(category));\r\n history.push(\"/visit/question\");\r\n } else {\r\n history.push(\"/visit/categories\");\r\n }\r\n };\r\n\r\n const handleSync = async () => {\r\n setResync(true);\r\n await attemptResync(visit, dispatch);\r\n setResync(false);\r\n };\r\n\r\n const handleCancelSync = async () => {\r\n setResync(true);\r\n await attemptCancelResync(visit, dispatch);\r\n setResync(false);\r\n };\r\n\r\n const handleResetVisitConfirm = () => {\r\n setContinueVisitOpen(false);\r\n setResetVisitOpen(true);\r\n };\r\n\r\n const handleCancelVisitConfirm = () => {\r\n setContinueVisitOpen(true);\r\n };\r\n\r\n const handleRemove = () => {\r\n setContinueVisitOpen(false);\r\n setResetVisitOpen(false);\r\n dispatch(resetVisit(visitId));\r\n dispatch(setCurrentVisitId(null));\r\n };\r\n\r\n const handleErrors = () => {\r\n setErrorsOpen(true);\r\n };\r\n\r\n const handleDeleteConfirm = () => {\r\n setDeleteVisitOpen(true);\r\n };\r\n\r\n const handleDelete = () => {\r\n dispatch(deleteVisit(visitId));\r\n };\r\n\r\n const handleCancelConfirm = () => {\r\n setCancelVisitOpen(true);\r\n };\r\n\r\n const handleCancel = () => {\r\n setCancelVisitOpen(false);\r\n const dateTime = dateToServerTimeString(new Date());\r\n dispatch(setVisitCancelled({ visitId, dateTime }));\r\n dispatch(setCurrentVisitId(null));\r\n cancelVisit(visitId, dateTime, dispatch);\r\n };\r\n\r\n useEffect(() => {\r\n if (errors?.length > 0) {\r\n setMode(MODES.errors);\r\n } else {\r\n if (cancelled) {\r\n if (!cancelConfirmed) {\r\n setMode(MODES.cancelled);\r\n } else {\r\n setMode(MODES.cancelledConfirmed);\r\n }\r\n } else {\r\n if (sealed) {\r\n setMode(MODES.sealed);\r\n } else {\r\n if (!started) {\r\n setMode(MODES.selectable);\r\n } else {\r\n if (!finished) {\r\n setMode(MODES.continue);\r\n } else {\r\n setMode(MODES.finished);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }, [started, finished, errors, sealed, cancelled, cancelConfirmed]);\r\n\r\n const handleClick = () => {\r\n switch (mode) {\r\n case MODES.selectable:\r\n return handleVisitSelect();\r\n case MODES.continue:\r\n return handleCancelVisitConfirm();\r\n case MODES.finished:\r\n return handleSync();\r\n case MODES.errors:\r\n return handleErrors();\r\n case MODES.sealed:\r\n return handleDeleteConfirm();\r\n case MODES.cancelled:\r\n return handleCancelSync();\r\n case MODES.cancelledConfirmed:\r\n return handleDeleteConfirm();\r\n default:\r\n return null;\r\n }\r\n };\r\n\r\n const Icon = (props) => {\r\n switch (mode) {\r\n case MODES.sealed:\r\n return ;\r\n case MODES.selectable:\r\n return ;\r\n case MODES.continue:\r\n return ;\r\n case MODES.finished:\r\n return ;\r\n case MODES.errors:\r\n return ;\r\n case MODES.cancelledConfirmed:\r\n return ;\r\n case MODES.cancelled:\r\n return ;\r\n default:\r\n return null;\r\n }\r\n };\r\n\r\n const prettyDate = (date) =>\r\n new Date(date).toLocaleDateString(\"en-gb\", {\r\n weekday: \"short\",\r\n day: \"numeric\",\r\n month: \"short\",\r\n year: \"numeric\",\r\n });\r\n\r\n const DisplayDate = () => {\r\n switch (mode) {\r\n case MODES.sealed:\r\n return `Completed: ${prettyDate(sealedDate)}`;\r\n case MODES.cancelled:\r\n return `Cancelled: ${prettyDate(cancelledDate)}`;\r\n case MODES.cancelledConfirmed:\r\n return `Cancelled: ${prettyDate(cancelledDate)}`;\r\n default:\r\n return `Expires: ${prettyDate(plannedEndDate)}`;\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n \r\n \r\n {visitType}\r\n
    \r\n {location?.name}, {location?.postcode}\r\n
    \r\n {product?.name && {product?.name}}\r\n {DisplayDate()}\r\n
    \r\n \r\n {isCancelable && }\r\n \r\n \r\n \r\n\r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nVisitDisplay.propTypes = {\r\n visit: shape({\r\n id: string,\r\n displayName: string,\r\n plannedEndDate: string,\r\n plannedStartDate: string,\r\n location: shape({ name: string, address1: string, town: string }),\r\n }).isRequired,\r\n started: bool,\r\n finished: bool,\r\n sealed: bool,\r\n inProgress: bool,\r\n};\r\n\r\nVisitDisplay.defaultProps = {\r\n visit: {},\r\n started: false,\r\n finished: false,\r\n sealed: false,\r\n inProgress: true,\r\n};\r\n\r\nexport default VisitDisplay;\r\n","import React, { useEffect, useRef, useState } from \"react\";\r\nimport LayoutBottom from \"../components/Layout/LayoutBottom\";\r\nimport LayoutTop from \"../components/Layout/LayoutTop\";\r\nimport Meta from \"../components/Meta\";\r\nimport VisitDisplay from \"../components/Visit/VisitDisplay\";\r\nimport dataService from \"../services/data\";\r\nimport styled from \"styled-components\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\n\r\nimport { useSwipeable } from \"react-swipeable\";\r\nimport { CircularProgress } from \"@material-ui/core\";\r\nimport RefreshOutlinedIcon from \"@material-ui/icons/RefreshOutlined\";\r\nimport {\r\n attemptResync,\r\n isVisitComplete,\r\n isVisitFinished,\r\n isVisitInFlight,\r\n isVisitSealedConfirmed,\r\n isVisitStarted,\r\n isVisitCancelled,\r\n isVisitCancelledConfirmed,\r\n attemptCancelResync,\r\n} from \"../services/visit\";\r\n\r\nimport {\r\n addVisit,\r\n deleteVisit,\r\n selectCancelledVisits,\r\n selectCurrentVisit,\r\n selectFinishedVisits,\r\n selectUnfinishedVisits,\r\n selectVisits,\r\n} from \"../store/visit.slice\";\r\nimport ExpandMoreIcon from \"@material-ui/icons/ExpandMore\";\r\nimport ExpandLessIcon from \"@material-ui/icons/ExpandLess\";\r\nimport CheckIcon from \"@material-ui/icons/Check\";\r\n\r\nimport {\r\n selectCurrentVisitId,\r\n selectVisitLastUpdated,\r\n setLastUpdated,\r\n} from \"../store/settings.slice\";\r\nimport Menu from \"../components/Menu/Menu\";\r\nimport { Paper } from \"@redwigwam/redalerts.elements.paper\";\r\n\r\nconst SwipeToRefreshContainer = styled.div`\r\n position: relative;\r\n`;\r\n\r\nconst RefreshSpinnerContainer = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n padding: 8px 0 16px 0;\r\n`;\r\n\r\nconst VisitsContainer = styled.div`\r\n width: 100%;\r\n position: absolute;\r\n top: ${(props) => {\r\n if (props.$loading) {\r\n return `${props.$refreshHeight}px`;\r\n } else {\r\n return `${props.$deltaY}px`;\r\n }\r\n }};\r\n`;\r\n\r\nconst VisitsPageContainer = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n`;\r\nconst LastUpdated = styled.p`\r\n font-size: 12px;\r\n text-align: center;\r\n opacity: 0.5;\r\n visibility: ${(props) => (props.show ? \"visible\" : \"hidden\")};\r\n`;\r\n\r\nconst CompletedToggle = styled.div`\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n font-size: 12px;\r\n color: ${(props) => props.theme.colours.purple};\r\n padding-bottom: 8px;\r\n > p {\r\n font-weight: bold;\r\n }\r\n`;\r\n\r\nconst NoVisits = styled.div`\r\n text-align: center;\r\n padding: 8px;\r\n`;\r\n\r\nconst Header = styled.h1`\r\n color: ${(props) => props.theme.colours.purple};\r\n font-weight: 600;\r\n`;\r\n\r\nconst NoVisitsIcon = styled(Paper)`\r\n border-radius: 50%;\r\n width: 125px;\r\n height: 125px;\r\n margin: 16px auto;\r\n\r\n svg {\r\n width: 75px;\r\n height: 75px;\r\n fill: ${(props) => props.theme.colours.purple};\r\n }\r\n`;\r\n\r\nconst StyledCircularProgress = styled(CircularProgress)`\r\n color: ${(props) => props.theme.colours.purple} !important;\r\n`;\r\nconst CompletedVisits = styled.div``;\r\nconst Visits = () => {\r\n const [deltaY, setDeltaY] = useState(0);\r\n const [loading, setLoading] = useState(false);\r\n const [triggeredRefresh, setTriggeredRefresh] = useState(false);\r\n const [showCompleted, setShowCompleted] = useState(false);\r\n const [showCancelled, setShowCancelled] = useState(false);\r\n\r\n const [swiping, setSwiping] = useState(false);\r\n const dispatch = useDispatch();\r\n const lastUpdated = useSelector(selectVisitLastUpdated);\r\n const visitPageContainerRef = useRef();\r\n const refreshSpinnerContainerRef = useRef();\r\n const visitsContainerRef = useRef();\r\n const visits = useSelector(selectVisits);\r\n const currentVisitId = useSelector(selectCurrentVisitId);\r\n const currentVisit = useSelector(selectCurrentVisit);\r\n\r\n const finishedVisits = useSelector(selectFinishedVisits);\r\n const unfinishedVisits = useSelector(selectUnfinishedVisits);\r\n const cancelledVisits = useSelector(selectCancelledVisits);\r\n\r\n const refreshHeight =\r\n refreshSpinnerContainerRef?.current?.getBoundingClientRect?.()?.height ?? 0;\r\n\r\n const handleSwiping = (e) => {\r\n setSwiping(true);\r\n const { dir, deltaY } = e;\r\n if (\r\n visitPageContainerRef?.current?.scrollTop === 0 &&\r\n dir === \"Down\" &&\r\n deltaY > 0 &&\r\n !loading\r\n ) {\r\n if (deltaY >= refreshHeight) {\r\n setLoading(true);\r\n setTriggeredRefresh((prev) => !prev);\r\n } else {\r\n setDeltaY(deltaY);\r\n }\r\n }\r\n };\r\n\r\n const handleSwiped = (e) => {\r\n setDeltaY(0);\r\n setSwiping(false);\r\n };\r\n\r\n const swipeHandlers = useSwipeable({\r\n onSwiping: handleSwiping,\r\n onSwiped: handleSwiped,\r\n });\r\n\r\n const refPassthrough = (el) => {\r\n swipeHandlers.ref(el);\r\n visitsContainerRef.current = el;\r\n };\r\n\r\n useEffect(() => {\r\n if (!loading) {\r\n setLoading(true);\r\n dataService\r\n .getVisits()\r\n .then((response) => {\r\n const visitsList = response?.data;\r\n if (visitsList) {\r\n dispatch(setLastUpdated());\r\n setLoading(false);\r\n setDeltaY(0);\r\n\r\n visitsList.forEach((visit) => {\r\n dispatch(addVisit(visit));\r\n });\r\n } else {\r\n console.error(\"Unable to update visits\", response);\r\n setLoading(false);\r\n setDeltaY(0);\r\n }\r\n })\r\n .catch((error) => {\r\n console.error(\"Unable to update visits\", error);\r\n setLoading(false);\r\n setDeltaY(0);\r\n });\r\n\r\n finishedVisits.forEach((visit) => {\r\n if (!isVisitSealedConfirmed(visit) && !isVisitInFlight(visit)) {\r\n attemptResync(visit, dispatch);\r\n }\r\n });\r\n\r\n cancelledVisits.forEach((visit) => {\r\n if (!isVisitCancelledConfirmed(visit) && !isVisitInFlight(visit)) {\r\n attemptCancelResync(visit, dispatch);\r\n }\r\n });\r\n }\r\n\r\n // we want this to run on page load and on manual update. adding finishedVisits makes it go brrrrrr\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [triggeredRefresh, dispatch]);\r\n\r\n // remove expired and unstarted visits\r\n useEffect(() => {\r\n Object.entries(visits).forEach(([visitId, visit]) => {\r\n if (\r\n new Date(visit?.data?.plannedEndDate) < Date.now() &&\r\n !visit?.started?.dateTime\r\n ) {\r\n console.log(\"Unstarted Visit Expired - remove\", visit);\r\n dispatch(deleteVisit(visitId));\r\n }\r\n if (\r\n [\"COMPLETE\", 6].includes(visit?.data?.status) &&\r\n !visit?.sealed?.dateTime\r\n ) {\r\n console.log(\"Visit already completed - remove\", visit);\r\n dispatch(deleteVisit(visitId));\r\n }\r\n });\r\n }, [visits, dispatch]);\r\n\r\n useEffect(() => {\r\n try {\r\n let hidden;\r\n let visibilityChange;\r\n\r\n if (typeof document.hidden !== \"undefined\") {\r\n hidden = \"hidden\";\r\n visibilityChange = \"visibilitychange\";\r\n } else if (typeof document.msHidden !== \"undefined\") {\r\n hidden = \"msHidden\";\r\n visibilityChange = \"msvisibilitychange\";\r\n }\r\n\r\n var document_hidden = document[hidden];\r\n\r\n const triggerRefreshOnTabFocus = () => {\r\n if (document_hidden !== document[hidden] && !document[hidden]) {\r\n setTriggeredRefresh((prev) => !prev);\r\n }\r\n document_hidden = document[hidden];\r\n };\r\n\r\n document.addEventListener(visibilityChange, () =>\r\n triggerRefreshOnTabFocus()\r\n );\r\n\r\n return document.removeEventListener(visibilityChange, () =>\r\n triggerRefreshOnTabFocus()\r\n );\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n }, []);\r\n\r\n const isCurrentVisitFinished = isVisitFinished(currentVisit);\r\n const isCurrentVisitStarted = isVisitStarted(currentVisit);\r\n\r\n // early end dates appear at top then group by location\r\n const sortedUnfinishedVisits = unfinishedVisits.sort((a, b) => {\r\n const aStarted = a?.started?.dateTime;\r\n const bStarted = b?.started?.dateTime;\r\n\r\n const aEndDate = new Date(a?.data?.plannedEndDate).getTime();\r\n const bEndDate = new Date(b?.data?.plannedEndDate).getTime();\r\n\r\n if (aStarted === bStarted) {\r\n if (aEndDate === bEndDate) {\r\n return a?.data?.location?.id.localeCompare(b?.data?.location?.id);\r\n }\r\n return aEndDate - bEndDate;\r\n }\r\n return aStarted === bStarted ? 0 : aStarted ? -1 : 1;\r\n });\r\n\r\n const sortedFinishedVisits = finishedVisits.sort(\r\n (a, b) => isVisitComplete(a) - isVisitComplete(b)\r\n );\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n setTriggeredRefresh((prev) => !prev)}\r\n >\r\n Last updated:{\" \"}\r\n {new Date(lastUpdated).toLocaleDateString(\"en-gb\", {\r\n weekday: \"short\",\r\n day: \"numeric\",\r\n month: \"short\",\r\n year: \"numeric\",\r\n hour: \"2-digit\",\r\n minute: \"2-digit\",\r\n second: \"2-digit\",\r\n })}\r\n \r\n \r\n setTriggeredRefresh((prev) => !prev)}\r\n >\r\n {loading && (\r\n <>\r\n \r\n Updating...\r\n \r\n )}\r\n {!loading && swiping && (\r\n <>\r\n \r\n Refresh\r\n \r\n )}\r\n \r\n \r\n {sortedUnfinishedVisits.length === 0 && (\r\n \r\n
    You are all caught up
    \r\n \r\n You have no new tasks available right now. Check back soon.\r\n \r\n \r\n \r\n \r\n
    \r\n )}\r\n {sortedUnfinishedVisits.length > 0 &&\r\n sortedUnfinishedVisits?.map?.((visit) => (\r\n \r\n ))}\r\n {sortedFinishedVisits.length > 0 && (\r\n <>\r\n setShowCompleted((prev) => !prev)}\r\n >\r\n {showCompleted ? : }\r\n

    \r\n {`${showCompleted ? \"Hide Completed\" : \"Show Completed\"}`}\r\n

    \r\n \r\n\r\n {showCompleted && (\r\n \r\n {sortedFinishedVisits?.map?.((visit) => (\r\n \r\n ))}\r\n \r\n )}\r\n \r\n )}\r\n {cancelledVisits.length > 0 && (\r\n <>\r\n setShowCancelled((prev) => !prev)}\r\n >\r\n {showCancelled ? : }\r\n

    \r\n {`${showCancelled ? \"Hide Cancelled\" : \"Show Cancelled\"}`}\r\n

    \r\n \r\n\r\n {showCancelled && (\r\n \r\n {cancelledVisits?.map?.((visit) => (\r\n \r\n ))}\r\n \r\n )}\r\n \r\n )}\r\n \r\n
    \r\n
    \r\n
    \r\n \r\n );\r\n};\r\nexport default Visits;\r\n","import { createSelector, createSlice } from \"@reduxjs/toolkit\";\r\n\r\nconst authSlice = createSlice({\r\n name: \"auth\",\r\n initialState: { authenticated: false },\r\n reducers: {\r\n setAuthenticated: (state, action) => {\r\n state.authenticated = action.payload;\r\n },\r\n },\r\n});\r\n\r\nexport const { setAuthenticated, setUserData } = authSlice.actions;\r\n\r\nconst selectSlice = (state) => state?.[authSlice.name];\r\n\r\nexport const selectAuthenticated = createSelector(\r\n selectSlice,\r\n (slice) => slice.authenticated || false\r\n);\r\n\r\nexport default authSlice;\r\n","import { Button } from \"@redwigwam/redalerts.elements.button\";\r\nimport React, { useEffect, useState } from \"react\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport {\r\n selectPermissionModalShown,\r\n setPermissionModalShown,\r\n} from \"../../store/settings.slice\";\r\nimport Modal from \"../Modal\";\r\n\r\nimport ReportProblemOutlinedIcon from \"@material-ui/icons/ReportProblemOutlined\";\r\nimport styled from \"styled-components\";\r\nimport ArrowForward from \"@material-ui/icons/ArrowForward\";\r\nimport ExitToApp from \"@material-ui/icons/ExitToApp\";\r\nimport authService from \"../../services/auth\";\r\nimport {\r\n checkCameraPermission,\r\n checkLocationPermission,\r\n} from \"../../services/permissions\";\r\n\r\nconst ErrorIcon = styled(ReportProblemOutlinedIcon)`\r\n width: 48px !important;\r\n height: 48px !important;\r\n color: ${(props) => props?.theme?.colours?.red};\r\n margin-bottom: 16px;\r\n`;\r\n\r\nconst NoCameraWrap = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n text-align: center;\r\n\r\n p {\r\n width: 100%;\r\n margin: 0 0 16px 0;\r\n font-size: 14px;\r\n }\r\n`;\r\n\r\nconst GenericWrap = styled(NoCameraWrap)`\r\n text-align: left;\r\n\r\n h1 {\r\n text-align: center;\r\n font-family: Montserrat;\r\n font-weight: 500;\r\n font-size: 24px;\r\n line-height: 29px;\r\n color: ${(props) => props?.theme?.colours?.purple};\r\n\r\n margin-bottom: 16px;\r\n }\r\n`;\r\n\r\nconst Permissions = () => {\r\n const [open, setOpen] = useState(false);\r\n const permissionModalShown = useSelector(selectPermissionModalShown);\r\n const [cameras, setCameras] = useState();\r\n\r\n const dispatch = useDispatch();\r\n useEffect(() => {\r\n if (!permissionModalShown) {\r\n getCameraDevices();\r\n\r\n setOpen(true);\r\n }\r\n }, [permissionModalShown]);\r\n\r\n const handleLogout = () => {\r\n authService.logOut();\r\n };\r\n\r\n const handleClose = () => {\r\n setOpen(false);\r\n dispatch(setPermissionModalShown(true));\r\n checkCameraPermission();\r\n checkLocationPermission();\r\n };\r\n\r\n const getCameraDevices = () => {\r\n navigator.mediaDevices.enumerateDevices().then((data) => {\r\n const videoDevices = data?.filter(\r\n (device) => device?.kind === \"videoinput\"\r\n );\r\n setCameras(videoDevices);\r\n });\r\n };\r\n\r\n return (\r\n \r\n {cameras?.length === 0 ? (\r\n \r\n \r\n

    Unfortunately no cameras were detected on this device.

    \r\n

    \r\n Tasks often require photographic evidence, so please try again on\r\n another device\r\n

    \r\n }\r\n onClick={handleLogout}\r\n />\r\n
    \r\n ) : (\r\n \r\n

    Welcome to Redwigwam tasks

    \r\n

    Before we begin, our app requires a couple of permissions.

    \r\n

    \r\n After closing this message, your device will prompt for both camera\r\n and location access. This is needed as all tasks require some\r\n photographic and geographic evidence.\r\n

    \r\n\r\n }\r\n />\r\n
    \r\n )}\r\n
    \r\n );\r\n};\r\n\r\nexport default Permissions;\r\n","import React from \"react\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { Redirect, Route } from \"react-router-dom\";\r\nimport { selectAuthenticated } from \"../../store/auth.slice\";\r\nimport Permissions from \"../Permissions\";\r\n\r\nconst AuthRoute = (props) => {\r\n const isAuthenticated = useSelector(selectAuthenticated);\r\n return isAuthenticated ? (\r\n <>\r\n \r\n {\" \"}\r\n \r\n ) : (\r\n \r\n );\r\n};\r\nexport default AuthRoute;\r\n","export default __webpack_public_path__ + \"static/media/splashscreen.f2b96652.jpg\";","import React from \"react\";\r\nimport styled from \"styled-components\";\r\nimport splashImage from \"../images/splashscreen.jpg\";\r\nimport logo from \"../images/login-logo.png\";\r\n\r\nconst SplashBackground = styled.div`\r\n background-image: url(${splashImage});\r\n background-size: cover;\r\n height: 100%;\r\n background-repeat: no-repeat;\r\n width: 100%;\r\n background-position: center;\r\n\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n`;\r\n\r\nconst Circle = styled.div`\r\n width: 180px;\r\n height: 180px;\r\n background-color: white;\r\n border-radius: 50%;\r\n\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n`;\r\n\r\nconst Logo = styled.img`\r\n padding: 36px;\r\n width: 100%;\r\n`;\r\n\r\nconst LoadingSplash = () => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default LoadingSplash;\r\n","import ArrowForward from \"@material-ui/icons/ArrowForward\";\r\nimport { Button } from \"@redwigwam/redalerts.elements.button\";\r\nimport React from \"react\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport { useHistory } from \"react-router\";\r\nimport styled from \"styled-components\";\r\nimport LayoutBottom from \"../components/Layout/LayoutBottom\";\r\nimport LayoutTop from \"../components/Layout/LayoutTop\";\r\nimport Meta from \"../components/Meta\";\r\nimport DoneOutlinedIcon from \"@material-ui/icons/DoneOutlined\";\r\nimport DoneAllOutlinedIcon from \"@material-ui/icons/DoneAllOutlined\";\r\n\r\nimport {\r\n selectCurrentQuestions,\r\n selectIsCurrentCategoryComplete,\r\n selectCurrentAnswers,\r\n} from \"../store/visit.slice\";\r\n\r\nimport {\r\n selectCurrentCategory,\r\n setCurrentQuestionId,\r\n} from \"../store/settings.slice\";\r\nimport Menu from \"../components/Menu/Menu\";\r\n\r\nconst QuestionContainer = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n`;\r\n\r\nconst QuestionButton = styled(Button)`\r\n margin-bottom: 16px;\r\n > div {\r\n justify-content: space-between;\r\n > span {\r\n display: flex;\r\n align-items: center;\r\n text-align: left;\r\n }\r\n }\r\n`;\r\n\r\nconst ContinueButton = styled(Button)`\r\n margin-bottom: 48px;\r\n`;\r\n\r\nconst CategoryTitle = styled.h1`\r\n color: ${(props) => props?.theme?.colours?.purple};\r\n font-weight: 600;\r\n text-align: center;\r\n`;\r\n\r\nconst Steps = () => {\r\n const history = useHistory();\r\n const dispatch = useDispatch();\r\n\r\n const questions = useSelector(selectCurrentQuestions);\r\n\r\n const currentVisitAnswers = useSelector(selectCurrentAnswers);\r\n\r\n const currentCategoryName = useSelector(selectCurrentCategory);\r\n\r\n const isCategoryComplete = useSelector(selectIsCurrentCategoryComplete);\r\n\r\n const handleGoToQuestion = (questionId) => {\r\n dispatch(setCurrentQuestionId(questionId));\r\n history.push(`/visit/question`);\r\n };\r\n const questionsInCurrentCategory = questions.filter((question) => {\r\n const { category } = question;\r\n return category === currentCategoryName;\r\n });\r\n\r\n if (questionsInCurrentCategory.length === 0) {\r\n console.error(\"No steps, moving to categories\");\r\n history.push(\"/visit/categories\");\r\n return null;\r\n }\r\n\r\n const isAnswered = (questionId) => {\r\n return Boolean(currentVisitAnswers?.[questionId]?.answer);\r\n };\r\n\r\n const hasOutcome = (questionId) => {\r\n return (\r\n currentVisitAnswers?.[questionId]?.answer?.Intervention &&\r\n currentVisitAnswers?.[questionId]?.answer?.Outcome\r\n );\r\n };\r\n\r\n //const isConfirmed = (questionId) => {\r\n //return Boolean(currentVisitAnswers?.[questionId]?.serverConfirmed);\r\n //};\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n {currentCategoryName}\r\n \r\n {questionsInCurrentCategory.map(({ id, subcategory }, index) => {\r\n const previousQuestion = questionsInCurrentCategory?.[index - 1];\r\n const isThisAnswered = isAnswered(id);\r\n const isPrevAnswered =\r\n isAnswered(previousQuestion?.id) || index === 0;\r\n\r\n const isThisHasOutcome = hasOutcome(id);\r\n\r\n const currentQuestion =\r\n !isThisAnswered && (isPrevAnswered || !previousQuestion);\r\n\r\n return (\r\n handleGoToQuestion(id)}\r\n endIcon={\r\n <>\r\n {!isThisAnswered ? (\r\n \r\n ) : isThisHasOutcome ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n }\r\n />\r\n );\r\n })}\r\n {\r\n history.push(\"/visit/categories\");\r\n }}\r\n />\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default Steps;\r\n","import { Button } from \"@redwigwam/redalerts.elements.button\";\r\nimport React from \"react\";\r\nimport { useHistory } from \"react-router\";\r\nimport styled from \"styled-components\";\r\nimport Meta from \"../components/Meta\";\r\n\r\nconst Container = styled.div`\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n flex-direction: column;\r\n text-align: center;\r\n\r\n height: 100%;\r\n`;\r\n\r\nconst Page404 = () => {\r\n const history = useHistory();\r\n const handleReturn = () => {\r\n history.push(\"/\");\r\n };\r\n return (\r\n \r\n \r\n

    Oops, something has gone wrong.

    \r\n \r\n \r\n \r\n
    \r\n
    {JSON.stringify(geoLocationOutput, null, 2)}
    \r\n
    {JSON.stringify(geoPermission, null, 2)}
    \r\n
    \r\n \r\n\r\n
    \r\n Camera\r\n\r\n
    \r\n \r\n
    \r\n
    \r\n
    {JSON.stringify(cameraOutput, null, 2)}
    \r\n
    {JSON.stringify(cameraPermission, null, 2)}
    \r\n
    \r\n
    \r\n\r\n {/*
    \r\n Storage\r\n\r\n
    {JSON.stringify(storage._config, null, 2)}
    \r\n
    \r\n            Available Storage: {storageQuota.used}/{storageQuota.total}\r\n          
    \r\n
    */}\r\n \r\n \r\n );\r\n};\r\n\r\nexport default Debug;\r\n","import React, { createContext, useEffect, useState } from \"react\";\r\nimport { BrowserRouter as Router, Route, Switch } from \"react-router-dom\";\r\n\r\nimport Login from \"./pages/Login\";\r\nimport Visits from \"./pages/Visits\";\r\n\r\nimport AuthRoute from \"./components/AuthRoute\";\r\nimport authService from \"./services/auth\";\r\nimport { setAuthenticated } from \"./store/auth.slice\";\r\nimport { setUserData } from \"./store/user.slice\";\r\n\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport LoadingSplash from \"./pages/LoadingSplash\";\r\nimport Steps from \"./pages/Steps\";\r\nimport Question from \"./pages/Question\";\r\nimport Page404 from \"./pages/404\";\r\nimport Categories from \"./pages/Categories\";\r\nimport FollowOnVisits from \"./pages/FollowOnVisits\";\r\nimport { selectRehydrated } from \"./store\";\r\nimport UpdateBar from \"./components/UpdateBar\";\r\nimport { clearVisits } from \"./store/visit.slice\";\r\nimport { clearSettings } from \"./store/settings.slice\";\r\nimport Debug from \"./pages/Debug\";\r\n\r\nexport const AuthContext = createContext(false);\r\n\r\nconst App = () => {\r\n const [authReady, setAuthReady] = useState(false);\r\n\r\n const dispatch = useDispatch();\r\n\r\n const forcedWaitDuration = 2000; //ms\r\n const [forcedWaitComplete, setForcedWaitComplete] = useState(false);\r\n\r\n const rehydrated = useSelector(selectRehydrated);\r\n\r\n useEffect(() => {\r\n const silentLogin = async () => {\r\n authService.registerListener((token) => {\r\n if (token) {\r\n dispatch(setAuthenticated(true));\r\n } else {\r\n dispatch(setAuthenticated(false));\r\n dispatch(clearVisits());\r\n dispatch(clearSettings());\r\n dispatch(setUserData());\r\n }\r\n });\r\n authService\r\n .silentLogIn()\r\n .then(() => {\r\n console.log(\"[AUTH] - Silent Success\");\r\n dispatch(setAuthenticated(true));\r\n })\r\n .catch((e) => {\r\n const { token: { token, expiry } = {}, error } = e;\r\n console.error(\"[AUTH] - Silent Fail\", error);\r\n if (token && new Date() > expiry) {\r\n console.log(\"[AUTH] - Token is still valid - Allow login\");\r\n dispatch(setAuthenticated(true));\r\n } else {\r\n console.error(\"[AUTH] - Token missing or expired - Log out\");\r\n authService.logOut();\r\n }\r\n })\r\n .finally(() => {\r\n setAuthReady(true);\r\n });\r\n };\r\n silentLogin();\r\n }, [dispatch]);\r\n\r\n // attempt to lock screen orientation to portrait\r\n useEffect(() => {\r\n try {\r\n window.screen.orientation\r\n .lock(\"portrait\")\r\n .then(() => console.log(\"Screen locked to portrait\"))\r\n .catch((e) => {\r\n console.error(\"Error locking screen orientation\", e);\r\n });\r\n } catch (e) {\r\n console.error(\"Error locking screen orientation\", e);\r\n }\r\n }, []);\r\n\r\n // show splashscreen some seconds\r\n\r\n useEffect(() => {\r\n setTimeout(() => {\r\n setForcedWaitComplete(true);\r\n }, forcedWaitDuration);\r\n }, []);\r\n\r\n return (\r\n <>\r\n \r\n\r\n {rehydrated && authReady && forcedWaitComplete ? (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ) : (\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default App;\r\n","// This optional code is used to register a service worker.\r\n// register() is not called by default.\r\n// This lets the app load faster on subsequent visits in production, and gives\r\n// it offline capabilities. However, it also means that developers (and users)\r\n// will only see deployed updates on subsequent visits to a page, after all the\r\n// existing tabs open on the page have been closed, since previously cached\r\n// resources are updated in the background.\r\n// To learn more about the benefits of this model and instructions on how to\r\n// opt-in, read https://cra.link/PWA\r\nconst isLocalhost = Boolean(\r\n window.location.hostname === \"localhost\" ||\r\n // [::1] is the IPv6 localhost address.\r\n window.location.hostname === \"[::1]\" ||\r\n // 127.0.0.0/8 are considered localhost for IPv4.\r\n window.location.hostname.match(\r\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\r\n )\r\n);\r\nexport function register(config) {\r\n if (process.env.NODE_ENV === \"production\" && \"serviceWorker\" in navigator) {\r\n // The URL constructor is available in all browsers that support SW.\r\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\r\n if (publicUrl.origin !== window.location.origin) {\r\n // Our service worker won't work if PUBLIC_URL is on a different origin\r\n // from what our page is served on. This might happen if a CDN is used to\r\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\r\n return;\r\n }\r\n window.addEventListener(\"load\", () => {\r\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\r\n if (isLocalhost) {\r\n // This is running on localhost. Let's check if a service worker still exists or not.\r\n checkValidServiceWorker(swUrl, config);\r\n // Add some additional logging to localhost, pointing developers to the\r\n // service worker/PWA documentation.\r\n navigator.serviceWorker.ready.then(() => {\r\n console.log(\r\n \"This web app is being served cache-first by a service \" +\r\n \"worker. To learn more, visit https://cra.link/PWA\"\r\n );\r\n });\r\n } else {\r\n // Is not localhost. Just register service worker\r\n registerValidSW(swUrl, config);\r\n }\r\n });\r\n }\r\n}\r\nfunction registerValidSW(swUrl, config) {\r\n navigator.serviceWorker\r\n .register(swUrl)\r\n .then((registration) => {\r\n registration.onupdatefound = () => {\r\n const installingWorker = registration.installing;\r\n if (installingWorker == null) {\r\n return;\r\n }\r\n\r\n installingWorker.onstatechange = () => {\r\n if (installingWorker.state === \"installed\") {\r\n if (navigator.serviceWorker.controller) {\r\n // At this point, the updated precached content has been fetched,\r\n // but the previous service worker will still serve the older\r\n // content until all client tabs are closed.\r\n console.log(\r\n \"New content is available and will be used when all \" +\r\n \"tabs for this page are closed. See https://cra.link/PWA.\"\r\n );\r\n // Execute callback\r\n if (config && config.onUpdate) {\r\n // tells front end to display update bar\r\n config.onUpdate(registration);\r\n }\r\n\r\n // listens to front end to trigger skip wait\r\n const updateButton = document.getElementById(\r\n \"skip-waiting-button\"\r\n );\r\n updateButton.addEventListener(\"click\", () => {\r\n installingWorker.postMessage({ type: \"SKIP_WAITING\" });\r\n });\r\n } else {\r\n // At this point, everything has been precached.\r\n // It's the perfect time to display a\r\n // \"Content is cached for offline use.\" message.\r\n console.log(\"Content is cached for offline use.\");\r\n // Execute callback\r\n if (config && config.onSuccess) {\r\n config.onSuccess(registration);\r\n }\r\n }\r\n }\r\n };\r\n };\r\n })\r\n .catch((error) => {\r\n console.error(\"Error during service worker registration:\", error);\r\n });\r\n\r\n let refreshing = false;\r\n // detect controller change and refresh the page\r\n navigator.serviceWorker.addEventListener(\"controllerchange\", () => {\r\n if (!refreshing) {\r\n window.location.reload();\r\n refreshing = true;\r\n }\r\n });\r\n}\r\nfunction checkValidServiceWorker(swUrl, config) {\r\n // Check if the service worker can be found. If it can't reload the page.\r\n fetch(swUrl, {\r\n headers: { \"Service-Worker\": \"script\" },\r\n })\r\n .then((response) => {\r\n // Ensure service worker exists, and that we really are getting a JS file.\r\n const contentType = response.headers.get(\"content-type\");\r\n if (\r\n response.status === 404 ||\r\n (contentType != null && contentType.indexOf(\"javascript\") === -1)\r\n ) {\r\n // No service worker found. Probably a different app. Reload the page.\r\n navigator.serviceWorker.ready.then((registration) => {\r\n registration.unregister().then(() => {\r\n window.location.reload();\r\n });\r\n });\r\n } else {\r\n // Service worker found. Proceed as normal.\r\n registerValidSW(swUrl, config);\r\n }\r\n })\r\n .catch((e) => {\r\n console.error(\r\n \"No internet connection found. App is running in offline mode.\"\r\n );\r\n });\r\n}\r\n\r\nexport function unregister() {\r\n if (\"serviceWorker\" in navigator) {\r\n navigator.serviceWorker.ready\r\n .then((registration) => {\r\n registration.unregister();\r\n })\r\n .catch((error) => {\r\n console.error(error.message);\r\n });\r\n }\r\n}\r\n","import React from \"react\";\r\nimport ReactDOM from \"react-dom\";\r\nimport App from \"./App\";\r\nimport * as serviceWorkerRegistration from \"./serviceWorkerRegistration\";\r\nimport { Provider } from \"react-redux\";\r\n\r\nimport { Wrapper } from \"@redwigwam/redalerts.theme.wrapper\";\r\n\r\nimport { store, persistor } from \"./store\";\r\n\r\nimport \"./index.css\";\r\nimport { PersistGate } from \"redux-persist/integration/react\";\r\nimport { setUpdateAvailable } from \"./store/settings.slice\";\r\n\r\nReactDOM.render(\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ,\r\n document.getElementById(\"root\")\r\n);\r\n\r\n// If you want your app to work offline and load faster, you can change\r\n// unregister() to register() below. Note this comes with some pitfalls.\r\n// Learn more about service workers: https://cra.link/PWA\r\n\r\nconst serviceWorkerConfig = {\r\n onUpdate: () => {\r\n store.dispatch(setUpdateAvailable(true));\r\n },\r\n};\r\n\r\nserviceWorkerRegistration.register(serviceWorkerConfig);\r\n","import React from \"react\";\r\nimport { Helmet } from \"react-helmet\";\r\nimport { string } from \"prop-types\";\r\n\r\nconst propTypes = {\r\n title: string.isRequired,\r\n description: string,\r\n};\r\n\r\nconst defaultProps = {\r\n description: null,\r\n};\r\n\r\nconst Meta = ({ title, description }) => {\r\n return (\r\n \r\n {title} | redwigwam tasks\r\n {description && }\r\n \r\n );\r\n};\r\n\r\nMeta.propTypes = propTypes;\r\nMeta.defaultProps = defaultProps;\r\n\r\nexport default Meta;\r\n","import { createSelector, createSlice } from \"@reduxjs/toolkit\";\r\n\r\nconst userSlice = createSlice({\r\n name: \"user\",\r\n initialState: { data: {} },\r\n reducers: {\r\n setUserData: (state, action) => {\r\n state.data = action.payload;\r\n },\r\n },\r\n});\r\n\r\nexport const { setAuthenticated, setUserData } = userSlice.actions;\r\n\r\nconst selectSlice = (state) => state?.[userSlice.name];\r\n\r\nexport const selectUserData = createSelector(\r\n selectSlice,\r\n (slice) => slice.data || {}\r\n);\r\n\r\nexport const selectFullName = createSelector(\r\n selectUserData,\r\n (data) => data?.fullName\r\n);\r\n\r\nexport const selectProfileUrl = createSelector(\r\n selectUserData,\r\n (data) => data?.profileUrl\r\n);\r\n\r\nexport const LoggedInName = createSelector(\r\n selectUserData,\r\n (data) => data?.fullName?.split?.(\" \")?.[0]\r\n);\r\n\r\nexport const LoggedInEmail = createSelector(\r\n selectUserData,\r\n (data) => data.emailAddress || \"\"\r\n);\r\n\r\nexport default userSlice;\r\n","import React from \"react\";\r\nimport styled from \"styled-components\";\r\n\r\nexport const height = \"130px\";\r\n\r\nconst Background = styled.div`\r\n background-color: ${(props) => props?.theme?.colours?.purple};\r\n height: ${height};\r\n padding: 14px 14px 0 14px;\r\n`;\r\n\r\nconst Container = styled.div`\r\n max-width: 600px;\r\n margin: 0 auto;\r\n position: relative;\r\n`;\r\n\r\nconst LayoutTop = ({ children }) => {\r\n \r\n\r\n return (\r\n \r\n \r\n {children}\r\n \r\n \r\n );\r\n};\r\n\r\nexport default LayoutTop;\r\n","import axios from \"axios\";\r\nimport localforage from \"localforage\";\r\n\r\nexport class AuthService {\r\n constructor(name = \"authStorage\") {\r\n this.error = null;\r\n this.listener = null;\r\n this.refreshTimeout = null;\r\n this.store = localforage.createInstance({ name });\r\n }\r\n\r\n async getRefreshToken() {\r\n return await this.store.getItem(\"refreshToken\");\r\n }\r\n\r\n async getAccessToken() {\r\n const token = await this.store.getItem(\"accessToken\");\r\n const expiry = await this.store.getItem(\"accessTokenExpiryTime\");\r\n\r\n return { token, expiry };\r\n }\r\n\r\n setRefreshToken(token) {\r\n if (token) {\r\n this.store.setItem(\"refreshToken\", token);\r\n } else {\r\n this.store.removeItem(\"refreshToken\");\r\n }\r\n }\r\n\r\n setAccessToken(token, expiry) {\r\n if (token) {\r\n const expiryTime = new Date().getTime() + expiry * 1000;\r\n\r\n this.store.setItem(\"accessToken\", token);\r\n this.store.setItem(\"accessTokenExpiryTime\", expiryTime);\r\n } else {\r\n this.store.removeItem(\"accessToken\");\r\n this.store.removeItem(\"accessTokenExpiryTime\");\r\n }\r\n\r\n this.listener(token, expiry);\r\n }\r\n\r\n registerListener(func) {\r\n this.listener = func;\r\n }\r\n\r\n async silentLogIn() {\r\n return new Promise((resolve, reject) => {\r\n try {\r\n // grab token from storage\r\n this.getRefreshToken().then((refreshToken) => {\r\n if (!refreshToken) {\r\n this.getAccessToken().then((token) =>\r\n reject({ token, error: \"No refresh token\" })\r\n );\r\n }\r\n\r\n // build request as per spec\r\n //https://datatracker.ietf.org/doc/html/rfc6749#section-6\r\n const params = new URLSearchParams();\r\n params.append(\"grant_type\", \"refresh_token\");\r\n params.append(\"refresh_token\", refreshToken);\r\n params.append(\"client_id\", OIDC_CONSTS.clientId);\r\n params.append(\"scope\", OIDC_CONSTS.scope);\r\n params.append(\"response_type\", \"id_token\");\r\n\r\n const config = {\r\n headers: {\r\n \"Content-Type\": \"application/x-www-form-urlencoded\",\r\n },\r\n };\r\n\r\n // send request\r\n\r\n axios\r\n .post(\"/connect/token\", params, config)\r\n .then((response) => {\r\n const { data: { access_token, expires_in, refresh_token } = {} } =\r\n response;\r\n if (!access_token || !expires_in || !refresh_token) {\r\n this.getAccessToken().then((token) =>\r\n reject({ token, error: \"Unexpected response\" })\r\n );\r\n }\r\n\r\n // store tokens in store\r\n this.setAccessToken(access_token, expires_in);\r\n this.setRefreshToken(refresh_token);\r\n\r\n this.registerTokenRefresh(expires_in);\r\n\r\n this.getAccessToken().then((token) => resolve({ token }));\r\n })\r\n .catch((e) => {\r\n this.getAccessToken().then((token) =>\r\n reject({ token, error: e.message })\r\n );\r\n });\r\n });\r\n } catch (e) {\r\n this.getAccessToken().then((token) =>\r\n reject({ token, error: e.message })\r\n );\r\n }\r\n });\r\n }\r\n\r\n registerTokenRefresh(expiry) {\r\n const nextSilentRefresh = new Date().getTime() + expiry * 1000;\r\n console.log(\"Next silent refresh\", new Date(nextSilentRefresh));\r\n this.refreshTimeout = setTimeout(() => {\r\n this.silentLogIn();\r\n }, expiry * 1000);\r\n }\r\n\r\n logOut() {\r\n // remove refresh token and reload page\r\n this.setAccessToken();\r\n this.setRefreshToken();\r\n clearTimeout(this.refreshTimeout);\r\n }\r\n\r\n async logIn(username, password) {\r\n // build request as per spec\r\n // https://datatracker.ietf.org/doc/html/rfc6749#section-4.4.2\r\n const params = new URLSearchParams();\r\n params.append(\"username\", username);\r\n params.append(\"password\", password);\r\n params.append(\"grant_type\", \"password\");\r\n params.append(\"scope\", OIDC_CONSTS.scope);\r\n params.append(\"client_id\", OIDC_CONSTS.clientId);\r\n\r\n const config = {\r\n headers: {\r\n \"Content-Type\": \"application/x-www-form-urlencoded\",\r\n },\r\n };\r\n\r\n const { data: { access_token, expires_in, refresh_token } = {} } =\r\n await axios.post(\"/connect/token\", params, config);\r\n\r\n if (!access_token || !expires_in || !refresh_token) {\r\n throw new Error(\"Unexpected token response\");\r\n }\r\n\r\n // store response in memory\r\n this.setAccessToken(access_token, expires_in);\r\n\r\n // store token in store\r\n this.setRefreshToken(refresh_token);\r\n\r\n this.registerTokenRefresh();\r\n }\r\n}\r\n\r\nconst authService = new AuthService();\r\n\r\nexport default authService;\r\n\r\nexport const OIDC_CONSTS = {\r\n scope: \"RwwWorkerAppPWAAPI openid profile offline_access\", // offline access adds refresh token to responses\r\n clientId: \"RwwWorkerAppPWA\",\r\n};\r\n","import React from \"react\";\r\nimport styled from \"styled-components\";\r\n\r\nimport { height } from \"./LayoutTop\";\r\n\r\nconst Wrap = styled.div`\r\n height: calc(100% - ${height});\r\n background-color: rgba(37,16,16,0.05);\r\n`;\r\nconst Container = styled.div`\r\n overflow-y: auto;\r\n height: 100%;\r\n max-width: 600px;\r\n margin: 0 auto;\r\n padding: 0 24px;\r\n @media (max-width: 600px) {\r\n padding: 0 16px;\r\n }\r\n\r\n @media (max-width: 1024px) and (min-width: 768px) {\r\n ::-webkit-scrollbar {\r\n width: 7px;\r\n }\r\n \r\n ::-webkit-scrollbar-thumb {\r\n background: ${(props) => props.theme.colours.purple};\r\n }\r\n \r\n ::-webkit-scrollbar-track {\r\n background: #E5D4E2;\r\n }\r\n }\r\n`;\r\n\r\nconst LayoutBottom = ({ children, containerRef, ...rest }) => {\r\n return (\r\n \r\n \r\n {children}\r\n \r\n \r\n );\r\n};\r\n\r\nexport default LayoutBottom;\r\n","import { Button } from \"@redwigwam/redalerts.elements.button\";\r\nimport React from \"react\";\r\nimport { useHistory } from \"react-router\";\r\nimport styled from \"styled-components\";\r\n\r\nconst StyledButton = styled(Button)`\r\n color: white;\r\n margin: 0;\r\n\r\n :hover {\r\n color: lightgrey;\r\n }\r\n`;\r\n\r\nconst BackButton = ({ path }) => {\r\n const history = useHistory();\r\n const handleClick = () => {\r\n if (path) {\r\n history.push(path);\r\n } else {\r\n history.goBack();\r\n }\r\n };\r\n return (\r\n \r\n \r\n \r\n \r\n }\r\n />\r\n );\r\n};\r\n\r\nexport default BackButton;\r\n","import { Button } from \"@redwigwam/redalerts.elements.button\";\r\nimport React, { useEffect, useState } from \"react\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport BackButton from \"../Button/BackButton\";\r\nimport { ProgressBar } from \"@redwigwam/redalerts.elements.progress-bar\";\r\nimport styled from \"styled-components\";\r\n\r\nimport AccountCircleOutlinedIcon from \"@material-ui/icons/AccountCircleOutlined\";\r\nimport MenuDrawer from \"../Menu/MenuDrawer\";\r\n\r\nimport { LoggedInName } from \"../../store/user.slice\";\r\nimport {\r\n selectCategoryProgress,\r\n selectCurrentProdName,\r\n selectCurrentSKU,\r\n selectCurrentStore,\r\n selectCurrentVisitErrors,\r\n selectIsCurrentCategoryExcluded,\r\n selectVisitType,\r\n} from \"../../store/visit.slice\";\r\nimport Modal from \"../Modal\";\r\nimport { useHistory } from \"react-router\";\r\nimport {\r\n setCurrentCategory,\r\n setCurrentQuestionId,\r\n setCurrentVisitId,\r\n} from \"../../store/settings.slice\";\r\n\r\nconst Heading = styled.div`\r\n color: white;\r\n font-size: 14px;\r\n margin-bottom: 4px;\r\n`;\r\n\r\nconst VisitHeading = styled.h1`\r\n color: white;\r\n`;\r\n\r\nconst ProductName = styled.div`\r\n color: rgba(255, 255, 255, 0.5);\r\n font-weight: 600;\r\n font-size: 12px;\r\n overflow-y: scroll;\r\n white-space: nowrap;\r\n width: 185px;\r\n`;\r\n\r\nconst ProductSKU = styled.div`\r\n color: rgba(255, 255, 255, 0.5);\r\n font-size: 12px;\r\n margin-top: 2px;\r\n`;\r\n\r\nconst HeadingContainer = styled.div`\r\n text-align: center;\r\n margin-top: 14px;\r\n`;\r\n\r\nconst Container = styled.div`\r\n display: flex;\r\n justify-content: space-between;\r\n`;\r\n\r\nconst LogoutButton = styled(Button)`\r\n color: white;\r\n margin: 0;\r\n`;\r\n\r\nconst VisitType = styled.div`\r\n font-size: 16px;\r\n color: rgba(255, 255, 255, 0.5);\r\n font-weight: 600;\r\n`;\r\n\r\nconst HomeContainer = styled.div`\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n`;\r\n\r\nconst HelloText = styled.div`\r\n font-size: 14px;\r\n font-weight: 600;\r\n color: rgba(255, 255, 255, 0.5);\r\n margin-left: 14px;\r\n`;\r\n\r\nconst Menu = ({ home, backButtonPath }) => {\r\n const [menuOpen, setMenuOpen] = useState(false);\r\n const currStore = useSelector(selectCurrentStore);\r\n const currProdName = useSelector(selectCurrentProdName);\r\n const currSKU = useSelector(selectCurrentSKU);\r\n const visitType = useSelector(selectVisitType);\r\n const categoryProgress = useSelector(selectCategoryProgress);\r\n const hideProgressBar = useSelector(selectIsCurrentCategoryExcluded);\r\n const name = useSelector(LoggedInName);\r\n const dispatch = useDispatch();\r\n\r\n const history = useHistory();\r\n const [showErrorModal, setShowErrorModal] = useState(false);\r\n const currentVisitErrors = useSelector(selectCurrentVisitErrors);\r\n // show visit error modal\r\n useEffect(() => {\r\n if (currentVisitErrors.length > 0) {\r\n setShowErrorModal(true);\r\n }\r\n }, [currentVisitErrors]);\r\n\r\n const handleError = () => {\r\n dispatch(setCurrentVisitId());\r\n dispatch(setCurrentQuestionId());\r\n dispatch(setCurrentCategory());\r\n setShowErrorModal(false);\r\n history.push(\"/\");\r\n };\r\n\r\n return (\r\n <>\r\n \r\n

    \r\n An error has occured in this task, for more details, refer to task on\r\n home screen\r\n

    \r\n