{"version":3,"sources":["services/errorFactory.ts","hooks/useSharedContext.ts","services/persistenceManager.ts","hooks/useIsMobile.ts","hooks/usePollOrderStatus.ts","resources/CurbsideIcon.svg","resources/rocket.png","resources/soft-bells-495.mp3","services/codeGenerator.ts","services/api.ts","components/Button/Button.tsx","constants/intervals.ts","services/sounds.ts","components/ConnectionStatusSnackbar/styled.ts","components/ConnectionStatusSnackbar/ConnectionStatusSnackbar.tsx","scenes/ActiveOrdersDisplay/styled.ts","constants/layout.ts","components/AppHeader/styled.ts","components/DropdownMenu/styled.ts","components/DropdownMenu/OpenDropdownMenu.tsx","components/DropdownMenu/DropdownMenu.tsx","components/AppHeader/AppHeader.tsx","components/OrderTracker/styled.ts","components/OrderCardFieldsDisplay/styled.ts","components/OrderCardFieldsDisplay/OrderCardFieldsDisplay.tsx","components/OrderCard/styled.ts","services/orderCalculations.ts","components/OrderCard/OrderCard.tsx","components/AnimatedOrderCard/styled.ts","components/AnimatedOrderCard/AnimatedOrderCard.tsx","components/PrivateRoute/styled.ts","components/Spinner/styled.ts","components/Spinner/Spinner.tsx","components/OrderTracker/helpers.ts","components/OrderTracker/OrderTracker.tsx","components/EnableSoundControl/styled.ts","components/EnableSoundControl/EnableSoundControl.tsx","components/OrderDetailsDisplay/helpers.ts","components/OrderDetailsDisplay/components/CustomDataCard/styled.ts","components/OrderDetailsDisplay/components/CustomDataCard/CustomDataCard.tsx","components/OrderDetailsDisplay/styled.ts","components/OrderDetailsDisplay/components/ChangeOrderStatus/styled.ts","components/OrderDetailsDisplay/components/ChangeOrderStatus/ChangeOrderStatus.tsx","components/OrderDetailsDisplay/components/OrderSuccessMessage/OrderSuccessMessage.tsx","components/OrderDetailsDisplay/OrderDetailsDisplay.tsx","components/OrderDetailsDisplay/useOrderDetailsDisplayController.ts","components/SearchBar/styled.ts","components/SearchBar/SearchBar.tsx","hooks/useOrderSearchFilter.ts","components/WaitTimeDisplay/styled.ts","components/WaitTimeDisplay/WaitTimeDisplay.tsx","components/NavigationLinks/styled.ts","components/NavigationLinks/NavigationLinks.tsx","scenes/ActiveOrdersDisplay/ActiveOrdersDisplay.tsx","components/AppContainer/styled.ts","components/AppContainer/AppContainer.tsx","components/RegionSelector/styled.ts","components/RegionSelector/RegionSelector.tsx","scenes/OneTimeCodeSetup/styled.ts","types/RegionType.ts","scenes/OneTimeCodeSetup/OneTimeCodeSetup.tsx","scenes/OrderHistoryDisplay/styled.ts","components/BackwardsNavigation/styled.ts","components/BackwardsNavigation/BackwardsNavigation.tsx","scenes/OrderHistoryDisplay/OrderHistoryDisplay.tsx","components/LoadingPage/LoadingPage.tsx","components/PrivateRoute/PrivateRoute.tsx","components/UrlLinkingFailed/styled.ts","components/UrlLinkingFailed/UrlLinkingFailed.tsx","components/UrlLinker/UrlLinker.tsx","components/AutoRefresh/styled.ts","components/AutoRefresh/AutoRefresh.tsx","scenes/SsoLogin/styled.ts","scenes/SsoLogin/SsoLogin.tsx","scenes/SsoLink/styled.ts","scenes/SsoLink/SsoLink.tsx","App.tsx","hooks/usePollAppVersion.ts","hooks/useLockScalingForNativeApp.ts","serviceWorker.ts","index.tsx","services/utils.ts","resources/Bluedot_Logo.png","components/LayoutComponents/styled.ts","hooks/useModalTabController.ts","hooks/useStore.ts","hooks/useIsOnline.ts","services/theme.ts","components/Button/styled.ts","components/OrderStatusContext/OrderStatusContext.tsx","components/AriaHideMainContentContext/AriaHideMainContentContext.tsx","hooks/useOrderDetailsOverlay.ts","components/ConfirmationModal/styled.ts","components/ConfirmationModal/ConfirmationModal.tsx","components/ConfirmationModal/ConfirmationModalContext.tsx","data/mockStateDefinitions.ts","components/StateDefinitionsContext/StateDefinitionsContext.tsx","hooks/useOrderStateConfiguration.ts","components/WaitTimeDisplay/WaitTimeContext.tsx","hooks/usePollWaitTime.ts"],"names":["NOT_YET_LINKED_ERROR","UNKNOWN_ERROR","NETWORK_CONNECTION_ERROR","SSO_DESTINATION_NOT_FOUND_ERROR","createPersistenceSyncError","valueKey","cookieValue","localStorageValue","error","Error","name","createNotYetLinkedError","createNetworkError","createInvalidUrlCodeError","createUnknownError","Object","prototype","hasOwnProperty","call","errorObject","console","log","newError","createNoRegionError","createNoTokenError","createRegistrationFailedError","createSsoLoginFailedError","createSsoDestinationNotFoundError","useConfirmationModal","useContext","ConfirmationModalContext","useOrderStatus","OrderStatusContext","useStateDefinitions","StateDefinitionsContext","useAriaHideMainContent","AriaHideMainContentContext","useWaitTime","WaitTimeContext","setCookieAndStorageValue","key","value","Cookies","set","expires","localStorage","setItem","getLocalStorageValueFromKey","get","getItem","getRegistrationCode","getAuthToken","storeRegistrationCode","newCodeValue","storeAuthToken","newTokenValue","getRegion","setRegion","regionValue","setSsoProjectId","getSsoLoginPage","deleteRegisteredValues","removeItem","remove","deleteAllValues","useState","window","innerWidth","width","setWidth","handleWindowSizeChange","useEffect","addEventListener","removeEventListener","latestOrderDetails","setLatestOrderDetails","setError","loadingFirstRequest","setLoadingFirstRequest","loginSuccessful","setLoginSuccessful","ordersStateHash","setOrdersStateHash","isLoggedOut","setIsLoggedOut","updateOrderDetails","useCallback","a","token","persistenceManager","region","api","getOrdersResponse","orderDetails","stateHash","undefined","errorFactory","enableNotificationSounds","timerId","setInterval","POLLING_INTERVAL","clearInterval","global","refreshOrderDetails","clearOrders","orders","pollOrdersError","resetLoadingFirstRequest","module","exports","randomStringGenerator","Random","generateRegistrationCode","code","string","generateAuthToken","uuid","OVERRIDE_API_URL","process","REACT_APP_OVERRIDE_API_URL","screenApiUrls","REACT_APP_HELLO_API_AUTH_OVERRIDE_URL","au","eu","us","generateAuthConfig","authToken","headers","Authorization","getOrders","status","url","concat","authConfig","axios","data","isAxiosError","axiosError","response","getWaitTime","timezoneOffset","getWaitTimeResponse","registerNewToken","registrationCode","payload","post","registrationResponse","registerViaUrlCode","urlCode","registerNewCode","maxRegistrationAttempts","currentRegistrationAttempts","registrationSuccessful","newAuthToken","newRegistrationCode","updateOrderStatus","orderId","newStatus","encodeURIComponent","op","path","patch","updateOrderResponse","acknowledgeOrder","acknowledgeOrderResponse","acknowledgeOrderWithRetries","MAX_RETRIES","WAIT_TIME","retries","lastError","wait","getStateDefinitions","getStateDefinitionsResponse","stateDefinitionsHeader","stateDefinitions","getStore","getStoreResponse","getSsoIdToken","body","ssoCode","result","id_token","getAuthTokenViaSso","ssoIdToken","destinationId","projectId","config","Button","children","onClick","disabled","onKeyUp","className","styled","tabIndex","ALERT_ANIMATION_TIME_PERIOD","WAIT_TIME_POLLING_INTERVAL","notificationSound","require","notificationPlayer","Audio","playOnLoop","soundPlaying","playerSoundEnabled","soundEndedEventListener","play","soundPausedEventListener","loopNotificationSound","stopNotificationSound","pause","disableNotificationSounds","getSoundEnabledStatus","StatusWrapper","div","StatusTrafficLight","props","connectionStatus","theme","colors","SUCCESS","WARNING","TERTIARY_ACCENT","StatusText","p","PRIMARY_TEXT","isOnline","useIsOnline","aria-label","role","ScreenWrapper","main","NEUTRAL_PANEL","RightTopBar","isMobile","MiddleTopBar","TopBar","ActiveOrdersWrapper","ActiveOrdersNumber","ActiveOrdersText","HeaderWrapper","TEXT_BACKGROUND","SHADOW_COLOR","LogoImage","img","HeaderText","MenuButtonWrapper","MenuWrapper","MenuLinksWrapper","h2","MenuLink","button","VersionTag","h4","MenuHeader","CloseButtonWrapper","MenuButton","Icon","closeMenu","store","useIsMobile","showConfirmationModal","onClearOrders","modalRef","useModalTabController","showLogoutModal","document","location","reload","zIndex","ref","glyph","size","event","navigate","storeName","isOpen","setIsOpen","setHideMainContent","openMenu","OpenDropdownMenu","ariaHidden","useStore","aria-hidden","src","Logo","title","alt","DropdownMenu","OrderTrackerWrapper","NoOrdersFoundText","DISABLED_TEXT","OrderSectionHeader","OrderSectionTitle","h1","MobileOrderCardFields","BORDER_COLOR","InlineOrderCardFields","InlineOrderCardFieldsRow","InlineOrderCardFieldWrapper","DARKER_NEUTRAL_PANEL","MobileOrderCardFieldsWrapper","InlineOrderCardFieldPlaceholder","MobileOrderCardFieldsPlaceholder","OrderCardFieldText","hsFields","orderCardFields","Boolean","OrderCardWrapper","isActive","OrderStatusEdgeColor","color","MobileWithOrderCardFieldsWrapper","InnerMobileWithOrderCardFieldsWrapper","EtaStatusWrapper","EtaText","TimeRemainingText","CustomerNameText","OrderNumberText","OrderDetailsLink","OrderNumberWrapper","OrderCardWithFieldsOverrideWrapper","getApproximateArrivalTime","timestamp","eta","moment","add","formatTimestamp","format","openOrderDetailsOverlay","alertTimer","targetState","stateDictionary","approximateArrivalTime","stateDisplayName","etaDirection","getApproximateTimeText","lastUpdateTime","lastTransitionTime","getOrderArrivalTimeText","displayState","cardContent","hideTimePrefix","time","minutesOverdue","Math","floor","minutesRemaining","timePeriodText","timePrefix","getOrderStatusText","customerName","getCustomerName","length","OrderCardFieldsDisplay","getOrderNumber","AnimatedOrderCardOverrideWrapper","baseStyles","tinycolor","darken","toString","orderCardFieldStyles","INVERTED_TEXT_NEUTRAL_PANEL","hasMobileOrderCardFields","keyframes","shouldAnimate","animationStartOffset","startAnimate","setStartAnimate","setTimeout","OrderCard","LoadingWrapper","LoadingText","rotate","dash","SpinnerWrap","Spinner","Circular","svg","Path","circle","viewBox","cx","cy","r","fill","stroke","strokeWidth","strokeMiterlimit","stateIsErrorOrHasEta","order","errorStates","includes","showingHistory","categoryTitle","setOrderDetailsOverlayData","isSearching","orderSorter","orderDetails1","orderDetails2","difference","arrivalTime1","arrivalTime2","valueOf","createSortOrdersFunction","toUpperCase","sort","map","orderDetail","index","cardIndex","getAlertTimer","features","AnimatedOrderCard","isAcknowledged","SoundControlWrapper","soundEnabled","PRIMARY_ACCENT","SoundControlText","label","updatingSound","setUpdatingSound","toggleSound","keyEvent","id","htmlFor","createStringTemplateValues","arrivalTime","toISOString","formattedLastTransitionTime","etaMinutesInteger","round","etaMinutes","etaDirectionPreposition","shouldOrderShowSuccessMessage","statesFeatures","targetTimer","showSuccessMessage","CustomDataCardWrapper","CustomDataFieldName","fieldName","OrderDetailsWrapper","OrderDetailsStatusHeader","CustomDataCardsWrapper","section","StatusDescriptionText","OrderIdText","ButtonWrapper","TwoButtonWrapper","BackButton","UpdateErrorMessage","SuccessMessageText","SuccessMessageTimerText","SuccessMessageGraphic","ChangeOrderStatusWrapper","CurrentStatusWrapper","CurrentStatusLabel","CurrentStatusText","SelectNewStatusText","StatusRadioButtonGrid","StatusButtonWrapper","StatusButtonLabel","StatusRadioButton","input","orderStatus","selectedStatus","setSelectedStatus","transitionableStates","useMemo","states","filter","state","canForceTransition","find","currentOrderDisplayState","transitionableState","type","onChange","checked","substring","hideOrderDetails","remainingCountdown","setRemainingCountdown","prevValue","clearTimeout","currentTime","Date","SUCCESS_MESSAGE_TEMPLATE","templateValues","stringTemplateFormat","generateSuccessMessageText","CurbsideIcon","updateError","setUpdateError","isUpdating","setIsUpdating","showChangeStatus","setShowChangeStatus","selectedForceTransitionState","setSelectedForceTransitionState","setShowSuccessMessage","acknowledgeCalled","setAcknowledgeCalled","setSelectedElementIndex","setHideBanner","refreshWaitTime","isWithRetries","canAcknowledge","newValue","onUpdateOrderStatus","newOrderStatus","usedQuickButton","useOrderDetailsDisplayController","OrderSuccessMessage","stateDefinition","orderDetailsTitle","generateHeaderText","orderDetailsSummary","generateStatusDescriptionText","simphonyCheckNumber","ChangeOrderStatus","keys","hsFieldsPriority","orderedFields","sortedFields","forEach","replace","toLowerCase","entries","indexA","indexB","Number","unorderedFields","fieldKey","push","alphabeticallySortedFields","b","localeCompare","sortCustomDataFields","CustomDataCard","renderCustomDetails","showChangeOrderStatus","forceTransitionStatus","CommonButtons","quickButtons","targetQuickButton","action","generateActionButtons","SearchBarAndLabelWrapper","SearchBarLabel","SearchBarWrapper","SearchInput","ClearIconContainer","SearchIconWrapper","searchTerm","setSearchTerm","onClearSearchTerm","target","ariaLabel","filteredOrders","indexOf","WaitTimeDisplayWrapper","WaitTimeWithGoalDisplayWrapper","WaitTimeLabel","h3","WaitTimeWrapper","WaitTimeWithUnitsWrapper","NoOrdersWrapper","NoOrdersText","ColoredWaitTimePerformance","waitTime","waitTimeGoal","ERROR","waitTimeAlert","WaitTimeNumber","WaitTimeGoalDivider","WaitTimeUnit","numberOfOrders","waitTimeString","convertToMinutesAndSecondsString","waitTimeFeature","goal","alert","NavLinksWrapper","nav","NavLink","LinksDescription","aria-labelledby","href","ActiveOrdersDisplay","currentOrders","historyOrders","stateCategoryMapping","useOrderDetailsOverlay","orderDetailsOverlayData","useOrderSearchFilter","hideMainContent","hideBanner","activeOrdersCount","OrderDetailsDisplay","AppHeader","EnableSoundControl","hideSearchBar","SearchBar","WaitTimeDisplay","ConnectionStatusSnackbar","categories","category","targetOrders","OrderTracker","NavigationLinks","AppWrapper","SelectWrapper","SECONDARY_ACCENT","DARKENED_SECONDARY_ACCENT","RegionSelectorLabel","handleRegionChange","selectedRegion","canvasRegions","options","classNamePrefix","placeholder","option","BackgroundPanel","DARK_BACKGROUND","BackgroundPanelMobile","OneTimeCodeWrapper","OneTimeCodeMobilePanel","CenterAlignmentWrapper","OneTimeCodeExplanationText","OneTimeCodeText","OneTimeCodeSmallText","LogoWrapper","FooterWrapper","MobileFooterWrapper","GenerateButtonWrapper","RegionSelectorWrapper","isValidRegion","setRegistrationCode","setLoginAttempts","setSelectedRegion","urlParams","useParams","saveNewRegistrationCode","storedRegion","storedCode","attemptLogin","previousLoginAttempts","intervalId","pageContent","codeLabel","split","join","generateRegistrationCodeText","RegionSelector","PageTitleWrapper","PageTitle","activeOrdersStyles","BackwardsNavigationIcon","BackwardsNavigationWrapper","BackwardsNavigationText","to","style","textDecoration","OrderHistoryDisplay","BackwardsNavigation","stateDefinitionsLoaded","component","LoadingPage","ErrorPageHeader","ErrorPageParagraph","UrlLinker","useLocation","registrationInProgress","setRegistrationInProgress","registrationError","setRegistrationError","handleRegisterCode","isValidUrlCode","search","queryString","parse","loadAction","UrlLinkingFailed","AutoRefreshWrapper","AutoRefreshHeader","AutoRefreshImage","BodyText","BluedotPurpleText","span","shouldRefresh","seconds","setSeconds","refreshCacheAndReload","caches","then","names","delete","timer","prevSeconds","rocket","SsoLoginWrapper","SsoLoginMobilePanel","SsoLoginText","FooterText","FooterLink","LoginButtonWrapper","initializeApp","apiKey","authDomain","storageBucket","messagingSenderId","appId","setSsoLoginUrl","shouldLoad","setShouldLoad","message","getUrlCodeDetails","onClickLoggedIn","auth","getAuth","getRedirectResult","getAdditionalUserInfo","result2","provider","SAMLAuthProvider","signInWithRedirect","SsoLinkWrapper","SsoLinkText","StoreCodeInput","ErrorMessageWrapper","ErrorMessage","ButtonWithErrorWrapper","jwtToken","setJwtToken","storeCode","setStoreCode","loadingResponse","setLoadingResponse","queryParams","idToken","getJwtToken","connectToStore","loginUrl","renderPageContent","ssoJwtToken","apiError","App","setShouldRefresh","shouldForceRefresh","REACT_APP_OVERRIDE_POLL_APP_VERSION","fetch","json","meta","version","latestVersion","usePollAppVersion","createElement","content","getElementsByTagName","appendChild","disableScaling","myTheme","AutoRefresh","AppContainer","PrivateRoute","SsoLink","SsoLogin","OneTimeCodeSetup","hostname","match","ReactDOM","render","StrictMode","getElementById","navigator","serviceWorker","ready","registration","unregister","catch","milliseconds","Promise","resolve","test","stateFeatures","elapsedSeconds","getTime","alertTimers","targetWaitTime","minuteComponent","secondComponent","Overlay","tabItemSelector","onEscapeKeyPressed","keyCaptureOn","selectedElementIndex","createRef","keyListenersMap","Escape","Tab","e","preventDefault","targetElement","focusableModalElements","current","querySelectorAll","shiftKey","focus","keyListener","listener","cancelDefault","startsWith","setStore","getStoreDetails","storeResponse","onLine","setIsOnline","handleConnectionChange","defaultProviderValue","createContext","OrderStatusProvider","usePollOrderStatus","stateDefinitionHash","updateStateDefinitions","filteredOrdersObject","alertableStateDefinitions","alertableStateNames","providerValue","Provider","defaultValue","AriaHideMainContentProvider","contextValue","waitingForOrderId","setWaitingForOrderID","openOrderDetailsModalSync","targetOrder","performAsyncUpdateThenOpen","openOrderDetailsModal","ModalTitle","ModalMessage","CloseButton","ModalWrapper","ButtonsWrapper","MobileVeritcalCenterContainer","CancelButtonWrapper","modalTitle","onConfirm","onHideModal","ConfirmationModalProvider","showModal","setShowModal","setModalTitle","modalMessage","setModalMessage","onConfirmAction","setOnConfirmAction","ConfirmationModal","mockStateDefinitions","progressionLevel","eventTriggers","isError","analyticsCategory","reduce","accumulator","currentValue","StateDefinitionsProvider","setStateDefinitions","setStateDefinitionHash","setStateDefinitionsLoaded","stateDefinitionsResponse","useOrderStateConfiguration","stateCategoryMap","errorStatesArray","WaitTimeProvider","setWaitTime","setNumberOfOrders","updateWaitTime","getTimezoneOffset","unit","waitTimeAverage","usePollWaitTime"],"mappings":"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","file":"static/js/main.e335ac69.chunk.js","sourcesContent":["export const NOT_YET_LINKED_ERROR = \"authTokenNotLinked\";\nexport const UNKNOWN_ERROR = \"unknownError\";\nexport const NO_REGION_ERROR = \"noRegion\";\nexport const NO_TOKEN_ERROR = \"noToken\";\nexport const REGISTRATION_FAILED_ERROR = \"registrationFailed\";\nexport const PERSISTENCE_OUT_OF_SYNC_ERROR = \"persistenceOutOfSyncError\";\nexport const NETWORK_CONNECTION_ERROR = \"networkConnectionError\";\nexport const INVALID_URL_CODE_ERROR = \"invalidUrlCodeError\";\nexport const SSO_LOGIN_FAILED_ERROR = \"ssoLoginFailedError\";\nexport const SSO_DESTINATION_NOT_FOUND_ERROR = \"ssoDestinationNotFoundError\";\n\nexport const createPersistenceSyncError = (\n valueKey: string,\n cookieValue: string,\n localStorageValue: string\n): Error => {\n const error = new Error(\n `Persistence out of sync for key: ${valueKey}. Cookie value: ${cookieValue}. Local Storage value: ${localStorageValue}`\n );\n error.name = PERSISTENCE_OUT_OF_SYNC_ERROR;\n return error;\n};\n\nexport const createNotYetLinkedError = () => {\n const error = new Error(\"Screen not yet linked\");\n error.name = NOT_YET_LINKED_ERROR;\n return error;\n};\n\nexport const createNetworkError = () => {\n const error = new Error(\"Unable to connect to the network\");\n error.name = NETWORK_CONNECTION_ERROR;\n return error;\n};\n\nexport const createInvalidUrlCodeError = () => {\n const error = new Error(\"Invalid URL code\");\n error.name = INVALID_URL_CODE_ERROR;\n return error;\n};\n\nexport const createUnknownError = (error?: unknown) => {\n if (error && Object.prototype.hasOwnProperty.call(error, \"message\")) {\n const errorObject = error as Error;\n console.log(\"An unidentified error occurred\", error);\n errorObject.name = UNKNOWN_ERROR;\n return errorObject;\n }\n const newError = new Error(\"An unidentified error occurred\");\n newError.name = UNKNOWN_ERROR;\n return newError;\n};\n\nexport const createNoRegionError = () => {\n const error = new Error(\"Region has not been set in localStorage\");\n error.name = NO_REGION_ERROR;\n return error;\n};\n\nexport const createNoTokenError = () => {\n const error = new Error(\"Token has not been set in localStorage\");\n error.name = NO_TOKEN_ERROR;\n return error;\n};\n\nexport const createRegistrationFailedError = () => {\n const error = new Error(\"Failed to register new code.\");\n error.name = REGISTRATION_FAILED_ERROR;\n return error;\n};\n\nexport const createSsoLoginFailedError = () => {\n const error = new Error(\"Failed to exchange code for idToken\");\n error.name = SSO_LOGIN_FAILED_ERROR;\n return error;\n};\n\nexport const createSsoDestinationNotFoundError = () => {\n const error = new Error(\"destinationId not found\");\n error.name = SSO_DESTINATION_NOT_FOUND_ERROR;\n return error;\n};\n","import { useContext } from \"react\";\nimport { ConfirmationModalContext } from \"../components/ConfirmationModal/ConfirmationModalContext\";\nimport { OrderStatusContext } from \"../components/OrderStatusContext/OrderStatusContext\";\nimport { StateDefinitionsContext } from \"../components/StateDefinitionsContext/StateDefinitionsContext\";\nimport { AriaHideMainContentContext } from \"../components/AriaHideMainContentContext/AriaHideMainContentContext\";\nimport { WaitTimeContext } from \"../components/WaitTimeDisplay/WaitTimeContext\";\n\nexport const useConfirmationModal = () => useContext(ConfirmationModalContext);\nexport const useOrderStatus = () => useContext(OrderStatusContext);\nexport const useStateDefinitions = () => useContext(StateDefinitionsContext);\nexport const useAriaHideMainContent = () =>\n useContext(AriaHideMainContentContext);\nexport const useWaitTime = () => useContext(WaitTimeContext);\n","import Cookies from \"js-cookie\";\nimport { PersistenceKey } from \"../types/PersistenceKeyTypes\";\nimport { Region } from \"../types/RegionType\";\nimport { createPersistenceSyncError } from \"./errorFactory\";\n\nconst REGISTRATION_CODE_KEY = \"registrationCode\";\nconst AUTH_TOKEN_KEY = \"authToken\";\nconst REGION_KEY = \"region\";\nconst HISTORY_ORDER_IDS = \"historyOrderIds\";\nconst PROJECT_ID_KEY = \"ssoProjectId\";\nconst IDENTITY_PROVIDER_KEY = \"ssoIdentityProvider\";\nconst SSO_LOGIN_PAGE_URL = \"ssoLoginPage\";\n\nconst setCookieAndStorageValue = (key: PersistenceKey, value: string): void => {\n Cookies.set(key, value, { expires: 365 });\n localStorage.setItem(key, value);\n};\n\nexport const getLocalStorageValueFromKey = (\n key: PersistenceKey\n): string | null => {\n const cookieValue = Cookies.get(key);\n const localStorageValue = localStorage.getItem(key);\n if (cookieValue && localStorageValue && localStorageValue !== cookieValue) {\n console.log(\n createPersistenceSyncError(key, cookieValue, localStorageValue)\n );\n }\n if (!cookieValue && !localStorageValue) {\n return null;\n }\n setCookieAndStorageValue(key, (localStorageValue || cookieValue) as string);\n return localStorage.getItem(key);\n};\n\nexport const getRegistrationCode = (): any => {\n return getLocalStorageValueFromKey(REGISTRATION_CODE_KEY);\n};\n\nexport const getAuthToken = (): any => {\n return getLocalStorageValueFromKey(AUTH_TOKEN_KEY);\n};\n\nexport const storeRegistrationCode = (newCodeValue: string): void => {\n setCookieAndStorageValue(REGISTRATION_CODE_KEY, newCodeValue);\n};\n\nexport const storeAuthToken = (newTokenValue: string): void => {\n setCookieAndStorageValue(AUTH_TOKEN_KEY, newTokenValue);\n};\n\nexport const getRegion = (): any => {\n return getLocalStorageValueFromKey(REGION_KEY);\n};\n\nexport const setRegion = (regionValue: Region): void => {\n setCookieAndStorageValue(REGION_KEY, regionValue);\n};\n\nexport const setSsoDetails = (\n projectId: string,\n identityProvider: string,\n loginUrl: string\n) => {\n setCookieAndStorageValue(PROJECT_ID_KEY, projectId);\n setCookieAndStorageValue(IDENTITY_PROVIDER_KEY, identityProvider);\n setCookieAndStorageValue(SSO_LOGIN_PAGE_URL, loginUrl);\n};\n\nexport const setSsoProjectId = (): any => {\n return getLocalStorageValueFromKey(PROJECT_ID_KEY);\n};\n\nexport const getSsoLoginPage = (): any => {\n return getLocalStorageValueFromKey(SSO_LOGIN_PAGE_URL);\n};\n\nexport const deleteRegisteredValues = (): void => {\n localStorage.removeItem(REGISTRATION_CODE_KEY);\n localStorage.removeItem(AUTH_TOKEN_KEY);\n Cookies.remove(REGISTRATION_CODE_KEY);\n Cookies.remove(AUTH_TOKEN_KEY);\n};\n\nexport const deleteAllValues = (): void => {\n localStorage.removeItem(REGISTRATION_CODE_KEY);\n localStorage.removeItem(AUTH_TOKEN_KEY);\n localStorage.removeItem(REGION_KEY);\n localStorage.removeItem(HISTORY_ORDER_IDS);\n localStorage.removeItem(PROJECT_ID_KEY);\n localStorage.removeItem(IDENTITY_PROVIDER_KEY);\n localStorage.removeItem(SSO_LOGIN_PAGE_URL);\n Cookies.remove(REGISTRATION_CODE_KEY);\n Cookies.remove(AUTH_TOKEN_KEY);\n Cookies.remove(REGION_KEY);\n Cookies.remove(HISTORY_ORDER_IDS);\n Cookies.remove(PROJECT_ID_KEY);\n Cookies.remove(IDENTITY_PROVIDER_KEY);\n Cookies.remove(SSO_LOGIN_PAGE_URL);\n};\n","import { useEffect, useState } from \"react\";\n\nexport default () => {\n const [width, setWidth] = useState(window.innerWidth);\n function handleWindowSizeChange() {\n setWidth(window.innerWidth);\n }\n useEffect(() => {\n window.addEventListener(\"resize\", handleWindowSizeChange);\n return () => {\n window.removeEventListener(\"resize\", handleWindowSizeChange);\n };\n }, []);\n\n return width < 800;\n};\n","import { useEffect, useState, useCallback } from \"react\";\nimport * as persistenceManager from \"../services/persistenceManager\";\nimport * as api from \"../services/api\";\nimport * as errorFactory from \"../services/errorFactory\";\nimport { POLLING_INTERVAL } from \"../constants/intervals\";\nimport { OrderDetails } from \"../types/OrderDetailsType\";\nimport { Region } from \"../types/RegionType\";\nimport { enableNotificationSounds } from \"../services/sounds\";\nimport { ExtendedGlobal } from \"../types/GlobalExtensionFunctions\";\n\nexport default () => {\n const [latestOrderDetails, setLatestOrderDetails] = useState(\n []\n );\n const [error, setError] = useState();\n const [loadingFirstRequest, setLoadingFirstRequest] = useState(true);\n const [loginSuccessful, setLoginSuccessful] = useState(false);\n const [ordersStateHash, setOrdersStateHash] = useState();\n const [isLoggedOut, setIsLoggedOut] = useState();\n\n const updateOrderDetails = useCallback(async () => {\n const token = persistenceManager.getAuthToken();\n const region = persistenceManager.getRegion();\n\n if (token && region) {\n try {\n const getOrdersResponse = await api.getOrders(token, region as Region);\n setIsLoggedOut(false);\n setLatestOrderDetails(getOrdersResponse.orderDetails);\n setOrdersStateHash(getOrdersResponse.stateHash);\n if (!loginSuccessful) {\n setLoginSuccessful(true);\n }\n setError(undefined);\n } catch (err) {\n // This is expected to occur often when screen has not yet been linked\n if (err instanceof Error) {\n if (err.name === errorFactory.NOT_YET_LINKED_ERROR) {\n setIsLoggedOut(true);\n } else {\n console.log(err);\n }\n }\n setError(err as Error);\n }\n setLoadingFirstRequest(false);\n } else {\n setIsLoggedOut(true);\n setLoadingFirstRequest(false);\n if (loginSuccessful) {\n setLoginSuccessful(false);\n }\n if (!token) {\n setError(errorFactory.createNoTokenError());\n } else if (!region) {\n setError(errorFactory.createNoRegionError());\n }\n }\n }, [loginSuccessful]);\n\n useEffect(() => {\n if (loadingFirstRequest) {\n enableNotificationSounds();\n }\n\n updateOrderDetails();\n const timerId = setInterval(() => updateOrderDetails(), POLLING_INTERVAL);\n\n return () => clearInterval(timerId);\n }, [loginSuccessful, loadingFirstRequest, updateOrderDetails]);\n\n // DO NOT CHANGE THIS FUNCTION SIGNATURE OR RETURN TYPE - IT WILL BREAK THE NATIVE APP\n ((global as unknown) as ExtendedGlobal).isLoggedOut = () => {\n return isLoggedOut;\n };\n\n const refreshOrderDetails = updateOrderDetails;\n\n const clearOrders = useCallback(() => {\n setLatestOrderDetails([]);\n setLoginSuccessful(false);\n setLoadingFirstRequest(true);\n }, [setLatestOrderDetails, setLoginSuccessful, setLoadingFirstRequest]);\n\n return {\n orders: latestOrderDetails,\n pollOrdersError: error,\n refreshOrderDetails,\n loginSuccessful,\n loadingFirstRequest,\n clearOrders,\n ordersStateHash,\n resetLoadingFirstRequest: () => setLoadingFirstRequest(true),\n };\n};\n","module.exports = __webpack_public_path__ + \"static/media/CurbsideIcon.a965d590.svg\";","module.exports = __webpack_public_path__ + \"static/media/rocket.810b41d0.png\";","module.exports = __webpack_public_path__ + \"static/media/soft-bells-495.8a718c40.mp3\";","import { Random } from \"random-js\";\nimport { v4 as uuid } from \"uuid\";\n\nconst randomStringGenerator = new Random();\n\nexport const generateRegistrationCode = () => {\n const allowedCharacters = \"123456789ABCDEFGHIJKLMNPQRSTUVWXYZ\";\n const code = randomStringGenerator.string(7, allowedCharacters);\n console.log(`Generated code: ${code}`);\n return code;\n};\n\nexport const generateAuthToken = () => {\n return uuid();\n};\n","import axios, { AxiosError } from \"axios\";\nimport { OrderDetails } from \"../types/OrderDetailsType\";\nimport { generateAuthToken, generateRegistrationCode } from \"./codeGenerator\";\nimport * as persistenceManager from \"./persistenceManager\";\nimport * as errorFactory from \"./errorFactory\";\nimport { Region } from \"../types/RegionType\";\nimport { wait } from \"./utils\";\nimport { StateDefinitionConfig } from \"../types/StateDefinitionType\";\nimport { Store } from \"../types/StoreType\";\n\n// Overrides all URLs if REACT_APP_OVERRIDE_API_URL is set\n// When hot loading during development this is set in package.json\nconst OVERRIDE_API_URL = process.env.REACT_APP_OVERRIDE_API_URL;\nconst OVERRIDE_HELLO_API_AUTH_URL =\n process.env.REACT_APP_HELLO_API_AUTH_OVERRIDE_URL;\n\nconst screenApiUrls = {\n au: OVERRIDE_API_URL || \"https://au1-screens.prod-au-2.bluedot.io\",\n eu: OVERRIDE_API_URL || \"https://eu1-screens.prod-eu-2.bluedot.io\",\n us: OVERRIDE_API_URL || \"https://us1-screens.prod-us-2.bluedot.io\",\n};\n\nconst helloApiAuthUrls = {\n au:\n OVERRIDE_HELLO_API_AUTH_URL ||\n \"https://au1-auth.screens.bluedot.io/oauth2/authorize?response_type=code&client_id=20fpbig3a4if029dgps0ktcfkc&redirect_uri=https%3A%2F%2Fscreens.bluedot.io%2Fau%2Fsso&identity_provider=\",\n eu:\n OVERRIDE_HELLO_API_AUTH_URL ||\n \"https://eu1-auth.screens.bluedot.io/oauth2/authorize?response_type=code&client_id=7v770otufn2pkuqgi37mr9akst&redirect_uri=https%3A%2F%2Fscreens.bluedot.io%2Feu%2Fsso&identity_provider=\",\n us:\n OVERRIDE_HELLO_API_AUTH_URL ||\n \"https://us1-auth.us1-screens.prod-use1.bluedot.io/oauth2/authorize?response_type=code&client_id=a4js8tpg9pj74i06l2sffcjkb&redirect_uri=https%3A%2F%2Fscreens.bluedot.io%2Fus%2Fsso&identity_provider=\",\n};\n\nconst generateAuthConfig = (authToken: string) => {\n return {\n headers: { Authorization: `Bearer ${authToken}` },\n };\n};\n\ninterface GetOrdersResponse {\n orderDetails: OrderDetails[];\n stateHash?: string;\n}\n\nexport const getOrders = async (\n authToken: string,\n region: Region,\n status?: string\n): Promise => {\n if (!region) {\n throw errorFactory.createNoRegionError();\n }\n\n let url = `${screenApiUrls[region]}/orders`;\n if (status) {\n url = url.concat(`?status=${status}`);\n }\n\n if (!authToken) {\n throw errorFactory.createNoTokenError();\n }\n\n const authConfig = generateAuthConfig(authToken);\n\n try {\n const getOrdersResponse = await axios.get(url, authConfig);\n if (getOrdersResponse.status === 200) {\n const stateHash =\n getOrdersResponse.headers[\"x-bluedot-state-configuration\"];\n return {\n orderDetails: getOrdersResponse.data as OrderDetails[],\n stateHash,\n };\n }\n } catch (error) {\n if (axios.isAxiosError(error)) {\n const axiosError = error as AxiosError;\n if (axiosError.response?.status === 403) {\n throw errorFactory.createNotYetLinkedError();\n }\n }\n throw errorFactory.createUnknownError(error);\n }\n\n throw errorFactory.createUnknownError();\n};\n\ninterface GetWaitTimeResponse {\n waitTimeAverage: number;\n numberOfOrders: number;\n unit?: string; // This will be removed after deployment of wait time goals project\n}\n\nexport const getWaitTime = async (\n authToken: string,\n region: Region,\n timezoneOffset: number\n): Promise => {\n if (!region) {\n throw errorFactory.createNoRegionError();\n }\n\n let url = `${screenApiUrls[region]}/orders/waitTime`;\n if (timezoneOffset) {\n url = url.concat(`?timezoneOffset=${timezoneOffset}`);\n }\n\n if (!authToken) {\n throw errorFactory.createNoTokenError();\n }\n\n const authConfig = generateAuthConfig(authToken);\n\n try {\n const getWaitTimeResponse = await axios.get(url, authConfig);\n if (getWaitTimeResponse.status === 200) {\n return getWaitTimeResponse.data as GetWaitTimeResponse;\n }\n } catch (error) {\n if (axios.isAxiosError(error)) {\n const axiosError = error as AxiosError;\n if (axiosError.response?.status === 403) {\n throw errorFactory.createNotYetLinkedError();\n }\n }\n throw errorFactory.createUnknownError(error);\n }\n\n throw errorFactory.createUnknownError();\n};\n\nconst registerNewToken = async (\n authToken: string,\n registrationCode: string,\n region: Region\n) => {\n const url = `${screenApiUrls[region]}/credentials/register`;\n const payload = {\n code: registrationCode,\n token: authToken,\n };\n\n try {\n const registrationResponse = await axios.post(url, payload);\n if (registrationResponse.status === 204) {\n return true;\n }\n console.log(\n `Registration of code ${registrationCode} with token ${authToken} failed`,\n registrationResponse\n );\n return false;\n } catch {\n console.log(\"Failed to register using payload\", payload);\n return false;\n }\n};\n\nexport const registerViaUrlCode = async (urlCode: string, region: Region) => {\n const url = `${screenApiUrls[region]}/credentials/url/linkCode`;\n const authToken = generateAuthToken();\n const payload = {\n code: urlCode,\n token: authToken,\n };\n try {\n const result = await axios.post(url, payload);\n if (result.status === 200) {\n persistenceManager.storeAuthToken(authToken);\n persistenceManager.setRegion(region);\n persistenceManager.storeRegistrationCode(urlCode);\n }\n return true;\n } catch (error) {\n console.log(\"Failed to register using payload\", payload);\n throw error;\n }\n};\n\n/**\n * Randomly generates a registration code and auth token and attempts to register it with Screen Api\n * If registration is successful then the values will be saved to local storage\n * @returns Returns a successfully registered registration code\n * @throws An error if registration of a new code failed after 4 retries\n */\nexport const registerNewCode = async (region: Region) => {\n const maxRegistrationAttempts = 4;\n let currentRegistrationAttempts = 0;\n let registrationSuccessful = false;\n let newAuthToken;\n let newRegistrationCode;\n\n if (!region) {\n throw errorFactory.createNoRegionError();\n }\n\n // This loop is to handle the case where the randomly generated values are already in use, very unlikely to happen even once\n while (\n !registrationSuccessful &&\n currentRegistrationAttempts < maxRegistrationAttempts\n ) {\n currentRegistrationAttempts = currentRegistrationAttempts + 1;\n newAuthToken = generateAuthToken();\n newRegistrationCode = generateRegistrationCode();\n\n registrationSuccessful = await registerNewToken(\n newAuthToken,\n newRegistrationCode,\n region\n );\n }\n\n if (registrationSuccessful && newAuthToken && newRegistrationCode) {\n persistenceManager.storeAuthToken(newAuthToken);\n persistenceManager.storeRegistrationCode(newRegistrationCode);\n console.log(`Stored code: ${newRegistrationCode}, token: ${newAuthToken}`);\n return newRegistrationCode;\n }\n\n console.log(\n `An unexpected error occurred while trying to register your screen. Attempted ${currentRegistrationAttempts} times.`\n );\n throw errorFactory.createRegistrationFailedError();\n};\n\nexport const updateOrderStatus = async (\n orderId: string,\n newStatus: string,\n authToken: string,\n region: Region\n) => {\n if (!region) {\n throw errorFactory.createNoRegionError();\n }\n\n let url = `${screenApiUrls[region]}/orders/${encodeURIComponent(orderId)}`;\n const payload = [\n {\n op: \"replace\",\n path: \"/status\",\n value: newStatus,\n },\n ];\n\n const authConfig = generateAuthConfig(authToken);\n\n try {\n const updateOrderResponse = await axios.patch(url, payload, authConfig);\n return updateOrderResponse.data;\n } catch (error) {\n throw errorFactory.createUnknownError(error);\n }\n};\n\nexport const acknowledgeOrder = async (\n orderId: string,\n authToken: string,\n region: Region\n) => {\n if (!region) {\n throw errorFactory.createNoRegionError();\n }\n\n let url = `${screenApiUrls[region]}/orders/${encodeURIComponent(orderId)}`;\n const payload = [\n {\n op: \"replace\",\n path: \"/isAcknowledged\",\n value: true,\n },\n ];\n\n const authConfig = generateAuthConfig(authToken);\n\n try {\n const acknowledgeOrderResponse = await axios.patch(\n url,\n payload,\n authConfig\n );\n return acknowledgeOrderResponse.data;\n } catch (error) {\n throw errorFactory.createUnknownError(error);\n }\n};\n\nexport const acknowledgeOrderWithRetries = async (\n orderId: string,\n authToken: string,\n region: Region\n) => {\n const MAX_RETRIES = 5;\n const WAIT_TIME = 100;\n let retries = 0;\n let lastError;\n while (retries < MAX_RETRIES) {\n try {\n await acknowledgeOrder(orderId, authToken, region as Region);\n return;\n } catch (error) {\n lastError = error;\n console.log(\"Error acknowledging order\", error);\n retries += 1;\n if (retries < MAX_RETRIES) {\n await wait(WAIT_TIME * retries * retries);\n }\n }\n }\n if (retries === MAX_RETRIES) {\n console.log(`Failed to acknowledge order: ${orderId}`);\n throw lastError;\n }\n};\n\nexport interface StateDefinitionsResponse {\n stateDefinitions: StateDefinitionConfig;\n stateHash?: string;\n}\n\nexport const getStateDefinitions = async (\n authToken: string,\n region: Region\n): Promise => {\n if (!region) {\n throw errorFactory.createNoRegionError();\n }\n\n const url = `${screenApiUrls[region]}/configuration/states`;\n const authConfig = generateAuthConfig(authToken);\n\n try {\n const getStateDefinitionsResponse = await axios.get(url, authConfig);\n const stateDefinitionsHeader =\n getStateDefinitionsResponse.headers[\"x-bluedot-state-configuration\"];\n return {\n stateDefinitions: getStateDefinitionsResponse.data,\n stateHash: stateDefinitionsHeader,\n };\n } catch (error) {\n throw errorFactory.createUnknownError(error);\n }\n};\n\nexport const getStore = async (\n authToken: string,\n region: Region\n): Promise => {\n if (!region) {\n throw errorFactory.createNoRegionError();\n }\n\n const url = `${screenApiUrls[region]}/me`;\n const authConfig = generateAuthConfig(authToken);\n\n try {\n const getStoreResponse = await axios.get(url, authConfig);\n return getStoreResponse.data;\n } catch (error) {\n throw errorFactory.createUnknownError(error);\n }\n};\n\ninterface SsoUrlCodeDetails {\n projectId: string;\n identityProvider: string;\n}\n\nexport const getSsoUrlCodeDetails = async (\n urlCode: string,\n region: Region\n): Promise => {\n if (!region) {\n throw errorFactory.createNoRegionError();\n }\n\n const url = `${screenApiUrls[region]}/credentials/sso/getUrlCode/${urlCode}`;\n\n try {\n const getUrlCodeDetailsResponse = await axios.get(url);\n return getUrlCodeDetailsResponse.data;\n } catch (error) {\n throw errorFactory.createUnknownError(error);\n }\n};\n\nexport const getSsoLoginUrl = (region: Region, identityProvider: string) => {\n const prefilledUrl = helloApiAuthUrls[region];\n\n return `${prefilledUrl}${identityProvider}`;\n};\n\nexport const getSsoIdToken = async (region: Region, code: string) => {\n const url = `${screenApiUrls[region]}/credentials/sso/getIdToken`;\n const body = {\n ssoCode: code,\n };\n\n try {\n const result = await axios.post(url, body);\n return result.data.id_token;\n } catch (err) {\n throw err;\n }\n};\n\nexport const getAuthTokenViaSso = async (\n region: Region,\n ssoIdToken: string,\n destinationId: string,\n projectId: string\n) => {\n const url = `${screenApiUrls[region]}/credentials/sso/register`;\n const config = {\n headers: { Authorization: `Bearer ${ssoIdToken}` },\n };\n const body = {\n projectId,\n destinationId,\n };\n\n const result = await axios.post(url, body, config);\n return result.data.token;\n};\n","import React, { KeyboardEvent } from \"react\";\nimport * as styled from \"./styled\";\n\nconst Button = ({\n children,\n onClick,\n disabled,\n onKeyUp,\n className,\n}: {\n children: React.ReactNode;\n onClick: () => void;\n disabled?: boolean;\n onKeyUp?: (event: KeyboardEvent) => void;\n className?: string;\n}) => {\n return (\n \n {children}\n \n );\n};\n\nexport default Button;\n","export const POLLING_INTERVAL = 5000;\nexport const ALERT_ANIMATION_TIME_PERIOD = 1000;\nexport const WAIT_TIME_POLLING_INTERVAL = 30000;\n","import { ExtendedGlobal } from \"../types/GlobalExtensionFunctions\";\n\nconst notificationSound = require(\"../resources/soft-bells-495.mp3\");\n\nconst notificationPlayer: HTMLAudioElement = new Audio(notificationSound);\n\nlet playOnLoop = false;\nlet soundPlaying = false;\nexport let playerSoundEnabled = false;\n\nconst soundEndedEventListener = () => {\n if (playOnLoop && playerSoundEnabled) {\n soundPlaying = true;\n notificationPlayer.play();\n } else {\n soundPlaying = false;\n }\n};\n\nconst soundPausedEventListener = () => {\n soundPlaying = false;\n};\n\nexport const loopNotificationSound = async () => {\n playOnLoop = true;\n if (!soundPlaying && playerSoundEnabled) {\n notificationPlayer.addEventListener(\"ended\", soundEndedEventListener);\n notificationPlayer.addEventListener(\"pause\", soundPausedEventListener);\n try {\n await notificationPlayer.play();\n soundPlaying = true;\n } catch (error) {\n // This happens when the browser is preventing the sound from being\n // played (usually the user needs to interact with the screen first)\n console.log(\"Failed to play sound\", error);\n soundPlaying = false;\n }\n }\n};\n\nexport const stopNotificationSound = () => {\n playOnLoop = false;\n notificationPlayer.pause();\n};\n\nexport const enableNotificationSounds = async () => {\n try {\n await notificationPlayer.play();\n playerSoundEnabled = true;\n if (playOnLoop) {\n await loopNotificationSound();\n } else {\n notificationPlayer.pause();\n }\n } catch (error) {\n console.error(\"Failed to enable sounds\", error);\n playerSoundEnabled = false;\n }\n};\n\nexport const disableNotificationSounds = async () => {\n try {\n playerSoundEnabled = false;\n await notificationPlayer.pause();\n } catch (error) {\n console.error(\"Failed to disable sounds\");\n }\n};\n\n// DO NOT CHANGE THESE GLOBAL FUNCTION SIGNATURES OR RETURN TYPE - IT WILL BREAK THE NATIVE APP\n((global as unknown) as ExtendedGlobal).disableNotificationSounds = disableNotificationSounds;\n\n((global as unknown) as ExtendedGlobal).getSoundEnabledStatus = () => {\n return playerSoundEnabled;\n};\n\n((global as unknown) as ExtendedGlobal).enableNotificationSounds = enableNotificationSounds;\n","import styled from \"styled-components\";\nimport { ConnectionStatus } from \"./ConnectionStatusSnackbar\";\n\nexport const StatusWrapper = styled.div`\n display: inline-flex;\n float: right;\n`;\n\ninterface ConnectionStatusProps {\n connectionStatus: ConnectionStatus;\n}\n\nexport const StatusTrafficLight = styled.div`\n width: 1rem;\n height: 1rem;\n background-color: ${(props) => {\n switch (props.connectionStatus) {\n case \"Online\":\n return props.theme.colors.SUCCESS;\n case \"Connecting...\":\n return props.theme.colors.WARNING;\n default:\n return props.theme.colors.TERTIARY_ACCENT;\n }\n }};\n border-radius: 1rem;\n margin: auto;\n margin-right: 1rem;\n`;\n\nexport const StatusText = styled.p`\n margin: auto;\n padding-top: 5px;\n font-size: 1rem;\n font-weight: 600;\n color: ${(props) => {\n switch (props.connectionStatus) {\n case \"Disconnected\":\n return props.theme.colors.TERTIARY_ACCENT;\n default:\n return props.theme.colors.PRIMARY_TEXT;\n }\n }};\n`;\n","import React from \"react\";\nimport * as styled from \"./styled\";\nimport useIsOnline from \"../../hooks/useIsOnline\";\n\nexport type ConnectionStatus = \"Online\" | \"Connecting...\" | \"Disconnected\";\n\nexport default () => {\n const isOnline = useIsOnline();\n const connectionStatus = isOnline ? \"Online\" : \"Disconnected\";\n return (\n \n \n \n {connectionStatus}\n \n \n );\n};\n","import styled from \"styled-components\";\nimport { HEADER_HEIGHT } from \"../../constants/layout\";\nimport { IsMobileProps } from \"../../types/sharedComponentProps\";\n\nexport const ScreenWrapper = styled.main`\n height: calc(100vh - ${HEADER_HEIGHT} - 4rem);\n background-color: ${(props) => props.theme.colors.NEUTRAL_PANEL};\n margin-top: 2rem;\n padding: 1% 3%;\n overflow: auto;\n`;\n\nexport const RightTopBar = styled.div`\n justify-content: space-between;\n display: flex;\n ${(props) => {\n if (!props.isMobile) {\n return `\n width: 55%;\n min-width: 22rem;\n `;\n }\n }}\n`;\n\nexport const MiddleTopBar = styled.div`\n text-align: center;\n ${(props) => {\n if (!props.isMobile) {\n return `\n width: 50%;\n `;\n }\n }}\n`;\n\nexport const TopBar = styled.div`\n width: 100%;\n display: inline-flex;\n justify-content: space-between;\n align-items: center;\n`;\n\nexport const ActiveOrdersWrapper = styled.div`\n display: inline-flex;\n font-size: 1.25rem;\n margin-right: 2rem;\n`;\n\nexport const ActiveOrdersNumber = styled.p`\n margin: 0;\n margin-right: 1rem;\n font-weight: 600;\n`;\n\nexport const ActiveOrdersText = styled.p`\n margin: 0;\n`;\n","// Component Layout\nexport const HEADER_HEIGHT = \"3.5rem\";\n\n// Device Viewport Layout\nexport const SMALL_PHONE_MAX_WIDTH = \"340px\"; // for low viewport width phones eg Galaxy Fold/Samsung Galaxy models\nexport const PHONE_MIN_WIDTH = \"576px\";\nexport const TABLET_MIN_WIDTH = \"800px\";\nexport const DESKTOP_MIN_WIDTH = \"992px\";\nexport const LARGE_DESKTOP_MIN_WIDTH = \"1200px\";\n","import styled from \"styled-components\";\nimport { HEADER_HEIGHT } from \"../../constants/layout\";\n\nexport const HeaderWrapper = styled.div`\n width: 100%;\n min-height: ${HEADER_HEIGHT};\n display: inline-flex;\n justify-content: space-between;\n background-color: ${(props) => props.theme.colors.TEXT_BACKGROUND};\n box-shadow: 0px 1px 2px ${(props) => props.theme.colors.SHADOW_COLOR};\n`;\n\nexport const LogoImage = styled.img<{ isMobile: boolean }>`\n height: 2rem;\n margin: auto ${(props) => (props.isMobile ? \"1\" : \"3\")}rem;\n`;\n\nexport const HeaderText = styled.p`\n font-size: 1.5rem;\n margin: auto;\n margin-left: 0;\n color: ${(props) => props.theme.colors.PRIMARY_TEXT};\n font-weight: 600;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n\n`;\n\nexport const MenuButtonWrapper = styled.div`\n margin: auto 2rem;\n`;\n","import styled from \"styled-components\";\nimport { Icon } from \"@bluedot-innovation/bluedot-ui\";\nimport { HEADER_HEIGHT } from \"../../constants/layout\";\n\ninterface MenuWrapperProps {\n isMobile: boolean;\n}\n\nexport const MenuWrapper = styled.div`\n background-color: ${(props) => props.theme.colors.TEXT_BACKGROUND};\n position: absolute;\n right: 0;\n top: 0;\n min-width: ${(props) => (props.isMobile ? \"100\" : \"30\")}vw;\n min-height: 100vh;\n z-index: 5;\n text-align: center;\n`;\n\nexport const MenuTitle = styled.h2`\n color: ${(props) => props.theme.colors.PRIMARY_TEXT};\n`;\n\nexport const MenuLinksWrapper = styled.div`\n margin: 0 2rem;\n`;\n\nexport const MenuLink = styled.button`\n border: none;\n background-color: ${(props) => props.theme.colors.TEXT_BACKGROUND};\n color: ${(props) => props.theme.colors.PRIMARY_TEXT};\n text-align: left;\n width: 100%;\n font-size: 1.5em;\n margin: 0.83em 0;\n font-weight: bold;\n font-family: \"Spartan\", -apple-system, BlinkMacSystemFont, \"Segoe UI\",\n \"Roboto\", \"Oxygen\", \"Ubuntu\", \"Cantarell\", \"Fira Sans\", \"Droid Sans\",\n \"Helvetica Neue\", sans-serif;\n`;\n\nexport const VersionTag = styled.h4`\n color: ${(props) => props.theme.colors.PRIMARY_TEXT};\n position: absolute;\n bottom: 0;\n right: 2rem;\n`;\n\nexport const MenuHeader = styled.div`\n width: 100%;\n text-align: right;\n height: ${HEADER_HEIGHT};\n box-shadow: 0 0.1rem ${(props) => props.theme.colors.SHADOW_COLOR};\n`;\n\nexport const CloseButtonWrapper = styled.div`\n margin-right: 2rem;\n margin-top: 0.7rem;\n`;\n\nexport const MenuButton = styled(Icon)`\n margin: 1rem;\n`;\n","import React from \"react\";\nimport { navigate } from \"@reach/router\";\nimport { Overlay } from \"../LayoutComponents/styled\";\nimport { deleteAllValues } from \"../../services/persistenceManager\";\nimport { useConfirmationModal } from \"../../hooks/useSharedContext\";\nimport { useOrderStatus } from \"../../hooks/useSharedContext\";\nimport useIsMobile from \"../../hooks/useIsMobile\";\nimport useModalTabController from \"../../hooks/useModalTabController\";\nimport * as styled from \"./styled\";\nimport { Store } from \"../../types/StoreType\";\n\nconst VERSION_NUMBER = process.env.REACT_APP_VERSION_NUMBER || \"1.0\";\n\nexport default ({\n closeMenu,\n store,\n}: {\n closeMenu: () => void;\n store: Store | undefined;\n}) => {\n const isMobile = useIsMobile();\n const showConfirmationModal = useConfirmationModal();\n const { onClearOrders } = useOrderStatus();\n const { modalRef } = useModalTabController(\".menu-item\", closeMenu, true);\n const showLogoutModal = () => {\n closeMenu();\n const modalTitle = \"Log out?\";\n const modalMessage =\n \"If you log out, this screen will be reset and you will need to register all over again.\";\n const logoutAction = () => {\n deleteAllValues();\n onClearOrders();\n // DO NOT CHANGE - Using location.reload rather than navigate as Native App is\n // using this trigger to unsubscribe from updates\n document.location.reload();\n };\n showConfirmationModal(modalTitle, modalMessage, logoutAction);\n };\n\n return (\n <>\n \n
\n \n \n \n {\n console.log(\"modalref\", modalRef);\n if (event.key === \"Enter\") {\n closeMenu();\n }\n }}\n aria-label=\"Close Menu\"\n role=\"button\"\n className=\"menu-item\"\n tabIndex={0}\n />\n \n \n\n \n {\n closeMenu();\n navigate(\"/history\");\n }}\n onKeyUp={(event) => {\n if (event.key === \"Enter\") {\n closeMenu();\n navigate(\"/history\");\n }\n }}\n className=\"menu-item\"\n >\n History\n \n\n {\n showLogoutModal();\n }}\n className=\"menu-item\"\n onKeyUp={(event) => {\n if (event.key === \"Enter\") {\n showLogoutModal();\n }\n }}\n role=\"button\"\n >\n Log out\n \n \n\n \n {store ? (\n <>\n Store name: {store.storeName}\n
\n Destination: {store.destinationId}\n
\n \n ) : (\n \"\"\n )}\n {`Version ${VERSION_NUMBER}`}\n
\n
\n
\n \n );\n};\n","import React, { useState } from \"react\";\nimport * as styled from \"./styled\";\nimport OpenDropdownMenu from \"./OpenDropdownMenu\";\nimport { useAriaHideMainContent } from \"../../hooks/useSharedContext\";\nimport { Store } from \"../../types/StoreType\";\n\nexport default ({ store }: { store?: Store | undefined}) => {\n const [isOpen, setIsOpen] = useState(false);\n const { setHideMainContent } = useAriaHideMainContent();\n\n const openMenu = () => {\n setIsOpen(true);\n setHideMainContent(true);\n };\n\n const closeMenu = () => {\n setIsOpen(false);\n setHideMainContent(false);\n };\n\n if (isOpen) {\n return ;\n }\n return (\n {\n if (event.key === \"Enter\") {\n openMenu();\n }\n }}\n aria-label=\"Open Navigation Menu\"\n role=\"button\"\n />\n );\n};\n","import React from \"react\";\nimport Logo from \"../../resources/Bluedot_Logo.png\";\nimport * as styled from \"./styled\";\nimport DropdownMenu from \"../DropdownMenu\";\nimport useStore from \"../../hooks/useStore\";\nimport useIsMobile from \"../../hooks/useIsMobile\";\n\nexport default ({ ariaHidden }: { ariaHidden?: boolean }) => {\n const store = useStore()\n const isMobile = useIsMobile();\n return (\n \n \n {store?.storeName}\n \n \n \n \n );\n};\n","import styled from \"styled-components\";\n\nexport const OrderTrackerWrapper = styled.div`\n margin-top: 2rem;\n width: 100%;\n`;\n\nexport const HeaderWrapper = styled.div`\n width: 100%;\n display: inline-flex;\n font-size: 1rem;\n font-weight: 650;\n color: ${(props) => props.theme.colors.PRIMARY_TEXT};\n`;\n\nexport const LeftHeaderCell = styled.div`\n width: 33%;\n padding-left: 2rem;\n`;\n\nexport const MiddleHeaderCell = styled.div`\n width: 33%;\n text-align: center;\n`;\n\nexport const HeaderText = styled.p`\n margin: 0;\n`;\n\nexport const RightHeaderCell = styled.div`\n width: 33%;\n text-align: right;\n\n ${HeaderText} {\n padding-right: 2rem;\n }\n`;\n\nexport const NoOrdersFoundText = styled.p`\n margin: 2rem 0;\n text-align: left;\n font-size: 1.3rem;\n font-weight: bold;\n color: ${(props) => props.theme.colors.DISABLED_TEXT};\n`;\n\nexport const OrderSectionHeader = styled.div`\n width: 100%;\n margin-top: 3rem;\n border-bottom: 0.2rem solid black;\n`;\n\nexport const OrderSectionTitle = styled.h1`\n margin: 0.3rem 0;\n font-size: 1.17em;\n`;\n","import styled from \"styled-components\";\n\nexport const MobileOrderCardFields = styled.div`\n width: 95%;\n display: flex;\n padding: 0.5rem 0;\n margin: 0 auto;\n border-top: solid 2px ${(props) => props.theme.colors.BORDER_COLOR};\n justify-content: space-between;\n\n & p {\n font-size: 0.8rem;\n }\n`;\n\nexport const InlineOrderCardFields = styled.div`\n width: 31%;\n height: 100%;\n padding: 1rem 0;\n`;\n\nexport const InlineOrderCardFieldsRow = styled.div`\n display: flex;\n justify-content: space-between;\n`;\n\nexport const InlineOrderCardFieldWrapper = styled.div`\n width: 48%;\n margin: 0.1rem 0;\n background-color: ${(props) => props.theme.colors.DARKER_NEUTRAL_PANEL};\n border-radius: 3px;\n`;\n\nexport const MobileOrderCardFieldsWrapper = styled(InlineOrderCardFieldWrapper)`\n width: 24%;\n`;\n\nexport const InlineOrderCardFieldPlaceholder = styled.div`\n width: 48%;\n margin: 0.1rem 0;\n`;\n\nexport const MobileOrderCardFieldsPlaceholder = styled(\n InlineOrderCardFieldPlaceholder\n)`\n width: 23%;\n`;\n\nexport const OrderCardFieldText = styled.p`\n margin: 0.2rem;\n text-align: center;\n font-weight: 800;\n font-size: 1rem;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n`;\n","import React from \"react\";\nimport * as styled from \"./styled\";\nimport useIsMobile from \"../../hooks/useIsMobile\";\n\nexport default ({\n hsFields,\n orderCardFields,\n}: {\n hsFields: Record | undefined;\n orderCardFields: string[];\n}) => {\n const isMobile = useIsMobile();\n\n if (isMobile) {\n if (!hsFields) {\n return ;\n }\n\n return (\n \n {Boolean(orderCardFields[0] && hsFields[orderCardFields[0]]) ? (\n \n \n {hsFields[orderCardFields[0]]}\n \n \n ) : (\n \n )}\n\n {Boolean(orderCardFields[1] && hsFields[orderCardFields[1]]) ? (\n \n \n {hsFields[orderCardFields[1]]}\n \n \n ) : (\n \n )}\n {Boolean(orderCardFields[2] && hsFields[orderCardFields[2]]) ? (\n \n \n {hsFields[orderCardFields[2]]}\n \n \n ) : (\n \n )}\n\n {Boolean(orderCardFields[3] && hsFields[orderCardFields[3]]) ? (\n \n \n {hsFields[orderCardFields[3]]}\n \n \n ) : (\n \n )}\n \n );\n }\n\n if (!hsFields) {\n return ;\n }\n\n return (\n \n \n {Boolean(orderCardFields[0] && hsFields[orderCardFields[0]]) ? (\n \n \n {hsFields[orderCardFields[0]]}\n \n \n ) : (\n \n )}\n\n {Boolean(orderCardFields[1] && hsFields[orderCardFields[1]]) ? (\n \n \n {hsFields[orderCardFields[1]]}\n \n \n ) : (\n \n )}\n \n \n {Boolean(orderCardFields[2] && hsFields[orderCardFields[2]]) ? (\n \n \n {hsFields[orderCardFields[2]]}\n \n \n ) : (\n \n )}\n\n {Boolean(orderCardFields[3] && hsFields[orderCardFields[3]]) ? (\n \n \n {hsFields[orderCardFields[3]]}\n \n \n ) : (\n \n )}\n \n \n );\n};\n","import styled from \"styled-components\";\nimport { IsActiveProps } from \"../../types/sharedComponentProps\";\n\nexport const OrderCardWrapper = styled.div`\n background-color: ${(props) => props.theme.colors.TEXT_BACKGROUND};\n height: 5rem;\n width: 100%;\n display: inline-flex;\n justify-content: space-between;\n margin: 0.5rem 0;\n border: solid 0.1rem ${(props) => props.theme.colors.BORDER_COLOR};\n box-shadow: 0 0.2rem 0.2rem ${(props) => props.theme.colors.SHADOW_COLOR};\n ${(props) => {\n if (!props.isActive) {\n return `color: ${props.theme.colors.DISABLED_TEXT};`;\n }\n }}\n`;\n\nexport const OrderStatusEdgeColor = styled.div`\n width: 0.5rem;\n transition: background-color 0.5s ease;\n background-color: ${(props) =>\n props.color || props.theme.colors.TERTIARY_ACCENT};\n`;\n\nexport const MobileWithOrderCardFieldsWrapper = styled(OrderCardWrapper)`\n ${OrderCardWrapper} {\n border: none;\n margin: 0;\n box-shadow: none;\n height: 3.7rem;\n animation: none;\n transform: none;\n\n p {\n font-size: 1.2rem;\n }\n\n ${OrderStatusEdgeColor} {\n display: none;\n }\n }\n\n height: 7rem;\n`;\n\nexport const InnerMobileWithOrderCardFieldsWrapper = styled.div`\n display: block;\n width: 100%;\n`;\n\ninterface OrderStatusEdgeColorProps {\n color: string;\n}\n\nexport const EtaStatusWrapper = styled.div`\n display: block;\n padding: 1rem 0;\n margin: auto 0;\n padding-left: 5%;\n width: 33%;\n`;\n\nexport const EtaText = styled.p`\n margin: 0;\n font-weight: 400;\n`;\n\nexport const TimeRemainingText = styled.p`\n margin: 0;\n font-weight: 700;\n font-size: 1.2rem;\n`;\n\nexport const CustomerNameText = styled.p`\n overflow: hidden;\n text-overflow: ellipsis;\n padding: 0.3rem;\n margin: auto;\n font-weight: 700;\n font-size: 1.2rem;\n text-align: center;\n width: 33%;\n max-height: 100%;\n`;\n\nexport const OrderNumberText = styled.p`\n overflow: hidden;\n text-overflow: ellipsis;\n padding: 0.3rem;\n max-height: 100%;\n margin: auto 0;\n font-size: 1.3rem;\n font-weight: 500;\n padding-right: 1.5rem;\n text-align: right;\n`;\n\nexport const OrderDetailsLink = styled.p`\n margin: auto 1rem;\n padding-top: 6px;\n\n ${(props) => {\n if (!props.isActive) {\n return `& svg {\n fill: ${props.theme.colors.DISABLED_TEXT};\n }`;\n }\n }}\n`;\n\nexport const OrderNumberWrapper = styled.div`\n width: 33%;\n display: inline-flex;\n justify-content: flex-end;\n`;\n\nexport const CardMessageWrapper = styled.div`\n display: flex;\n margin-right: 2rem;\n`;\n\nexport const CardMessage = styled.p`\n font-size: 2.5rem;\n margin: auto;\n`;\n\nexport const OrderCardWithFieldsOverrideWrapper = styled.div`\n ${OrderCardWrapper} {\n height: 6rem;\n }\n\n ${CustomerNameText} {\n width: 23%;\n }\n\n ${OrderNumberWrapper} {\n width: 23%;\n }\n\n ${EtaStatusWrapper} {\n width: 23%;\n }\n`;\n","import moment from \"moment\";\nimport { EtaDirection, OrderDetails } from \"../types/OrderDetailsType\";\nimport { AlertTimer } from \"../types/StateDefinitionType\";\n\nexport function getOrderStatusText(\n orderDetails: OrderDetails,\n hideTimePrefix: boolean,\n stateDisplayName: string | undefined,\n alertTimer: AlertTimer | undefined\n): string {\n if (alertTimer && alertTimer.time) {\n const minutesOverdue = Math.floor(alertTimer.time / 60);\n if (minutesOverdue > 1) {\n return `Over ${minutesOverdue} minutes`;\n } else if (minutesOverdue === 1) {\n return `Over 1 minute`;\n }\n }\n if (orderDetails.eta) {\n const minutesRemaining = orderDetails.eta / 60;\n const timePeriodText = minutesRemaining > 1 ? \"Minutes\" : \"Minute\";\n if (hideTimePrefix) {\n return `${minutesRemaining} ${timePeriodText}`;\n }\n const timePrefix =\n orderDetails.etaDirection === \"lessThan\" ? \"Less Than\" : \"More Than\";\n return `${timePrefix} ${minutesRemaining} ${timePeriodText}`;\n } else {\n return stateDisplayName || \"Unknown\";\n }\n}\n\nexport function getApproximateArrivalTime(\n timestamp: string,\n eta?: number\n): moment.Moment {\n // If order is completed or stopped return last update time\n if (!eta) {\n return moment(timestamp);\n }\n\n return moment(timestamp).add(eta, \"s\");\n}\n\nexport function getApproximateTimeText(\n approximateArrivalTime: moment.Moment,\n stateDisplayName: string,\n etaDirection: EtaDirection | undefined,\n eta: number | undefined\n): string {\n const arrivalTimeFormat = \"HH:mm\";\n if (!eta) {\n return `${stateDisplayName} at ${approximateArrivalTime.format(\n arrivalTimeFormat\n )}`;\n }\n if (etaDirection === \"lessThan\") {\n return `ETA is ${approximateArrivalTime.format(arrivalTimeFormat)}`;\n }\n return `ETA is after ${approximateArrivalTime.format(arrivalTimeFormat)}`;\n}\n\n// Returns a string in the format 4:12 PM\nexport function formatTimestamp(timestamp: string): string {\n const dateObject = moment(timestamp);\n const displayTimeFormat = \"LT\";\n return dateObject.format(displayTimeFormat);\n}\n\n// Returns a string in the format 4:12 PM\nexport function getOrderArrivalTimeString(orderDetails: OrderDetails): string {\n // TODO: Remove the or condition for lastUpdateTime after 48 hours of deployment of dynamic states. This is just temporary\n // as during deployment not all orders will have been updated to include lastTransitionTime\n const arrivalTime = getApproximateArrivalTime(\n orderDetails.lastTransitionTime || orderDetails.lastUpdateTime,\n orderDetails.eta\n );\n const displayTimeFormat = \"LT\";\n return arrivalTime.format(displayTimeFormat);\n}\n\n// Returns a string in the format Approx/Arrived/Stopped at/after/between 4:12\nexport function getOrderArrivalTimeText(\n orderDetails: OrderDetails,\n stateDisplayName: string\n): string {\n // If order has an eta then use lastUpdateTime, otherwise use lastTransitionTime\n const arrivalTime = orderDetails.eta\n ? getApproximateArrivalTime(orderDetails.lastUpdateTime, orderDetails.eta)\n : getApproximateArrivalTime(\n orderDetails.lastTransitionTime || orderDetails.lastUpdateTime,\n orderDetails.eta\n );\n return getApproximateTimeText(\n arrivalTime,\n stateDisplayName,\n orderDetails.etaDirection,\n orderDetails.eta\n );\n}\n","import React from \"react\";\nimport { Icon } from \"@bluedot-innovation/bluedot-ui\";\nimport OrderCardFieldsDisplay from \"../OrderCardFieldsDisplay\";\nimport * as styled from \"./styled\";\nimport {\n getOrderArrivalTimeText,\n getOrderStatusText,\n} from \"../../services/orderCalculations\";\nimport { OrderDetails } from \"../../types/OrderDetailsType\";\nimport useIsMobile from \"../../hooks/useIsMobile\";\nimport { useStateDefinitions } from \"../../hooks/useSharedContext\";\nimport { AlertTimer, StateDefinition } from \"../../types/StateDefinitionType\";\n\nexport interface OrderCardProps {\n orderDetails: OrderDetails;\n openOrderDetailsOverlay: () => void;\n isActive: boolean;\n alertTimer?: AlertTimer;\n orderCardFields: string[] | undefined;\n}\n\nconst getCustomerName = (orderDetails: OrderDetails) => {\n if (orderDetails.customerName) {\n return orderDetails.customerName;\n }\n return \"-\";\n};\n\nconst getOrderNumber = (orderDetails: OrderDetails) => {\n if (orderDetails.orderId) {\n return orderDetails.orderId;\n }\n return \"-\";\n};\n\nexport default ({\n orderDetails,\n openOrderDetailsOverlay,\n isActive,\n alertTimer,\n orderCardFields,\n}: OrderCardProps) => {\n const isMobile = useIsMobile();\n const { stateDictionary } = useStateDefinitions();\n const targetState = stateDictionary[orderDetails.status] as StateDefinition;\n\n const approximateArrivalTime = getOrderArrivalTimeText(\n orderDetails,\n targetState.displayState!.stateDisplayName\n );\n\n const cardContent = (\n openOrderDetailsOverlay()}\n isActive={isActive}\n role=\"button\"\n tabIndex={0}\n onKeyUp={(event) => {\n if (event.key === \"Enter\") {\n openOrderDetailsOverlay();\n }\n }}\n >\n \n \n \n {getOrderStatusText(\n orderDetails,\n isMobile,\n targetState.displayState?.stateDisplayName,\n alertTimer\n )}\n \n {!isMobile && {approximateArrivalTime}}\n \n \n {getCustomerName(orderDetails)}\n \n {Boolean(!isMobile && orderCardFields?.length) && (\n \n )}\n \n \n {getOrderNumber(orderDetails)}\n \n {!isMobile && (\n \n \n \n )}\n \n \n );\n\n if (!orderCardFields?.length) {\n return cardContent;\n }\n\n if (isMobile) {\n return (\n \n \n \n {cardContent}\n \n \n \n );\n }\n\n return (\n \n {cardContent}\n \n );\n};\n","import styled, { keyframes } from \"styled-components\";\nimport tinycolor from \"tinycolor2\";\nimport * as baseStyles from \"../OrderCard/styled\";\nimport * as orderCardFieldStyles from \"../OrderCardFieldsDisplay/styled\";\nimport { ALERT_ANIMATION_TIME_PERIOD } from \"../../constants/intervals\";\n\nconst AlertAnimation = (props: any) => keyframes`\n 0% {\n transform: scale(.95);\n box-shadow: 0 0 0 0 rgba(0, 0, 0, 0.7);\n }\n\n 50% {\n transform: scale(1);\n box-shadow: 0 0 0 10px rgba(0, 0, 0, 0);\n }\n\n 100% {\n transform: scale(0.95);\n box-shadow: 0 0 0 0 rgba(0, 0, 0, 0);\n }\n`;\n\ninterface AnimatedOrderCardOverrideWrapperProps {\n isOnline: boolean;\n color: string;\n hasMobileOrderCardFields: boolean;\n}\n\nexport const AnimatedOrderCardOverrideWrapper = styled.div<\n AnimatedOrderCardOverrideWrapperProps\n>`\n ${baseStyles.OrderStatusEdgeColor} {\n display: none;\n }\n\n ${baseStyles.OrderCardWrapper} {\n background-color: ${(props) =>\n props.isOnline\n ? props.color\n : tinycolor(props.color).darken().toString()};\n color: ${(props) => props.theme.colors.TEXT_BACKGROUND};\n transform: scale(1);\n font-weight: bold;\n font-size: 1.35rem;\n }\n\n ${baseStyles.EtaText} {\n font-weight: bold;\n font-size: 1.2rem;\n }\n\n ${baseStyles.TimeRemainingText} {\n font-weight: bold;\n font-size: 1.35rem;\n }\n\n ${baseStyles.OrderNumberText} {\n font-weight: bold;\n font-size: 1.35rem;\n }\n\n ${baseStyles.CustomerNameText} {\n font-weight: bold;\n font-size: 1.35rem;\n }\n\n ${orderCardFieldStyles.OrderCardFieldText} {\n color: ${(props) => props.theme.colors.TEXT_BACKGROUND};\n }\n\n ${orderCardFieldStyles.MobileOrderCardFields} {\n border-color: ${(props) => props.theme.colors.SHADOW_COLOR};\n }\n\n ${orderCardFieldStyles.InlineOrderCardFieldWrapper} {\n background-color: ${(props) =>\n props.theme.colors.INVERTED_TEXT_NEUTRAL_PANEL};\n }\n\n &.animateOn {\n ${(props) =>\n props.hasMobileOrderCardFields\n ? baseStyles.MobileWithOrderCardFieldsWrapper\n : baseStyles.OrderCardWrapper} {\n animation: ${AlertAnimation} ${ALERT_ANIMATION_TIME_PERIOD}ms infinite;\n }\n }\n\n svg {\n fill: ${(props) => props.theme.colors.TEXT_BACKGROUND};\n }\n`;\n","import React, { useEffect, useState } from \"react\";\nimport OrderCard from \"../OrderCard/OrderCard\";\nimport * as styled from \"./styled\";\nimport { OrderDetails } from \"../../types/OrderDetailsType\";\nimport { AlertTimer } from \"../../types/StateDefinitionType\";\nimport useIsMobile from \"../../hooks/useIsMobile\";\n\ninterface ArrivedOrderCardProps {\n orderDetails: OrderDetails;\n openOrderDetailsOverlay: () => void;\n shouldAnimate: boolean;\n animationStartOffset: number;\n isOnline: boolean;\n alertTimer: AlertTimer;\n orderCardFields: string[] | undefined;\n}\nexport default ({\n orderDetails,\n openOrderDetailsOverlay,\n shouldAnimate,\n animationStartOffset,\n isOnline,\n alertTimer,\n orderCardFields,\n}: ArrivedOrderCardProps) => {\n const [startAnimate, setStartAnimate] = useState(false);\n const isMobile = useIsMobile();\n\n // This triggers the animation after a random delay so card animations are not in sync\n useEffect(() => {\n if (shouldAnimate) {\n const timerId = setTimeout(() => {\n setStartAnimate(true);\n }, animationStartOffset);\n return () => clearInterval(timerId);\n } else {\n setStartAnimate(false);\n }\n }, [shouldAnimate, animationStartOffset]);\n\n return (\n \n \n \n );\n};\n","import styled from \"styled-components\";\n\nexport const LoadingWrapper = styled.div`\n text-align: center;\n`;\n\nexport const LoadingText = styled.h2`\n margin: auto;\n`;\n","import styled, { keyframes } from \"styled-components\";\n\n// scaling... any units\nconst rotate = keyframes`\n from {\n transform: rotate(0deg);\n }\n\n to {\n transform: rotate(360deg);\n }\n `;\n\nconst dash = keyframes`\n 0% {\n stroke-dasharray: 1, 200;\n stroke-dashoffset: 0;\n }\n 50% {\n stroke-dasharray: 89, 200;\n stroke-dashoffset: -35px;\n }\n 100% {\n stroke-dasharray: 89, 200;\n stroke-dashoffset: -124px;\n }\n `;\n\n// demo-specific\nexport const SpinnerWrap = styled.div``;\n// end demo-specific\n\nexport const Spinner = styled.div`\n position: relative;\n margin: 0 auto;\n width: 20rem;\n\n &:before {\n content: \"\";\n display: block;\n padding-top: 100%;\n }\n`;\n\nexport const Circular = styled.svg`\n animation: ${rotate} 2s linear infinite;\n height: 100%;\n transform-origin: center center;\n width: 100%;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n margin: auto;\n`;\n\nexport const Path = styled.circle`\n stroke-dasharray: 1, 200;\n stroke-dashoffset: 0;\n animation: ${dash} 1.5s ease-in-out infinite;\n stroke-linecap: round;\n`;\n","import React from \"react\";\nimport * as styled from \"./styled\";\n\nexport default function Spinner() {\n return (\n \n \n \n \n \n \n \n );\n}\n","import { getApproximateArrivalTime } from \"../../services/orderCalculations\";\nimport { OrderDetails } from \"../../types/OrderDetailsType\";\n\nconst stateIsErrorOrHasEta = (order: OrderDetails, errorStates: string[]) => {\n return errorStates.includes(order.status) || order.eta !== undefined;\n};\n\nexport const createSortOrdersFunction = (\n showingHistory: boolean,\n errorStates: string[]\n) => (orderDetails1: OrderDetails, orderDetails2: OrderDetails) => {\n if (!showingHistory) {\n // Orders with ETA should be placed above orders without ETA\n if (\n stateIsErrorOrHasEta(orderDetails1, errorStates) &&\n !stateIsErrorOrHasEta(orderDetails2, errorStates)\n ) {\n return -1;\n } else if (\n !stateIsErrorOrHasEta(orderDetails1, errorStates) &&\n stateIsErrorOrHasEta(orderDetails2, errorStates)\n ) {\n return 1;\n }\n }\n\n // Order approximate arrival time is either the expected arrival time\n // or the last update time if it is not receiving updates (eg Error State or Arrived)\n const arrivalTime1 = orderDetails1.eta\n ? getApproximateArrivalTime(orderDetails1.lastUpdateTime, orderDetails1.eta)\n : getApproximateArrivalTime(\n orderDetails1.lastTransitionTime || orderDetails1.lastUpdateTime,\n orderDetails1.eta\n );\n const arrivalTime2 = orderDetails2.eta\n ? getApproximateArrivalTime(orderDetails2.lastUpdateTime, orderDetails2.eta)\n : getApproximateArrivalTime(\n orderDetails2.lastTransitionTime || orderDetails2.lastUpdateTime,\n orderDetails2.eta\n );\n // When showing history we want the most recent (latest eta) orders shown first\n let difference;\n if (showingHistory) {\n difference = arrivalTime2.valueOf() - arrivalTime1.valueOf();\n } else {\n // When showing active orders we want the earliest eta showing first\n difference = arrivalTime1.valueOf() - arrivalTime2.valueOf();\n }\n // If the times are the same then orders with eta greater than should appear after orders with eta less than\n if (difference === 0) {\n if (orderDetails1.etaDirection !== orderDetails2.etaDirection) {\n if (orderDetails1.etaDirection === \"lessThan\") {\n return -1;\n } else {\n return 1;\n }\n }\n }\n return difference;\n};\n","import React from \"react\";\nimport { OrderDetails } from \"../../types/OrderDetailsType\";\nimport * as styled from \"./styled\";\nimport { ALERT_ANIMATION_TIME_PERIOD } from \"../../constants/intervals\";\nimport useIsOnline from \"../../hooks/useIsOnline\";\nimport AnimatedOrderCard from \"../AnimatedOrderCard\";\nimport {\n useOrderStatus,\n useStateDefinitions,\n} from \"../../hooks/useSharedContext\";\nimport { LoadingText, LoadingWrapper } from \"../PrivateRoute/styled\";\nimport Spinner from \"../Spinner\";\nimport OrderCard from \"../OrderCard/OrderCard\";\nimport { createSortOrdersFunction } from \"./helpers\";\nimport { getAlertTimer } from \"../../services/utils\";\nimport useStore from \"../../hooks/useStore\";\n\ninterface OrderTrackerProps {\n orders: OrderDetails[];\n showingHistory: boolean;\n categoryTitle: string;\n setOrderDetailsOverlayData: (orderDetails: OrderDetails) => void;\n isSearching: boolean;\n}\n\nexport default ({\n orders,\n showingHistory,\n categoryTitle,\n setOrderDetailsOverlayData,\n isSearching,\n}: OrderTrackerProps) => {\n const isOnline = useIsOnline();\n const {\n stateDictionary,\n errorStates,\n stateDefinitions,\n } = useStateDefinitions();\n const store = useStore();\n const { loadingFirstRequest } = useOrderStatus();\n\n const calculateAnimationStartOffset = (cardIndex: number) => {\n // The reason for changing the offset time based on even or uneven indexes is to increase the\n // difference between the animations for adjacent orders. When there are a large amount of arrived orders\n // if just based on the index then adjacent orders appears to flash evenly as the difference between the indexes\n // is small. This way the first orders on the list will appear to flash more noticeably out of sync. This approach\n // does result in the same issue for orders in the middle of a large arrived orders list but these are less prominent.\n // In production this should not occur very often as orders should be cleared as they arrived so a large amount of\n // arrived orders should not build up.\n if (cardIndex % 2 === 0) {\n return 0 + (cardIndex / orders.length) * ALERT_ANIMATION_TIME_PERIOD;\n }\n return (\n ALERT_ANIMATION_TIME_PERIOD -\n (cardIndex / orders.length) * ALERT_ANIMATION_TIME_PERIOD\n );\n };\n\n const shouldCardTextBeGreyedOut = (order: OrderDetails) =>\n !showingHistory && (!isOnline || errorStates.includes(order.status));\n\n const orderSorter = createSortOrdersFunction(showingHistory, errorStates);\n\n return (\n <>\n \n \n {categoryTitle.toUpperCase()}\n \n \n {!orders.length && loadingFirstRequest ? (\n \n \n Loading\n \n ) : !orders.length ? (\n \n {isSearching\n ? `No customers are currently ${categoryTitle} which match the search term`\n : `No customers are currently ${categoryTitle}`}\n \n ) : (\n \n {orders.sort(orderSorter).map((orderDetail, index) => {\n const key = orderDetail.orderId;\n const alertTimer =\n !showingHistory &&\n getAlertTimer(\n orderDetail,\n stateDictionary[orderDetail.status],\n stateDefinitions?.features,\n store\n );\n if (alertTimer) {\n return (\n {\n setOrderDetailsOverlayData(orderDetail);\n }}\n shouldAnimate={!orderDetail.isAcknowledged}\n animationStartOffset={calculateAnimationStartOffset(index)}\n isOnline={isOnline}\n alertTimer={alertTimer}\n orderCardFields={stateDefinitions?.orderCardFields}\n />\n );\n }\n return (\n \n setOrderDetailsOverlayData(orderDetail)\n }\n isActive={!shouldCardTextBeGreyedOut(orderDetail)}\n orderCardFields={stateDefinitions?.orderCardFields}\n />\n );\n })}\n \n )}\n \n );\n};\n","import styled from \"styled-components\";\nimport { IsMobileProps } from \"../../types/sharedComponentProps\";\n\ninterface SoundControlWrapperProps extends IsMobileProps {\n soundEnabled: boolean;\n}\n\nexport const SoundControlWrapper = styled.div`\n background-color: ${(props) =>\n props.soundEnabled\n ? props.theme.colors.TERTIARY_ACCENT\n : props.theme.colors.PRIMARY_ACCENT};\n font-size: 1rem;\n padding: 0.5rem 1rem;\n border-radius: 2rem;\n margin: auto 0;\n width: fit-content;\n display: inline-flex;\n max-height: 3rem;\n ${(props) => {\n if (!props.isMobile) {\n return `margin-left: 1.5rem;`;\n }\n }}\n\n svg {\n fill: ${(props) => props.theme.colors.TEXT_BACKGROUND};\n }\n`;\n\nexport const SoundControlText = styled.label`\n font-weight: 800;\n margin: auto 1rem;\n padding-top: 0.3rem;\n color: ${(props) => props.theme.colors.TEXT_BACKGROUND};\n`;\n","import React, { useState } from \"react\";\nimport { Icon } from \"@bluedot-innovation/bluedot-ui\";\nimport {\n playerSoundEnabled,\n enableNotificationSounds,\n disableNotificationSounds,\n} from \"../../services/sounds\";\nimport useIsMobile from \"../../hooks/useIsMobile\";\nimport * as styled from \"./styled\";\nexport default () => {\n const [updatingSound, setUpdatingSound] = useState(false);\n const isMobile = useIsMobile();\n\n const toggleSound = async () => {\n if (updatingSound) {\n return;\n }\n if (playerSoundEnabled) {\n setUpdatingSound(true);\n await disableNotificationSounds();\n setUpdatingSound(false);\n } else {\n setUpdatingSound(true);\n await enableNotificationSounds();\n setUpdatingSound(false);\n }\n };\n\n return (\n <>\n toggleSound()}\n onKeyUp={(keyEvent) => {\n if (keyEvent.key === \"Enter\") {\n toggleSound();\n }\n }}\n tabIndex={0}\n soundEnabled={playerSoundEnabled}\n role=\"button\"\n id=\"toggle-sounds-button\"\n >\n \n \n {playerSoundEnabled ? \"Disable alerts\" : \"Enable alerts\"}\n \n \n \n );\n};\n","import {\n getApproximateArrivalTime,\n formatTimestamp,\n} from \"../../services/orderCalculations\";\nimport stringTemplateFormat from \"string-template\";\nimport { OrderDetails } from \"../../types/OrderDetailsType\";\nimport {\n FeatureToggles,\n StateDefinition,\n} from \"../../types/StateDefinitionType\";\nimport { getAlertTimer } from \"../../services/utils\";\nimport { Store } from \"../../types/StoreType\";\n\nconst createStringTemplateValues = (order: OrderDetails) => {\n const arrivalTimestamp = getApproximateArrivalTime(\n order.lastUpdateTime,\n order.eta\n );\n const arrivalTime = formatTimestamp(arrivalTimestamp.toISOString());\n // TODO: Remove the or condition for lastUpdateTime after 48 hours of deployment of dynamic states. This is just temporary\n // as during deployment not all orders will have been updated to include lastTransitionTime\n const transitionTimestamp = order.lastTransitionTime || order.lastUpdateTime;\n const formattedLastTransitionTime = formatTimestamp(transitionTimestamp);\n const etaMinutesInteger = order.eta ? Math.round(order.eta / 60) : \"-\";\n const etaMinutes =\n etaMinutesInteger > 1\n ? `${etaMinutesInteger} MINUTES`\n : `${etaMinutesInteger} MINUTE`;\n let etaDirectionPreposition = \"-\";\n if (order.etaDirection) {\n if (order.etaDirection === \"lessThan\") {\n etaDirectionPreposition = \"at\";\n } else {\n etaDirectionPreposition = \"after\";\n }\n }\n return {\n ...order.hsFields,\n ...order,\n arrivalTime,\n formattedLastTransitionTime,\n etaMinutes,\n etaDirectionPreposition,\n };\n};\n\nexport const generateHeaderText = (\n orderDetails: OrderDetails,\n stateDefinition: StateDefinition\n) => {\n if (!stateDefinition.displayState) {\n console.log(\"Order does not have display state\", orderDetails);\n return \"Something Went Wrong\";\n }\n const templateValues = createStringTemplateValues(orderDetails);\n return stringTemplateFormat(\n stateDefinition.displayState.orderDetailsTitle,\n templateValues\n );\n};\n\nexport const generateSuccessMessageText = (orderDetails: OrderDetails) => {\n const currentTimestamp = new Date().toISOString();\n const currentTime = formatTimestamp(currentTimestamp);\n const SUCCESS_MESSAGE_TEMPLATE = `{customerName}'s order was completed at ${currentTime}`;\n const templateValues = createStringTemplateValues(orderDetails);\n return stringTemplateFormat(SUCCESS_MESSAGE_TEMPLATE, templateValues);\n};\n\nexport const generateStatusDescriptionText = (\n orderDetails: OrderDetails,\n stateDefinition: StateDefinition\n) => {\n if (!stateDefinition.displayState) {\n console.log(\"Order does not have display state\", orderDetails);\n return \"Something Went Wrong\";\n }\n const templateValues = createStringTemplateValues(orderDetails);\n return stringTemplateFormat(\n stateDefinition.displayState.orderDetailsSummary,\n templateValues\n );\n};\n\nexport const shouldOrderShowSuccessMessage = (\n orderDetails: OrderDetails,\n targetState: StateDefinition,\n statesFeatures: FeatureToggles | undefined,\n store: Store | undefined\n) => {\n const targetTimer = getAlertTimer(\n orderDetails,\n targetState,\n statesFeatures,\n store\n );\n if (targetTimer) {\n return targetTimer.showSuccessMessage;\n }\n return false;\n};\n\nexport const sortCustomDataFields = (\n hsFieldsPriority: string[] | undefined,\n hsFields: Record\n) => {\n let orderedFields: Record = {};\n let sortedFields: string[] = [];\n\n Object.keys(hsFields).forEach((key) => {\n if (hsFieldsPriority) {\n for (let index = 0; index < hsFieldsPriority.length; index++) {\n if (\n hsFieldsPriority[index].replace(/\\s+/g, \"\").toLowerCase() ===\n key.replace(/\\s+/g, \"\").toLowerCase()\n ) {\n orderedFields[index] = key;\n }\n }\n }\n });\n\n sortedFields = Object.entries(orderedFields)\n .sort(([indexA], [indexB]) => Number(indexA) - Number(indexB))\n .map(([, key]) => key);\n\n const unorderedFields: string[] = [];\n\n Object.keys(hsFields).forEach((fieldKey) => {\n if (!sortedFields.includes(fieldKey)) {\n unorderedFields.push(fieldKey);\n }\n });\n\n const alphabeticallySortedFields = unorderedFields.sort((a, b) =>\n a.localeCompare(b)\n );\n sortedFields.push(...alphabeticallySortedFields);\n\n return sortedFields;\n};\n","import styled from \"styled-components\";\n\nexport const CustomDataCardWrapper = styled.div`\n display: inline-flex;\n justify-content: space-between;\n width: 100%;\n border: solid 0.1rem ${(props) => props.theme.colors.BORDER_COLOR};\n box-shadow: 0 0.2rem 0.2rem ${(props) => props.theme.colors.SHADOW_COLOR};\n padding: 0 1rem;\n min-height: 4rem;\n\n p {\n width: 50%;\n overflow-wrap: break-word;\n text-align: left;\n margin: auto;\n }\n\n p:last-child {\n text-align: right;\n }\n`;\n\nexport const CustomDataFieldName = styled.p`\n font-weight: 700;\n`;\n","import React from \"react\";\nimport * as styled from \"./styled\";\n\nexport default ({ fieldName, value }: { key: string, fieldName: string; value: string }) => {\n return (\n \n {fieldName}\n

{value}

\n
\n );\n};\n","import styled from \"styled-components\";\nimport { Button } from \"../Button/styled\";\n\ninterface OrderDetailsWrapperProps {\n isMobile: boolean;\n}\n\nexport const OrderDetailsWrapper = styled.div`\n background-color: ${(props) => props.theme.colors.TEXT_BACKGROUND};\n position: absolute;\n top: 0;\n left: 0;\n ${(props) => {\n if (!props.isMobile) {\n return `top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);`;\n }\n }}\n min-width: ${(props) => (props.isMobile ? \"100\" : \"55\")}vw;\n min-height: ${(props) => (props.isMobile ? \"100\" : \"40\")}vh;\n max-width: 100vw;\n max-height: 100vh;\n z-index: 5;\n text-align: center;\n`;\n\ninterface OrderStatusProps {\n color?: string;\n}\n\nexport const OrderDetailsStatusHeader = styled.div`\n width: 100%;\n display: flex;\n flex-direction: column;\n background-color: ${(props) => props.color || props.theme.colors.SUCCESS};\n height: 7rem;\n`;\n\nexport const HeaderText = styled.h1`\n color: ${(props) => props.theme.colors.TEXT_BACKGROUND};\n margin: auto 1rem;\n font-size: 2rem;\n`;\n\nexport const CustomDataCardsWrapper = styled.section`\n width: 80%;\n margin: 2rem auto;\n overflow-y: scroll;\n max-height: 36vh;\n`;\n\nexport const OrderStatusText = styled.p`\n font-weight: 700;\n font-size: 1.6rem;\n margin-top: 3rem;\n margin-bottom: 0rem;\n`;\n\nexport const StatusDescriptionText = styled.p`\n font-size: 1.4rem;\n margin-bottom: 0rem;\n overflow-wrap: break-word;\n padding: 0.8rem;\n\n b {\n margin-left: 0.5rem;\n }\n`;\n\nexport const OrderIdText = styled.p`\n font-size: 1.2rem;\n padding: 1rem;\n overflow-wrap: break-word;\n b {\n margin-right: 0.5rem;\n }\n`;\n\nexport const ButtonWrapper = styled.div`\n margin: 1rem auto;\n width: 80%;\n`;\n\nexport const TwoButtonWrapper = styled.div`\n margin: 1rem auto;\n display: inline-flex;\n width: 80%;\n justify-content: space-between;\n button {\n width: 40%;\n }\n`;\n\nexport const BackButton = styled(Button)`\n background-color: ${(props) => props.theme.colors.TEXT_BACKGROUND};\n color: ${(props) => props.theme.colors.PRIMARY_TEXT};\n border-color: ${(props) => props.theme.colors.PRIMARY_TEXT};\n`;\n\nexport const UpdateErrorMessage = styled.p`\n color: ${(props) => props.theme.colors.TERTIARY_ACCENT};\n font-size: 1.17rem;\n font-weight: bold;\n`;\n\nexport const SuccessMessageText = styled.h2``;\n\nexport const SuccessMessageTimerText = styled.p`\n color: ${(props) => props.theme.colors.DISABLED_TEXT};\n`;\n\nexport const SuccessMessageGraphic = styled.img`\n height: 12rem;\n margin: 2rem 0;\n`;\n","import styled from \"styled-components\";\nimport { DESKTOP_MIN_WIDTH, SMALL_PHONE_MAX_WIDTH } from \"../../../../constants/layout\";\n\nexport const ChangeOrderStatusWrapper = styled.div`\n display: flex;\n flex-direction: column;\n margin: auto;\n\n @media only screen and (min-width: ${DESKTOP_MIN_WIDTH}) {\n min-width: 45rem;\n }\n`;\n\nexport const CurrentStatusWrapper = styled.div`\n display: flex;\n margin: auto;\n`;\n\nexport const CurrentStatusLabel = styled.h2`\n font-size: 1.2rem;\n font-weight: 500;\n margin-right: 1.5rem;\n`;\n\nexport const CurrentStatusText = styled.h2`\n font-size: 1.2rem;\n`;\n\nexport const SelectNewStatusText = styled.h2`\n font-size: 1rem;\n text-align: left;\n margin-left: 2rem;\n`;\n\nexport const StatusRadioButtonGrid = styled.div`\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 0.5rem 2rem;\n padding: 0 0.5rem;\n margin-bottom: 1.5rem;\n\n @media only screen and (min-width: ${DESKTOP_MIN_WIDTH}) { \n padding: 0 3rem;\n }\n\n @media only screen and (max-width: ${SMALL_PHONE_MAX_WIDTH}) { \n grid-template-columns: 1fr;\n padding: 0 2rem;\n }\n`;\n\nexport const StatusButtonWrapper = styled.div`\n position: relative;\n display: flex;\n align-items: center;\n min-height: 4rem;\n border: solid ${(props) => props.theme.colors.PRIMARY_TEXT} 2px;\n border-radius: 6px;\n padding: 0 0.8rem;\n\n @media only screen and (max-width: ${SMALL_PHONE_MAX_WIDTH}) { \n min-height: 5rem;\n }\n`;\n\nexport const StatusButtonLabel = styled.label`\n text-align: left;\n max-width: 8rem;\n margin-left: 1rem;\n\n @media only screen and (min-width: ${DESKTOP_MIN_WIDTH}), (max-width: ${SMALL_PHONE_MAX_WIDTH}) { \n // to centre text exactly disregarding radio position\n position: absolute;\n left: 0; right: 0; \n margin-left: auto; margin-right: auto; \n width: fit-content;\n max-width: none;\n } \n`;\n\nexport const StatusRadioButton = styled.input`\n display: flex;\n justify-self: flex-start;\n align-self: center;\n transform: scale(1.5);\n`;\n","import React, { useEffect, useMemo } from \"react\";\nimport { useStateDefinitions } from \"../../../../hooks/useSharedContext\";\nimport * as styled from \"./styled\";\n\nexport default ({\n orderStatus,\n selectedStatus,\n setSelectedStatus,\n}: {\n orderStatus: string;\n selectedStatus: string | undefined;\n setSelectedStatus: (newStatus: string) => void;\n}) => {\n const { stateDefinitions, stateDictionary } = useStateDefinitions();\n\n const transitionableStates = useMemo(\n () =>\n stateDefinitions?.states\n .filter((state) => state.canForceTransition && state.displayState)\n .map((state) => ({\n orderStatus: state.name,\n label: state.displayState!.stateDisplayName,\n })) || [],\n [stateDefinitions]\n );\n\n useEffect(() => {\n if (selectedStatus === undefined && transitionableStates.length) {\n if (\n transitionableStates.find(\n (transitionableStates) =>\n transitionableStates.orderStatus === orderStatus\n )\n ) {\n setSelectedStatus(orderStatus);\n } else {\n setSelectedStatus(transitionableStates[0].orderStatus);\n }\n }\n }, [selectedStatus, transitionableStates, setSelectedStatus, orderStatus]);\n\n const currentOrderDisplayState =\n stateDictionary[orderStatus].displayState?.stateDisplayName;\n return (\n \n \n Current Status:\n \n {currentOrderDisplayState}\n \n \n Select new status\n \n {transitionableStates.map((transitionableState, index) => {\n return (\n setSelectedStatus(transitionableState.orderStatus)}\n >\n \n setSelectedStatus(transitionableState.orderStatus)\n }\n className={index === 0 ? \"menu-item\" : \"\"}\n name=\"force-order-status\"\n checked={transitionableState.orderStatus === selectedStatus}\n id={transitionableState.orderStatus}\n />\n \n {transitionableState.label.length > 20 \n ? `${transitionableState.label.substring(0, 20)}...` \n : transitionableState.label\n }\n \n \n );\n })}\n \n \n );\n};\n","import React, { useEffect, useState } from \"react\";\nimport { Overlay } from \"../../../LayoutComponents/styled\";\nimport * as styled from \"../../styled\";\nimport { generateSuccessMessageText } from \"../../helpers\";\nimport { OrderDetails } from \"../../../../types/OrderDetailsType\";\nimport useIsMobile from \"../../../../hooks/useIsMobile\";\nimport CurbsideIcon from \"../../../../resources/CurbsideIcon.svg\";\n\nconst SUCCESS_MESSAGE_TIME_SECONDS = 3;\n\nexport default ({\n orderDetails,\n hideOrderDetails,\n}: {\n orderDetails: OrderDetails;\n hideOrderDetails: () => void;\n}) => {\n const isMobile = useIsMobile();\n const [remainingCountdown, setRemainingCountdown] = useState(\n SUCCESS_MESSAGE_TIME_SECONDS\n );\n\n useEffect(() => {\n if (remainingCountdown <= 0) {\n hideOrderDetails();\n } else {\n const timerId = setTimeout(\n () => setRemainingCountdown((prevValue) => prevValue - 1),\n 1000\n );\n return () => clearTimeout(timerId);\n }\n }, [remainingCountdown, hideOrderDetails]);\n\n return (\n <>\n hideOrderDetails()} zIndex={2} />\n \n \n COMPLETED\n \n \n {generateSuccessMessageText(orderDetails)}\n \n \n Order ID:\n {orderDetails.orderId}\n \n Great job!\n That was fast.\n \n \n {`Closing in ${remainingCountdown} ${\n remainingCountdown > 1 ? \"secs\" : \"sec\"\n }`}\n \n \n hideOrderDetails()}>\n Back Now\n \n \n \n \n );\n};\n","import React from \"react\";\nimport { OrderDetails } from \"../../types/OrderDetailsType\";\nimport Button from \"../Button\";\nimport { generateStatusDescriptionText, generateHeaderText, sortCustomDataFields } from \"./helpers\";\nimport CustomDataCard from \"./components/CustomDataCard\";\nimport * as styled from \"./styled\";\nimport useIsMobile from \"../../hooks/useIsMobile\";\nimport { Overlay } from \"../LayoutComponents/styled\";\nimport ChangeOrderStatus from \"./components/ChangeOrderStatus\";\nimport OrderSuccessMessage from \"./components/OrderSuccessMessage\";\nimport useOrderDetailsDisplayController from \"./useOrderDetailsDisplayController\";\nimport { useStateDefinitions } from \"../../hooks/useSharedContext\";\nimport { StateDefinitionConfig } from \"../../types/StateDefinitionType\";\n\nexport default ({ orderDetails, hideOrderDetails }: { orderDetails: OrderDetails; hideOrderDetails: () => void }) => {\n const isMobile = useIsMobile();\n const {\n showSuccessMessage,\n isUpdating,\n setShowChangeStatus,\n showChangeStatus,\n onUpdateOrderStatus,\n updateError,\n targetState,\n acknowledgeOrder,\n selectedForceTransitionState,\n setSelectedForceTransitionState,\n modalRef,\n } = useOrderDetailsDisplayController(orderDetails, hideOrderDetails);\n const { stateDefinitions } = useStateDefinitions();\n\n if (showSuccessMessage) {\n return (\n \n );\n }\n\n const generateActionButtons = (\n orderDetails: OrderDetails,\n showChangeOrderStatus: boolean,\n forceTransitionStatus: string\n ) => {\n if (showChangeOrderStatus) {\n return (\n <>\n \n setShowChangeStatus(false)}\n onKeyUp={(event: { key: string; }) => {\n if (event.key === \"Enter\") {\n setShowChangeStatus(false);\n }\n }}\n >\n Back\n \n onUpdateOrderStatus(forceTransitionStatus, false)}\n disabled={isUpdating}\n className=\"menu-item\"\n onKeyUp={(event) => {\n if (event.key === \"Enter\") {\n onUpdateOrderStatus(forceTransitionStatus, false);\n }\n }}\n >\n {isUpdating ? \"Updating\" : \"Update\"}\n \n \n {updateError && (\n \n An error occurred updating the order status\n \n )}\n \n );\n }\n const CommonButtons = (\n <>\n \n hideOrderDetails()}\n className=\"menu-item\"\n onKeyUp={(event: { key: string; }) => {\n if (event.key === \"Enter\") {\n hideOrderDetails();\n }\n }}\n >\n Back\n \n setShowChangeStatus(true)}\n className=\"menu-item\"\n onKeyUp={(event) => {\n if (event.key === \"Enter\") {\n setShowChangeStatus(true);\n }\n }}\n >\n Update Status\n \n \n {updateError && (\n \n An error occurred updating the order status\n \n )}\n \n );\n if (!targetState.displayState?.quickButtons?.length) {\n return CommonButtons;\n }\n const targetQuickButton = targetState.displayState.quickButtons[0];\n if (targetQuickButton.action === \"ACKNOWLEDGE\") {\n if (orderDetails.isAcknowledged) {\n return CommonButtons;\n }\n return (\n <>\n \n {\n acknowledgeOrder(orderDetails, false);\n }}\n onKeyUp={(event) => {\n if (event.key === \"Enter\") {\n acknowledgeOrder(orderDetails, false);\n }\n }}\n disabled={isUpdating}\n className=\"menu-item\"\n >\n {isUpdating ? \"Updating\" : targetQuickButton.label}\n \n \n {CommonButtons}\n \n );\n }\n return (\n <>\n \n onUpdateOrderStatus(targetQuickButton.action, true)}\n disabled={isUpdating}\n className=\"menu-item\"\n onKeyUp={(event) => {\n if (event.key === \"Enter\") {\n onUpdateOrderStatus(targetQuickButton.action, true);\n }\n }}\n >\n {isUpdating ? \"Updating\" : targetQuickButton.label}\n \n \n {CommonButtons}\n \n );\n };\n\n const renderCustomDetails = (orderDetails: OrderDetails, stateDefinitions: StateDefinitionConfig | undefined) => {\n if (orderDetails.hsFields) {\n const sortedFields = sortCustomDataFields(stateDefinitions!.hsFieldsPriority, orderDetails.hsFields);\n return sortedFields.map(key => (\n \n ));\n };\n };\n\n return (\n <>\n hideOrderDetails()} zIndex={2} />\n \n \n \n {generateHeaderText(orderDetails, targetState)}\n \n \n \n {generateStatusDescriptionText(orderDetails, targetState)}\n \n \n Order ID:\n {orderDetails.orderId}\n \n {orderDetails.simphonyCheckNumber && (\n \n Simphony Check Number:\n {orderDetails.simphonyCheckNumber}\n \n )}\n {showChangeStatus ? (\n \n ) : (\n \n {renderCustomDetails(orderDetails, stateDefinitions)}\n \n )}\n {generateActionButtons(\n orderDetails,\n showChangeStatus,\n selectedForceTransitionState as string\n )}\n \n \n );\n};\n","import {\n useOrderStatus,\n useStateDefinitions,\n} from \"../../hooks/useSharedContext\";\nimport { RefObject, useCallback, useEffect, useMemo, useState } from \"react\";\nimport useModalTabController from \"../../hooks/useModalTabController\";\nimport { StateDefinition } from \"../../types/StateDefinitionType\";\nimport { OrderDetails } from \"../../types/OrderDetailsType\";\nimport * as persistenceManager from \"../../services/persistenceManager\";\nimport * as api from \"../../services/api\";\nimport { Region } from \"../../types/RegionType\";\nimport * as errorFactory from \"../../services/errorFactory\";\nimport { shouldOrderShowSuccessMessage } from \"./helpers\";\nimport { useAriaHideMainContent } from \"../../hooks/useSharedContext\";\nimport { useWaitTime } from \"../../hooks/useSharedContext\";\nimport useStore from \"../../hooks/useStore\";\n\nexport interface UseOrderDetailsControllerOutput {\n showSuccessMessage: boolean;\n isUpdating: boolean;\n setShowChangeStatus: (newValue: boolean) => void;\n showChangeStatus: boolean;\n onUpdateOrderStatus: (\n newOrderStatus: string,\n usedQuickButton: boolean\n ) => Promise;\n updateError: undefined | Error;\n targetState: StateDefinition;\n acknowledgeOrder: (\n orderDetails: OrderDetails,\n isWithRetries?: boolean | undefined\n ) => Promise;\n selectedForceTransitionState: undefined | string;\n setSelectedForceTransitionState: (newValue: string | undefined) => void;\n modalRef: RefObject;\n}\n\nexport default (\n orderDetails: OrderDetails,\n hideOrderDetails: () => void\n): UseOrderDetailsControllerOutput => {\n const { refreshOrderDetails } = useOrderStatus();\n const [updateError, setUpdateError] = useState();\n const [isUpdating, setIsUpdating] = useState(false);\n const { stateDictionary, stateDefinitions } = useStateDefinitions();\n const [showChangeStatus, setShowChangeStatus] = useState(false);\n const [\n selectedForceTransitionState,\n setSelectedForceTransitionState,\n ] = useState();\n const [showSuccessMessage, setShowSuccessMessage] = useState(false);\n const targetState = useMemo(\n () => stateDictionary[orderDetails.status] as StateDefinition,\n [stateDictionary, orderDetails]\n );\n const [acknowledgeCalled, setAcknowledgeCalled] = useState(false);\n const { modalRef, setSelectedElementIndex } = useModalTabController(\n \".menu-item\",\n hideOrderDetails,\n true\n );\n const { setHideMainContent, setHideBanner } = useAriaHideMainContent();\n const { refreshWaitTime } = useWaitTime();\n const store = useStore();\n\n useEffect(() => {\n setHideMainContent(true);\n setHideBanner(true);\n\n return () => {\n setHideMainContent(false);\n setHideBanner(false);\n };\n }, [setHideMainContent, setHideBanner]);\n\n const acknowledgeOrder = useCallback(\n async (orderDetails: OrderDetails, isWithRetries?: boolean) => {\n const authToken = persistenceManager.getAuthToken();\n const region = persistenceManager.getRegion();\n\n if (authToken && region && orderDetails.orderId) {\n try {\n if (isWithRetries) {\n await api.acknowledgeOrderWithRetries(\n orderDetails.orderId,\n authToken,\n region as Region\n );\n } else {\n await api.acknowledgeOrder(\n orderDetails.orderId,\n authToken,\n region as Region\n );\n }\n await refreshOrderDetails();\n // Is with retries refers to Arrival acknowledgement while the card\n // is still open. In this case do not hide the modal after acknowledgement\n // Otherwise it should occur after a button press so do hide the modal\n if (!isWithRetries) {\n hideOrderDetails();\n }\n } catch (error) {\n setUpdateError(error as Error);\n }\n } else {\n if (!authToken) {\n setUpdateError(errorFactory.createNoTokenError() as Error);\n } else if (!region) {\n setUpdateError(errorFactory.createNoRegionError() as Error);\n }\n }\n },\n [refreshOrderDetails, setUpdateError, hideOrderDetails]\n );\n\n useEffect(() => {\n if (\n !acknowledgeCalled &&\n targetState.name === orderDetails.status &&\n targetState.canAcknowledge &&\n targetState.isActive &&\n !orderDetails.isAcknowledged\n ) {\n setAcknowledgeCalled(true);\n acknowledgeOrder(orderDetails, true);\n }\n }, [\n orderDetails,\n acknowledgeOrder,\n targetState,\n acknowledgeCalled,\n setAcknowledgeCalled,\n ]);\n\n const onUpdateOrderStatus = async (\n newOrderStatus: string,\n usedQuickButton: boolean\n ) => {\n setIsUpdating(true);\n const authToken = persistenceManager.getAuthToken();\n const region = persistenceManager.getRegion();\n\n if (authToken && region && orderDetails.orderId) {\n try {\n await api.updateOrderStatus(\n orderDetails.orderId,\n newOrderStatus,\n authToken,\n region as Region\n );\n refreshWaitTime();\n setIsUpdating(false);\n if (\n usedQuickButton &&\n shouldOrderShowSuccessMessage(\n orderDetails,\n targetState,\n stateDefinitions?.features,\n store\n )\n ) {\n setShowSuccessMessage(true);\n } else {\n hideOrderDetails();\n await refreshOrderDetails();\n }\n } catch (error) {\n setUpdateError(error as Error);\n setIsUpdating(false);\n }\n } else {\n setUpdateError(errorFactory.createNoRegionError() as Error);\n setIsUpdating(false);\n }\n };\n\n const onSetShowChangeStatus = (newValue: boolean) => {\n setShowChangeStatus(newValue);\n setSelectedElementIndex(undefined);\n };\n\n return {\n showSuccessMessage,\n isUpdating,\n setShowChangeStatus: onSetShowChangeStatus,\n showChangeStatus,\n onUpdateOrderStatus,\n updateError,\n targetState,\n acknowledgeOrder,\n selectedForceTransitionState,\n setSelectedForceTransitionState,\n modalRef,\n };\n};\n","import styled from \"styled-components\";\nimport { IsMobileProps } from \"../../types/sharedComponentProps\";\n\nexport const SearchBarAndLabelWrapper = styled.div`\n width: 100%;\n ${(props) => {\n if (props.isMobile) {\n return `margin-top: 1rem;`;\n } else {\n return `max-width: 33%;`;\n }\n }}\n`;\n\nexport const SearchBarLabel = styled.label`\n font-weight: 500;\n`;\n\nexport const SearchBarWrapper = styled.div`\n width: 100%;\n height: 35px;\n display: flex;\n align-items: center;\n background-color: ${(props) => props.theme.colors.TEXT_BACKGROUND};\n border-radius: 5px;\n border: ${(props) => props.theme.colors.PRIMARY_TEXT} solid 2px;\n`;\n\nexport const SearchInput = styled.input`\n border: none;\n padding: 12px 0 12px 12px;\n font-size: 16px;\n width: 100%;\n height: 100%;\n`;\n\nexport const ClearIconContainer = styled.div`\n margin: 0.5rem 1rem auto 0;\n\n & svg {\n transform: rotate(45deg);\n }\n`;\n\nexport const SearchIconWrapper = styled.div`\n background-color: ${(props) => props.theme.colors.TEXT_BACKGROUND};\n margin: 0 0.5rem;\n align-items: center;\n display: flex;\n height: 100%;\n\n & svg {\n margin: auto;\n }\n`;\n","import React from \"react\";\nimport { Icon } from \"@bluedot-innovation/bluedot-ui\";\nimport useIsMobile from \"../../hooks/useIsMobile\";\nimport * as styled from \"./styled\";\n\nconst LABEL_TEXT = \"Filter orders by ID or name\";\n\nexport default ({\n searchTerm,\n setSearchTerm,\n}: {\n searchTerm: string;\n setSearchTerm: (newValue: string) => void;\n}) => {\n const isMobile = useIsMobile();\n const onClearSearchTerm = () => {\n setSearchTerm(\"\");\n };\n\n return (\n \n \n {LABEL_TEXT}\n \n \n \n \n \n\n setSearchTerm(event.target.value)}\n role=\"searchbox\"\n id=\"orderSearch\"\n />\n {searchTerm && (\n \n {\n if (keyEvent.key === \"Enter\") {\n onClearSearchTerm();\n }\n }}\n tabIndex={0}\n />\n \n )}\n \n \n );\n};\n","import { useState, useMemo } from \"react\";\nimport { OrderDetails } from \"../types/OrderDetailsType\";\n\nexport default (orders: OrderDetails[]) => {\n const [searchTerm, setSearchTerm] = useState(\"\");\n\n const filteredOrders = useMemo(() => {\n if (!searchTerm) {\n return orders;\n }\n return orders.filter((order) => {\n if (\n order.orderId.toLowerCase().indexOf(searchTerm.toLowerCase()) !== -1\n ) {\n return true;\n }\n return (\n order.customerName &&\n order.customerName.toLowerCase().indexOf(searchTerm.toLowerCase()) !==\n -1\n );\n });\n }, [searchTerm, orders]);\n\n return {\n filteredOrders,\n searchTerm,\n setSearchTerm,\n };\n};\n","import styled from \"styled-components\";\nimport { IsMobileProps } from \"../../types/sharedComponentProps\";\n\nexport const WaitTimeDisplayWrapper = styled.div`\n display: flex;\n ${(props) => {\n if (!props.isMobile) {\n return \"flex-direction: column; align-items: flex-start;\";\n } else {\n return \"margin-top: 1rem; width: fit-content; align-items: center;\";\n }\n }}\n`;\n\nexport const WaitTimeWithGoalDisplayWrapper = styled.div`\n display: flex;\n background-color: ${(props) => props.theme.colors.TEXT_BACKGROUND};\n padding: 0 1rem;\n border-radius: 0.5rem;\n ${(props) => {\n if (!props.isMobile) {\n return \"flex-direction: column; align-items: flex-start;\";\n } else {\n return \"margin-top: 1rem; width: 100%; align-items: center; justify-content: space-between; padding-top: 0.5rem;\";\n }\n }}\n`;\n\nexport const MobileWaitTimeWrapper = styled.div`\n display: flex;\n`;\n\nexport const WaitTimeLabel = styled.h3`\n font-size: 1rem;\n ${(props) => {\n if (props.isMobile) {\n return \"margin-right: 0.5rem;\";\n }\n }}\n`;\n\nexport const WaitTimeWrapper = styled.div`\n display: flex;\n`;\n\nexport const WaitTimeWithUnitsWrapper = styled.div`\n display: flex;\n ${(props) => {\n if (props.isMobile) {\n return \"margin-top: 0.7rem;\";\n }\n }}\n`;\n\nexport const NoOrdersWrapper = styled.div`\n ${(props) => {\n if (!props.isMobile) {\n return \"width: 100%;\";\n }\n }}\n text-align: center;\n`;\n\nexport const NoOrdersText = styled.div`\n text-align: center;\n`;\n\ninterface WaitTimePerformanceProps {\n waitTimeGoal: number;\n waitTimeAlert: number;\n waitTime: number;\n}\n\nexport const ColoredWaitTimePerformance = styled.p`\n font-size: 1.5rem;\n font-weight: 600;\n margin: 0;\n color: ${(props) => {\n if (props.waitTime >= props.waitTimeGoal) {\n return props.theme.colors.ERROR;\n }\n if (props.waitTime >= props.waitTimeAlert) {\n return props.theme.colors.WARNING;\n }\n return props.theme.colors.SUCCESS;\n }};\n`;\n\nexport const WaitTimeNumber = styled.p`\n font-size: 1.5rem;\n font-weight: 600;\n margin: 0;\n`;\n\nexport const WaitTimeGoalDivider = styled.p`\n font-size: 1.5rem;\n font-weight: 600;\n margin: 0 0.2rem 0.5rem;\n`;\n\nexport const WaitTimeUnit = styled.p`\n font-size: 1rem;\n font-weight: 600;\n margin-left: 0.5rem;\n margin-top: 0.5rem;\n`;\n","import React from \"react\";\nimport { useWaitTime, useStateDefinitions } from \"../../hooks/useSharedContext\";\nimport * as styled from \"./styled\";\nimport useIsMobile from \"../../hooks/useIsMobile\";\nimport useStore from \"../../hooks/useStore\";\nimport { convertToMinutesAndSecondsString } from \"../../services/utils\";\n\nexport default () => {\n const { waitTime, numberOfOrders } = useWaitTime();\n const { stateDefinitions } = useStateDefinitions();\n const store = useStore();\n const isMobile = useIsMobile();\n\n const waitTimeString = convertToMinutesAndSecondsString(waitTime);\n\n const waitTimeFeature =\n store?.waitTime || stateDefinitions?.features?.waitTime;\n\n if (!waitTimeFeature) {\n return null;\n }\n\n if (!waitTimeFeature.goal || !numberOfOrders) {\n return (\n \n \n Wait Time Average\n \n {numberOfOrders ? (\n \n {waitTimeString}\n Minutes\n \n ) : (\n \n \n No orders yet\n \n \n )}\n \n );\n }\n\n return (\n \n \n Wait Time Average\n \n {numberOfOrders ? (\n \n \n {waitTimeString}\n \n /\n \n {convertToMinutesAndSecondsString(waitTimeFeature.goal as number)}\n \n \n ) : (\n \n \n No orders yet\n \n \n )}\n \n );\n};\n","import styled from \"styled-components\";\n\nexport const NavLinksWrapper = styled.nav`\n max-width: 30rem;\n display: flex;\n justify-content: space-between;\n margin: auto;\n margin-top: 3rem;\n`;\n\nexport const NavLink = styled.a``;\n\nexport const LinksDescription = styled.p`\n margin: 0;\n`;\n","import React from \"react\";\nimport * as styled from \"./styled\";\n\nexport default () => {\n return (\n \n \n Site Map:\n \n Active Orders\n Order History\n \n );\n};\n","import React, { useEffect } from \"react\";\nimport ConnectionStatusSnackbar from \"../../components/ConnectionStatusSnackbar\";\nimport * as styled from \"./styled\";\nimport AppHeader from \"../../components/AppHeader/AppHeader\";\nimport useIsMobile from \"../../hooks/useIsMobile\";\nimport {\n useOrderStatus,\n useStateDefinitions,\n} from \"../../hooks/useSharedContext\";\nimport OrderTracker from \"../../components/OrderTracker\";\nimport EnableSoundControl from \"../../components/EnableSoundControl\";\nimport useOrderDetailsOverlay from \"../../hooks/useOrderDetailsOverlay\";\nimport OrderDetailsDisplay from \"../../components/OrderDetailsDisplay/OrderDetailsDisplay\";\nimport SearchBar from \"../../components/SearchBar\";\nimport useOrderSearchFilter from \"../../hooks/useOrderSearchFilter\";\nimport WaitTimeDisplay from \"../../components/WaitTimeDisplay/WaitTimeDisplay\";\nimport { useAriaHideMainContent } from \"../../hooks/useSharedContext\";\nimport NavigationLinks from \"../../components/NavigationLinks\";\n\nconst ActiveOrdersDisplay = () => {\n const { currentOrders, historyOrders } = useOrderStatus();\n const {\n stateCategoryMapping,\n stateDefinitions,\n errorStates,\n } = useStateDefinitions();\n const isMobile = useIsMobile();\n const {\n orderDetailsOverlayData,\n setOrderDetailsOverlayData,\n } = useOrderDetailsOverlay(currentOrders, historyOrders);\n const { filteredOrders, searchTerm, setSearchTerm } = useOrderSearchFilter(\n currentOrders\n );\n const { hideMainContent, hideBanner } = useAriaHideMainContent();\n\n useEffect(() => {\n document.title = \"Hello Screens - Active Orders\";\n }, []);\n\n const activeOrdersCount = currentOrders.filter((order) => {\n return !errorStates.includes(order.status);\n }).length;\n\n return (\n <>\n {orderDetailsOverlayData && (\n setOrderDetailsOverlayData(null)}\n />\n )}\n \n \n \n \n \n {activeOrdersCount}\n \n Active\n \n {isMobile ? (\n \n ) : (\n !stateDefinitions?.features?.hideSearchBar && (\n \n )\n )}\n \n {!isMobile && (\n <>\n \n \n \n )}\n \n \n \n {isMobile && !stateDefinitions?.features?.hideSearchBar && (\n \n )}\n {isMobile && }\n {stateDefinitions?.categories.map((category) => {\n const targetOrders = filteredOrders.filter(\n (order) =>\n stateCategoryMapping[category] &&\n stateCategoryMapping[category].includes(order.status)\n );\n\n return (\n \n );\n })}\n \n \n \n );\n};\n\nexport default ActiveOrdersDisplay;\n","import styled from \"styled-components\";\n\nexport const AppWrapper = styled.div`\n height: 100vh;\n background-color: ${(props) => props.theme.colors.NEUTRAL_PANEL};\n overflow: auto;\n`;\n","import React, { ReactNode } from \"react\";\nimport * as styled from \"./styled\";\n\nexport default ({ children }: { children: ReactNode }) => {\n return {children};\n};\n","import styled from \"styled-components\";\n\nexport const SelectWrapper = styled.div`\n .region-selector {\n font-family: \"Spartan\", -apple-system, BlinkMacSystemFont, \"Segoe UI\",\n \"Roboto\", \"Oxygen\", \"Ubuntu\", \"Cantarell\", \"Fira Sans\", \"Droid Sans\",\n \"Helvetica Neue\", sans-serif;\n .region-selector__control {\n background-color: ${(props) => props.theme.colors.TEXT_BACKGROUND};\n height: 3rem;\n }\n\n .region-selector__indicator-separator {\n width: 0;\n }\n\n .region-selector__option--is-focused {\n background-color: ${(props) => props.theme.colors.SECONDARY_ACCENT};\n }\n\n .region-selector__option--is-selected {\n background-color: ${(props) =>\n props.theme.colors.DARKENED_SECONDARY_ACCENT};\n }\n }\n`;\n\nexport const RegionSelectorLabel = styled.label`\n font-size: 1.2rem;\n font-weight: 700;\n`;\n","import React from \"react\";\nimport Select from \"react-select\";\nimport * as styled from \"./styled\";\n\nexport default ({\n handleRegionChange,\n selectedRegion,\n}: {\n handleRegionChange: (seletedOption: any) => void;\n selectedRegion: string | undefined;\n}) => {\n const canvasRegions = [\n { label: \"Asia Pacific\", value: \"au\" },\n { label: \"Europe\", value: \"eu\" },\n { label: \"North America\", value: \"us\" },\n ];\n\n return (\n \n \n Select your region:\n \n option.value === selectedRegion)}\n aria-labelledby=\"region-selector-label\"\n />\n \n );\n};\n","import styled from \"styled-components\";\n\n/*\n Note: Many of these styles are imported by the UrlLinkingFailed component as well\n Please ensure any changes made here are also validated in UrlLinkingFailed\n */\n\ninterface IsMobileProps {\n isMobile: boolean;\n}\n\nexport const BackgroundPanel = styled.main`\n background-color: ${(props) => props.theme.colors.DARK_BACKGROUND};\n width: 100vw;\n height: 100vh;\n position: relative;\n`;\n\nexport const BackgroundPanelMobile = styled.main`\n width: 100vw;\n height: 100vh;\n background-color: ${(props) => props.theme.colors.TEXT_BACKGROUND};\n position: relative;\n`;\n\nexport const OneTimeCodeWrapper = styled.div`\n background-color: ${(props) => props.theme.colors.TEXT_BACKGROUND};\n width: 40rem;\n padding: 3rem;\n text-align: center;\n`;\n\nexport const OneTimeCodeMobilePanel = styled.div`\n margin: auto;\n padding: 3rem 1rem;\n display: flex;\n flex-direction: column;\n text-align: center;\n align-items: center;\n`;\n\nexport const CenterAlignmentWrapper = styled.main`\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n`;\n\nexport const OneTimeCodeExplanationText = styled.h1`\n font-size: 1.3rem;\n`;\n\nexport const OneTimeCodeText = styled.h2`\n font-size: 5rem;\n`;\n\nexport const OneTimeCodeSmallText = styled.h1`\n margin: 3rem 0 2rem 0;\n font-size: 1.3rem;\n`;\n\nexport const LogoImage = styled.img`\n height: 3rem;\n width: auto;\n`;\n\nexport const LogoWrapper = styled.div`\n display: inline-flex;\n justify-content: center;\n width: 100%;\n margin-bottom: 1rem;\n`;\n\nexport const FooterWrapper = styled.div`\n font-size: 0.8rem;\n color: ${(props) => props.theme.colors.TEXT_BACKGROUND};\n display: inline-flex;\n justify-content: center;\n width: 100%;\n margin-top: 1rem;\n\n a {\n color: ${(props) => props.theme.colors.TEXT_BACKGROUND};\n margin-left: 1%;\n }\n`;\n\nexport const MobileFooterWrapper = styled.div`\n font-size: 0.8rem;\n color: ${(props) => props.theme.colors.PRIMARY_TEXT};\n display: inline-flex;\n flex-direction: column;\n justify-content: center;\n width: 100%;\n margin-top: 1rem;\n\n a {\n color: ${(props) => props.theme.colors.PRIMARY_TEXT};\n }\n`;\n\nexport const GenerateButtonWrapper = styled.div`\n margin: 2rem auto;\n width: 80%;\n\n ${(props) => {\n if (props.isMobile) {\n return `\n width: 100%;\n button {\n font-size: 1.5rem;\n padding: 1.5rem;\n }\n `;\n }\n }}\n`;\n\nexport const RegionSelectorWrapper = styled.div`\n margin: auto;\n margin-bottom: 3rem;\n width: ${(props) => (props.isMobile ? \"100%\" : \"80%\")};\n`;\n","export type Region = \"au\" | \"eu\" | \"us\";\n\nexport const isValidRegion = (value: any): value is Region => {\n const validRegions = [\"au\", \"eu\", \"us\"];\n return validRegions.includes(value);\n};\n","import React, { useEffect, useState, useCallback } from \"react\";\nimport { navigate, useParams, RouteComponentProps } from \"@reach/router\";\nimport { POLLING_INTERVAL } from \"../../constants/intervals\";\nimport Logo from \"../../resources/Bluedot_Logo.png\";\nimport Button from \"../../components/Button\";\nimport RegionSelector from \"../../components/RegionSelector\";\nimport * as styled from \"./styled\";\nimport * as api from \"../../services/api\";\nimport useIsMobile from \"../../hooks/useIsMobile\";\nimport * as persistenceManager from \"../../services/persistenceManager\";\nimport { isValidRegion, Region } from \"../../types/RegionType\";\nimport { useConfirmationModal } from \"../../hooks/useSharedContext\";\nimport { useAriaHideMainContent } from \"../../hooks/useSharedContext\";\n\nexport default (props: RouteComponentProps) => {\n const isMobile = useIsMobile();\n const [registrationCode, setRegistrationCode] = useState<\n string | undefined\n >();\n const [error, setError] = useState();\n const [, setLoginAttempts] = useState(0);\n const [selectedRegion, setSelectedRegion] = useState();\n const urlParams = useParams();\n const showConfirmationModal = useConfirmationModal();\n const { hideMainContent } = useAriaHideMainContent();\n\n const saveNewRegistrationCode = useCallback(\n async (region: Region) => {\n try {\n const newRegistrationCode = await api.registerNewCode(region);\n setRegistrationCode(newRegistrationCode);\n } catch (error) {\n setError(error as Error);\n }\n },\n [setRegistrationCode, setError]\n );\n\n // When new region is selected generate new code\n useEffect(() => {\n let storedRegion = persistenceManager.getRegion();\n\n if (selectedRegion && selectedRegion !== storedRegion) {\n persistenceManager.setRegion(selectedRegion);\n persistenceManager.deleteRegisteredValues();\n saveNewRegistrationCode(selectedRegion as Region);\n }\n }, [selectedRegion, saveNewRegistrationCode]);\n\n // Set region based on url params and local storage\n // If not token generated and region selected then register new codes\n useEffect(() => {\n const authToken = persistenceManager.getAuthToken();\n const storedCode = persistenceManager.getRegistrationCode();\n let storedRegion = persistenceManager.getRegion();\n\n if (urlParams.region) {\n if (isValidRegion(urlParams.region)) {\n if (storedRegion && urlParams.region !== storedRegion) {\n navigate(\"/register\");\n return;\n }\n persistenceManager.setRegion(urlParams.region);\n storedRegion = urlParams.region;\n setSelectedRegion(urlParams.region);\n } else {\n navigate(\"/register\");\n return;\n }\n }\n\n if (storedRegion) {\n setSelectedRegion(storedRegion);\n if (!authToken || !storedCode) {\n persistenceManager.deleteRegisteredValues();\n saveNewRegistrationCode(storedRegion as Region);\n } else {\n setRegistrationCode(storedCode);\n }\n }\n }, [saveNewRegistrationCode, urlParams.region]);\n\n useEffect(() => {\n document.title = \"Hello Screens - Register Linking Code\";\n }, []);\n\n // Poll for orders if code has been generated\n useEffect(() => {\n const attemptLogin = async () => {\n const token = persistenceManager.getAuthToken();\n const region = persistenceManager.getRegion();\n\n if (token && region) {\n try {\n await api.getOrders(token, region as Region);\n // This needs to stay as a location redirect rather than navigate via React\n // as the Native app uses the change url callback to identify when linking occurs\n window.location.href = \"./active\";\n } catch {\n setLoginAttempts((previousLoginAttempts : number) => {\n if (\n previousLoginAttempts !== 0 &&\n previousLoginAttempts % 10 === 0\n ) {\n console.log(`Failed login attempts: ${previousLoginAttempts}`);\n }\n return previousLoginAttempts + 1;\n });\n }\n }\n };\n\n attemptLogin();\n const intervalId = setInterval(() => attemptLogin(), POLLING_INTERVAL);\n\n return () => clearInterval(intervalId);\n }, []);\n\n const onUpdateSelectedRegion = ({ value }: { value: Region }) => {\n setSelectedRegion(value);\n };\n\n const generateRegistrationCodeText = () => {\n if (registrationCode) {\n const codeLabel = registrationCode.split(\"\").join(\" \");\n return (\n <>\n \n Use this one-time code to setup your screen\n \n \n {registrationCode}\n \n \n );\n }\n if (error) {\n return (\n \n Failed to generate code\n \n );\n }\n const region = persistenceManager.getRegion();\n if (!region) {\n return (\n \n Select your region to generate code\n \n );\n }\n\n return (\n Generating\n );\n };\n\n const onShowGenerateNewCodeModal = () => {\n const onGenerateNewCode = () => {\n const storedRegion = persistenceManager.getRegion();\n if (storedRegion) {\n saveNewRegistrationCode(storedRegion as Region);\n }\n };\n const title = \"New Code?\";\n const message =\n \"Generating a new code means the previous code will no longer work for registration. Are you sure?\";\n showConfirmationModal(title, message, onGenerateNewCode);\n };\n\n const pageContent = (\n <>\n \n \n \n {generateRegistrationCodeText()}\n \n \n \n {registrationCode && (\n \n \n \n )}\n \n );\n\n if (isMobile) {\n return (\n \n \n \n {pageContent}\n \n If you have any questions or setup issues simply contact our team\n help@bluedot.io\n \n \n \n \n );\n }\n return (\n \n \n {pageContent}\n \n If you have any questions or setup issues simply contact our team\n help@bluedot.io\n \n \n \n );\n};\n","import * as activeOrdersStyles from \"../ActiveOrdersDisplay/styled\";\nimport styled from \"styled-components\";\n\nexport const PageTitleWrapper = styled.div`\n display: inline-flex;\n justify-content: space-between;\n width: 100%;\n margin-top: 2rem;\n`;\n\nexport const PageTitle = styled.h2`\n font-size: 1.2rem;\n`;\n\nexport const NoOrdersFoundText = styled.h2`\n margin: 2rem 0;\n text-align: left;\n font-size: 1.3rem;\n color: ${(props) => props.theme.colors.DISABLED_TEXT};\n`;\n\nexport default {\n ...activeOrdersStyles,\n PageTitle,\n PageTitleWrapper,\n NoOrdersFoundText,\n};\n","import styled from \"styled-components\";\nimport { Icon } from \"@bluedot-innovation/bluedot-ui\";\n\nexport const BackwardsNavigationIcon = styled(Icon)`\n transform: rotate(180deg);\n margin-right: 1rem;\n`;\n\nexport const BackwardsNavigationWrapper = styled.div`\n display: inline-flex;\n`;\n\nexport const BackwardsNavigationText = styled.p`\n margin: auto;\n padding: 0.2rem;\n font-size: 0.9rem;\n font-weight: 700;\n color: ${(props) => props.theme.colors.PRIMARY_TEXT};\n`;\n","import React from \"react\";\nimport { Link } from \"@reach/router\";\nimport * as styled from \"./styled\";\n\nexport default () => {\n return (\n \n \n \n Back\n \n \n );\n};\n","import React, { useEffect } from \"react\";\nimport ConnectionStatus from \"../../components/ConnectionStatusSnackbar\";\nimport styled from \"./styled\";\nimport BackwardsNavigation from \"../../components/BackwardsNavigation\";\nimport AppHeader from \"../../components/AppHeader/AppHeader\";\nimport {\n useOrderStatus,\n useStateDefinitions,\n} from \"../../hooks/useSharedContext\";\nimport OrderTracker from \"../../components/OrderTracker\";\nimport useOrderDetailsOverlay from \"../../hooks/useOrderDetailsOverlay\";\nimport OrderDetailsDisplay from \"../../components/OrderDetailsDisplay/OrderDetailsDisplay\";\nimport useOrderSearchFilter from \"../../hooks/useOrderSearchFilter\";\nimport useIsMobile from \"../../hooks/useIsMobile\";\nimport SearchBar from \"../../components/SearchBar/SearchBar\";\nimport { useAriaHideMainContent } from \"../../hooks/useSharedContext\";\nimport NavigationLinks from \"../../components/NavigationLinks\";\n\nconst OrderHistoryDisplay = () => {\n const { historyOrders, currentOrders } = useOrderStatus();\n const {\n orderDetailsOverlayData,\n setOrderDetailsOverlayData,\n } = useOrderDetailsOverlay(currentOrders, historyOrders);\n const { stateDefinitions } = useStateDefinitions();\n const { filteredOrders, searchTerm, setSearchTerm } = useOrderSearchFilter(\n historyOrders\n );\n const isMobile = useIsMobile();\n const { hideMainContent, hideBanner } = useAriaHideMainContent();\n\n useEffect(() => {\n document.title = \"Hello Screens - Order History\";\n }, []);\n\n return (\n <>\n {orderDetailsOverlayData && (\n setOrderDetailsOverlayData(null)}\n />\n )}\n \n \n \n \n {!isMobile && !stateDefinitions?.features?.hideSearchBar && (\n \n )}\n \n \n {isMobile && !stateDefinitions?.features?.hideSearchBar && (\n \n )}\n \n \n \n \n );\n};\n\nexport default OrderHistoryDisplay;\n","import React, { useEffect } from \"react\";\nimport AppHeader from \"../AppHeader/AppHeader\";\nimport { ScreenWrapper } from \"../../scenes/ActiveOrdersDisplay/styled\";\nimport * as styled from \"../PrivateRoute/styled\";\nimport Spinner from \"../Spinner\";\n\nexport default () => {\n useEffect(() => {\n document.title = \"Hello Screens - Loading Page\";\n }, []);\n\n return (\n <>\n \n \n \n \n Loading\n \n \n \n );\n};\n","import React, { useEffect } from \"react\";\nimport { RouteComponentProps, navigate } from \"@reach/router\";\nimport {\n useOrderStatus,\n useStateDefinitions,\n} from \"../../hooks/useSharedContext\";\nimport LoadingPage from \"../LoadingPage\";\n\ninterface PrivateRouteProps extends RouteComponentProps {\n component: React.ReactElement;\n}\n\nexport default (props: PrivateRouteProps) => {\n const { loginSuccessful, loadingFirstRequest } = useOrderStatus();\n const { stateDefinitionsLoaded } = useStateDefinitions();\n\n useEffect(() => {\n if (!loginSuccessful && !loadingFirstRequest) {\n navigate(\"/register\");\n }\n }, [loadingFirstRequest, loginSuccessful]);\n\n if (loginSuccessful && stateDefinitionsLoaded) {\n return props.component;\n }\n\n return ;\n};\n","import styled from \"styled-components\";\nexport {\n LogoWrapper,\n LogoImage,\n BackgroundPanelMobile,\n BackgroundPanel,\n CenterAlignmentWrapper,\n OneTimeCodeMobilePanel,\n OneTimeCodeWrapper,\n} from \"../../scenes/OneTimeCodeSetup/styled\";\n\nexport const ErrorPageHeader = styled.h1`\n margin: 2rem auto;\n max-width: 100%;\n`;\n\nexport const ErrorPageParagraph = styled.p`\n max-width: 80%;\n margin: 2rem auto;\n`;\n","import React from \"react\";\nimport * as styled from \"./styled\";\nimport Logo from \"../../resources/Bluedot_Logo.png\";\nimport useIsMobile from \"../../hooks/useIsMobile\";\n\nexport default () => {\n const isMobile = useIsMobile();\n\n const pageContent = (\n <>\n \n \n \n \n\n \n We couldn't link your device\n \n\n \n Seems like the URL you're using to connect to Hello Screens has expired.\n \n\n \n Please contact your admin to get a new URL\n \n \n );\n\n if (isMobile) {\n return (\n \n \n \n {pageContent}\n \n \n \n );\n }\n return (\n \n \n {pageContent}\n \n \n );\n};\n","import React, { useEffect, useState } from \"react\";\nimport {\n navigate,\n RouteComponentProps,\n useParams,\n useLocation,\n} from \"@reach/router\";\nimport queryString from \"query-string\";\nimport { deleteAllValues } from \"../../services/persistenceManager\";\nimport { registerViaUrlCode } from \"../../services/api\";\nimport { isValidRegion, Region } from \"../../types/RegionType\";\nimport { useOrderStatus } from \"../../hooks/useSharedContext\";\nimport { isValidUrlCode } from \"../../services/utils\";\nimport LoadingPage from \"../LoadingPage\";\nimport UrlLinkingFailed from \"../UrlLinkingFailed/UrlLinkingFailed\";\n\nconst UrlLinker = (props: RouteComponentProps) => {\n const urlParams = useParams();\n const location = useLocation();\n const {\n loginSuccessful,\n loadingFirstRequest,\n refreshOrderDetails,\n } = useOrderStatus();\n const [registrationInProgress, setRegistrationInProgress] = useState(false);\n const [registrationError, setRegistrationError] = useState<\n undefined | Error\n >();\n\n useEffect(() => {\n document.title = \"Hello Screens - One Time Code\";\n }, []);\n\n // Set region based on url params and local storage\n // If not token generated and region selected then register new codes\n useEffect(() => {\n const handleRegisterCode = async () => {\n setRegistrationInProgress(true);\n const region = urlParams.region as Region;\n const urlCode = urlParams.urlCode;\n try {\n await registerViaUrlCode(urlCode, region);\n await refreshOrderDetails();\n return;\n } catch (error) {\n setRegistrationError(error as Error);\n }\n setRegistrationInProgress(false);\n };\n\n if (\n !isValidRegion(urlParams.region) ||\n !isValidUrlCode(urlParams.urlCode)\n ) {\n navigate(\"/\");\n return;\n }\n\n if (location.search) {\n const queryParams = queryString.parse(location.search);\n if (queryParams.loadAction === \"logout\") {\n deleteAllValues();\n navigate(`/${urlParams.region}/${urlParams.urlCode}`);\n return;\n }\n }\n\n if (loginSuccessful) {\n navigate(\"/active\");\n return;\n }\n\n if (!loadingFirstRequest && !registrationInProgress && !registrationError) {\n handleRegisterCode();\n }\n }, [\n loginSuccessful,\n loadingFirstRequest,\n urlParams.region,\n urlParams.urlCode,\n registrationError,\n registrationInProgress,\n refreshOrderDetails,\n location.search,\n ]);\n\n if (registrationError) {\n return ;\n }\n\n return ;\n};\n\nexport default UrlLinker;\n","import styled from \"styled-components\";\n\ninterface AutoRefreshWrapperProps {\n isMobile: boolean;\n}\ninterface ButtonWrapperProps {\n isMobile: boolean;\n}\n\nexport const AutoRefreshWrapper = styled.div`\n background-color: ${(props) => props.theme.colors.TEXT_BACKGROUND};\n position: absolute;\n top: 0;\n left: 0;\n ${(props) => {\n if (!props.isMobile) {\n return `top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);`;\n } else {\n return `padding-top: 5rem;`;\n }\n }}\n min-width: ${(props) => (props.isMobile ? \"100\" : \"40\")}vw;\n min-height: ${(props) => (props.isMobile ? \"100\" : \"40\")}vh;\n max-width: 100vw;\n z-index: 10;\n text-align: center;\n`;\n\nexport const AutoRefreshHeader = styled.div<{ isMobile: boolean }>`\n width: 100%;\n display: flex;\n flex-direction: column;\n text-align: center;\n margin-top: ${(props) => (props.isMobile ? \"10\" : \"3\")}rem;\n`;\n\nexport const AutoRefreshImage = styled.img`\n width: 120px;\n height: 125px;\n margin: auto;\n`;\n\nexport const HeaderText = styled.h2`\n margin: auto;\n font-size: 1.5rem;\n`;\n\nexport const BodyText = styled.p`\n font-size: 1.25rem;\n padding: 1rem;\n overflow-wrap: break-word;\n b {\n margin-right: 0.5rem;\n }\n width: 80%;\n margin: auto;\n`;\n\nexport const BluedotPurpleText = styled.span`\n color: ${(props) => props.theme.colors.PRIMARY_ACCENT};\n font-weight: bold;\n display: block;\n margin: 0.5rem;\n font-size: 1.5rem;\n`;\n\nexport const ButtonWrapper = styled.div`\n margin: 2.5rem auto;\n width: 80%;\n ${(props) => {\n if (props.isMobile) {\n return `margin: 6rem 10%;\n bottom: 0;\n position: absolute;`;\n }\n }}\n`;\n\nexport const Button = styled.button<{ isMobile: boolean }>`\n background-color: ${(props) =>\n props.disabled\n ? props.theme.colors.DISABLED_TEXT\n : props.theme.colors.SECONDARY_ACCENT};\n border: solid 1px\n ${(props) =>\n props.disabled\n ? props.theme.colors.DISABLED_TEXT\n : props.theme.colors.SECONDARY_ACCENT};\n border-radius: 8px;\n color: ${(props) => props.theme.colors.TEXT_BACKGROUND};\n padding: ${(props) => (props.isMobile ? \"1rem\" : \"0.8rem 1rem;\")};\n width: 100%;\n font-weight: 800;\n font-size: 19px;\n font-family: \"Spartan\", -apple-system, BlinkMacSystemFont, \"Segoe UI\",\n \"Roboto\", \"Oxygen\", \"Ubuntu\", \"Cantarell\", \"Fira Sans\", \"Droid Sans\",\n \"Helvetica Neue\", sans-serif;\n`;\n","import React, { useEffect, useState } from \"react\";\nimport * as styled from \"./styled\";\nimport useIsMobile from \"../../hooks/useIsMobile\";\nimport { Overlay } from \"../LayoutComponents/styled\";\nimport rocket from \"../../resources/rocket.png\";\nimport useModalTabController from \"../../hooks/useModalTabController\";\nimport { useAriaHideMainContent } from \"../../hooks/useSharedContext\";\n\nexport default ({ shouldRefresh }: { shouldRefresh: boolean }) => {\n const [seconds, setSeconds] = useState(10);\n const isMobile = useIsMobile();\n\n const { setHideMainContent, setHideBanner } = useAriaHideMainContent();\n\n useEffect(() => {\n if (shouldRefresh) {\n setHideMainContent(true);\n setHideBanner(true);\n }\n }, [setHideMainContent, shouldRefresh, setHideBanner]);\n\n const refreshCacheAndReload = () => {\n console.log(\"Clearing cache and hard reloading...\");\n if (caches) {\n // Service worker cache should be cleared with caches.delete()\n caches.keys().then(function (names) {\n for (let name of names) {\n caches.delete(name);\n }\n });\n }\n // delete browser cache and hard reload\n window.location.reload();\n };\n\n const { modalRef } = useModalTabController(\n \".refresh-modal-item\",\n refreshCacheAndReload,\n shouldRefresh\n );\n\n useEffect(() => {\n const timer = setTimeout(() => {\n if (!shouldRefresh) {\n return;\n }\n\n if (seconds > 0) {\n setSeconds((prevSeconds) => prevSeconds - 1);\n }\n if (seconds === 0) {\n refreshCacheAndReload();\n }\n }, 1000);\n return () => clearTimeout(timer);\n }, [seconds, shouldRefresh]);\n\n return (\n <>\n {shouldRefresh && (\n <>\n refreshCacheAndReload()} zIndex={9} />\n \n \n \n \n New version available\n \n We are going to automatically refresh the app to get the latest\n updates.\n \n \n Refreshing in{\" \"}\n \n {seconds} seconds\n \n \n \n {\n refreshCacheAndReload();\n }}\n isMobile={isMobile}\n className=\"refresh-modal-item\"\n onKeyUp={(event) => {\n if (event.key === \"Enter\") {\n refreshCacheAndReload();\n }\n }}\n >\n REFRESH NOW\n \n \n \n \n )}\n \n );\n};\n","import styled from \"styled-components\";\n\ninterface IsMobileProps {\n isMobile: boolean;\n}\n\nexport const BackgroundPanel = styled.div`\n background-color: ${(props) => props.theme.colors.DARK_BACKGROUND};\n width: 100vw;\n height: 100vh;\n position: relative;\n`;\n\nexport const BackgroundPanelMobile = styled.div`\n width: 100vw;\n height: 100vh;\n background-color: ${(props) => props.theme.colors.TEXT_BACKGROUND};\n position: relative;\n`;\n\nexport const SsoLoginWrapper = styled.div`\n background-color: ${(props) => props.theme.colors.TEXT_BACKGROUND};\n width: 25rem;\n height: 25rem;\n padding: 3rem;\n text-align: center;\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n`;\n\nexport const SsoLoginMobilePanel = styled.div`\n margin: auto;\n padding: 3rem 1rem;\n display: flex;\n flex-direction: column;\n text-align: center;\n align-items: center;\n`;\n\nexport const CenterAlignmentWrapper = styled.main`\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n`;\n\nexport const SsoLoginText = styled.h1`\n font-size: 1rem;\n font-weight: bold;\n`;\n\nexport const OneTimeCodeSmallText = styled.h1`\n margin: 3rem 0 2rem 0;\n font-size: 1.3rem;\n`;\n\nexport const LogoImage = styled.img`\n height: 3rem;\n width: auto;\n`;\n\nexport const LogoWrapper = styled.div`\n display: inline-flex;\n justify-content: center;\n width: 100%;\n margin-bottom: 1rem;\n`;\n\nexport const FooterWrapper = styled.div`\n color: ${(props) => props.theme.colors.TEXT_BACKGROUND};\n display: inline-flex;\n justify-content: center;\n flex-direction: column;\n align-items: center;\n width: 25rem;\n margin-top: 1rem;\n text-align: center;\n\n a {\n color: ${(props) => props.theme.colors.TEXT_BACKGROUND};\n margin-left: 1%;\n }\n`;\n\nexport const FooterText = styled.p`\n font-size: 0.8rem;\n margin: 0;\n`;\n\nexport const FooterLink = styled.a`\n font-size: 0.8rem;\n`;\n\nexport const MobileFooterWrapper = styled.div`\n font-size: 0.8rem;\n color: ${(props) => props.theme.colors.PRIMARY_TEXT};\n display: inline-flex;\n flex-direction: column;\n justify-content: center;\n width: 100%;\n margin-top: 1rem;\n\n a {\n color: ${(props) => props.theme.colors.PRIMARY_TEXT};\n }\n`;\n\nexport const LoginButtonWrapper = styled.div`\n margin: 0 auto;\n width: 80%;\n\n button {\n font-size: 1.2rem;\n }\n\n ${(props) => {\n if (props.isMobile) {\n return `\n width: 100%;\n `;\n }\n }}\n`;\n","import React, { useEffect, useState } from \"react\";\nimport { initializeApp } from \"firebase/app\";\nimport { SAMLAuthProvider, getAuth, signInWithRedirect, getRedirectResult, getAdditionalUserInfo } from \"firebase/auth\";\nimport {\n // navigate,\n useParams,\n RouteComponentProps,\n useLocation,\n} from \"@reach/router\";\nimport Logo from \"../../resources/Bluedot_Logo.png\";\nimport Button from \"../../components/Button\";\nimport * as styled from \"./styled\";\n// import * as api from \"../../services/api\";\nimport * as errorFactory from \"../../services/errorFactory\";\nimport useIsMobile from \"../../hooks/useIsMobile\";\n// import * as persistenceManager from \"../../services/persistenceManager\";\nimport { isValidRegion } from \"../../types/RegionType\";\nimport { useAriaHideMainContent } from \"../../hooks/useSharedContext\";\nimport { createNetworkError } from \"../../services/errorFactory\";\n\n/*\n This is only used if a customer has requested we provide an alias URL\n Currently only one customer has asked for this\n */\n// const getUrlCodeAlias = (urlCode: string, region: string) => {\n// const auAliases = {\n// coles: \"XTW7ZVC8TU1W\",\n// };\n// const allRegionAliases: Record> = {\n// au: auAliases,\n// };\n//\n// if (allRegionAliases[region]) {\n// return allRegionAliases[region][urlCode.trim().toLowerCase()];\n// }\n// };\n\nconst firebaseConfig = {\n apiKey: \"AIzaSyC5yW48yZPhZXa0YK_pAOWVeHzMqkQLu-A\",\n authDomain: \"auth-au1.screens.prod-au-2.bluedot.io\",\n projectId: \"prototypes-397706\",\n storageBucket: \"prototypes-397706.appspot.com\",\n messagingSenderId: \"1249836292\",\n appId: \"1:1249836292:web:4aefa9ebf526113085a451\"\n};\n\n// Initialize Firebase\ninitializeApp(firebaseConfig);\n\nconsole.log('this is new')\n\nexport default (props: RouteComponentProps) => {\n const isMobile = useIsMobile();\n const [error, setError] = useState();\n const urlParams = useParams();\n const [ssoLoginUrl, setSsoLoginUrl] = useState(\"\");\n const { hideMainContent } = useAriaHideMainContent();\n const [shouldLoad, setShouldLoad] = useState(true);\n const location = useLocation();\n\n useEffect(() => {\n const getUrlCodeDetails = async () => {\n setShouldLoad(false);\n if (urlParams.region && urlParams.urlCode) {\n if (isValidRegion(urlParams.region)) {\n try {\n setSsoLoginUrl(\"test\")\n return;\n } catch (err) {\n if ((err as Error).message === \"Network Error\") {\n setError(createNetworkError());\n return;\n }\n console.error(err);\n }\n }\n }\n setError(errorFactory.createInvalidUrlCodeError());\n };\n if (shouldLoad) {\n getUrlCodeDetails();\n }\n }, [urlParams.region, urlParams.urlCode, shouldLoad, location.href]);\n\n const onClickLogin = () => {\n console.log('login clicked')\n const auth = getAuth();\n const provider = new SAMLAuthProvider(\"saml.test-azure-idp-prod1\");\n signInWithRedirect(auth, provider);\n }\n\n const onClickLoggedIn = async () => {\n console.log('logged in clicked')\n const auth = getAuth();\n const result = await getRedirectResult(auth)\n const result2 = await getAdditionalUserInfo(result!)\n console.log('res', result)\n console.log('res2', result2)\n }\n\n useEffect(() => {\n document.title = \"Hello Screens - Login via SSO\";\n }, []);\n\n const pageContent = (\n <>\n \n \n \n\n {!error ? (\n <>\n \n Connect to Hello Screens with your organization's identity provider\n \n \n \n Single Sign On\n \n \n \n \n ) : error.name === errorFactory.NETWORK_CONNECTION_ERROR ? (\n <>\n \n Network connection failed. Click the button below to retry\n \n\n \n {\n setShouldLoad(true);\n setError(undefined);\n }}\n >\n Retry\n \n \n \n ) : (\n \n Invalid login URL. Please check your URL and try again\n \n )}\n \n );\n\n if (isMobile) {\n return (\n \n \n \n {pageContent}\n \n \n If you have any questions or setup issues simply contact our\n team\n \n \n help@bluedot.io\n \n \n \n \n \n );\n }\n return (\n \n \n {pageContent}\n \n \n If you have any questions or setup issues simply contact our team\n \n \n help@bluedot.io\n \n \n \n \n );\n};\n","import styled from \"styled-components\";\n\ninterface IsMobileProps {\n isMobile: boolean;\n}\n\nexport const BackgroundPanel = styled.div`\n background-color: ${(props) => props.theme.colors.DARK_BACKGROUND};\n width: 100vw;\n height: 100vh;\n position: relative;\n`;\n\nexport const BackgroundPanelMobile = styled.div`\n width: 100vw;\n height: 100vh;\n background-color: ${(props) => props.theme.colors.TEXT_BACKGROUND};\n position: relative;\n`;\n\nexport const SsoLinkWrapper = styled.div`\n background-color: ${(props) => props.theme.colors.TEXT_BACKGROUND};\n width: 35rem;\n height: 35rem;\n padding: 3rem;\n text-align: center;\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n`;\n\nexport const SsoLoginMobilePanel = styled.div`\n margin: auto;\n padding: 3rem 1rem;\n display: flex;\n flex-direction: column;\n text-align: center;\n align-items: center;\n`;\n\nexport const CenterAlignmentWrapper = styled.main`\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n`;\n\nexport const SsoLinkText = styled.h1`\n font-size: 1.3rem;\n font-weight: bold;\n`;\n\nexport const StoreCodeInput = styled.input`\n font-size: 1.4rem;\n background-color: rgb(251, 251, 251);\n border: 1px solid rgb(235, 235, 235);\n font-family: Spartan, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto,\n Oxygen, Ubuntu, Cantarell, \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\",\n sans-serif;\n padding: 1rem 1.6rem;\n line-height: normal;\n width: 100%;\n margin-right: 0px;\n`;\n\nexport const LoadingText = styled.p`\n font-size: 1.5rem;\n font-weight: bold;\n`;\n\nexport const OneTimeCodeSmallText = styled.h1`\n margin: 3rem 0 2rem 0;\n font-size: 1.3rem;\n`;\n\nexport const LogoImage = styled.img`\n height: 3rem;\n width: auto;\n`;\n\nexport const LogoWrapper = styled.div`\n display: inline-flex;\n justify-content: center;\n width: 100%;\n margin-bottom: 1rem;\n`;\n\nexport const FooterWrapper = styled.div`\n color: ${(props) => props.theme.colors.TEXT_BACKGROUND};\n display: inline-flex;\n justify-content: center;\n flex-direction: column;\n align-items: center;\n width: 35rem;\n margin-top: 1rem;\n text-align: center;\n\n a {\n color: ${(props) => props.theme.colors.TEXT_BACKGROUND};\n margin-left: 1%;\n }\n`;\n\nexport const FooterText = styled.p`\n font-size: 0.8rem;\n margin: 0;\n`;\n\nexport const FooterLink = styled.a`\n font-size: 0.8rem;\n`;\n\nexport const MobileFooterWrapper = styled.div`\n font-size: 0.8rem;\n color: ${(props) => props.theme.colors.PRIMARY_TEXT};\n display: inline-flex;\n flex-direction: column;\n justify-content: center;\n width: 100%;\n margin-top: 1rem;\n\n a {\n color: ${(props) => props.theme.colors.PRIMARY_TEXT};\n }\n`;\n\nexport const ErrorMessageWrapper = styled.div`\n height: 3rem;\n width: 100%;\n`;\n\nexport const ErrorMessage = styled.p`\n color: ${(props) => props.theme.colors.ERROR};\n text-align: center;\n margin: 0 auto;\n font-weight: 700;\n`;\n\nexport const ButtonWithErrorWrapper = styled.div`\n margin: 0 auto;\n width: 80%;\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n\n button {\n font-size: 1.2rem;\n }\n\n ${(props) => {\n if (props.isMobile) {\n return `\n width: 100%;\n `;\n }\n }}\n`;\n","import React, { useEffect, useState } from \"react\";\nimport {\n navigate,\n useLocation,\n RouteComponentProps,\n useParams,\n} from \"@reach/router\";\nimport Logo from \"../../resources/Bluedot_Logo.png\";\nimport Button from \"../../components/Button\";\nimport * as styled from \"./styled\";\nimport queryString from \"query-string\";\nimport * as api from \"../../services/api\";\nimport * as errorFactory from \"../../services/errorFactory\";\nimport Spinner from \"../../components/Spinner\";\nimport useIsMobile from \"../../hooks/useIsMobile\";\nimport * as persistenceManager from \"../../services/persistenceManager\";\nimport { isValidRegion } from \"../../types/RegionType\";\nimport { useAriaHideMainContent } from \"../../hooks/useSharedContext\";\nimport { useOrderStatus } from \"../../hooks/useSharedContext\";\n\nexport default (props: RouteComponentProps) => {\n const isMobile = useIsMobile();\n const [error, setError] = useState();\n const { hideMainContent } = useAriaHideMainContent();\n const urlParams = useParams();\n const [jwtToken, setJwtToken] = useState(\"\");\n const location = useLocation();\n const [storeCode, setStoreCode] = useState(\"\");\n const [loadingResponse, setLoadingResponse] = useState(false);\n const { resetLoadingFirstRequest } = useOrderStatus();\n\n useEffect(() => {\n const getJwtToken = async () => {\n if (urlParams.region && isValidRegion(urlParams.region)) {\n if (location.search) {\n const queryParams = queryString.parse(location.search);\n if (queryParams.code) {\n try {\n const idToken = await api.getSsoIdToken(\n urlParams.region,\n queryParams.code as string\n );\n setJwtToken(idToken);\n return;\n } catch (err) {\n if ((err as Error).message === \"Network Error\") {\n setError(errorFactory.createNetworkError());\n return;\n }\n console.error(err);\n setError(errorFactory.createUnknownError());\n }\n }\n }\n }\n setError(errorFactory.createSsoLoginFailedError());\n };\n if (!jwtToken) {\n getJwtToken();\n }\n }, [jwtToken, urlParams.region, location.search]);\n\n const connectToStore = async () => {\n const region = urlParams.region;\n const projectId = persistenceManager.setSsoProjectId();\n if (!storeCode || !jwtToken) {\n return;\n }\n setLoadingResponse(true);\n try {\n const token = await api.getAuthTokenViaSso(\n region,\n jwtToken,\n storeCode,\n projectId\n );\n persistenceManager.setRegion(region);\n persistenceManager.storeRegistrationCode(\"\");\n persistenceManager.storeAuthToken(token);\n resetLoadingFirstRequest();\n navigate(\"/active\");\n } catch (err) {\n if ((err as Error).message === \"Request failed with status code 404\") {\n setError(errorFactory.createSsoDestinationNotFoundError());\n } else if ((err as Error).message === \"Network Error\") {\n setError(errorFactory.createNetworkError());\n } else {\n console.error(err);\n setError(errorFactory.createUnknownError());\n }\n setLoadingResponse(false);\n }\n };\n\n useEffect(() => {\n document.title = \"Hello Screens - Link via SSO\";\n }, []);\n\n const loginUrl = persistenceManager.getSsoLoginPage();\n\n const renderPageContent = (\n ssoJwtToken: string,\n apiError: Error | undefined\n ) => {\n if (!ssoJwtToken && !apiError) {\n return (\n <>\n \n Logging in ...\n \n );\n }\n if (\n !ssoJwtToken &&\n apiError?.name === errorFactory.NETWORK_CONNECTION_ERROR\n ) {\n return (\n <>\n \n {loginUrl\n ? \"Network connection failed. Check your network connection and click below to retry\"\n : \"Login details not found. Please login using the SSO login link provided.\"}\n \n {loginUrl && (\n \n )}\n \n );\n }\n if (\n !ssoJwtToken &&\n apiError?.name !== errorFactory.NETWORK_CONNECTION_ERROR\n ) {\n return (\n <>\n \n {loginUrl\n ? \"Login failed. Please try again.\"\n : \"Login details not found. Please login using the SSO login link provided.\"}\n \n {loginUrl && (\n \n )}\n \n );\n }\n if (ssoJwtToken && apiError?.name !== errorFactory.UNKNOWN_ERROR) {\n return (\n <>\n \n Welcome! Please enter the store code you would like to connect\n \n setStoreCode(event.target.value)}\n />\n \n \n {apiError && (\n \n {apiError.name ===\n errorFactory.SSO_DESTINATION_NOT_FOUND_ERROR\n ? \"Store code not found. Please double check the code and try again\"\n : \"Network connection failed. Check your connection and try again\"}\n \n )}\n \n \n Open Hello Screens\n \n \n \n );\n }\n if (ssoJwtToken && apiError?.name === errorFactory.UNKNOWN_ERROR) {\n return (\n <>\n \n Login failed. You do not have access to the target project. Please\n contact your support team\n \n \n );\n }\n };\n\n if (isMobile) {\n return (\n \n \n \n \n \n \n \n {renderPageContent(jwtToken, error)}\n \n \n \n If you have any questions or setup issues simply contact our\n team\n \n \n help@bluedot.io\n \n \n \n \n \n );\n }\n return (\n \n \n \n \n \n \n {renderPageContent(jwtToken, error)}\n \n \n \n If you have any questions or setup issues simply contact our team\n \n \n help@bluedot.io\n \n \n \n \n );\n};\n","import React from \"react\";\nimport { ThemeProvider } from \"styled-components\";\nimport { Router } from \"@reach/router\";\nimport { myTheme } from \"./services/theme\";\nimport { ConfirmationModalProvider } from \"./components/ConfirmationModal/ConfirmationModalContext\";\nimport { OrderStatusProvider } from \"./components/OrderStatusContext/OrderStatusContext\";\nimport { StateDefinitionsProvider } from \"./components/StateDefinitionsContext/StateDefinitionsContext\";\nimport { WaitTimeProvider } from \"./components/WaitTimeDisplay/WaitTimeContext\";\nimport ActiveOrdersDisplay from \"./scenes/ActiveOrdersDisplay\";\nimport AppContainer from \"./components/AppContainer\";\nimport OneTimeCodeSetup from \"./scenes/OneTimeCodeSetup\";\nimport OrderHistoryDisplay from \"./scenes/OrderHistoryDisplay\";\nimport PrivateRoute from \"./components/PrivateRoute\";\nimport UrlLinker from \"./components/UrlLinker\";\nimport usePollAppVersion from \"./hooks/usePollAppVersion\";\nimport useLockScalingForNativeApp from \"./hooks/useLockScalingForNativeApp\";\nimport AutoRefresh from \"./components/AutoRefresh\";\nimport SsoLogin from \"./scenes/SsoLogin\";\nimport SsoLink from \"./scenes/SsoLink\";\nimport { AriaHideMainContentProvider } from \"./components/AriaHideMainContentContext/AriaHideMainContentContext\";\n\nfunction App() {\n const shouldRefresh = usePollAppVersion();\n useLockScalingForNativeApp();\n return (\n \n \n \n \n \n \n \n \n \n }\n />\n }\n />\n }\n />\n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n}\n\nexport default App;\n","import { useEffect, useState } from \"react\";\nimport { POLLING_INTERVAL } from \"../constants/intervals\";\nconst VERSION_NUMBER = process.env.REACT_APP_VERSION_NUMBER || \"1.0\";\n\nexport default () => {\n const [shouldRefresh, setShouldRefresh] = useState(false);\n\n const shouldForceRefresh = async (): Promise => {\n // This is used only when running locally from dev\n if (process.env.REACT_APP_OVERRIDE_POLL_APP_VERSION === \"true\") {\n return false;\n }\n try {\n const response = await fetch(\"/meta.json\");\n const meta = await response.json();\n if (!meta.version) {\n console.log(\"Could not find the latest version in meta.json\");\n return false;\n }\n const latestVersion = meta.version;\n if (latestVersion !== VERSION_NUMBER) {\n console.log(\n `We have a new version - ${latestVersion}. Should force refresh`\n );\n return true;\n }\n } catch (err) {\n console.log(\"Error while comparing version\", err);\n }\n return false;\n };\n\n useEffect(() => {\n const timerId = setInterval(async () => {\n if (await shouldForceRefresh()) {\n setShouldRefresh(true);\n return;\n }\n }, POLLING_INTERVAL);\n\n return () => clearInterval(timerId);\n }, []);\n\n return shouldRefresh;\n};\n","import { useEffect } from \"react\";\n\n/*\n The purpose of this function to to prevent scaling behaviour when using the Native App version of\n Hello Screens only. While scaling is an important feature via a normal browser view and should not be\n disabled for accessibility reasons, when using an app, in particular on iOS, the pinch behaviour is easy\n to do accidentally and does not provide an expected experience for a native app. For this reason native apps\n will set a value in localStorage so they can be identified. If this value is present then disable scaling.\n\n The apps should be setting this value at first load so if not identified straight away then waiting 1 minute and trying\n again should allow plenty of time.\n */\nexport default () => {\n useEffect(() => {\n const disableScaling = () => {\n const meta = document.createElement(\"meta\");\n meta.name = \"viewport\";\n meta.content =\n \"width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no\";\n const head = document.getElementsByTagName(\"head\")[0];\n head.appendChild(meta);\n console.log(\"scaling disabled\");\n };\n if (localStorage.getItem(\"appName\")) {\n disableScaling();\n }\n }, []);\n};\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.0/8 are considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\ntype Config = {\n onSuccess?: (registration: ServiceWorkerRegistration) => void;\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\n};\n\nexport function register(config?: Config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(\n process.env.PUBLIC_URL,\n window.location.href\n );\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl: string, config?: Config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl: string, config?: Config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl, {\n headers: { 'Service-Worker': 'script' }\n })\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready\n .then(registration => {\n registration.unregister();\n })\n .catch(error => {\n console.error(error.message);\n });\n }\n}\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.css';\nimport App from './App';\nimport * as serviceWorker from './serviceWorker';\n\nReactDOM.render(\n \n \n ,\n document.getElementById('root')\n);\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\n","import { myTheme } from \"./theme\";\nimport { OrderDetails } from \"../types/OrderDetailsType\";\nimport { FeatureToggles, StateDefinition } from \"../types/StateDefinitionType\";\nimport { Store } from \"../types/StoreType\";\n\nexport const wait = (milliseconds: number) =>\n new Promise((resolve) => {\n setTimeout(() => resolve(undefined), milliseconds);\n });\n\nexport const isValidUrlCode = (urlCode: string) => {\n const regex = /^[1-9A-NP-Z]{7}$/;\n return regex.test(urlCode);\n};\n\nexport const getAlertTimer = (\n order: OrderDetails,\n targetState: StateDefinition | undefined,\n stateFeatures: FeatureToggles | undefined,\n store: Store | undefined\n) => {\n if (!targetState) {\n return false;\n }\n const elapsedTime =\n new Date().getTime() - new Date(order.lastTransitionTime).getTime();\n const elapsedSeconds = elapsedTime / 1000;\n if (targetState.displayState?.alertTimers?.length) {\n const alertTimers = targetState.displayState.alertTimers;\n const targetAlertTimer =\n alertTimers.find(\n (alert, index) =>\n index < alertTimers.length - 1 &&\n alertTimers[index + 1].time >= elapsedSeconds\n ) || alertTimers[alertTimers.length - 1];\n return targetAlertTimer;\n }\n // Arrived is a special state that alerts based on the wait time goals if present\n if (order.status === \"Arrived\") {\n const targetWaitTime = store?.waitTime || stateFeatures?.waitTime;\n if (!targetWaitTime?.alert || elapsedSeconds < targetWaitTime?.alert) {\n // This is the default alert state where it just flashes green on arrival\n return {\n time: 0,\n color: myTheme.colors.SUCCESS,\n showSuccessMessage: Boolean(\n targetState.displayState?.showSuccessMessage\n ),\n };\n }\n if (targetWaitTime?.goal && elapsedSeconds < targetWaitTime?.goal) {\n return {\n time: targetWaitTime?.alert,\n color: myTheme.colors.WARNING,\n showSuccessMessage: false,\n };\n }\n return {\n time: targetWaitTime?.alert,\n color: myTheme.colors.ERROR,\n showSuccessMessage: false,\n };\n }\n};\n\n/*\n Below returns minutes and seconds in mm:SS format.\n If greater than 99:59 return 99:59 as maximum\n */\nexport const convertToMinutesAndSecondsString = (seconds: number) => {\n const minuteComponent = Math.floor(seconds / 60);\n const secondComponent = Math.floor(seconds) % 60;\n return minuteComponent > 99\n ? `99:59`\n : `${minuteComponent}:${\n secondComponent < 10 ? `0${secondComponent}` : secondComponent\n }`;\n};\n","module.exports = __webpack_public_path__ + \"static/media/Bluedot_Logo.3dbb2b66.png\";","import styled from \"styled-components\";\n\ninterface OverlayProps {\n zIndex: number\n}\n\nexport const Overlay = styled.div`\n position: absolute;\n height: 100vh;\n width: 100vw;\n top: 0;\n left: 0;\n z-index: ${(props) => props.zIndex};\n background-color: black;\n opacity: 0.5;\n`;\n","import { createRef, RefObject, useEffect, useState } from \"react\";\n\nexport default (\n tabItemSelector: string,\n onEscapeKeyPressed: () => void,\n keyCaptureOn: boolean\n) => {\n const [selectedElementIndex, setSelectedElementIndex] = useState<\n undefined | number\n >(undefined);\n const modalRef = createRef() as RefObject;\n\n const handleTabKey = (e: any) => {\n e.preventDefault();\n\n const focusableModalElements:\n | NodeListOf\n | never[] = modalRef.current\n ? modalRef.current.querySelectorAll(tabItemSelector)\n : [];\n let targetElement;\n if (selectedElementIndex === undefined) {\n if (!e.shiftKey) {\n setSelectedElementIndex(0);\n targetElement = focusableModalElements[0];\n } else {\n setSelectedElementIndex(focusableModalElements.length - 1);\n targetElement =\n focusableModalElements[focusableModalElements.length - 1];\n }\n } else {\n if (!e.shiftKey) {\n if (selectedElementIndex + 1 < focusableModalElements.length) {\n setSelectedElementIndex(selectedElementIndex + 1);\n targetElement = focusableModalElements[selectedElementIndex + 1];\n } else {\n setSelectedElementIndex(0);\n targetElement = focusableModalElements[0];\n }\n } else {\n if (selectedElementIndex - 1 < 0) {\n setSelectedElementIndex(focusableModalElements.length - 1);\n targetElement =\n focusableModalElements[focusableModalElements.length - 1];\n } else {\n setSelectedElementIndex(selectedElementIndex - 1);\n targetElement = focusableModalElements[selectedElementIndex - 1];\n }\n }\n }\n // @ts-ignore\n targetElement && targetElement.focus();\n };\n\n const keyListenersMap: Record void> = {\n Escape: onEscapeKeyPressed,\n Tab: handleTabKey,\n };\n\n useEffect(() => {\n function keyListener(e: any) {\n const listener = keyListenersMap[e.key];\n return listener && listener(e);\n }\n\n function cancelDefault(e: any) {\n if (!e.key.startsWith(\"Arrow\")) e.preventDefault();\n }\n\n if (keyCaptureOn) {\n document.addEventListener(\"keydown\", cancelDefault);\n document.addEventListener(\"keyup\", keyListener);\n\n return () => {\n document.removeEventListener(\"keyup\", keyListener);\n document.removeEventListener(\"keydown\", cancelDefault);\n };\n }\n });\n\n return {\n modalRef,\n setSelectedElementIndex,\n };\n};\n","import { useEffect, useState } from \"react\";\nimport * as persistenceManager from \"../services/persistenceManager\";\nimport * as api from \"../services/api\";\nimport * as errorFactory from \"../services/errorFactory\";\nimport { Store } from \"../types/StoreType\";\nimport { ExtendedGlobal } from \"../types/GlobalExtensionFunctions\";\n\nexport default () => {\n const [store, setStore] = useState();\n\n // DO NOT CHANGE THIS FUNCTION SIGNATURE OR RETURN TYPE - IT WILL BREAK THE NATIVE APP\n ((global as unknown) as ExtendedGlobal).getStoreDetails = () => {\n return store;\n };\n\n useEffect(() => {\n const getStore = async () => {\n const token = persistenceManager.getAuthToken();\n const region = persistenceManager.getRegion();\n\n if (token && region) {\n try {\n const storeResponse = await api.getStore(token as string, region);\n setStore(storeResponse);\n } catch (error) {\n console.log(\"Failed to get store.\");\n }\n } else {\n if (!token) {\n console.log(errorFactory.createNoTokenError());\n } else if (!region) {\n console.log(errorFactory.createNoRegionError());\n }\n }\n };\n\n getStore();\n }, []);\n\n return store;\n};\n","import { useEffect, useState } from \"react\";\n\nexport default () => {\n const [isOnline, setIsOnline] = useState(window.navigator.onLine);\n\n const handleConnectionChange = (event: { type: string }) => {\n if (event.type === \"offline\") {\n setIsOnline(false);\n }\n if (event.type === \"online\") {\n setIsOnline(true);\n }\n };\n\n useEffect(() => {\n window.addEventListener(\"online\", handleConnectionChange);\n window.addEventListener(\"offline\", handleConnectionChange);\n\n return () => {\n window.removeEventListener(\"online\", handleConnectionChange);\n window.removeEventListener(\"online\", handleConnectionChange);\n };\n }, []);\n\n return isOnline;\n};\n","import { DefaultTheme } from \"styled-components\";\n\nconst myTheme: DefaultTheme = {\n colors: {\n NEUTRAL_PANEL: \"#EBEFF2\",\n DARKER_NEUTRAL_PANEL: \"#ECECFD\",\n INVERTED_TEXT_NEUTRAL_PANEL: \"rgba(0, 0, 0, 0.4)\",\n TEXT_BACKGROUND: \"#FFFFFF\",\n PRIMARY_TEXT: \"#18182D\",\n PRIMARY_ACCENT: \"#7B10F4\",\n SECONDARY_ACCENT: \"#279EBA\",\n TERTIARY_ACCENT: \"#D82D59\",\n SUCCESS: \"#45A04A\",\n WARNING: \"#f6a01e\",\n ERROR: \"#D82D59\",\n BORDER_COLOR: \"rgba(151, 151, 151, 0.12)\",\n SHADOW_COLOR: \"rgba(0, 0, 0, 0.06)\",\n DARKENED_SECONDARY_ACCENT: \"#008CB3\",\n DISABLED_TEXT: \"#6B6B6B\",\n DARK_BACKGROUND: \"rgb(24, 24, 45)\",\n },\n};\n\nexport { myTheme };\n","import styled from \"styled-components\";\n\nexport const Button = styled.button`\n background-color: ${(props) =>\n props.disabled\n ? props.theme.colors.DISABLED_TEXT\n : props.theme.colors.SECONDARY_ACCENT};\n border: solid 1px\n ${(props) =>\n props.disabled\n ? props.theme.colors.DISABLED_TEXT\n : props.theme.colors.SECONDARY_ACCENT};\n border-radius: 8px;\n color: ${(props) => props.theme.colors.TEXT_BACKGROUND};\n padding: 0.8rem 1rem;\n width: 100%;\n font-weight: 800;\n font-size: 19px;\n font-family: \"Spartan\", -apple-system, BlinkMacSystemFont, \"Segoe UI\",\n \"Roboto\", \"Oxygen\", \"Ubuntu\", \"Cantarell\", \"Fira Sans\", \"Droid Sans\",\n \"Helvetica Neue\", sans-serif;\n`;\n","import React, { createContext, ReactNode, useEffect, useMemo } from \"react\";\nimport {\n loopNotificationSound,\n stopNotificationSound,\n} from \"../../services/sounds\";\nimport { useStateDefinitions } from \"../../hooks/useSharedContext\";\nimport usePollOrderStatus from \"../../hooks/usePollOrderStatus\";\nimport useIsOnline from \"../../hooks/useIsOnline\";\nimport { OrderDetails } from \"../../types/OrderDetailsType\";\n\ninterface OrderStatusContextValue {\n historyOrders: OrderDetails[];\n refreshOrderDetails: () => void;\n loginSuccessful: boolean;\n // Current orders is all orders minus those have order.status === \"Completed\" || (order.isAcknowledged === true && order.status !== \"Arrived\")\n currentOrders: OrderDetails[];\n pollOrdersError: undefined | Error;\n loadingFirstRequest: boolean;\n onClearOrders: () => void;\n resetLoadingFirstRequest: () => void;\n}\n\nconst defaultProviderValue: OrderStatusContextValue = {\n historyOrders: [],\n refreshOrderDetails: () =>\n console.log(\"Placeholder function for refreshOrderDetails\"),\n loginSuccessful: false,\n currentOrders: [],\n pollOrdersError: undefined,\n loadingFirstRequest: true,\n onClearOrders: () => {\n console.log(\"Placeholder function for onClearOrders\");\n },\n resetLoadingFirstRequest: () => {\n console.log(\"Placeholder function for resetLoadingFirstRequest\");\n },\n};\n\nconst OrderStatusContext = createContext(defaultProviderValue);\n\nconst OrderStatusProvider = ({ children }: { children: ReactNode }) => {\n const {\n orders,\n pollOrdersError,\n refreshOrderDetails,\n loginSuccessful,\n loadingFirstRequest,\n clearOrders,\n ordersStateHash,\n resetLoadingFirstRequest,\n } = usePollOrderStatus();\n\n const {\n stateDefinitions,\n stateDefinitionHash,\n stateDefinitionsLoaded,\n updateStateDefinitions,\n } = useStateDefinitions();\n\n const filteredOrders: {\n currentOrders: OrderDetails[];\n historyOrders: OrderDetails[];\n } = useMemo(() => {\n const filteredOrdersObject: {\n currentOrders: OrderDetails[];\n historyOrders: OrderDetails[];\n } = {\n currentOrders: [],\n historyOrders: [],\n };\n\n if (!stateDefinitionsLoaded) {\n return filteredOrdersObject;\n }\n\n for (const order of orders) {\n const targetState = stateDefinitions?.states.find(\n (state) => state.name === order.status\n );\n if (!targetState) {\n console.log(\"Unable to identify target state for order\", order);\n } else if (targetState.isActive) {\n filteredOrdersObject.currentOrders.push(order);\n } else if (targetState.canAcknowledge && !order.isAcknowledged) {\n filteredOrdersObject.currentOrders.push(order);\n } else {\n filteredOrdersObject.historyOrders.push(order);\n }\n }\n\n return filteredOrdersObject;\n }, [orders, stateDefinitions, stateDefinitionsLoaded]);\n\n const isOnline = useIsOnline();\n\n useEffect(() => {\n if (\n loginSuccessful &&\n (!stateDefinitionsLoaded || ordersStateHash !== stateDefinitionHash)\n ) {\n updateStateDefinitions();\n }\n }, [\n ordersStateHash,\n stateDefinitionHash,\n stateDefinitionsLoaded,\n loginSuccessful,\n updateStateDefinitions,\n ]);\n\n // This plays a sound when a new order has arrived\n useEffect(() => {\n if (isOnline) {\n const alertableStateDefinitions = stateDefinitions?.states.filter(\n (state) =>\n (state.displayState?.alertTimers &&\n state.displayState.alertTimers.length) ||\n state.name === \"Arrived\"\n );\n const alertableStateNames = alertableStateDefinitions\n ? alertableStateDefinitions.map((state) => state.name)\n : [];\n const unacknowledgedOrders = orders.filter(\n (order) =>\n alertableStateNames.includes(order.status) && !order.isAcknowledged\n );\n if (unacknowledgedOrders.length) {\n loopNotificationSound();\n } else {\n stopNotificationSound();\n }\n } else {\n stopNotificationSound();\n }\n }, [orders, isOnline, stateDefinitions]);\n\n const providerValue = {\n historyOrders: filteredOrders.historyOrders,\n refreshOrderDetails,\n pollOrdersError,\n loginSuccessful,\n currentOrders: filteredOrders.currentOrders,\n loadingFirstRequest,\n onClearOrders: clearOrders,\n resetLoadingFirstRequest,\n };\n\n return (\n \n {children}\n \n );\n};\n\nexport { OrderStatusContext, OrderStatusProvider };\n","import React, { createContext, ReactNode, useState } from \"react\";\n\nconst defaultValue = {\n hideMainContent: false,\n setHideMainContent: (() =>\n console.log(\n \"Placeholder aria hide main content function\"\n ) as unknown) as React.Dispatch>,\n hideBanner: false,\n setHideBanner: (() =>\n console.log(\n \"Placeholder aria hide banner function\"\n ) as unknown) as React.Dispatch>,\n};\n\nconst AriaHideMainContentContext = createContext(defaultValue);\n\n/*\n This function creates a ContextProvider which is designed to live at the root level of the App, allowing for the\n same data to be used by all components in the app. It ensures the value mainContentHidden = true can be updated by the various\n modals and menus in the app without needing to keep track of these values for each modal\n\n Usage:\n\n const {hideMainContent, setHideMainContent} = useContext(AriaHideMainContentContext);\n */\nconst AriaHideMainContentProvider = ({ children }: { children: ReactNode }) => {\n const [hideMainContent, setHideMainContent] = useState(false);\n const [hideBanner, setHideBanner] = useState(false);\n const contextValue = {\n hideMainContent,\n setHideMainContent,\n hideBanner,\n setHideBanner,\n };\n\n return (\n \n {children}\n \n );\n};\n\nexport { AriaHideMainContentContext, AriaHideMainContentProvider };\n","import { useState, useEffect, useCallback } from \"react\";\nimport { useOrderStatus } from \"./useSharedContext\";\nimport { OrderDetails } from \"../types/OrderDetailsType\";\nimport { ExtendedGlobal } from \"../types/GlobalExtensionFunctions\";\n\nexport default (\n currentOrders: OrderDetails[],\n historyOrders: OrderDetails[]\n) => {\n const [\n orderDetailsOverlayData,\n setOrderDetailsOverlayData,\n ] = useState(null);\n const { refreshOrderDetails } = useOrderStatus();\n const [waitingForOrderId, setWaitingForOrderID] = useState(\"\");\n\n /*\n This function uses the existing orders that are available and opens the modal\n for that order if the orderId is found\n */\n const openOrderDetailsModalSync = useCallback(\n (orderId: string) => {\n let targetOrder = currentOrders.find(\n (order) => order.orderId === orderId\n );\n if (!targetOrder) {\n targetOrder = historyOrders.find((order) => order.orderId === orderId);\n }\n if (\n targetOrder &&\n targetOrder.lastUpdateTime !== orderDetailsOverlayData?.lastUpdateTime\n ) {\n setOrderDetailsOverlayData(targetOrder);\n return true;\n }\n return false;\n },\n [currentOrders, historyOrders, orderDetailsOverlayData]\n );\n\n useEffect(() => {\n if (waitingForOrderId) {\n openOrderDetailsModalSync(waitingForOrderId);\n setWaitingForOrderID(\"\");\n }\n }, [waitingForOrderId, currentOrders, openOrderDetailsModalSync]);\n\n /*\n This function updates the current orders first before trying to open the modal\n */\n const performAsyncUpdateThenOpen = async (orderId: string) => {\n await refreshOrderDetails();\n setWaitingForOrderID(orderId);\n };\n\n // DO NOT CHANGE THIS FUNCTION SIGNATURE OR RETURN TYPE - IT WILL BREAK THE NATIVE APP\n ((global as unknown) as ExtendedGlobal).openOrderDetailsModal = (\n orderId: string\n ) => {\n performAsyncUpdateThenOpen(orderId);\n return true;\n };\n\n useEffect(() => {\n if (orderDetailsOverlayData) {\n openOrderDetailsModalSync(orderDetailsOverlayData.orderId);\n }\n }, [\n currentOrders,\n orderDetailsOverlayData,\n historyOrders,\n openOrderDetailsModalSync,\n ]);\n\n return {\n orderDetailsOverlayData,\n setOrderDetailsOverlayData,\n };\n};\n","import styled from \"styled-components\";\nimport { Icon } from \"@bluedot-innovation/bluedot-ui\";\n\ninterface IsMobileProps {\n isMobile: boolean;\n}\n\nexport const ModalTitle = styled.h1`\n font-size: 1.5rem;\n ${(props) => {\n if (props.isMobile) {\n return `margin-bottom: 5rem;`;\n }\n }}\n`;\n\nexport const ModalMessage = styled.p`\n margin: 2rem 0;\n`;\n\nexport const CloseButton = styled(Icon)`\n position: absolute;\n top: 1rem;\n right: 1rem;\n`;\n\nexport const ModalWrapper = styled.div`\n background-color: ${(props) => props.theme.colors.TEXT_BACKGROUND};\n position: absolute;\n top: 0;\n left: 0;\n ${(props) => {\n if (!props.isMobile) {\n return `top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n padding: 2% 5%;`;\n }\n }}\n min-width: ${(props) => (props.isMobile ? \"100\" : \"20\")}vw;\n min-height: ${(props) => (props.isMobile ? \"100\" : \"20\")}vh;\n z-index: 10;\n text-align: center;\n box-sizing: border-box;\n`;\n\nexport const ButtonsWrapper = styled.div`\n display: inline-flex;\n justify-content: space-between;\n width: 100%;\n margin-top: 2rem;\n\n ${(props) => {\n if (props.isMobile) {\n return `flex-direction: column;\n align-items: center;\n \n button {\n margin-bottom: 3rem;\n }`;\n }\n }}\n`;\n\nexport const MobileVeritcalCenterContainer = styled.div`\n ${(props) => {\n if (props.isMobile) {\n return `margin: 0;\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n padding: 2% 10%;`;\n }\n }}\n`;\n\nexport const ButtonWrapper = styled.div`\n width: 30%;\n`;\n\nexport const CancelButtonWrapper = styled(ButtonWrapper)`\n button {\n border-color: ${(props) => props.theme.colors.TERTIARY_ACCENT};\n background-color: ${(props) => props.theme.colors.TERTIARY_ACCENT};\n }\n`;\n","import React from \"react\";\nimport useIsMobile from \"../../hooks/useIsMobile\";\nimport useModalTabController from \"../../hooks/useModalTabController\";\nimport * as styled from \"./styled\";\nimport Button from \"../Button\";\nimport { Overlay } from \"../LayoutComponents/styled\";\n\ninterface ConfirmationModalProps {\n modalTitle: string;\n message: string;\n onConfirm: () => void;\n onHideModal: () => void;\n}\n\n/*\n To use this component, please use the ConfirmationModalContext defined in the ConfirmationModalContext file in this folder\n For usage instructions see the ConfirmationModalContext file\n */\nexport default ({\n modalTitle,\n message,\n onConfirm,\n onHideModal,\n}: ConfirmationModalProps) => {\n const isMobile = useIsMobile();\n const { modalRef } = useModalTabController(\".modal-item\", onHideModal, true);\n return (\n <>\n \n \n onHideModal()}\n onKeyUp={(event: KeyboardEvent) => {\n if (event.key === \"Enter\") {\n onHideModal();\n }\n }}\n className=\"modal-item\"\n tabIndex={0}\n />\n \n \n {modalTitle}\n \n {message}\n \n {isMobile ? (\n <>\n \n {\n onConfirm();\n onHideModal();\n }}\n onKeyUp={(event) => {\n if (event.key === \"Enter\") {\n onConfirm();\n onHideModal();\n }\n }}\n className=\"modal-item\"\n >\n Yes\n \n \n \n onHideModal()}\n onKeyUp={(event) => {\n if (event.key === \"Enter\") {\n onHideModal();\n }\n }}\n className=\"modal-item\"\n >\n No\n \n \n \n ) : (\n <>\n \n onHideModal()}\n onKeyUp={(event) => {\n if (event.key === \"Enter\") {\n onHideModal();\n }\n }}\n className=\"modal-item\"\n >\n No\n \n \n \n {\n onConfirm();\n onHideModal();\n }}\n onKeyUp={(event) => {\n if (event.key === \"Enter\") {\n onConfirm();\n onHideModal();\n }\n }}\n className=\"modal-item\"\n >\n Yes\n \n \n \n )}\n \n \n \n \n );\n};\n","import React, { createContext, ReactNode, useState } from \"react\";\nimport ConfirmationModal from \"./ConfirmationModal\";\nimport { useAriaHideMainContent } from \"../../hooks/useSharedContext\";\n\nconst ConfirmationModalContext = createContext(\n (title: string, message: string, onConfirm: () => void) =>\n console.log(\"Placeholder create modal function\")\n);\n\n/*\n This function creates a ContextProvider which is designed to live at the root level of the App, allowing for the\n same modal to be used by all components in the app. Usage:\n\n const showConfirmationModal = useContext(ConfirmationModalContext);\n showConfirmationModal(title: string, message: string, onConfirm: () => void);\n\n Hiding of the modal is managed automatically after either clicking No or the X to close, or after completing the onConfirm function\n\n For a more concrete example you can check the OneTimeCodeSetup and DropdownMenu components\n */\nconst ConfirmationModalProvider = ({ children }: { children: ReactNode }) => {\n const [showModal, setShowModal] = useState(false);\n const [modalTitle, setModalTitle] = useState(\"Placeholder Title\");\n const [modalMessage, setModalMessage] = useState(\"Placeholder message\");\n const [onConfirmAction, setOnConfirmAction] = useState<() => void>(() => () =>\n console.log(\"Modal confirm button clicked\")\n );\n const { setHideMainContent, setHideBanner } = useAriaHideMainContent();\n\n const openModal = (title: string, message: string, onConfirm: () => void) => {\n setModalTitle(title);\n setModalMessage(message);\n setOnConfirmAction(() => onConfirm);\n setShowModal(true);\n setHideMainContent(true);\n setHideBanner(true);\n };\n\n const onHideModal = () => {\n setShowModal(false);\n setHideMainContent(false);\n setHideBanner(false);\n };\n\n return (\n \n {showModal && (\n onConfirmAction()}\n onHideModal={onHideModal}\n />\n )}\n {children}\n \n );\n};\n\nexport { ConfirmationModalContext, ConfirmationModalProvider };\n","import {\n StateDefinition,\n StateDefinitionConfig,\n} from \"../types/StateDefinitionType\";\nimport { StateDefinitionsResponse } from \"../services/api\";\n\nexport const mockStateDefinitions: StateDefinitionConfig = {\n hsFieldsPriority: [\"Parking Bay\", \"Mobile Number\", \"Car Model\"],\n states: [\n {\n name: \"Registered\",\n displayState: null,\n progressionLevel: 1,\n canAcknowledge: false,\n eventTriggers: [\"REGISTRATION\"],\n isActive: true,\n isError: false,\n canForceTransition: false,\n },\n {\n name: \"OnTheWay\", // State name that's shared in code.\n displayState: {\n orderDetailsTitle: \"ON THE WAY\",\n orderDetailsSummary: \"{customerName} is on the way\",\n categoryTitle: \"On The Way\",\n stateDisplayName: \"On The Way\",\n color: \"#7B10F4\",\n },\n progressionLevel: 10,\n canAcknowledge: false,\n eventTriggers: [\"TEMPO_UPDATE\", \"onTheWay\"],\n isActive: true,\n isError: false,\n canForceTransition: true,\n },\n {\n name: \"TempoOnTheWay\", // State name that's shared in code.\n displayState: {\n orderDetailsTitle: \"{etaMinutes} AWAY\",\n orderDetailsSummary:\n \"{customerName} is arriving {etaDirectionPreposition} {arrivalTime}.\",\n categoryTitle: \"On The Way\",\n stateDisplayName: \"On The Way\",\n color: \"#7B10F4\",\n },\n progressionLevel: 10,\n canAcknowledge: false,\n eventTriggers: [\"TEMPO_UPDATE\"],\n isActive: true,\n isError: false,\n analyticsCategory: \"onTheWay\",\n canForceTransition: false,\n },\n {\n name: \"LostConnection\",\n displayState: {\n orderDetailsTitle: \"LOST CONNECTION\",\n orderDetailsSummary:\n \"Order for {customerName} lost connection at {formattedLastTransitionTime}\",\n categoryTitle: \"On The Way\",\n stateDisplayName: \"Lost Connection\",\n color: \"#D82D59\",\n quickButtons: [{ label: \"Move To History\", action: \"ACKNOWLEDGE\" }],\n },\n progressionLevel: 10,\n canAcknowledge: true,\n eventTriggers: [\"NO_UPDATES_5_MINS\"],\n isActive: false,\n isError: true,\n canForceTransition: false,\n },\n {\n name: \"Stopped\",\n displayState: {\n orderDetailsTitle: \"STOPPED\",\n orderDetailsSummary:\n \"Order for {customerName} stopped tracking journey at {formattedLastTransitionTime}\",\n categoryTitle: \"On The Way\",\n stateDisplayName: \"Stopped\",\n color: \"#D82D59\",\n quickButtons: [{ label: \"Move To History\", action: \"ACKNOWLEDGE\" }],\n },\n progressionLevel: 15,\n canAcknowledge: true,\n eventTriggers: [\"TEMPO_CANCELLED\"],\n isActive: false,\n isError: true,\n canForceTransition: true,\n },\n\n {\n name: \"Timeout\",\n displayState: {\n orderDetailsTitle: \"TIMEOUT\",\n orderDetailsSummary:\n \"Order for {customerName} stopped tracking journey at {formattedLastTransitionTime}\",\n categoryTitle: \"On The Way\",\n stateDisplayName: \"Timeout\",\n color: \"#D82D59\",\n quickButtons: [{ label: \"Move To History\", action: \"ACKNOWLEDGE\" }],\n },\n progressionLevel: 15,\n canAcknowledge: true,\n eventTriggers: [\"TEMPO_TIMEOUT\"],\n isActive: false,\n isError: true,\n canForceTransition: false,\n },\n {\n name: \"Arrived\",\n displayState: {\n orderDetailsTitle: \"CUSTOMER ARRIVED\",\n orderDetailsSummary:\n \"{customerName} arrived at {formattedLastTransitionTime}.\",\n alertTimers: [\n {\n time: 0,\n color: \"#45A04A\",\n showSuccessMessage: false,\n },\n ],\n categoryTitle: \"Arrived\",\n quickButtons: [{ label: \"Fulfilled\", action: \"Fulfilled\" }],\n stateDisplayName: \"Arrived\",\n color: \"#45A04A\",\n },\n progressionLevel: 20,\n canAcknowledge: true,\n eventTriggers: [\"GEOTRIGGER\", \"arrival\"],\n isActive: true,\n isError: false,\n canForceTransition: true,\n },\n {\n name: \"Fulfilled\",\n displayState: {\n categoryTitle: \"Arrived\",\n orderDetailsSummary: \"{customerName}'s order is completed.\",\n orderDetailsTitle: \"FULFILLED\",\n stateDisplayName: \"Fulfilled\",\n color: \"#5AB75F\",\n },\n progressionLevel: 100,\n canAcknowledge: false,\n eventTriggers: [\"completed\"],\n isActive: false,\n isError: false,\n canForceTransition: true,\n },\n ],\n\n categories: [\"Arrived\", \"On The Way\"],\n\n features: {\n hideSearchBar: false,\n waitTime: {\n alert: 120,\n goal: 300,\n },\n },\n};\n\nexport const mockStateDefinitionsResponse: StateDefinitionsResponse = {\n stateDefinitions: mockStateDefinitions,\n stateHash: undefined,\n};\n\nexport const mockStateDictionary = mockStateDefinitions.states.reduce(\n (accumulator, currentValue) => {\n accumulator[currentValue.name] = currentValue;\n return accumulator;\n },\n {} as Record\n);\n\nexport const mockGetStatesResponse = {\n stateDefinitions: mockStateDefinitions,\n stateHash: undefined,\n};\n\nexport const mockRetailStateDefinitionsResponse: StateDefinitionsResponse = {\n stateHash: undefined,\n stateDefinitions: {\n hsFieldsPriority: [\n \"Customer Name\",\n \"Order Number\",\n \"Collection Window\",\n \"Van Number\",\n \"Sequence Number\",\n \"Ambient\",\n \"Bulk Ambient\",\n \"Chilled\",\n \"Bulk Chilled\",\n \"Frozen\",\n \"Hot Food\",\n \"Restricted\",\n \"Order Type\",\n ],\n states: [\n {\n name: \"Registered\",\n displayState: null,\n progressionLevel: 1,\n canAcknowledge: false,\n eventTriggers: [\"REGISTRATION\"],\n isActive: true,\n isError: false,\n analyticsCategory: \"registered\",\n canForceTransition: false,\n shouldNotify: false,\n },\n {\n name: \"OnTheWay\",\n displayState: {\n orderDetailsTitle: \"ON THE WAY\",\n orderDetailsSummary: \"{customerName} is on the way\",\n categoryTitle: \"On The Way\",\n stateDisplayName: \"On The Way\",\n color: \"#7B10F4\",\n },\n progressionLevel: 10,\n canAcknowledge: false,\n eventTriggers: [\"NO_UPDATES_5_MINS\", \"TEMPO_TIMEOUT\", \"onTheWay\"],\n isActive: true,\n isError: false,\n analyticsCategory: \"onTheWay\",\n canForceTransition: true,\n shouldNotify: true,\n },\n {\n name: \"TempoOnTheWay\",\n displayState: {\n orderDetailsTitle: \"{etaMinutes} AWAY\",\n orderDetailsSummary:\n \"{customerName} is arriving {etaDirectionPreposition} {arrivalTime}.\",\n categoryTitle: \"On The Way\",\n stateDisplayName: \"On The Way\",\n color: \"#7B10F4\",\n },\n progressionLevel: 10,\n canAcknowledge: false,\n eventTriggers: [\"TEMPO_UPDATE\"],\n isActive: true,\n isError: false,\n analyticsCategory: \"onTheWay\",\n canForceTransition: false,\n shouldNotify: true,\n },\n {\n name: \"Stopped\",\n displayState: {\n orderDetailsTitle: \"STOPPED\",\n orderDetailsSummary:\n \"{customerName} stopped tracking journey at {formattedLastTransitionTime}\",\n categoryTitle: \"On The Way\",\n stateDisplayName: \"Stopped\",\n color: \"#D82D59\",\n quickButtons: [\n {\n label: \"Move To History\",\n action: \"ACKNOWLEDGE\",\n },\n ],\n },\n progressionLevel: 15,\n canAcknowledge: true,\n eventTriggers: [\"TEMPO_CANCELLED\"],\n isActive: false,\n isError: true,\n analyticsCategory: \"haltFail\",\n canForceTransition: false,\n shouldNotify: true,\n },\n {\n name: \"Cancelled\",\n displayState: {\n orderDetailsTitle: \"CANCELLED\",\n orderDetailsSummary: \"{customerName}'s order was cancelled\",\n categoryTitle: \"On The Way\",\n stateDisplayName: \"Cancelled\",\n color: \"#D82D59\",\n },\n progressionLevel: 25,\n canAcknowledge: false,\n eventTriggers: [\"cancelled\"],\n isActive: false,\n isError: true,\n analyticsCategory: \"haltFail\",\n canForceTransition: true,\n shouldNotify: true,\n },\n {\n name: \"Arrived\",\n displayState: {\n orderDetailsSummary:\n \"{customerName} arrived at {formattedLastTransitionTime}.\",\n orderDetailsTitle: \"CUSTOMER ARRIVED\",\n alertTimers: [\n {\n time: 0,\n color: \"#45A04A\",\n showSuccessMessage: true,\n },\n {\n time: 300,\n color: \"#DD7208\",\n showSuccessMessage: false,\n },\n {\n time: 480,\n color: \"#D82D59\",\n showSuccessMessage: false,\n },\n ],\n categoryTitle: \"Arrived\",\n quickButtons: [\n {\n label: \"Complete\",\n action: \"Completed\",\n },\n ],\n stateDisplayName: \"Arrived\",\n color: \"#45A04A\",\n },\n progressionLevel: 20,\n canAcknowledge: true,\n eventTriggers: [\"GEOTRIGGER\", \"arrival\"],\n isActive: true,\n isError: false,\n analyticsCategory: \"arrived\",\n canForceTransition: true,\n shouldNotify: true,\n },\n {\n name: \"Completed\",\n displayState: {\n orderDetailsSummary: \"{customerName}'s order is completed.\",\n categoryTitle: \"Arrived\",\n orderDetailsTitle: \"COMPLETED\",\n stateDisplayName: \"Completed\",\n color: \"#45A04A\",\n },\n progressionLevel: 100,\n canAcknowledge: false,\n eventTriggers: [\"completed\"],\n isActive: false,\n isError: false,\n analyticsCategory: \"haltSucceed\",\n canForceTransition: true,\n shouldNotify: false,\n },\n {\n name: \"ReadyToCollect\",\n displayState: {\n orderDetailsSummary: \"{customerName}'s order is ready to collect.\",\n categoryTitle: \"Ready To Collect\",\n stateDisplayName: \"Ready To Collect\",\n orderDetailsTitle: \"READY TO COLLECT\",\n color: \"#16BFE6\",\n },\n progressionLevel: 5,\n canAcknowledge: false,\n eventTriggers: [\"pickCompleted\"],\n isError: false,\n isActive: true,\n canForceTransition: true,\n shouldNotify: false,\n },\n {\n name: \"OrderOverdue\",\n displayState: {\n orderDetailsSummary:\n \"{customerName}'s order was not collected on time.\",\n categoryTitle: \"Overdue\",\n stateDisplayName: \"Order Overdue\",\n orderDetailsTitle: \"ORDER OVERDUE\",\n color: \"#16BFE6\",\n },\n progressionLevel: 6,\n canAcknowledge: false,\n eventTriggers: [\"orderOverdue\"],\n isError: false,\n isActive: true,\n canForceTransition: true,\n shouldNotify: false,\n },\n ],\n categories: [\"Arrived\", \"On The Way\", \"Ready To Collect\", \"Overdue\"],\n features: {\n hideSearchBar: false,\n },\n },\n};\n","import React, { createContext, ReactNode, useMemo } from \"react\";\nimport useOrderStateConfiguration from \"../../hooks/useOrderStateConfiguration\";\nimport { StateDefinition, StateDefinitionConfig } from \"../../types/StateDefinitionType\";\n\ninterface OrderStatusContextValue {\n stateDefinitions: StateDefinitionConfig | undefined;\n stateDictionary: Record;\n stateCategoryMapping: Record;\n updateStateDefinitions: () => void;\n errorStates: string[];\n stateDefinitionHash?: string;\n stateDefinitionsLoaded: boolean;\n}\n\nconst defaultProviderValue: OrderStatusContextValue = {\n stateDefinitions: undefined,\n stateDictionary: {},\n stateCategoryMapping: {},\n updateStateDefinitions: () =>\n console.log(\"Placeholder function for updateStateDefinitions\"),\n errorStates: [],\n stateDefinitionHash: undefined,\n stateDefinitionsLoaded: false,\n};\n\nconst StateDefinitionsContext = createContext(defaultProviderValue);\n\nconst StateDefinitionsProvider = ({ children }: { children: ReactNode }) => {\n const {\n stateDefinitions,\n updateStateDefinitions,\n stateDefinitionHash,\n stateDefinitionsLoaded,\n } = useOrderStateConfiguration();\n\n const stateCategoryMapping = useMemo(() => {\n if (!stateDefinitions) {\n return {};\n }\n const stateCategoryMap: Record = {};\n for (const category of stateDefinitions.categories) {\n for (const state of stateDefinitions.states) {\n if (state.displayState?.categoryTitle === category) {\n if (stateCategoryMap.hasOwnProperty(category)) {\n stateCategoryMap[category].push(state.name);\n } else {\n stateCategoryMap[category] = [state.name];\n }\n }\n }\n }\n return stateCategoryMap;\n }, [stateDefinitions]);\n\n const stateDictionary = useMemo(() => {\n if (!stateDefinitions) {\n return {};\n }\n const stateDictionary: Record = {};\n for (const state of stateDefinitions.states) {\n stateDictionary[state.name] = state;\n }\n return stateDictionary;\n }, [stateDefinitions]);\n\n const errorStates: string[] = useMemo(() => {\n if (!stateDefinitions) {\n return [];\n }\n const errorStatesArray: string[] = [];\n for (const state of stateDefinitions.states) {\n if (state.isError) {\n errorStatesArray.push(state.name);\n }\n }\n return errorStatesArray;\n }, [stateDefinitions]);\n\n const providerValue = {\n stateDefinitions,\n updateStateDefinitions,\n stateCategoryMapping,\n errorStates,\n stateDictionary,\n stateDefinitionHash,\n stateDefinitionsLoaded,\n };\n\n return (\n \n {children}\n \n );\n};\n\nexport { StateDefinitionsContext, StateDefinitionsProvider };\n","import { useCallback, useState } from \"react\";\nimport { mockStateDefinitions } from \"../data/mockStateDefinitions\";\nimport { StateDefinitionConfig } from \"../types/StateDefinitionType\";\nimport * as api from \"../services/api\";\nimport * as errorFactory from \"../services/errorFactory\";\nimport * as persistenceManager from \"../services/persistenceManager\";\n\nexport default () => {\n const [stateDefinitions, setStateDefinitions] = useState<\n undefined | StateDefinitionConfig\n >();\n const [stateDefinitionHash, setStateDefinitionHash] = useState<\n undefined | string\n >();\n const [stateDefinitionsLoaded, setStateDefinitionsLoaded] = useState(false);\n const [error, setError] = useState();\n\n const updateStateDefinitions = useCallback(async () => {\n const token = persistenceManager.getAuthToken();\n const region = persistenceManager.getRegion();\n\n if (token && region) {\n try {\n const stateDefinitionsResponse = await api.getStateDefinitions(\n token as string,\n region\n );\n setStateDefinitionHash(stateDefinitionsResponse.stateHash);\n setStateDefinitions(stateDefinitionsResponse.stateDefinitions);\n } catch (error) {\n console.log(\n \"Failed to get state definitions. Using fallback definitions\"\n );\n setStateDefinitions(mockStateDefinitions);\n }\n setStateDefinitionsLoaded(true);\n } else {\n if (!token) {\n setError(errorFactory.createNoTokenError());\n } else if (!region) {\n setError(errorFactory.createNoRegionError());\n }\n }\n }, []);\n\n return {\n stateDefinitions,\n updateStateDefinitions,\n stateDefinitionHash,\n stateDefinitionsLoaded,\n error,\n };\n};\n","import React, { createContext, ReactNode } from \"react\";\nimport usePollWaitTime from \"../../hooks/usePollWaitTime\";\n\ninterface WaitTimeContextValue {\n waitTime: number;\n numberOfOrders: number;\n refreshWaitTime: () => void;\n}\n\nconst defaultProviderValue: WaitTimeContextValue = {\n waitTime: 0,\n refreshWaitTime: () =>\n console.log(\"Placeholder function for refreshWaitTime\"),\n numberOfOrders: 0,\n};\n\nconst WaitTimeContext = createContext(defaultProviderValue);\n\nconst WaitTimeProvider = ({ children }: { children: ReactNode }) => {\n const { waitTime, refreshWaitTime, numberOfOrders } = usePollWaitTime();\n\n const providerValue = {\n waitTime,\n refreshWaitTime,\n numberOfOrders,\n };\n\n return (\n \n {children}\n \n );\n};\n\nexport { WaitTimeContext, WaitTimeProvider };\n","import { useEffect, useState } from \"react\";\nimport * as persistenceManager from \"../services/persistenceManager\";\nimport * as api from \"../services/api\";\nimport * as errorFactory from \"../services/errorFactory\";\nimport { WAIT_TIME_POLLING_INTERVAL } from \"../constants/intervals\";\nimport { Region } from \"../types/RegionType\";\n\nexport default () => {\n const [waitTime, setWaitTime] = useState(0);\n const [numberOfOrders, setNumberOfOrders] = useState(0);\n const [shouldRefresh, setShouldRefresh] = useState(false);\n const [, setError] = useState();\n\n useEffect(() => {\n const updateWaitTime = async () => {\n setShouldRefresh(false);\n const token = persistenceManager.getAuthToken();\n const region = persistenceManager.getRegion();\n\n if (token && region) {\n try {\n const timezoneOffset = new Date().getTimezoneOffset();\n const getWaitTimeResponse = await api.getWaitTime(\n token,\n region as Region,\n timezoneOffset\n );\n // TODO: Remove below wait time check after deployment of wait time goals project\n // (just used for a change in units from milliseconds to seconds)\n // If condition can be replaced with code in else block\n if (!getWaitTimeResponse?.unit) {\n setWaitTime(getWaitTimeResponse.waitTimeAverage / 1000);\n } else {\n setWaitTime(getWaitTimeResponse.waitTimeAverage);\n }\n setNumberOfOrders(getWaitTimeResponse.numberOfOrders);\n setError(undefined);\n } catch (err) {\n console.log(err);\n setError(errorFactory.createUnknownError(err));\n }\n } else {\n if (!token) {\n setError(errorFactory.createNoTokenError());\n } else if (!region) {\n setError(errorFactory.createNoRegionError());\n }\n }\n };\n updateWaitTime();\n const timerId = setInterval(\n () => updateWaitTime(),\n WAIT_TIME_POLLING_INTERVAL\n );\n\n return () => clearInterval(timerId);\n }, [shouldRefresh]);\n\n return {\n waitTime,\n numberOfOrders,\n refreshWaitTime: () => setShouldRefresh(true),\n };\n};\n"],"sourceRoot":""}