{"version":3,"sources":["../node_modules/@ionic/core/dist/esm-es5 lazy /^/.*/.entry/.js$/ groupOptions: {} namespace object","../node_modules/ionicons/dist/esm-es5 lazy /^/.*/.entry/.js$/ groupOptions: {} namespace object","../node_modules/@ionic/pwa-elements/dist/esm-es5 lazy /^/.*/.entry/.js$/ include: /.entry/.js$/ exclude: /.system/.entry/.js$/ groupOptions: {} namespace object","theme/appConfiguration.ts","helpers/configHelper.ts","components/CategoryGrid.tsx","helpers/currencyHelpers.ts","helpers/menuHelpers.ts","components/MenuItemRow.tsx","components/CategoryFilters.tsx","store/DealStore.ts","components/CategoryMenuItemLister.tsx","store/ColleagueStore.ts","store/MenuStore.ts","store/LocationStore.ts","store/HeaderFooterStore.ts","store/MenuItemStore.ts","pages/Categories.tsx","helpers/googleHelpers.ts","store/BasketStore.ts","helpers/formValidationHelpers.ts","inputs/GenericInput.tsx","components/Button.tsx","pages/EnterEmail.tsx","components/GooglePay.tsx","components/ApplePay.tsx","helpers/checkoutHelper.ts","helpers/PayerAuthentication.tsx","pages/OrderConfirmation.tsx","components/AltQuantityInput.tsx","components/ModifierGroupItem.tsx","components/ModifierGroup.tsx","modals/AllergenInfoModal.tsx","components/HeaderDescription.tsx","components/DealHeader.tsx","pages/MenuItem.tsx","components/BasketItemRow.tsx","pages/BasketPage.tsx","components/MenuItemTile.tsx","modals/AllergenPopup.tsx","pages/UpsellPage.tsx","helpers/waitTimesHelper.ts","components/wait-times/WaitTimesModal.tsx","components/MopFooterList.tsx","components/MopFooterMenuItem.tsx","components/AgeSelect.tsx","modals/KidsEatFreeModal.tsx","components/wait-times/WaitTimesCheckoutModal.tsx","components/MopFooterBasketPage.tsx","helpers/useMopHook.ts","components/MopFooterConfirmStore.tsx","components/MopFooterUpsellPage.tsx","components/MopFooterTablePage.tsx","components/BasketTotalsAndCoupons.tsx","components/MopFooterPaymentSuccessPage.tsx","components/MopFooterDealUpgrade.tsx","components/MopFooterDeal.tsx","components/MopFooter.tsx","modals/TermsCondModal.tsx","modals/AllergenModal.tsx","modals/LoginModal.tsx","modals/MopHeaderMenusModal.tsx","components/AppHeader.tsx","components/CheckoutPayCard.tsx","pages/CheckoutTestPage.tsx","components/MopCoupons.tsx","pages/CouponsTestPage.tsx","pages/PaymentSuccess.tsx","components/HistoryListener.tsx","components/LocationListener.tsx","components/TimeSlotChooser.tsx","pages/TimeSlotPage.tsx","components/LocationItem.tsx","pages/StoreSearch.tsx","components/wait-times/WaitTimesBanner.tsx","pages/ChooseOrderType.tsx","pages/TableNumber.tsx","pages/NameOrNickname.tsx","pages/TempDealsPage.tsx","pages/UpgradePage.tsx","pages/Splash.tsx","pages/DealSummaryPage.tsx","App.tsx","serviceWorker.ts","store/Counter.ts","store/index.ts","index.tsx","store/configureStore.ts"],"names":["map","webpackAsyncContext","req","__webpack_require__","o","Promise","resolve","then","e","Error","code","ids","id","keys","Object","module","exports","cafeConfiguration","isMarket","imageThemeID","baseUrl","window","location","href","startsWith","getConfig","cacheBust","CategoryGrid","_ref","categoryId","categoryImage","categoryName","fullWidth","onClick","isFavourites","sortOrder","useSelector","state","headerFooter","_jsx","IonCol","size","className","children","_jsxs","alt","src","concat","formatCurrency","amount","toFixed","split","Math","abs","replace","hasPrefixSymbol","value","length","calculateMenuItemTotalPrice","item","calcQuantity","arguments","undefined","_basePrice","menuItemBasePrice","_price","selectedSkus","getSelectedSkus","modifierGroups","reduce","acc","group","shouldShowModifierGroup","sku","itemsAreChargeable","modifierGroupItems","price","quantitySelected","quantity","inlineBrandImage","menuItemName","hasBrandImage","limitSize","showDealHeader","menuItem","isColleague","isDealItem","showModifierGroupsOnPages","find","isMandatory","canSelectMultiple","maxDifferentItems","downloadAllergenFile","url","iOS","test","navigator","userAgent","MSStream","isChrome","toLowerCase","indexOf","vendor","iOSVersion","version","match","substr","n","parseInt","fetch","response","arrayBuffer","buffer","contentType","blob","Blob","type","blobUrl","URL","createObjectURL","link","document","createElement","target","download","body","appendChild","click","removeChild","revokeObjectURL","catch","console","error","forEach","all","v","selected","filter","showOnPage","push","checkSIFIncludes","lhs","rhs","i","includes","modifierGroup","skus","mainItemSku","dataTag","sifs","_dataTag","returnSKUsFromDataTag","index","MenuItemDetails","props","productFlags","kcal","rolledUpItems","backgroundColour","_v$calories","dangerouslySetInnerHTML","__html","calories","IonImg","style","backgroundColor","width","height","IonText","DefaultMenuItemRow","menuItemFromPrice","inStock","menuItemId","separatorColour","getMenuItemName","IonRow","borderBottom","_Fragment","onIonError","log","IonGrid","substring","BirdsEyeStyles","BirdsEyeBackgroundStyles","Red","Orange","Purple","BirdsEyeBackgroundColours","BirdsEyeMenuItemRow","_ref2","backgroundStyle","description","backgroundImage","backgroundRepeat","backgroundSize","backgroundPosition","handleClick","MenuItemRow","graphicTreatment","CategoryFilters","menuItems","selectedFilter","onFilterSelected","uniqueFilters","categoryLevelFilter","sort","a","b","_b$sortOrder","_a$sortOrder","array","initialState","deals","itemSkuToDealSku","currentDealSku","upgradedFromSku","currentPage","actionCreators","Map","deal","upgradeFrom","itemSku","set","dealSku","upgradeToDeal","cancelDeal","page","CategoryMenuItemLister","_categoryList$auxCate","_categoryList$auxCate2","categoryList","onNavigateToCategory","onNavigateToMenuItem","setSelectedFilter","useState","useLocation","history","useHistory","dispatch","useDispatch","handleMenuItemClick","useEffect","categories","c","DealStore","items","onClickCategory","category","pathname","menuItemIds","subCategoryIds","IonContent","fullscreen","class","auxCategoryData","categoryColours","background","tagImageUrl","showFilters","newSelectedFilter","itemTags","_b$sortOrder2","_a$sortOrder2","aHasFlag","auxData","bHasFlag","_categoryList$auxCate3","_categoryList$auxCate4","_a$auxData","_a$auxData2","menuItemImage","separator","VALIDATE_PIN_REQUEST","VALIDATE_PIN_SUCCESS","VALIDATE_PIN_FAILURE","LOGGED_IN","RESET_MESSAGE","validatePinFailure","payload","loggedIn","isLoggedIn","localStorage","setItem","String","resetMessage","message","pin","getState","currentPin","validatePinRequest","json","data","validatedOk","validatePinSuccess","pfIdentifier","_appState$colleague","appState","method","headers","JSON","stringify","colleague","removeItem","unloadedState","loading","expired","getItem","requestCategoryList","container","callback","_appState$location","_appState$location2","_appState$menuData","channelIdentifier","timeSlotStart","selectedTimeSlot","startTime","menuData","isFirstAccess","status","categoryCurrent","categoryListA","categoryListB","isLoading","title","autocompleteService","placesService","simpleChannelType","isBusy","isGeoLocationSupported","clientLatitude","Number","NaN","clientLongitude","clientAccuracy","clientTimeStamp","predictions","place","placeLatitude","placeLongitude","stores","selectedStore","selectedChannel","label","endTime","startDateTime","endDateTime","takingOrders","requestClientGeoLocation","geolocation","getCurrentPosition","p","geolocationPosition","latitude","coords","longitude","accuracy","timeStamp","timestamp","requestServerGeoAutoComplete","input","google","maps","places","AutocompleteService","getPlacePredictions","componentRestrictions","country","requestServerGeoPlace","place_id","PlacesService","getDetails","placeId","PlacesServiceStatus","OVER_QUERY_LIMIT","setTimeout","_place$geometry","geometry","_place$geometry2","noidea","parse","lat","lng","requestStores","radius","isNaN","selectStore","selectedChannelIdentifier","store","clearStores","clearSelectedStore","requestStore","storeReference","errorCallback","selectTimeslot","timeslot","timeSlot","setChannel","HeaderMode","FooterMode","setTitle","showBack","setPage","path","_appState$location$se","menuTitle","_appState$menuData$ca","categoryTitle","showDealPageFooter","_appState$menuItemDat","_appState$menuItemDat2","menuItemData","channelType","setShowModal","name","singleInstance","_state$headerFooter","_singleInstance","_selectedModal","modals","selectedModal","_state$headerFooter2","_state$headerFooter3","show","requestMenuItemBySku","params","URLSearchParams","append","toString","requestMenuItem","referrer","requestBasketMenuItem","basketMenuItemId","_appState$basket","basketItem","basket","batch","updateMenuItemTotalPrice","updateModifierGroupItem","idx","flatMap","mod","j","findIndex","_appState$menuItemDat3","_appState$menuItemDat4","categoryIndex","menuItemIndex","updateMenuItemQuantity","updateAuxFilterItemQuantity","modifierGroupIndex","filterGroupIndex","filterSelectorIndex","_appState$menuItemDat5","totalPrice","calculateAuxFilterItems","_appState$menuItemDat6","debug","_targetModifierGroup$","_targetModifierGroup$2","_targetModifierGroup$3","targetModifierGroup","selectedFilters","auxMenuItemData","auxJsonFilters","groups","filterSelection","selectors","groupFilters","selector","tag","selectedFilterInGroup","_availableOutcomes","_selectedFilters","selectorTag","filterInGroupTag","selectedFilterIndex","filterSelected","outcomes","outcome","every","q","filters","availableModifierItems","some","_a$price","_b$price","samePrice","from","currentPrice","_group","groupPrice","_selector","groupTitle","_availableModifierIte","enabled","outcomeMatches","_","isEqual","prevSelectedModifier","modifierMatches","modifier","modIndex","isBasket","Categories","React","Component","constructor","super","this","componentDidMount","requiredId","categoryIdentifier","_this$props$pfIdentif","setState","useStoreA","listen","action","breakUrl","currentCatgegoryId","setCurrentCategory","componentWillUnmount","onReceiveCategoryList","navigateToCategory","_this$props$pfIdentif2","_this$props$pfIdentif3","navigateToMenuItem","_this$props$pfIdentif4","_this$props$dealData$","dealData","get","goBack","render","IonPage","IonSpinner","color","bind","connect","mapStateToProps","ownProps","MenuDataStore","HeaderFooterStore","referer","MenuItemDataStore","pushToGoogleEcommerce","event","ecommerce","dataLayer","addItemToGtagBasket","currentMenuItem","affiliation","getGtagBasketObject","addCoupon","_menuItems","_discounts","_googleItems","isDiscount","totalPricePreDiscount","prev","curr","menuItemSinglePrice","discount","coupon","totalDiscount","percentage","parseFloat","itemDiscount","formatMopMenuItemToGoogleMenuItem","currency","item_id","item_name","item_category","PaymentStatus","upsellDone","showAllergen","isKefComplete","staffCardNumber","moreCardNumber","mopUpsells","mopCoupons","calculateExternalDiscounts","isColleagueDiscountBasket","externalPromotionsApplied","calculateExternalDiscountsFailed","externalCalculationMessages","ageConfirmations","ageRestrictedDiscounts","tmpBasket","upsells","email","orderNumber","totalQuantity","shouldOfferUpsellToCustomer","continueClicked","tableFormErrors","tableNumber","nicknameFormErrors","nickname","paymentStatus","UNSET","toastNotificationOpen","abortController","updateBasketItem","currentBasketItem","menuItemTotalPrice","basketItemIndex","basketItems","actualItems","x","addMenuItemToBasket","_appState$basket2","_appState$basket3","newBasket","_appState$basket4","basketId","floor","random","conflictIndex","_appState$location2$s","storeName","storeNumber","calculateBasket","updateBasketDetails","values","consent","saveValues","getUpsells","_appState$location3","addCouponCode","couponCode","deleteCouponCode","updateBasketItemQuantity","basketItemId","_appState$location4","_appState$location4$s","_appState$location5","_appState$location5$s","removeItemFromGtagBasket","setDiscountAges","applyAgeRestrictedDiscounts","_appState$location6","_appState$basket5","_appState$basket6","_appState$basket7","_appState$basket8","_applyAgeRestrictedDi","abort","newAbortController","AbortController","requestOptions","signal","clearBasket","updateOrderNumber","setShouldOfferUpsell","setIsKefComplete","setContinueClicked","setTableFormErrors","setTableNumber","setNicknameFormErrors","setNickname","updateTempBasket","clearBasketItems","dispatchEvent","updatePaymentStatus","enterEmailSchema","Yup","shape","domain","required","nullable","genericCardErrorMessage","createError","cardPrefix","cardCheckoutSchema","Name","Expiry","tableNumberSchema","TableNumber","max","nicknameSchema","Nickname","GenericInput","ref","IonInputProps","onError","onIonChange","Field","field","meta","form","touched","IonInput","onChange","Button","IonButton","rounded","uppercase","_state$basket","_state$basket2","BasketStore","showStaffDiscount","setShowStaffDiscount","initialValues","setInitialValues","Formik","validationSchema","enableReinitialize","onSubmit","actions","handleSubmit","IonLabel","autofocus","placeholder","IonItem","lines","IonCheckbox","slot","checked","setFieldValue","hidden","expand","GooglePay","_useSelector","useRef","baseRequest","apiVersion","apiVersionMinor","tokenizationSpecification","parameters","LivePayments","merchantInfo","merchantName","merchantId","baseCardPaymentMethod","allowedCardNetworks","allowedAuthMethods","assuranceDetailsRequired","cardPaymentMethod","assign","paymentDataRequest","allowedPaymentMethods","transactionInfo","totalPriceStatus","current","countryCode","currencyCode","checkoutOption","isReadyToPayRequest","paymentsClient","payments","api","PaymentsClient","environment","isReadyToPay","result","button","createButton","ShouldPaymentStart","res","loadPaymentData","paymentData","GooglePayButtonClickHandler","err","buttonColor","buttonSizeMode","buttonType","firstChild","clearElements","GooglePayButtonContainer","TotalPrice","ApplePay","setStatus","merchantDetails","setMerchantDetails","MerchantIdentifier","StoreName","basketStore","request","supportedNetworks","merchantCapabilities","total","showApplePayButton","addToStatus","ApplePayButton","SetShowButton","onClickApplePayButton","beginPayment","session","ApplePaySession","onvalidatemerchant","EndpointURL","validationURL","completeMerchantValidation","onpaymentmethodselected","paymentMethodSelected","paymentMethod","displayName","completePaymentMethodSelection","newTotal","onshippingcontactselected","shippingContactSelected","completeShippingContactSelection","onshippingmethodselected","shippingSelected","completeShippingMethodSelection","onpaymentauthorized","paymentAuthorizedEvent","paymentToken","payment","token","ApplePayButtonClickHandler","oncancel","cancelEvent","begin","addEventListener","_props$ApplePayButton","removeEventListener","checkForApplePay","merchantIdentifier","canMakePaymentsWithActiveCard","canMakePayments","reason","s","Debug","zIndex","CreatePaymentRequest","async","orderType","_orderType","ClickAndCollect","TableOrder","collectionTime","ok","text","responseData","checkoutRecord","orderUid","addPurchaseToGtag","transactionId","gtagPurchaseObject","transaction_id","collection_time","order_type","previousOrders","PayerAuthentication","forwardRef","onPaymentSuccess","initialTransactionInformation","setInitialTransactionInformation","payerAuthSetupResponse","setPayerAuthSetupResponse","checkoutResponse","setCheckoutResponse","expireMessage","setExpireMessage","paymentResponse","paymentResult","payerAuthSetupFormRef","stepupFormRef","handleError","_result","Authenticate","authPayInfo","processingInformation","_initialTransactionInformation","flexTokenInformation","paymentInformation","tokenInformation","transientToken","jti","AuthenticatePaymentRequest","consumerAuthenticationInformation","CreatePayment","cardSummary","_appState$basket$tabl","_appState$basket$nick","_appState$location3$s","transactionType","createPaymentRequest","cardInformation","cardDetails","reject","_checkoutResponse","_result2","hideStepUpScreen","display","actionList","authenticationTransactionId","listenToAuthentication","origin","Status","referenceId","returnUrl","submit","_paymentResponse$cons","errorInformation","payerAuthForm","useMemo","deviceDataCollectionUrl","accessToken","stepUpForm","_paymentResponse$cons2","stepUpUrl","useImperativeHandle","OrderConfirmation","bindActionCreators","basketActions","setError","showAppleButton","setShowAppleButton","googlePayButtonRef","applePayButtonRef","paymentOptions","setPaymentOptions","setTotalPrice","setIsLoading","paymentsLive","debugApplePay","stateRef","payerAuthRef","options","pLive","livePayments","standalone","splice","shouldPaymentStart","REQUESTED","onPaymentStart","handleApplePayButtonClick","paymentData64","Base64","encode","fluidData","descriptor","encoding","number","paymentSolution","authorizationOptions","ignoreCsvResult","STATUS_SUCCESS","STATUS_FAILURE","completePayment","handleGooglePayButtonClick","paymentMethodData","tokenizationData","paymentToken64","_assuranceDetails","_assuranceDetails2","authSetupRequest","info","assuranceDetails","cardHolderAuthenticated","COMPLETE","option","opacity","AltQuantityInput","subtractButtonColour","addButtonColour","disableAddQuantityButton","disableDecreaseQuantityButton","valueColour","viewBox","fill","xmlns","d","ModifierGroupItemCommon","_props$kcal","showImage","showQuantityComponent","showPrice","ModifierGroupItem","memo","_props$menuItem$price","_props$menuItem$price2","handleItemSelected","onSelect","IonIcon","icon","checkmarkOutline","disabled","disableSelect","ModifierGroup","localId","onSelectedSingle","groupDescription","groupType","_state$menuItemData","boundUpdateItem","menuItemStore","setSelected","totalQuantitySelected","setTotalQuantitySelected","startSelected","out","defaultQuantitySelected","minDifferentItems","menuSingleItemSelected","prevItem","handleChange","currentValue","mgi","showImages","maxQuantity","AllergenInfoModal","isModalOpen","closeModalClick","allergenHtml","IonModal","isOpen","cssClass","onDidDismiss","swipeToClose","IonHeader","chevronBack","HeaderDescription","_menuItem$menuItemBas","_menuItem$productFlag","_menuItem$kcal","_menuItem$allergenInf","headerImage","hideText","headerState","allergenInfoOpen","setAllergenInfoOpen","priceValue","currencyHelpers","showDebugLabel","allergenInfo","DealComponent","imageFailed","setImageFailed","primarySelectedText","primaryDefaultText","DealGraphic","_menuItem$menuItemNam","_menuItem$menuItemNam2","mainItemImage","_menuItem$overrideMen","image","overrideMenuItemImageInDealComponents","productNameBasketOverride","showMenuItemImageInDealComponents","filteredModifierGroups","_menuItem$modifierGro","_menuItem$modifierGro2","primaryModifierGroup","order","totalModifierGroups","_menuItem$modifierGro3","add","mg","getSelected","DealHeader","_props$menuItem","_props$menuItem$menuI","_props$menuItem2","_props$menuItem$hasBr","_props$menuItem3","_props$menuItem4","dealIndex","isDeal","_state$menuItemData2","_state$colleague","setBasketShowModal","_state$deal","contentRef","_contentRef$current","scrollToTop","_contentRef$current2","search","BasketItemRow","_basketItem$optionsTe","readOnly","boundRequestBasketItem","boundUpdateBasketItemQuantity","boundStartDeal","removeAlertIsOpen","setRemoveAlertIsOpen","isCoupon","IonAlert","header","buttons","role","handler","optionsTextList","row","trim","isExtra","editable","proceed","BasketPage","_state$basket3","showAlert","setShowAlert","boundClearBasket","boundGetUpsells","sortedMenuItems","obj","key","MenuItemTile","fromPrice","onAddClick","AllergenPopup","_props$show","close","accept","UpsellPage","boundUpsellDone","boundRequestMenuItem","MenuItemStore","locationStore","showAllergenPopup","setShowAllergenPopup","plpRoundels","goToNextPage","_locationStore$select","secondsToMinutes","seconds","waitingText","minutes","waitingRange","waitingLabel","useWaitTimes","_selectedStore$waitTi","anticipatedWaitTimeSeconds","_state$location","waitTimeModel","displayWaitTimes","anticipatedWait","WaitTimesModal","showing","WaitTimesButton","timeOutline","MopFooterList","_locationState$select","showModal","locationState","headerFooterStore","boundCalculateBasket","basketEnabled","showWaitingModal","setShowWaitingModal","fromCharCode","showBasketModal","takingMopOrders","goToBasket","MopFooterMenuItem","_state$menuItemData3","_state$menuItemData3$","boundAddToBasket","boundUpdateBasket","setPrice","enableButton","setEnableButton","canAddOrUpdate","AgeSelect","onChangeValue","disableSubtract","disableAdd","KefList","kids","kidsMeals","cx","cy","r","stroke","KidsEatFreeModal","_basketStore$basket2","_props$kidsMeals$kid","_props$kidsMeals$kid$","_props$kidsMeals$kid2","kid","setKid","age","setAge","setKidsMeals","boundSetDiscountAges","boundSetIsKefComplete","_basketStore$basket","nextKid","k","clamp","min","resetState","completeModal","exitModal","closeModal","rewardNames","handleAgeClick","change","handleConfirmClick","newKidsMeals","m","ageIsValid","handleCancelClick","discountValue","WaitTimesCheckoutModal","onDidAccept","MopFooterBasketPage","_locationState$select2","showKefModal","setShowKefModal","showWaitingCheckoutModal","setShowWaitingCheckoutModal","handleKef","handleCloseKef","handleCheckout","useMopHooks","boundSelectTimeslot","LocationStore","boundSetChannel","setAsapTimeSlot","serverTime","remainder","moment","minute","subtract","format","onChannelSelected","channel","enableTimeSlots","MopFooterConfirmStore","_locationState$select3","showButton","setShowButton","supportedChannels","MopFooterUpsellPage","MopFooterTablePage","BasketTableNumber","BasketNickname","_state$basket4","boundSetContinueClicked","boundSetTableFormError","boundSetNicknameFormError","boundSetTableNumber","boundSetNickname","submitTableNumber","couponErrorMappings","CouponCheckMarkSvg","fillRule","clipRule","ErrorSvg","CouponCode","SetCouponCode","showCouponEntry","setShowCouponEntry","SetError","IsBusy","SetIsBusy","basketStoreEx","couponsTotal","calculateCouponsTotal","rejected","couponMenuItem","subTotal","chevronDownOutline","chevronUpOutline","detail","duplicatCoupon","couponsAdded","thatCoupon","mappedError","errorCode","MopFooterPaymentSuccessPage","MopFooterDealUpgrade","_state$menuItemData$m","_state$deal$deals","_state$deal2","_state$deal3","MopFooterDeal","setCurrentPage","addToBasket","updateBasket","pages","unique","Set","Array","lastPage","slice","isGreyedOut","setIsGreyedOut","requiredItems","setRequiredItems","showToastError","setShowToastError","showToastSuccess","setShowToastSuccess","goBackRecursive","to","getFirstValidPage","validPage","_menuItem$menuItemTot","isPageComplete","hasPriceSet","nextPage","IonToast","animated","duration","position","MopFooter","footerMode","BasketTotalAndCoupons","IonFooter","Hidden","Basket","PDP","TablePage","ConfirmStore","PaymentSuccessPage","DealPage","DealUpgradePage","TermsCondModal","AllergenModal","paddingBottom","_state$colleague2","_state$colleague3","_state$colleague$isLo","_state$colleague4","parentModalClick","validatePin","ColleaguesStore","errorMessage","setErrorMessage","getConfirmPinErrorMessage","setConfirmPinErrorMessage","pinConfirmed","setPinConfirmed","setPin","mode","inputmode","maxlength","minlength","inputValue","checkbox","MopHeaderMenusModal","boundSetShowModal","orders","setOrders","showLogoutAlert","setShowLogoutAlert","setIsLoggedIn","getOrderStatus","orderGUIDs","orderPlaced","finally","complete","handleLogoutConfirmation","confirmed","reload","onWillPresent","IonRefresher","onIonRefresh","IonRefresherContent","orderStoreLocation","completed","customerOrderNumber","orderTotal","mopOrderUid","warningOutline","documentTextOutline","personCircle","LoginModal","allowedStartingPages","AppHeader","boundShowDebugLabels","redirect","setRedirect","dealPageCount","setDealPageCount","isUserAllowedToLandHere","sendPageView","_params$get","count","showLabel","handleBrowserHistoryChange","page_title","gtag","hasStartedApp","headerMode","Normal","IonToolbar","IonTitle","menu","closeOutline","handleLogout","ErrorIcon","CheckoutPayCard","myStyles","formRef","createRef","stepUpIframe","deviceCollectionIframe","pageWrapper","controller","renderIframe","isCreatingPaymentRequest","isPageValid","isPageLoading","isPayLoading","microform","fields","ccv","customerInformation","cardExpiryDate","toast","isToastOpen","toastMessage","payerAuth","payerAuthEnrolled","disablePayButton","serverBasket","cvvError","numberError","InitCheckout","componentDidUpdate","prevProps","prevState","load","unload","that","Flex","jwk","styles","createField","securityCode","on","onPaymentError","unLockUi","self","onReceivedCardToken","decodedFlexObj","jwtDecode","lockUI","setShowBack","IonLoading","dates","expirationMonth","expirationYear","createToken","details","f","enterkeyhint","autoCapitalize","inputMode","_ref3","IonDatetime","displayFormat","_state$location2","Email","ChannelIdentifier","TimeSlot","withRouter","CheckoutTestPage","_props$mopCoupons","_props$mopCoupons2","_props$mopCoupons3","showCoupons","setShowCoupons","getCouponDescription","closeCircle","SlideDown","closed","clearInput","fixed","CouponsTestPage","MopCoupons","PaymentSuccess","basketState","counterItems","setCounterItems","isKitchenItemPresent","setIsKitchenItemPresent","_counterItems","isKitchenItem","counterItem","_isKitchenItemsPresent","HistoryListener","boundSetPage","LocationListener","classList","contains","remove","IonicSafeString","TimeSlotChooser","isChanging","setIsChanging","timeSlots","setTimeSlots","timeRange","setTimeRange","asapTimeSlot","pickATimeObj","setPickATimeObj","prevTimeSlot","setPrevTimeSlot","handleTimeslotChange","isHeader","firstTimeslot","_formRef$current","reset","handleHeaderRadioChange","mopTimeSlots","_asapTimeSlot","timeslotFromState","firstAvailableTimeslot","ts","IonRadioGroup","IonRadio","offset","TimeSlotPage","_LocationState$select","_LocationState$select2","LocationState","LocationItemObject","locationName","locationAddress","locationPostcode","locationDistance","locationIsMarketKitchen","locationIsCafe","locationMessage","selectedStoreNumber","openingTimes","storeOpen","isFirstItem","isLastItem","warning","tidyPlaceDescription","newTitle","StoreSearch","requestAutocomplete","query","_responseJson$feature","responseJson","features","feature","statusText","localPredictions","cancelOrderAlertShow","ignoreInput","requestStoresCallback","requestServerGeoAutoCompleteCallback","requestServerGeoPlaceCallback","geoCallback","onIonRadioGroupChange","setSelectedStore","_storeNumber","theStore","theChannel","theChannelIdentifier","_this$props$predictio","clearSuggestions","onBlur","_e$detail","_e$detail$relatedTarg","relatedTarget","tagName","onInputChanged","evt","str","onPlaceSelect","long","isOk","_this$props$selectedS","onIonBlur","debounce","locate","IonList","prediction","onMouseDown","place_name","coordinates","_this$props$selectedS2","metersValue","LocationItem","firstLineAddress","postcode","distance","WaitTimesBanner","channelProps","KerbsideOrder","ChannelButton","ChooseOrderType","setSelectedChannel","isAlertOpen","setIsAlertOpen","isClearBasketAlertOpen","setClearBasketAlertOpen","BasketState","backdropDismiss","margin","_channelProps$a$chann","_channelProps$a$chann2","_channelProps$b$chann","_channelProps$b$chann2","handleOrderTypeClick","TableFormErrors","ContinueClicked","auxStoreData","tableNumbers","IonSelect","interface","table","IonSelectOption","NameOrNickname","NicknameFormErrors","_values$Nickname","getImageSrc","imageUrl","AppDealItem","srcSet","dealImage","sizes","dealPrice","TempDealsPage","dealName","dealDescription","subTitle","advertisedPrice","itemName","itemPrice","UpgradePage","CookieConsent","showTermsAndConditions","handleDecline","onExit","handleAccept","SplashPage","showCookieConsent","setShowCookieConsent","boundSetHasStartedApp","cookieConsent","searchParams","pd","splitDecodeByComma","decode","isNewOrder","startOrder","continueFromInitialPage","DealSummaryPage","isChargeable","App","loadGooglePlaces","onload","getElementsByTagName","loadHeadTags","favicon","rel","head","createManifest","_document$querySelect","stringManifest","manifestUrl","querySelector","setAttribute","showExpireModal","setShowExpireModal","IonApp","IonReactRouter","basename","IonRouterOutlet","Route","exact","component","MenuItem","EnterEmail","Splash","Redirect","Boolean","hostname","reducers","counter","reducer","incomingAction","_state$categoryListA","_state$categoryListB","_state$menuItem","update","$merge","newShowBack","newFooterMode","newHeaderMode","_unloadedState","$set","_coupons","mi","_calculateExternalDiscounts","getAttribute","middleware","thunk","routerMiddleware","rootReducer","combineReducers","router","connectRouter","enhancers","windowIfDefined","__REDUX_DEVTOOLS_EXTENSION__","createStore","compose","applyMiddleware","configureStore","createBrowserHistory","ReactDOM","BrowserRouter","Provider","getElementById","defineCustomElements","serviceWorker","ready","registration","unregister"],"mappings":"qLAAA,IAAIA,EAAM,CACT,8BAA+B,CAC9B,IACA,GAED,uBAAwB,CACvB,IACA,GAED,uBAAwB,CACvB,IACA,GAED,0BAA2B,CAC1B,IACA,IAED,6BAA8B,CAC7B,IACA,IAED,0BAA2B,CAC1B,IACA,IAED,0BAA2B,CAC1B,IACA,IAED,wBAAyB,CACxB,IACA,IAED,0BAA2B,CAC1B,IACA,IAED,sBAAuB,CACtB,IACA,IAED,uBAAwB,CACvB,IACA,IAED,4BAA6B,CAC5B,IACA,IAED,uBAAwB,CACvB,IACA,IAED,qBAAsB,CACrB,IACA,IAED,mCAAoC,CACnC,IACA,IAED,uBAAwB,CACvB,IACA,IAED,+BAAgC,CAC/B,IACA,IAED,wBAAyB,CACxB,IACA,IAED,yBAA0B,CACzB,IACA,IAED,wBAAyB,CACxB,IACA,IAED,uBAAwB,CACvB,IACA,IAED,uBAAwB,CACvB,IACA,IAED,yBAA0B,CACzB,IACA,IAED,8BAA+B,CAC9B,IACA,IAED,yBAA0B,CACzB,IACA,IAED,uBAAwB,CACvB,IACA,IAED,6BAA8B,CAC7B,IACA,IAED,2BAA4B,CAC3B,IACA,IAED,+BAAgC,CAC/B,IACA,IAED,yBAA0B,CACzB,IACA,IAED,2BAA4B,CAC3B,IACA,IAED,2BAA4B,CAC3B,IACA,IAED,0BAA2B,CAC1B,IACA,IAED,yBAA0B,CACzB,IACA,IAED,yBAA0B,CACzB,IACA,IAED,4BAA6B,CAC5B,IACA,IAED,2BAA4B,CAC3B,IACA,IAED,uBAAwB,CACvB,IACA,IAED,sBAAuB,CACtB,IACA,IAED,0BAA2B,CAC1B,IACA,IAED,uBAAwB,CACvB,IACA,IAED,wBAAyB,CACxB,IACA,IAED,gCAAiC,CAChC,IACA,KAGF,SAASC,EAAoBC,GAC5B,IAAIC,EAAoBC,EAAEJ,EAAKE,GAC9B,OAAOG,QAAQC,UAAUC,MAAK,WAC7B,IAAIC,EAAI,IAAIC,MAAM,uBAAyBP,EAAM,KAEjD,MADAM,EAAEE,KAAO,mBACHF,CACP,IAGD,IAAIG,EAAMX,EAAIE,GAAMU,EAAKD,EAAI,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","file":"static/js/main.b0abfc36.chunk.js","sourcesContent":["var map = {\n\t\"./ion-action-sheet.entry.js\": [\n\t\t288,\n\t\t7\n\t],\n\t\"./ion-alert.entry.js\": [\n\t\t289,\n\t\t8\n\t],\n\t\"./ion-app_8.entry.js\": [\n\t\t290,\n\t\t9\n\t],\n\t\"./ion-avatar_3.entry.js\": [\n\t\t291,\n\t\t19\n\t],\n\t\"./ion-back-button.entry.js\": [\n\t\t292,\n\t\t20\n\t],\n\t\"./ion-backdrop.entry.js\": [\n\t\t293,\n\t\t45\n\t],\n\t\"./ion-button_2.entry.js\": [\n\t\t294,\n\t\t21\n\t],\n\t\"./ion-card_5.entry.js\": [\n\t\t295,\n\t\t22\n\t],\n\t\"./ion-checkbox.entry.js\": [\n\t\t296,\n\t\t23\n\t],\n\t\"./ion-chip.entry.js\": [\n\t\t297,\n\t\t24\n\t],\n\t\"./ion-col_3.entry.js\": [\n\t\t298,\n\t\t46\n\t],\n\t\"./ion-datetime_3.entry.js\": [\n\t\t299,\n\t\t12\n\t],\n\t\"./ion-fab_3.entry.js\": [\n\t\t300,\n\t\t25\n\t],\n\t\"./ion-img.entry.js\": [\n\t\t301,\n\t\t47\n\t],\n\t\"./ion-infinite-scroll_2.entry.js\": [\n\t\t302,\n\t\t48\n\t],\n\t\"./ion-input.entry.js\": [\n\t\t303,\n\t\t26\n\t],\n\t\"./ion-item-option_3.entry.js\": [\n\t\t304,\n\t\t27\n\t],\n\t\"./ion-item_8.entry.js\": [\n\t\t305,\n\t\t28\n\t],\n\t\"./ion-loading.entry.js\": [\n\t\t306,\n\t\t29\n\t],\n\t\"./ion-menu_3.entry.js\": [\n\t\t307,\n\t\t30\n\t],\n\t\"./ion-modal.entry.js\": [\n\t\t308,\n\t\t10\n\t],\n\t\"./ion-nav_2.entry.js\": [\n\t\t309,\n\t\t16\n\t],\n\t\"./ion-popover.entry.js\": [\n\t\t310,\n\t\t11\n\t],\n\t\"./ion-progress-bar.entry.js\": [\n\t\t311,\n\t\t31\n\t],\n\t\"./ion-radio_2.entry.js\": [\n\t\t312,\n\t\t32\n\t],\n\t\"./ion-range.entry.js\": [\n\t\t313,\n\t\t33\n\t],\n\t\"./ion-refresher_2.entry.js\": [\n\t\t314,\n\t\t13\n\t],\n\t\"./ion-reorder_2.entry.js\": [\n\t\t315,\n\t\t18\n\t],\n\t\"./ion-ripple-effect.entry.js\": [\n\t\t316,\n\t\t49\n\t],\n\t\"./ion-route_4.entry.js\": [\n\t\t317,\n\t\t34\n\t],\n\t\"./ion-searchbar.entry.js\": [\n\t\t318,\n\t\t35\n\t],\n\t\"./ion-segment_2.entry.js\": [\n\t\t319,\n\t\t36\n\t],\n\t\"./ion-select_3.entry.js\": [\n\t\t320,\n\t\t37\n\t],\n\t\"./ion-slide_2.entry.js\": [\n\t\t321,\n\t\t50\n\t],\n\t\"./ion-spinner.entry.js\": [\n\t\t322,\n\t\t15\n\t],\n\t\"./ion-split-pane.entry.js\": [\n\t\t323,\n\t\t51\n\t],\n\t\"./ion-tab-bar_2.entry.js\": [\n\t\t324,\n\t\t38\n\t],\n\t\"./ion-tab_2.entry.js\": [\n\t\t325,\n\t\t17\n\t],\n\t\"./ion-text.entry.js\": [\n\t\t326,\n\t\t39\n\t],\n\t\"./ion-textarea.entry.js\": [\n\t\t327,\n\t\t40\n\t],\n\t\"./ion-toast.entry.js\": [\n\t\t328,\n\t\t41\n\t],\n\t\"./ion-toggle.entry.js\": [\n\t\t329,\n\t\t14\n\t],\n\t\"./ion-virtual-scroll.entry.js\": [\n\t\t330,\n\t\t52\n\t]\n};\nfunction webpackAsyncContext(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\treturn Promise.resolve().then(function() {\n\t\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\t\te.code = 'MODULE_NOT_FOUND';\n\t\t\tthrow e;\n\t\t});\n\t}\n\n\tvar ids = map[req], id = ids[0];\n\treturn __webpack_require__.e(ids[1]).then(function() {\n\t\treturn __webpack_require__(id);\n\t});\n}\nwebpackAsyncContext.keys = function webpackAsyncContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackAsyncContext.id = 129;\nmodule.exports = webpackAsyncContext;","var map = {\n\t\"./ion-icon.entry.js\": [\n\t\t331,\n\t\t67\n\t]\n};\nfunction webpackAsyncContext(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\treturn Promise.resolve().then(function() {\n\t\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\t\te.code = 'MODULE_NOT_FOUND';\n\t\t\tthrow e;\n\t\t});\n\t}\n\n\tvar ids = map[req], id = ids[0];\n\treturn __webpack_require__.e(ids[1]).then(function() {\n\t\treturn __webpack_require__(id);\n\t});\n}\nwebpackAsyncContext.keys = function webpackAsyncContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackAsyncContext.id = 131;\nmodule.exports = webpackAsyncContext;","var map = {\n\t\"./pwa-action-sheet.entry.js\": [\n\t\t335,\n\t\t59\n\t],\n\t\"./pwa-camera-modal-instance.entry.js\": [\n\t\t336,\n\t\t60\n\t],\n\t\"./pwa-camera-modal.entry.js\": [\n\t\t337,\n\t\t61\n\t],\n\t\"./pwa-camera.entry.js\": [\n\t\t338,\n\t\t62\n\t],\n\t\"./pwa-toast.entry.js\": [\n\t\t339,\n\t\t63\n\t]\n};\nfunction webpackAsyncContext(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\treturn Promise.resolve().then(function() {\n\t\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\t\te.code = 'MODULE_NOT_FOUND';\n\t\t\tthrow e;\n\t\t});\n\t}\n\n\tvar ids = map[req], id = ids[0];\n\treturn __webpack_require__.e(ids[1]).then(function() {\n\t\treturn __webpack_require__(id);\n\t});\n}\nwebpackAsyncContext.keys = function webpackAsyncContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackAsyncContext.id = 285;\nmodule.exports = webpackAsyncContext;","export const cafeConfiguration: AppConfiguration = {\r\n isMarket: false,\r\n imageThemeID: \"Cafe\"\r\n}\r\n\r\nexport const marketConfiguration: AppConfiguration = {\r\n isMarket: true,\r\n imageThemeID: \"MK\"\r\n}\r\n","import { cafeConfiguration, marketConfiguration } from '../theme/appConfiguration';\r\n\r\nexport function baseUrl() { \r\n if (window.location.href.startsWith(\"http://localhost:\")) {\r\n return \"https://localhost:44362\";\r\n\r\n }\r\n // Line below will be removed by TeamCity\r\n \r\n return \"/cafe\"; \r\n}\r\n\r\nexport const getConfig = () => {\r\n\r\n //REPLACECONFIG\r\n\r\n\r\n return cafeConfiguration;\r\n //return marketConfiguration;\r\n}\r\n\r\nexport const cacheBust = () => {\r\n\r\n return 7913\r\n \r\n\r\n return Date.now().toString();\r\n}\r\n\r\nexport const continueFromInitialPage = (history: any, boundSetHasStartedApp: any, pathname: string) => {\r\n boundSetHasStartedApp(() => {\r\n history.push(pathname);\r\n }); \r\n}","import React from 'react';\r\nimport { IonCol } from '@ionic/react';\r\nimport './CategoryGrid.scss';\r\nimport { baseUrl, cacheBust } from '../helpers/configHelper';\r\nimport { useSelector } from 'react-redux';\r\nimport { ApplicationState } from '../store';\r\n\r\ninterface CategoryGridProps {\r\n categoryId: number;\r\n categoryImage: string;\r\n categoryName: string;\r\n fullWidth: boolean;\r\n onClick?: (categoryId: number) => void;\r\n isFavourites?: boolean;\r\n sortOrder?: number;\r\n}\r\n\r\nconst CategoryGrid: React.FC = ({\r\n categoryId,\r\n categoryImage,\r\n categoryName,\r\n fullWidth,\r\n onClick,\r\n isFavourites,\r\n sortOrder,\r\n}) => {\r\n const headerState = useSelector((state: ApplicationState) => state.headerFooter);\r\n\r\n return (\r\n onClick && onClick(categoryId)}\r\n size={fullWidth ? \"12\" : \"6\"}\r\n className=\"category-column\"\r\n >\r\n {isFavourites\r\n ?\r\n
\r\n
\r\n \r\n
\r\n

Your Café favourites

\r\n

Quick access to Café favourites you've ordered before.

\r\n
\r\n
\r\n
\r\n :\r\n
\r\n \r\n
\r\n }\r\n \r\n );\r\n};\r\n\r\nexport default CategoryGrid;\r\n","export function formatCurrency(amount: number | null | undefined) {\r\n if (!amount) {\r\n return \"£ --\";\r\n }\r\n\r\n if (amount < 0) {\r\n if (amount > -1) {\r\n return \"-\" + amount.toFixed(2).split('.')[1] + \"p\";\r\n }\r\n\r\n return \"-£\" + Math.abs(amount).toFixed(2);\r\n }\r\n\r\n if (amount < 1) {\r\n return amount.toFixed(2).split('.')[1].replace(/^0+/, '') + \"p\";\r\n }\r\n\r\n return \"£\" + amount.toFixed(2);\r\n}\r\n\r\nexport function hasPrefixSymbol(value: string) {\r\n if (value.length > 1) {\r\n return value[0] === '£';\r\n }\r\n\r\n return false;\r\n}\r\n","import { getConfig, baseUrl } from \"./configHelper\";\r\nimport { saveAs } from 'file-saver';\r\n\r\nexport function menuSingleItemSelected(items: IMopModifierGroup, isBasket: boolean) {\r\n console.log(items);\r\n var out = '';\r\n items.modifierGroupItems.map((item: any) => {\r\n if(isBasket){\r\n if (item.quantitySelected === 1){\r\n out = item.menuItemName;\r\n }\r\n } \r\n else{\r\n if (item.defaultQuantitySelected === 1) {\r\n out = item.menuItemName;\r\n }\r\n } \r\n })\r\n if(!getConfig().isMarket && out == '' && items.minDifferentItems == 1){\r\n out = items.modifierGroupItems[0].menuItemName;\r\n }\r\n return out;\r\n}\r\n\r\nexport function calculateMenuItemTotalPrice(item?: IMopMenuItemDetail, calcQuantity: boolean = false, isColleague: boolean = false) {\r\n if (!item) {\r\n return 0;\r\n }\r\n\r\n let _basePrice = item.menuItemBasePrice;\r\n let _price = _basePrice ?? 0;\r\n\r\n const selectedSkus = getSelectedSkus(item.modifierGroups);\r\n\r\n _price = item.modifierGroups.reduce((acc: number, group: IMopModifierGroup) => {\r\n if (!shouldShowModifierGroup(group, selectedSkus, item.sku)) {\r\n return acc;\r\n }\r\n\r\n if (!group.itemsAreChargeable) {\r\n return acc;\r\n }\r\n\r\n return group.modifierGroupItems.reduce((acc: number, item: IMopModifierGroupItem) => {\r\n if (!item.price) {\r\n return acc;\r\n }\r\n\r\n return acc + (item.quantitySelected * item.price);\r\n }, acc);\r\n }, _price)\r\n\r\n _price = calcQuantity ? _price * item.quantity : _price;\r\n\r\n return _price;\r\n}\r\n\r\nexport function inlineBrandImage(menuItemName: string, hasBrandImage: boolean, limitSize: boolean = true) {\r\n if (hasBrandImage) {\r\n return menuItemName.replace(/\\[\\[(.+?)\\]\\]/g, ``);\r\n }\r\n\r\n return `${menuItemName}`\r\n}\r\n\r\nexport function showDealHeader(menuItem: IMopMenuItemDetail, isColleague?: boolean): boolean {\r\n if (isColleague) {\r\n return false\r\n }\r\n\r\n if (menuItem.isDealItem) {\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n\r\nexport function showModifierGroupsOnPages(menuItem?: IMopMenuItemDetail): boolean {\r\n if (!menuItem) {\r\n return false;\r\n }\r\n\r\n if (menuItem.isDealItem) {\r\n return true;\r\n }\r\n\r\n const modifierGroup = menuItem.modifierGroups.find((group: IMopModifierGroup) => {\r\n if (group.isMandatory && group.canSelectMultiple && group.maxDifferentItems && group.maxDifferentItems > 1) {\r\n return group;\r\n }\r\n\r\n return null;\r\n })\r\n\r\n if (modifierGroup !== undefined) {\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n\r\nfunction isSafari(): boolean {\r\n const ua = navigator.userAgent.toLowerCase();\r\n return ua.indexOf('safari') !== -1 && ua.indexOf('chrome') === -1;\r\n};\r\n\r\nexport function downloadAllergenFile() {\r\n const url = `${baseUrl()}/menudata/allergen`;\r\n\r\n var iOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream;\r\n\r\n var isChrome =\r\n navigator.userAgent.toLowerCase().indexOf(\"CriOS\") > -1 ||\r\n navigator.vendor.toLowerCase().indexOf(\"google\") > -1;\r\n\r\n var iOSVersion: number[] = [];\r\n if (iOS) {\r\n const version = navigator.userAgent\r\n .match(/OS [\\d_]+/i)\r\n\r\n if (version) {\r\n iOSVersion = version[0].substr(3).split(\"_\").map((n) => parseInt(n));\r\n }\r\n }\r\n\r\n fetch(url)\r\n .then(response => response.arrayBuffer())\r\n .then(buffer => {\r\n let contentType = 'application/pdf';\r\n\r\n if (iOS && !isChrome) {\r\n contentType = 'application/octet-stream';\r\n }\r\n\r\n const blob = new Blob([buffer], { type: contentType });\r\n const blobUrl = URL.createObjectURL(blob);\r\n const link = document.createElement('a');\r\n link.href = blobUrl;\r\n link.target = '_blank';\r\n\r\n if ((iOS && (iOSVersion[0] > 12 || isChrome)) || !iOS) {\r\n link.download = 'Morrisons_cafe_allergens.pdf';\r\n }\r\n\r\n document.body.appendChild(link);\r\n link.click();\r\n document.body.removeChild(link);\r\n\r\n URL.revokeObjectURL(blobUrl);\r\n })\r\n .catch(console.error)\r\n}\r\n\r\nexport function getSelectedSkus(modifierGroups: IMopModifierGroup[]): SkuSelection[] {\r\n let selectedSkus: SkuSelection[] = [];\r\n\r\n modifierGroups.forEach((group: IMopModifierGroup) => {\r\n let all = group.modifierGroupItems.map((v) => v.sku);\r\n let selected = group.modifierGroupItems\r\n .filter((v) => v.quantitySelected > 0)\r\n .map((v) => v.sku);\r\n\r\n if (!selectedSkus[group.showOnPage]) {\r\n selectedSkus[group.showOnPage] = { all: all, selected: selected };\r\n } else {\r\n selectedSkus[group.showOnPage].all.push(...all);\r\n selectedSkus[group.showOnPage].selected.push(...selected);\r\n }\r\n })\r\n\r\n return selectedSkus;\r\n}\r\n\r\nfunction returnSKUsFromDataTag(dataTag: string) {\r\n if (!/\\[.*\\]/.test(dataTag)) {\r\n dataTag = `[${dataTag}]`\r\n }\r\n const regex = /\\d+/g;\r\n const SKUs = dataTag?.match(regex);\r\n return SKUs\r\n}\r\n\r\nfunction checkSIFIncludes(lhs: string[], rhs: string[]) {\r\n for (let i = 0; i < lhs.length; i++) {\r\n if (rhs.includes(lhs[i])) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nexport function shouldShowModifierGroup(modifierGroup: IMopModifierGroup, skus: SkuSelection[], mainItemSku?: string): boolean {\r\n if (!modifierGroup.dataTag) {\r\n return true;\r\n }\r\n\r\n let sifs = returnSKUsFromDataTag(modifierGroup.dataTag)\r\n\r\n if (!sifs || sifs.length === 0) {\r\n return true;\r\n }\r\n\r\n if (mainItemSku) {\r\n if (checkSIFIncludes(sifs, [mainItemSku])) {\r\n return true;\r\n }\r\n }\r\n\r\n for (let index = skus.length - 1; index >= 0; index--) {\r\n // Skip pages later than the current one.\r\n if (index >= modifierGroup.showOnPage) {\r\n continue;\r\n }\r\n\r\n if (!skus[index]) {\r\n continue;\r\n }\r\n\r\n // If SIF contains any of the selected ones, show.\r\n if (checkSIFIncludes(sifs, skus[index].selected)) {\r\n return true;\r\n }\r\n\r\n // If all contains any of the SIF, stop here.\r\n if (checkSIFIncludes(skus[index].all, sifs)) {\r\n return false;\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n","import React from 'react';\r\nimport { IonRow, IonCol, IonText, IonImg, IonGrid } from '@ionic/react';\r\nimport './MenuItemRow.scss';\r\nimport './MenuItemRowBirdsEye.scss'\r\nimport { formatCurrency, hasPrefixSymbol } from '../helpers/currencyHelpers';\r\nimport { baseUrl, cacheBust } from '../helpers/configHelper';\r\nimport { RolledUpItem } from '../store/MenuStoreTypes';\r\nimport { inlineBrandImage } from '../helpers/menuHelpers';\r\n\r\ninterface MenuItemDetailsProps {\r\n productFlags: string[];\r\n kcal?: number;\r\n rolledUpItems?: RolledUpItem[] | null;\r\n backgroundColour?: string;\r\n}\r\n\r\nfunction MenuItemDetails(props: MenuItemDetailsProps) {\r\n const {\r\n productFlags,\r\n kcal,\r\n rolledUpItems,\r\n backgroundColour,\r\n } = props;\r\n\r\n function getMenuItemName(item: RolledUpItem) {\r\n return inlineBrandImage(item.menuItemName, item.hasBrandImage);\r\n }\r\n\r\n return (\r\n
\r\n {rolledUpItems && rolledUpItems !== null\r\n ?\r\n
\r\n {rolledUpItems.map((v: RolledUpItem) => {\r\n return (\r\n
\r\n \r\n {typeof v.calories === 'number' &&\r\n \r\n {` (${v.calories ?? 0}kcal)`}\r\n \r\n }\r\n {v.productFlags.map((v: string) => {\r\n return \r\n })}\r\n
\r\n )\r\n })}\r\n
\r\n :\r\n
\r\n {productFlags.map((v) => {\r\n return \r\n })}\r\n {\r\n typeof kcal === 'number' &&\r\n \r\n {`${kcal ?? 0}kcal`}\r\n \r\n }\r\n
\r\n }\r\n
\r\n );\r\n}\r\n\r\ninterface MenuItemRowProps {\r\n menuItemId: number;\r\n menuItemImage: string;\r\n menuItemName: string;\r\n sku: string;\r\n menuItemBasePrice: number | null;\r\n menuItemFromPrice: number | null;\r\n productFlags: string[];\r\n kcal?: number;\r\n inStock: boolean;\r\n onClick?: (menuItemId: number) => void;\r\n separatorColour?: string;\r\n rolledUpItems?: RolledUpItem[] | null;\r\n hasBrandImage: boolean;\r\n graphicTreatment: string | null;\r\n backgroundStyle: string | null;\r\n description: string | null;\r\n}\r\n\r\nconst DefaultMenuItemRow: React.FC = ({productFlags, kcal, menuItemFromPrice, menuItemBasePrice, onClick, menuItemName, hasBrandImage, inStock, menuItemId, separatorColour, rolledUpItems, sku}) => {\r\n const price = menuItemFromPrice\r\n ? formatCurrency(menuItemFromPrice)\r\n : formatCurrency(menuItemBasePrice);\r\n\r\n function handleClick() {\r\n if (!inStock || typeof onClick === 'undefined') {\r\n return;\r\n }\r\n\r\n onClick(menuItemId);\r\n }\r\n\r\n function getMenuItemName() {\r\n return inlineBrandImage(menuItemName, hasBrandImage);\r\n }\r\n\r\n return
\r\n \r\n {\r\n rolledUpItems\r\n ?\r\n <> {/* Menu item image, title and price are kept on their own row, rolledUpItems are put on their own row below */}\r\n \r\n \r\n {\r\n console.log(e)\r\n }} className=\"\"\r\n src={`${baseUrl()}/images/ProductShots/${sku}_PLP.png?v=${cacheBust()}`}/>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n \r\n {hasPrefixSymbol(price)\r\n ?\r\n <>\r\n {menuItemFromPrice && From }\r\n {price[0]}\r\n {price.substring(1)}\r\n \r\n :\r\n price\r\n }\r\n \r\n

Out of stock

\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n :\r\n <>\r\n \r\n {\r\n console.log(e)\r\n }} className=\"\" src={`${baseUrl()}/images/ProductShots/${sku}_PLP.png?v=${cacheBust()}`}/>\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n {hasPrefixSymbol(price)\r\n ?\r\n <>\r\n {menuItemFromPrice && From }\r\n {price[0]}\r\n {price.substring(1)}\r\n \r\n :\r\n price\r\n }\r\n \r\n

Out of stock

\r\n
\r\n
\r\n
\r\n
\r\n \r\n }\r\n \r\n
\r\n}\r\n\r\nenum BirdsEyeStyles { Red = \"Red\", Orange = \"Orange\", Purple = \"Purple\" };\r\n\r\nconst BirdsEyeBackgroundStyles: { [Key: string]: string } = {\r\n [BirdsEyeStyles.Red]: \"images/assets/BE_kids_lproductBG_MOP.png\",\r\n [BirdsEyeStyles.Orange]: \"images/assets/BE_yellowOrange_productBG_MOP.png\",\r\n [BirdsEyeStyles.Purple]: \"images/assets/BE_redPurple_productBG_MOP.png\"\r\n};\r\n\r\nconst BirdsEyeBackgroundColours: { [Key: string]: string } = {\r\n [BirdsEyeStyles.Red]: \"#EF4743\",\r\n [BirdsEyeStyles.Orange]: \"#F68B1D\",\r\n [BirdsEyeStyles.Purple]: \"#C3342E\"\r\n};\r\n\r\nconst BirdsEyeMenuItemRow: React.FC = ({backgroundStyle, productFlags, kcal, menuItemFromPrice, menuItemBasePrice, onClick, menuItemName, hasBrandImage, inStock, menuItemId, separatorColour, rolledUpItems, sku, description}) => {\r\n const price = menuItemFromPrice\r\n ? formatCurrency(menuItemFromPrice)\r\n : formatCurrency(menuItemBasePrice);\r\n\r\n const handleClick = () => {\r\n if (!inStock || typeof onClick === 'undefined') {\r\n return;\r\n }\r\n onClick(menuItemId);\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n {\r\n console.log(e)\r\n }}\r\n className=\"menu-item-image\"\r\n src={`${baseUrl()}/images/ProductShots/${sku}_PLP.png?v=${cacheBust()}`}\r\n />\r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {/* Only show a description if there is an image */}\r\n {description && description.indexOf(\"[[\") >= 0 &&\r\n \r\n \r\n
\r\n }\r\n \r\n \r\n
\r\n \r\n {\r\n hasPrefixSymbol(price) ?\r\n <>\r\n {menuItemFromPrice && From }\r\n {price[0]}\r\n {price.substring(1)}\r\n \r\n :\r\n price\r\n }\r\n \r\n

Out of stock

\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n )\r\n}\r\n\r\nconst MenuItemRow: React.FC = (props) => {\r\n return props.graphicTreatment == \"BirdsEye\" ? : ;\r\n};\r\n\r\nexport default MenuItemRow;\r\n","import React from \"react\";\r\nimport { MopMenuItem } from '../store/MenuStoreTypes';\r\nimport './CategoryFilters.scss';\r\n\r\nconst CategoryFilters: React.FC<{ menuItems: MopMenuItem[], selectedFilter: string | undefined | null, onFilterSelected: (selectedFilter: string) => void }> = ({ menuItems, selectedFilter = \"\", onFilterSelected }) => {\r\n const matchingMenuItems = menuItems\r\n .filter((menuItem: MopMenuItem) => menuItem.categoryLevelFilter)\r\n .sort((a: MopMenuItem, b: MopMenuItem) => (\r\n (b.sortOrder ?? 0) - (a.sortOrder ?? 0)\r\n ));\r\n\r\n const uniqueFilters = matchingMenuItems\r\n .map(item => item.categoryLevelFilter)\r\n .filter((value, index, array) => array.indexOf(value) === index);\r\n\r\n return (\r\n
\r\n
\r\n {uniqueFilters.length > 1 && (\r\n selectedFilter !== \"\" && onFilterSelected(\"\")}\r\n className={\"filterButton\" + (\"\" === selectedFilter ? \" selectedFilter\" : \"\")}\r\n key={\"All_Selected\"}\r\n >\r\n All\r\n
\r\n )}\r\n {uniqueFilters.length > 1 && uniqueFilters.map((value: string, index: number) => (\r\n selectedFilter !== value && onFilterSelected(value)}\r\n className={\"filterButton\" + (value === selectedFilter ? \" selectedFilter\" : \"\")}\r\n key={\"JACK\" + index}\r\n >\r\n {value}\r\n
\r\n ))}\r\n \r\n \r\n );\r\n};\r\n\r\nexport default CategoryFilters;\r\n","import { Action } from \"redux\";\r\nimport { DealItem } from \"./MenuStoreTypes\";\r\n\r\nexport interface DealState {\r\n deals?: DealItem[];\r\n itemSkuToDealSku?: Map;\r\n currentDealSku?: string;\r\n upgradedFromSku?: string;\r\n currentPage?: number;\r\n}\r\n\r\nconst initialState: DealState = {\r\n deals: undefined,\r\n itemSkuToDealSku: undefined,\r\n currentDealSku: undefined,\r\n upgradedFromSku: undefined,\r\n currentPage: undefined,\r\n}\r\n\r\ninterface UpdateDeals {\r\n type: 'UPDATE_DEALS';\r\n deals: DealItem[];\r\n itemSkuToDealSku: Map;\r\n}\r\n\r\ninterface UpgradeToDeal {\r\n type: 'UPGRADE_TO_DEAL';\r\n upgradedFromSku: string;\r\n dealSku: string;\r\n}\r\n\r\ninterface StartDeal {\r\n type: 'START_DEAL';\r\n dealSku: string;\r\n}\r\n\r\ninterface CancelDeal {\r\n type: 'CANCEL_DEAL';\r\n}\r\n\r\ninterface SetCurrentPage {\r\n type: 'SET_CURRENT_PAGE';\r\n page: number;\r\n}\r\n\r\ntype KnownAction = UpdateDeals | UpgradeToDeal | StartDeal | CancelDeal | SetCurrentPage;\r\n\r\nexport const actionCreators = {\r\n updateDeals: (deals: DealItem[]): UpdateDeals => {\r\n const itemSkuToDealSku = new Map();\r\n\r\n deals.forEach((deal) => {\r\n deal.upgradeFrom.forEach((itemSku) => {\r\n itemSkuToDealSku.set(itemSku, deal.dealSku);\r\n });\r\n });\r\n\r\n return {\r\n type: 'UPDATE_DEALS',\r\n deals: deals,\r\n itemSkuToDealSku: itemSkuToDealSku,\r\n }\r\n },\r\n\r\n upgradeToDeal: (upgradedFromSku: string, dealSku: string): UpgradeToDeal => {\r\n console.log(`Deal: Upgrading from ${upgradedFromSku} to ${dealSku}.`);\r\n\r\n return {\r\n type: 'UPGRADE_TO_DEAL',\r\n upgradedFromSku: upgradedFromSku,\r\n dealSku: dealSku,\r\n }\r\n },\r\n\r\n startDeal: (dealSku: string): StartDeal => {\r\n console.log(`Deal: Starting ${dealSku}.`);\r\n\r\n return {\r\n type: 'START_DEAL',\r\n dealSku: dealSku,\r\n }\r\n },\r\n\r\n cancelDeal: (): CancelDeal => {\r\n console.log('Deal: Cancelling...');\r\n\r\n return {\r\n type: 'CANCEL_DEAL',\r\n }\r\n },\r\n\r\n setCurrentPage: (page: number): SetCurrentPage => {\r\n return {\r\n type: 'SET_CURRENT_PAGE',\r\n page,\r\n }\r\n }\r\n};\r\n\r\nexport function reducer(state: DealState = initialState, incomingAction: Action): DealState {\r\n const action = incomingAction as KnownAction;\r\n\r\n switch (action.type) {\r\n case 'UPDATE_DEALS': {\r\n console.log(`Deals: Added ${action.itemSkuToDealSku.size}`);\r\n\r\n return {\r\n ...state,\r\n deals: action.deals,\r\n itemSkuToDealSku: action.itemSkuToDealSku,\r\n };\r\n }\r\n\r\n case 'UPGRADE_TO_DEAL': {\r\n return {\r\n ...state,\r\n currentDealSku: action.dealSku,\r\n upgradedFromSku: action.upgradedFromSku,\r\n currentPage: 1,\r\n };\r\n }\r\n\r\n case 'START_DEAL': {\r\n return {\r\n ...state,\r\n currentDealSku: action.dealSku,\r\n currentPage: 1,\r\n };\r\n }\r\n\r\n case 'CANCEL_DEAL': {\r\n return {\r\n ...state,\r\n currentDealSku: undefined,\r\n upgradedFromSku: undefined,\r\n };\r\n }\r\n\r\n case 'SET_CURRENT_PAGE': {\r\n return {\r\n ...state,\r\n currentPage: action.page,\r\n }\r\n }\r\n\r\n default: {\r\n return {\r\n ...state,\r\n };\r\n }\r\n }\r\n}\r\n","import React, { useState, useEffect } from 'react';\r\nimport './CategoryMenuItemLister.scss';\r\nimport { IonGrid, IonContent, IonRow } from '@ionic/react';\r\nimport CategoryGrid from '../components/CategoryGrid';\r\nimport MenuItemRow from '../components/MenuItemRow';\r\nimport { baseUrl, cacheBust } from '../helpers/configHelper';\r\nimport CategoryFilters from './CategoryFilters';\r\nimport { useLocation, useHistory } from \"react-router-dom\";\r\n\r\nimport { CategoryList, MopCategory, MopMenuItem } from '../store/MenuStoreTypes';\r\nimport { useDispatch } from 'react-redux';\r\nimport * as DealStore from '../store/DealStore';\r\n\r\ninterface CategoryMenuItemListerProps {\r\n categoryList: CategoryList | null,\r\n onNavigateToCategory?: (categoryId: number) => void;\r\n onNavigateToMenuItem?: (menuItemId: number) => void;\r\n isColleague?: boolean;\r\n}\r\n\r\nconst CategoryMenuItemLister: React.FC = ({\r\n categoryList,\r\n onNavigateToCategory,\r\n onNavigateToMenuItem,\r\n isColleague,\r\n}) => {\r\n const [selectedFilter, setSelectedFilter] = useState();\r\n const location = useLocation()\r\n const history = useHistory();\r\n const dispatch = useDispatch();\r\n\r\n useEffect(() => {\r\n console.log(\"Category Info:\", categoryList);\r\n\r\n if (categoryList && categoryList.categories) {\r\n categoryList.categories.forEach((c: MopCategory) => {\r\n if (c.deals) {\r\n dispatch(DealStore.actionCreators.updateDeals(c.deals.items));\r\n }\r\n });\r\n }\r\n }, [categoryList]);\r\n\r\n function handleMenuItemClick(menuItemId: number) {\r\n if (onNavigateToMenuItem) {\r\n onNavigateToMenuItem(menuItemId);\r\n }\r\n }\r\n\r\n const onClickCategory = (category: MopCategory) => {\r\n if (location.pathname !== \"/categories\" && category.menuItemIds && category.menuItemIds.length === 1 && (!category.subCategoryIds || category.subCategoryIds.length === 0)) {\r\n if (onNavigateToMenuItem) {\r\n onNavigateToMenuItem(category.menuItemIds[0]);\r\n }\r\n else {\r\n console.log(\"ERROR: onNavigateToMenuItem undefined\");\r\n }\r\n }\r\n else {\r\n if (onNavigateToCategory) {\r\n onNavigateToCategory(category.categoryId);\r\n }\r\n else {\r\n console.log(\"ERROR: onNavigateToCategory undefined\");\r\n }\r\n }\r\n }\r\n\r\n const onFilterSelected = (newSelectedFilter: string) => {\r\n if (newSelectedFilter == selectedFilter) {\r\n setSelectedFilter(null);\r\n return;\r\n }\r\n\r\n setSelectedFilter(newSelectedFilter);\r\n return;\r\n }\r\n\r\n return (\r\n \r\n\r\n {\r\n categoryList?.isFavourites &&\r\n <>\r\n {!categoryList?.menuItems.length &&\r\n

\r\n Your favourites will appear here after you place an order\r\n

\r\n }\r\n \r\n }\r\n\r\n \r\n {\r\n categoryList && categoryList.categories && !categoryList.menuItems &&\r\n <>\r\n
\r\n {\r\n categoryList.categories\r\n .filter((a: MopCategory) => {\r\n return a.isFavourites;\r\n })\r\n .map((a: MopCategory) => {\r\n return onClickCategory(a)} sortOrder={a.sortOrder} />\r\n })\r\n }\r\n
\r\n
\r\n \r\n {\r\n categoryList.categories\r\n .filter((a: MopCategory) => {\r\n if (isColleague && a.deals) {\r\n return false;\r\n }\r\n\r\n return !a.isFavourites;\r\n })\r\n .sort((a: MopCategory, b: MopCategory) => {\r\n // NOTE: The deals category has no sortOrder, but\r\n // should be displayed at the end of the list.\r\n if (a.deals) {\r\n return 1;\r\n }\r\n\r\n if (b.deals) {\r\n return -1;\r\n }\r\n\r\n return (a.sortOrder ?? 0) - (b.sortOrder ?? 0);\r\n })\r\n .map((a: MopCategory) => {\r\n if (a.deals) {\r\n return (\r\n history.push(`/deals`)}\r\n />\r\n )\r\n } else {\r\n return onClickCategory(a)} sortOrder={a.sortOrder} />\r\n }\r\n })\r\n }\r\n \r\n
\r\n \r\n }\r\n\r\n {\r\n categoryList && categoryList.menuItems &&\r\n <>\r\n {\r\n <>\r\n {categoryList.tagImageUrl &&\r\n \r\n \r\n \r\n }\r\n {categoryList.showFilters !== false &&\r\n \r\n }\r\n {\r\n categoryList.menuItems\r\n .filter((v: MopMenuItem) => {\r\n if (selectedFilter && selectedFilter !== '') {\r\n return v.categoryLevelFilter === selectedFilter;\r\n }\r\n\r\n return v.itemTags.indexOf('[DEAL]') === -1;\r\n })\r\n .sort((a: MopMenuItem, b: MopMenuItem) => {\r\n // Move items with graphicTreatment to top.\r\n const aHasFlag = a.auxData ? a.auxData.graphicTreatment !== null : false;\r\n const bHasFlag = b.auxData ? b.auxData.graphicTreatment !== null : false;\r\n\r\n if (aHasFlag && !bHasFlag) return -1;\r\n if (!aHasFlag && bHasFlag) return 1;\r\n\r\n return (b.sortOrder ?? 0) - (a.sortOrder ?? 0);\r\n })\r\n .map((a: MopMenuItem) => (\r\n \r\n ))\r\n }\r\n \r\n }\r\n \r\n }\r\n \r\n
\r\n );\r\n};\r\n\r\nexport default CategoryMenuItemLister;\r\n","import { apps, call, menu } from 'ionicons/icons';\r\nimport { Action, Reducer } from 'redux';\r\nimport { ApplicationState, AppThunkAction } from './';\r\nimport { baseUrl } from '../helpers/configHelper';\r\nimport update from 'immutability-helper';\r\nimport { Dispatch } from 'react';\r\n\r\nexport const VALIDATE_PIN_REQUEST = 'VALIDATE_PIN_REQUEST';\r\nexport const VALIDATE_PIN_SUCCESS = 'VALIDATE_PIN_SUCCESS';\r\nexport const VALIDATE_PIN_FAILURE = 'VALIDATE_PIN_FAILURE';\r\nexport const LOGGED_IN = 'LOGGED_IN';\r\nexport const RESET_MESSAGE = 'RESET_MESSAGE';\r\nexport interface LoggedInAction {\r\n type: typeof LOGGED_IN;\r\n isLoggedIn: boolean;\r\n}\r\n\r\nexport interface ValidatePinRequestAction {\r\n type: typeof VALIDATE_PIN_REQUEST;\r\n payload: string;\r\n}\r\n\r\nexport interface ValidatePinSuccessAction {\r\n type: typeof VALIDATE_PIN_SUCCESS;\r\n payload: { pfIdentifier: string; validatedOk: boolean };\r\n}\r\n\r\nexport interface ValidatePinFailureAction {\r\n type: typeof VALIDATE_PIN_FAILURE;\r\n payload: string;\r\n}\r\nexport interface ResetMessageAction {\r\n type: typeof RESET_MESSAGE;\r\n payload: string | null\r\n}\r\n\r\nexport const validatePinRequest = (\r\n pin: string\r\n): ValidatePinRequestAction => ({\r\n type: VALIDATE_PIN_REQUEST,\r\n payload: pin,\r\n});\r\n\r\nexport const validatePinSuccess = (\r\n data: { pfIdentifier: string; validatedOk: boolean }\r\n): ValidatePinSuccessAction => ({\r\n type: VALIDATE_PIN_SUCCESS,\r\n payload: data,\r\n});\r\n\r\nexport const validatePinFailure = (\r\n error: string\r\n): ValidatePinFailureAction => ({\r\n type: VALIDATE_PIN_FAILURE,\r\n payload: error,\r\n});\r\n\r\nexport const loggedIn = (isLoggedIn: boolean): LoggedInAction => {\r\n localStorage.setItem('isLoggedIn', String(isLoggedIn));\r\n\r\n return {\r\n type: LOGGED_IN,\r\n isLoggedIn,\r\n };\r\n};\r\n\r\nexport const resetMessage = (message: string): ResetMessageAction => ({\r\n type: RESET_MESSAGE,\r\n payload: message\r\n});\r\n\r\nexport interface PinState {\r\n loading: boolean;\r\n error: string | null;\r\n message: string | null;\r\n expired: string | null;\r\n isLoggedIn: boolean;\r\n}\r\n\r\ntype KnownAction =\r\n | ValidatePinRequestAction\r\n | ValidatePinSuccessAction\r\n | ValidatePinFailureAction\r\n | LoggedInAction\r\n | ResetMessageAction;\r\n\r\nexport const actionCreators = {\r\n validatePin: (pin: string): AppThunkAction => (\r\n dispatch: Dispatch,\r\n getState\r\n ) => {\r\n const currentPin = pin;\r\n dispatch(validatePinRequest(currentPin));\r\n\r\n fetch(`${baseUrl()}/colleague/validatecolleaguecode?code=${currentPin}`)\r\n .then((response) => response.json())\r\n .then((data) => {\r\n if (data.validatedOk) {\r\n dispatch(validatePinSuccess(data));\r\n localStorage.setItem(\"pfidentifier\", data?.pfIdentifier)\r\n dispatch(loggedIn(true));\r\n } else {\r\n dispatch(validatePinFailure('Invalid code. Try again'));\r\n }\r\n })\r\n .catch((error) => {\r\n dispatch(validatePinFailure(error.message));\r\n });\r\n },\r\n logout: (isLoggedIn: boolean): AppThunkAction => (\r\n dispatch: Dispatch,\r\n getState\r\n ) => {\r\n const appState = getState();\r\n\r\n fetch(`${baseUrl()}/colleague/logout`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n },\r\n body: JSON.stringify(appState.colleague?.message)\r\n })\r\n .then((response) => response.json())\r\n .then((data) => {\r\n localStorage.removeItem('isLoggedIn');\r\n localStorage.removeItem('pfidentifier');\r\n dispatch(loggedIn(false));\r\n })\r\n },\r\n};\r\n\r\nconst isLoggedIn = localStorage.getItem('isLoggedIn') === 'true';\r\n\r\nconst unloadedState: PinState = {\r\n loading: false,\r\n error: null,\r\n message: null,\r\n expired: null,\r\n isLoggedIn: isLoggedIn,\r\n};\r\n\r\nexport const reducer: Reducer = (\r\n state: PinState = JSON.parse(JSON.stringify(unloadedState)),\r\n incomingAction: Action\r\n): PinState => {\r\n const action = incomingAction as KnownAction;\r\n\r\n const _unloadedState = JSON.parse(JSON.stringify(unloadedState));\r\n switch (action.type) {\r\n case VALIDATE_PIN_REQUEST:\r\n return {\r\n ...state,\r\n loading: true,\r\n error: null,\r\n };\r\n case VALIDATE_PIN_SUCCESS:\r\n return {\r\n ...state,\r\n loading: false,\r\n error: null,\r\n message: action.payload.pfIdentifier,\r\n };\r\n case VALIDATE_PIN_FAILURE:\r\n return {\r\n ...state,\r\n loading: false,\r\n error: action.payload,\r\n };\r\n case LOGGED_IN:\r\n return {\r\n ...state,\r\n isLoggedIn: action.isLoggedIn,\r\n };\r\n case RESET_MESSAGE:\r\n localStorage.removeItem(\"pfidentifier\");\r\n return {\r\n ...state,\r\n expired: action.payload,\r\n };\r\n default:\r\n return state;\r\n }\r\n};","import { Action, Reducer } from 'redux';\r\nimport { AppThunkAction } from './';\r\nimport { baseUrl } from '../helpers/configHelper';\r\nimport { CategoryList, MenuDataState } from './MenuStoreTypes';\r\nimport { batch, useDispatch, useSelector } from 'react-redux';\r\nimport { ApplicationState } from '../store';\r\nimport { resetMessage, ResetMessageAction } from '../store/ColleagueStore';\r\n\r\n// -----------------\r\n// STATE - This defines the type of data maintained in the Redux store.\r\n\r\n\r\n// -----------------\r\n// ACTIONS - These are serializable (hence replayable) descriptions of state transitions.\r\n// They do not themselves have any side-effects; they just describe something that is going to happen.\r\n\r\ninterface RequestCategoryListAction {\r\n type: 'REQUEST_CATEGORYLIST';\r\n categoryId: number;\r\n container: string;\r\n pfIdentifier: string | undefined\r\n}\r\n\r\ninterface ReceiveCategoryListAction {\r\n type: 'RECEIVE_CATEGORYLIST';\r\n categoryId: number;\r\n categoryList: CategoryList;\r\n container: string;\r\n}\r\n\r\ninterface SetCategoryIdAction {\r\n type: 'SET_CATEGORYID';\r\n categoryId: number;\r\n}\r\n\r\ninterface ClearMenuStore {\r\n type: \"CLEAR_MENU_STORE\"\r\n}\r\n\r\nexport interface ResetFirstCallAction {\r\n type: 'RESET_FIRST_CALL';\r\n}\r\n\r\n// Declare a 'discriminated union' type. This guarantees that all references to 'type' properties contain one of the\r\n// declared type strings (and not any other arbitrary string).\r\ntype KnownAction = RequestCategoryListAction | ReceiveCategoryListAction | SetCategoryIdAction | ResetFirstCallAction | ClearMenuStore | ResetMessageAction;\r\n\r\n// ----------------\r\n// ACTION CREATORS - These are functions exposed to UI components that will trigger a state transition.\r\n// They don't directly mutate state, but they can have external side-effects (such as loading data).\r\n\r\nexport const actionCreators = {\r\n\r\n resetFirstCall: (): AppThunkAction => (dispatch, getState) => {\r\n dispatch({ type: 'RESET_FIRST_CALL' });\r\n },\r\n requestCategoryList: (categoryId: number, container: string, pfIdentifier: string, callback: any): AppThunkAction => (dispatch, getState) => {\r\n // Only load data if it's something we don't already have (and are not already loading)\r\n if (!categoryId) categoryId = 0;\r\n const appState = getState();\r\n\r\n let channelIdentifier = appState.location?.channelIdentifier\r\n let timeSlotStart = appState.location?.selectedTimeSlot.startTime;\r\n\r\n console.log(\"Requesting category listing \", categoryId, timeSlotStart); \r\n // if (appState && appState.weatherForecasts && startDateIndex !== appState.weatherForecasts.startDateIndex) {\r\n fetch(`${baseUrl()}/menudata/${channelIdentifier}/Category/${categoryId}?${localStorage.getItem(\"staffCardNumber\") ? \"cardNumber=\" + localStorage.getItem(\"staffCardNumber\") : \"\"}${pfIdentifier ? \"&pfIdentifier=\" + pfIdentifier + \"&\" : \"&\"}timeSlot=` + timeSlotStart + (appState.menuData?.isFirstAccess == true ? \"&firstCall=true\":\"\"))\r\n .then(response => response.json() as Promise)\r\n .then((data: any) => {\r\n if (data.status === 401) { \r\n dispatch(resetMessage(\"showExpireModal\"))\r\n }\r\n else {\r\n dispatch({ type: 'RECEIVE_CATEGORYLIST', categoryId: categoryId, categoryList: data, container: container });\r\n callback && callback();\r\n }\r\n });\r\n dispatch({ type: 'REQUEST_CATEGORYLIST', categoryId: categoryId, container: container, pfIdentifier: pfIdentifier });\r\n // }\r\n },\r\n setCurrentCategory: (categoryId: number): AppThunkAction => (dispatch, getState) => {\r\n dispatch({ type: 'SET_CATEGORYID', categoryId: categoryId });\r\n // }\r\n },\r\n clearMenuStore: () : AppThunkAction => (dispatch) => {\r\n dispatch({ type: 'CLEAR_MENU_STORE' });\r\n }\r\n};\r\n\r\n// ----------------\r\n// REDUCER - For a given state and action, returns the new state. To support time travel, this must not mutate the old state.\r\n\r\nconst unloadedState: MenuDataState = { categoryCurrent: null, categoryListA: null, categoryListB: null, categoryId: null, isLoading: false, title: \"Menu\", isFirstAccess:true };\r\n\r\nexport const reducer: Reducer = (state: MenuDataState | undefined, incomingAction: Action): MenuDataState => {\r\n if (state === undefined) {\r\n return { ...unloadedState };\r\n }\r\n const action = incomingAction as KnownAction;\r\n switch (action.type) {\r\n case 'CLEAR_MENU_STORE':\r\n return { ...unloadedState }\r\n case 'SET_CATEGORYID':\r\n let title = \"Menu\";\r\n if (action.categoryId == state.categoryListA?.categoryId) {\r\n title = state.categoryListA.categoryTitle;\r\n }\r\n if (action.categoryId == state.categoryListB?.categoryId) {\r\n title = state.categoryListB.categoryTitle;\r\n }\r\n return {\r\n ...state,\r\n categoryId: action.categoryId,\r\n title :title\r\n };\r\n case 'REQUEST_CATEGORYLIST':\r\n return {\r\n ...state,\r\n categoryId: action.categoryId,\r\n isLoading: true\r\n };\r\n case 'RESET_FIRST_CALL':\r\n //console.log(\"Reset first call\");\r\n return {\r\n ...state,\r\n isFirstAccess:true\r\n };\r\n case 'RECEIVE_CATEGORYLIST':\r\n // Only accept the incoming data if it matches the most recent request. This ensures we correctly\r\n // handle out-of-order responses.\r\n if (action.categoryId === state.categoryId) {\r\n if (action.container == \"a\") {\r\n //console.log(\"Loading A with \" + action.categoryId);\r\n return {\r\n ...state,\r\n isFirstAccess:false,\r\n categoryId: action.categoryId,\r\n categoryListA: action.categoryList,\r\n categoryCurrent: action.categoryList,\r\n title: action.categoryList.categoryTitle,\r\n isLoading: false\r\n };\r\n } else if (action.container == \"b\") {\r\n //console.log(\"Loading B with \" + action.categoryId);\r\n return {\r\n ...state,\r\n isFirstAccess: false,\r\n categoryId: action.categoryId,\r\n categoryListB: action.categoryList,\r\n categoryCurrent: action.categoryList,\r\n title: action.categoryList.categoryTitle,\r\n isLoading: false\r\n };\r\n }\r\n \r\n\r\n\r\n }\r\n break;\r\n }\r\n\r\n return state;\r\n};\r\n","import { GeolocationPosition } from '@capacitor/core/dist/esm/core-plugin-definitions';\r\nimport { Action, Reducer } from 'redux';\r\nimport { AppThunkAction } from './';\r\nimport { baseUrl } from '../helpers/configHelper';\r\nimport { ResetFirstCallAction } from './MenuStore'\r\nimport { Dispatch } from 'react';\r\n\r\n// ----------------------------------------------------------------------------\r\n\r\nconst componentRestrictionsCountry = \"uk\";\r\n\r\nconst maxRequestStoresLimit = 15;\r\n\r\nlet autocompleteService:google.maps.places.AutocompleteService;\r\nlet placesService:google.maps.places.PlacesService;\r\n\r\ntype AutocompletePrediction = google.maps.places.AutocompletePrediction;\r\n\r\n// ----------------------------------------------------------------------------\r\n\r\n// Peterborough\r\nconst testLatitude = 52.56909370755608;\r\nconst testLongitude = -0.24083238030238144;\r\n\r\n// ----------------------------------------------------------------------------\r\n\r\nexport enum simpleChannelType {\r\n ClickAndCollect = \"ClickAndCollect\",\r\n KerbsideOrder = \"KerbsideOrder\",\r\n TableOrder = \"TableOrder\"\r\n}\r\n\r\nexport interface SimpleChannel {\r\n enabled: boolean,\r\n channelIdentifier:string,\r\n channelType: simpleChannelType;\r\n}\r\n\r\nexport interface SimpleStore {\r\n auxStoreData?: AuxStoreData,\r\n city: string,\r\n firstLineAddress: string,\r\n enableTimeSlots: boolean;\r\n serverTime: Date;\r\n storeNumber: string,\r\n storeName: string,\r\n openingTimes: string,\r\n takingMopOrders: boolean,\r\n storeOpen: boolean,\r\n postcode: string,\r\n distance: number,\r\n latitude: number,\r\n longitude: number,\r\n supportedChannels: SimpleChannel[]\r\n waitTimeModel: {\r\n anticipatedWaitTimeSeconds: number | null,\r\n waitTimeChecked: Date\r\n }\r\n}\r\n\r\nexport interface AuxStoreData {\r\n tableNumbers?: string[]\r\n}\r\n\r\n// ----------------------------------------------------------------------------\r\n\r\nexport interface LocationState {\r\n isBusy: boolean;\r\n clientLatitude: number;\r\n clientLongitude: number;\r\n clientAccuracy: number;\r\n clientTimeStamp: number;\r\n isGeoLocationSupported: boolean;\r\n predictions: AutocompletePrediction[];\r\n place: google.maps.places.PlaceResult | undefined;\r\n placeLatitude: number;\r\n placeLongitude: number;\r\n stores: SimpleStore[];\r\n channelIdentifier: string | undefined;\r\n selectedStore: SimpleStore | undefined;\r\n selectedChannel: SimpleChannel | undefined;\r\n selectedTimeSlot: TimeSlot;\r\n}\r\n\r\n// ----------------------------------------------------------------------------\r\n\r\ninterface InitialiseGeoLocationAction {\r\n type: 'INITIALISE_GEO_LOCATION';\r\n}\r\n\r\n// ----------------------------------------------------------------------------\r\n\r\ninterface RequestClientGeoLocationAction {\r\n type: 'REQUEST_CLIENT_GEO_LOCATION';\r\n}\r\n\r\ninterface ReceiveClientGeoLocationAction {\r\n type: 'RECEIVE_CLIENT_GEO_LOCATION';\r\n latitude: number;\r\n longitude: number;\r\n accuracy: number;\r\n timeStamp: number;\r\n}\r\n\r\n// ----------------------------------------------------------------------------\r\n\r\ninterface SelectTimeSlot {\r\n type: 'SELECT_TIMESLOT';\r\n timeSlot: TimeSlot;\r\n}\r\n\r\n// ----------------------------------------------------------------------------\r\n\r\ninterface SelectStoreAction {\r\n type: 'SELECT_STORE';\r\n store: SimpleStore;\r\n channelIdentifier: string;\r\n}\r\n\r\ninterface ClearStoresAction {\r\n type: 'CLEAR_STORES';\r\n}\r\n\r\ninterface ClearSelectedStoreAction {\r\n type: 'CLEAR_SELECTED_STORE';\r\n}\r\n\r\n// ----------------------------------------------------------------------------\r\n\r\ninterface RequestServerGeoAutoCompleteAction {\r\n type: 'REQUEST_SERVER_GEO_AUTOCOMPLETE';\r\n}\r\n\r\ninterface ReceiveServerGeoAutoCompleteAction {\r\n type: 'RECEIVE_SERVER_GEO_AUTOCOMPLETE';\r\n predictions: AutocompletePrediction[];\r\n}\r\n\r\n// ----------------------------------------------------------------------------\r\n\r\ninterface RequestServerGeoPlaceAction {\r\n type: 'REQUEST_SERVER_GEO_PLACE';\r\n}\r\n\r\ninterface ReceiveServerGeoPlaceAction {\r\n type: 'RECEIVE_SERVER_GEO_PLACE';\r\n place?: google.maps.places.PlaceResult;\r\n latitude: number;\r\n longitude: number;\r\n}\r\n\r\n// ----------------------------------------------------------------------------\r\n\r\ninterface RequestStoresAction {\r\n type: 'REQUEST_STORES';\r\n}\r\n\r\ninterface ReceiveStoresAction {\r\n type: 'RECEIVE_STORES';\r\n stores: SimpleStore[];\r\n}\r\n\r\n// ----------------------------------------------------------------------------\r\n\r\ninterface RequestStoreAction {\r\n type: 'REQUEST_STORE';\r\n}\r\n\r\ninterface ReceiveStoreAction {\r\n type: 'RECEIVE_STORE';\r\n store: SimpleStore | undefined;\r\n}\r\n\r\n// ----------------------------------------------------------------------------\r\n\r\ninterface SetChannel {\r\n type: \"SET_CHANNEL\",\r\n value: SimpleChannel\r\n}\r\n\r\ntype KnownAction =\r\n RequestClientGeoLocationAction |\r\n ReceiveClientGeoLocationAction |\r\n InitialiseGeoLocationAction |\r\n RequestServerGeoAutoCompleteAction |\r\n ReceiveServerGeoAutoCompleteAction |\r\n RequestServerGeoPlaceAction |\r\n ReceiveServerGeoPlaceAction |\r\n RequestStoresAction |\r\n ReceiveStoresAction |\r\n SelectStoreAction |\r\n RequestStoreAction |\r\n ReceiveStoreAction |\r\n ClearStoresAction |\r\n ClearSelectedStoreAction | ResetFirstCallAction |\r\n SelectTimeSlot |\r\n SetChannel;\r\n\r\nconst unloadedState: LocationState = {\r\n isBusy: false,\r\n isGeoLocationSupported: false,\r\n clientLatitude: Number.NaN,\r\n clientLongitude: Number.NaN,\r\n clientAccuracy: Number.NaN,\r\n clientTimeStamp: -1,\r\n predictions: [],\r\n place: undefined,\r\n placeLatitude: Number.NaN,\r\n placeLongitude: Number.NaN,\r\n stores: [],\r\n channelIdentifier: undefined,\r\n selectedStore: undefined,\r\n selectedChannel: undefined,\r\n selectedTimeSlot: {label: \"ASAP\", startTime: \"ASAP\", endTime: \"ASAP\", startDateTime: \"ASAP\", endDateTime: \"ASAP\", takingOrders: false}\r\n};\r\n\r\nfunction ensurePlaceService() {\r\n if (placesService == null)\r\n placesService = new google.maps.places.PlacesService(document.createElement('div')); // div for whatever here...\r\n}\r\n\r\nfunction ensureAutocompleteService() {\r\n if (autocompleteService == null)\r\n autocompleteService = new google.maps.places.AutocompleteService();\r\n}\r\n\r\ntype geoLocationCallback = (latitude: number, longitude: number, accuracy: number, isOk: boolean) => any;\r\n\r\nexport type requestServerGeoAutoCompleteCallback = () => any;\r\nexport type requestServerGeoPlaceCallback = () => any;\r\nexport type requestStoresCallback = () => any;\r\nexport type requestStoreCallback = () => any;\r\nexport type requestStoreErrorCallback = () => any;\r\n\r\nexport const actionCreators = {\r\n requestClientGeoLocation: (callback:geoLocationCallback): AppThunkAction => (dispatch, getState) => {\r\n const appState = getState();\r\n navigator.geolocation.getCurrentPosition((p:any) => {\r\n const geolocationPosition = p as GeolocationPosition;\r\n dispatch({\r\n type: 'RECEIVE_CLIENT_GEO_LOCATION',\r\n latitude: geolocationPosition.coords.latitude,\r\n longitude: geolocationPosition.coords.longitude,\r\n accuracy: geolocationPosition.coords.accuracy,\r\n timeStamp: geolocationPosition.timestamp\r\n });\r\n if(callback)\r\n callback(geolocationPosition.coords.latitude, geolocationPosition.coords.longitude, geolocationPosition.coords.accuracy,true);\r\n }, (e: any) => {\r\n dispatch({\r\n type: 'RECEIVE_CLIENT_GEO_LOCATION',\r\n latitude: Number.NaN,\r\n longitude: Number.NaN,\r\n accuracy: Number.NaN,\r\n timeStamp: -1\r\n });\r\n if (callback)\r\n callback(Number.NaN, Number.NaN, Number.NaN, false);\r\n });\r\n dispatch({ type: 'REQUEST_CLIENT_GEO_LOCATION' });\r\n },\r\n requestServerGeoAutoComplete: (input: string, callback:requestServerGeoAutoCompleteCallback): AppThunkAction => (dispatch, getState) => {\r\n ensureAutocompleteService();\r\n autocompleteService.getPlacePredictions({ input: input, componentRestrictions: { country: componentRestrictionsCountry } }, (predictions: AutocompletePrediction[]) => {\r\n dispatch({ type: 'RECEIVE_SERVER_GEO_AUTOCOMPLETE', predictions: predictions });\r\n if (callback)\r\n callback();\r\n });\r\n dispatch({ type: 'REQUEST_SERVER_GEO_AUTOCOMPLETE' });\r\n },\r\n requestServerGeoPlace: (place_id: string, callback: requestServerGeoPlaceCallback): AppThunkAction => (dispatch: Dispatch, getState) => {\r\n ensurePlaceService();\r\n placesService.getDetails({ placeId: place_id }, (place: google.maps.places.PlaceResult, status) => {\r\n console.log(\"---Places Status---:\", status);\r\n if(status == google.maps.places.PlacesServiceStatus.OVER_QUERY_LIMIT){\r\n //Query limit reached, wait a second to try again.\r\n setTimeout(() => {\r\n dispatch(actionCreators.requestServerGeoPlace(place_id, callback));\r\n }, 1000); \r\n } \r\n else{\r\n if (place?.geometry?.location) {\r\n const noidea: any = JSON.parse(JSON.stringify(place.geometry?.location)); // bad typing from the package?\r\n dispatch({ type: 'RECEIVE_SERVER_GEO_PLACE', place: place, latitude: Number(noidea.lat), longitude: Number(noidea.lng) });\r\n }\r\n else {\r\n dispatch({ type: 'RECEIVE_SERVER_GEO_PLACE', place: undefined, latitude: Number.NaN, longitude: Number.NaN });\r\n }\r\n if (callback)\r\n callback();\r\n }\r\n });\r\n dispatch({ type: 'REQUEST_SERVER_GEO_PLACE' });\r\n },\r\n requestStores: (latitude: number, longitude: number, radius: number, callback: requestStoresCallback): AppThunkAction => (dispatch, getState) => {\r\n let url = `${baseUrl()}/stores/getstoresatlocation?latitude=${latitude}&longitude=${longitude}&limit=${maxRequestStoresLimit}`;\r\n if (Number.isNaN(radius) == false)\r\n url += `&radius=${radius}`;\r\n fetch(url)\r\n .then(response => response.json() as Promise)\r\n .then(data => {\r\n \r\n //let itabIndex = data.findIndex(loc => loc.storeNumber == \"9994\"); // Test unavailable time slots\r\n //data[itabIndex].enableTimeSlots = false;\r\n console.log(data);\r\n dispatch({ type: 'RECEIVE_STORES', stores: data });\r\n if (callback)\r\n callback();\r\n }).catch(error => { console.error(error); })\r\n dispatch({ type: 'REQUEST_STORES' });\r\n }, \r\n selectStore: (selectedStore: SimpleStore, selectedChannelIdentifier: string): AppThunkAction => (dispatch, getState) => {\r\n dispatch({ type: 'SELECT_STORE', store: selectedStore, channelIdentifier: selectedChannelIdentifier });\r\n dispatch({ type: 'RESET_FIRST_CALL' });\r\n },\r\n clearStores: (): AppThunkAction => (dispatch, getState) => {\r\n dispatch({ type: 'CLEAR_STORES'});\r\n },\r\n clearSelectedStore: (): AppThunkAction => (dispatch, getState) => {\r\n dispatch({ type: 'CLEAR_SELECTED_STORE' });\r\n },\r\n requestStore: (storeReference: string, callback: requestStoreCallback, errorCallback:requestStoreErrorCallback):AppThunkAction => (dispatch, getState) => {\r\n fetch(`${baseUrl()}/stores/getstore?storeNumber=${storeReference}`)\r\n .then(response => response.json() as Promise)\r\n .then(data => {\r\n dispatch({ type: 'RECEIVE_STORE', store:data});\r\n if (callback)\r\n callback();\r\n }).catch(error => {\r\n console.error(\"requestStore.error: \" + error);\r\n dispatch({ type: 'RECEIVE_STORE', store: undefined });\r\n if (errorCallback)\r\n errorCallback();\r\n })\r\n dispatch({ type: 'REQUEST_STORE'});\r\n },\r\n selectTimeslot: (timeslot: TimeSlot, callback?: any) : AppThunkAction => (dispatch) => {\r\n //console.debug(\"selectTimeslot: \" + JSON.stringify(timeslot));\r\n dispatch({ type: 'SELECT_TIMESLOT', timeSlot: timeslot});\r\n callback && callback();\r\n },\r\n setChannel: (value: SimpleChannel): AppThunkAction => (dispatch) => {\r\n dispatch({ type: \"SET_CHANNEL\", value: value})\r\n }\r\n};\r\n\r\nexport const reducer: Reducer = (state: LocationState | undefined, incomingAction: Action): LocationState => {\r\n if (state === undefined) \r\n return unloadedState;\r\n const action = incomingAction as KnownAction;\r\n switch (action.type) {\r\n case 'INITIALISE_GEO_LOCATION':\r\n return {\r\n ...state,\r\n isGeoLocationSupported: navigator.geolocation != null\r\n };\r\n case 'REQUEST_SERVER_GEO_PLACE':\r\n return {\r\n ...state,\r\n isBusy:true\r\n };\r\n case 'RECEIVE_SERVER_GEO_PLACE':\r\n return {\r\n ...state,\r\n isBusy: false,\r\n place: action.place,\r\n placeLatitude: action.latitude,\r\n placeLongitude: action.longitude\r\n };\r\n case 'REQUEST_SERVER_GEO_AUTOCOMPLETE':\r\n return {\r\n ...state,\r\n isBusy: true\r\n };\r\n case 'RECEIVE_SERVER_GEO_AUTOCOMPLETE':\r\n return {\r\n ...state,\r\n isBusy: false,\r\n predictions: action.predictions\r\n };\r\n case 'REQUEST_STORES':\r\n return {\r\n ...state,\r\n isBusy: true\r\n };\r\n case 'RECEIVE_STORES':\r\n return {\r\n ...state,\r\n isBusy: false,\r\n stores: action.stores\r\n };\r\n case 'REQUEST_CLIENT_GEO_LOCATION': {\r\n return {\r\n ...state,\r\n isBusy: true,\r\n };\r\n };\r\n case 'RECEIVE_CLIENT_GEO_LOCATION': {\r\n return {\r\n ...state,\r\n isBusy: false,\r\n clientLatitude: action.latitude,\r\n clientLongitude: action.longitude,\r\n clientAccuracy: action.accuracy,\r\n clientTimeStamp: action.timeStamp\r\n };\r\n }\r\n case 'SELECT_STORE': {\r\n return {\r\n ...state,\r\n selectedStore: action.store,\r\n channelIdentifier:action.channelIdentifier\r\n };\r\n };\r\n case 'REQUEST_STORE': {\r\n return {\r\n ...state,\r\n isBusy: true,\r\n stores:[]\r\n };\r\n };\r\n case 'RECEIVE_STORE': {\r\n return {\r\n ...state,\r\n isBusy: false,\r\n stores: action.store == undefined ? [] : [action.store]\r\n };\r\n };\r\n case 'CLEAR_STORES': {\r\n return {\r\n ...state,\r\n stores: [],\r\n };\r\n }; case 'CLEAR_SELECTED_STORE': {\r\n return {\r\n ...state,\r\n selectedStore: undefined\r\n };\r\n }; case 'SELECT_TIMESLOT': {\r\n return {\r\n ...state,\r\n selectedTimeSlot: action.timeSlot\r\n };\r\n }; case 'SET_CHANNEL':\r\n return {\r\n ...state,\r\n selectedChannel: action.value,\r\n channelIdentifier: action.value.channelIdentifier\r\n }\r\n default:\r\n return state;\r\n }\r\n};\r\n","import { Action, Reducer } from 'redux';\r\nimport { AppThunkAction } from './';\r\nimport { simpleChannelType } from './LocationStore';\r\nimport { showModifierGroupsOnPages } from '../helpers/menuHelpers';\r\n\r\n// -----------------\r\n// STATE - This defines the type of data maintained in the Redux store.\r\n\r\nexport interface HeaderFooterState {\r\n title: string;\r\n showBack: boolean;\r\n headerMode: HeaderMode;\r\n footerMode: FooterMode;\r\n showBasketModal: boolean;\r\n modals: {\r\n selectedModal: string;\r\n singleInstance: boolean;\r\n }\r\n hasStartedApp: boolean;\r\n showDebugLabel: boolean;\r\n}\r\n\r\nexport enum HeaderMode {\r\n Hidden = 1,\r\n Normal,\r\n PDP,\r\n DealPage,\r\n}\r\n\r\nexport enum FooterMode {\r\n Hidden = 1,\r\n Basket,\r\n PDP,\r\n ConfirmStore,\r\n BasketPage,\r\n UpsellPage,\r\n TablePage,\r\n PaymentSuccessPage,\r\n DealUpgradePage,\r\n DealPage,\r\n}\r\n\r\n// -----------------\r\n// ACTIONS - These are serializable (hence replayable) descriptions of state transitions.\r\n// They do not themselves have any side-effects; they just describe something that is going to happen.\r\n// Use @typeName and isActionType for type detection that works even after serialization/deserialization.\r\n\r\nexport interface SetTitleAction { type: 'SET_TITLE', title:string,showBack:boolean }\r\nexport interface SetShowBack { type: 'SET_SHOW_BACK', showBack: boolean }\r\nexport interface SetPageAction {\r\n type: 'SET_PAGE',\r\n path: string,\r\n menuTitle: string | undefined,\r\n channelType:simpleChannelType | undefined,\r\n showDealPageFooter?: boolean,\r\n}\r\nexport interface SetBasketShowModal { type: 'SET_SHOW_BASKET_MODAL', value: boolean }\r\nexport interface setShowModal { type: 'SET_SHOW_MODAL', selectedModal: string, singleInstance: boolean}\r\nexport interface setHasStartedApp { type: 'SET_HAS_STARTED_APP' }\r\nexport interface ShowDebugLabels { type: 'SHOW_DEBUG_LABELS', show: boolean }\r\n\r\n// Declare a 'discriminated union' type. This guarantees that all references to 'type' properties contain one of the\r\n// declared type strings (and not any other arbitrary string).\r\nexport type KnownAction = SetTitleAction | SetPageAction | SetBasketShowModal | setShowModal | setHasStartedApp | SetShowBack | ShowDebugLabels;\r\n\r\n// ----------------\r\n// ACTION CREATORS - These are functions exposed to UI components that will trigger a state transition.\r\n// They don't directly mutate state, but they can have external side-effects (such as loading data).\r\n\r\nexport const actionCreators = {\r\n\r\n setTitle: (title: string,showBack:boolean): AppThunkAction => (dispatch, getState) => {\r\n dispatch({ type: 'SET_TITLE', title:title,showBack:showBack });\r\n // }\r\n },\r\n setPage: (path: string,selectedChannel?:simpleChannelType): AppThunkAction => (dispatch, getState) => {\r\n const appState = getState();\r\n let menuTitle = undefined;\r\n if (path.includes('categories') ) {\r\n menuTitle = appState.menuData?.categoryCurrent?.categoryTitle;\r\n }\r\n\r\n let showDealPageFooter = false;\r\n\r\n if (path.includes('menuitem')) {\r\n showDealPageFooter = showModifierGroupsOnPages(appState.menuItemData?.menuItem ?? undefined);\r\n }\r\n\r\n dispatch({\r\n type: 'SET_PAGE',\r\n path: path,\r\n menuTitle: menuTitle,\r\n channelType: appState.location?.selectedChannel?.channelType,\r\n showDealPageFooter,\r\n });\r\n // }\r\n },\r\n setBasketShowModal: (value: boolean) : AppThunkAction => (dispatch) => {\r\n dispatch({ type: 'SET_SHOW_BASKET_MODAL', value });\r\n },\r\n setShowModal: (name: \"MAIN\" | \"TC\" | \"FAQ\" | \"ALLERGEN\" | string, value: boolean, singleInstance?: boolean): AppThunkAction => (dispatch, getState) => {\r\n let state = getState();\r\n //console.log(\"Current state = \", state.headerFooter?.modals);\r\n //console.log(\"Setting modal\", name, \"to \", value, \" singleInstance: \", singleInstance);\r\n let _singleInstance: boolean = singleInstance || false;\r\n let _selectedModal: string = \"\";\r\n\r\n if(!value && (state.headerFooter?.modals.selectedModal != name)){\r\n return;\r\n }\r\n\r\n if(value === false ){\r\n if( state.headerFooter?.modals.singleInstance || name === \"MAIN\" || state.headerFooter?.modals.selectedModal == \"\"){\r\n\r\n }\r\n else{\r\n _selectedModal = \"MAIN\"\r\n }\r\n }\r\n else{\r\n _selectedModal = name;\r\n }\r\n\r\n dispatch({ type: \"SET_SHOW_MODAL\", selectedModal: _selectedModal, singleInstance: _singleInstance });\r\n },\r\n setShowBack: (showBack: boolean) : AppThunkAction => (dispatch) => {\r\n dispatch({ type: 'SET_SHOW_BACK', showBack: showBack });\r\n },\r\n setHasStartedApp: (callback: () => void) : AppThunkAction => (dispatch) => {\r\n dispatch({ type: 'SET_HAS_STARTED_APP' });\r\n callback();\r\n },\r\n setShowDebugLabels: (show: boolean) : AppThunkAction => (dispatch) => {\r\n dispatch({ type: 'SHOW_DEBUG_LABELS', show: show });\r\n }\r\n};\r\n\r\n// ----------------\r\n// REDUCER - For a given state and action, returns the new state. To support time travel, this must not mutate the old state.\r\n\r\nexport const reducer: Reducer = (state: HeaderFooterState | undefined, incomingAction: Action): HeaderFooterState => {\r\n if (state === undefined) {\r\n return { hasStartedApp: false, title: \"No title\", showBack: false, footerMode: FooterMode.Hidden,headerMode: HeaderMode.Hidden, showBasketModal: false,\r\n modals: {\r\n selectedModal: \"\",\r\n singleInstance: false\r\n }, showDebugLabel: false }\r\n }\r\n\r\n const action = incomingAction as KnownAction;\r\n switch (action.type) {\r\n case 'SET_TITLE':\r\n console.log(\"TITLE:\" + action.title);\r\n return {\r\n ...state,\r\n title: action.title,\r\n showBack: action.showBack\r\n };\r\n case 'SET_SHOW_BACK':\r\n return {\r\n ...state,\r\n showBack: action.showBack\r\n }\r\n // Called automatically when router changes page\r\n case 'SET_PAGE':\r\n console.log(\"SET_PAGE: \" + action.path );\r\n let newTitle = state.title;\r\n let newShowBack = state.showBack;\r\n\r\n let newFooterMode: FooterMode = FooterMode.Hidden;\r\n let newHeaderMode: HeaderMode = HeaderMode.Hidden;\r\n\r\n if (action.path === '/splash') {\r\n newTitle = \"Splash\";\r\n newHeaderMode = HeaderMode.Hidden;\r\n newFooterMode = FooterMode.Hidden;\r\n }\r\n\r\n if (action.path === '/categories') {\r\n newHeaderMode = HeaderMode.Normal;\r\n newFooterMode = FooterMode.Basket;\r\n newShowBack = true;\r\n newTitle = \"Menu\";\r\n } else if (action.path.includes('categories')) {\r\n newHeaderMode = HeaderMode.Normal;\r\n newFooterMode = FooterMode.Basket;\r\n if (action.menuTitle) {\r\n //console.debug(\"Setting CATEGORY title to: \", action.menuTitle);\r\n newTitle = action.menuTitle;\r\n }\r\n newShowBack = true;\r\n }\r\n\r\n if (action.path.includes('menuitem')) {\r\n newHeaderMode = HeaderMode.PDP;\r\n newFooterMode = FooterMode.PDP;\r\n\r\n if (action.showDealPageFooter) {\r\n newFooterMode = FooterMode.DealPage;\r\n }\r\n }\r\n\r\n if (action.path.includes('/storesearch')) {\r\n newTitle = \"Order & Collect\";\r\n newHeaderMode = HeaderMode.Normal;\r\n newFooterMode = FooterMode.ConfirmStore;\r\n newShowBack = true;\r\n }\r\n\r\n if (action.path.includes('/choosetimeslot')) {\r\n if (action.channelType === simpleChannelType.ClickAndCollect) {\r\n newTitle = \"Collection Time\";\r\n }\r\n else if (action.channelType === simpleChannelType.TableOrder) {\r\n newTitle = \"Order Time\";\r\n }\r\n newHeaderMode = HeaderMode.Normal;\r\n newFooterMode = FooterMode.ConfirmStore;\r\n newShowBack = true;\r\n }\r\n\r\n if (action.path.includes('enteremail')) {\r\n newTitle = \"Your Details\";\r\n newHeaderMode = HeaderMode.Normal;\r\n newFooterMode = FooterMode.Hidden;\r\n newShowBack = true;\r\n }\r\n\r\n if (action.path.includes('orderconfirmation')) {\r\n newTitle = \"Checkout\";\r\n newHeaderMode = HeaderMode.Normal;\r\n newFooterMode = FooterMode.Hidden;\r\n newShowBack = true;\r\n }\r\n\r\n if (action.path.includes('basketpage')) {\r\n if(action.channelType === simpleChannelType.ClickAndCollect) {\r\n newTitle = \"Your Take Away Order\";\r\n }\r\n else if(action.channelType === simpleChannelType.TableOrder) {\r\n newTitle = \"Your Eat In Order\";\r\n }\r\n console.log(\"EGGS: \" + action.channelType);\r\n newHeaderMode = HeaderMode.Normal;\r\n newFooterMode = FooterMode.BasketPage;\r\n }\r\n\r\n if (action.path.includes('temptyou')) {\r\n newTitle = \"Can we tempt you?\";\r\n newHeaderMode = HeaderMode.Normal;\r\n newFooterMode = FooterMode.UpsellPage;\r\n }\r\n\r\n if (action.path.includes('payment')) {\r\n newTitle = \"Payment\";\r\n newHeaderMode = HeaderMode.Normal;\r\n newFooterMode = FooterMode.Hidden;\r\n newShowBack = true;\r\n }\r\n\r\n if(action.path.includes(\"payment/success\")){\r\n newTitle = \"Order Confirmation\";\r\n newHeaderMode = HeaderMode.Normal;\r\n newFooterMode = FooterMode.PaymentSuccessPage;\r\n newShowBack = false;\r\n }\r\n\r\n if(action.path.includes(\"/ordertype\")){\r\n newTitle = \"Order type\";\r\n newHeaderMode = HeaderMode.Normal;\r\n newFooterMode = FooterMode.Hidden;\r\n newShowBack = true;\r\n }\r\n\r\n if(action.path.includes(\"/tablenumber\")){\r\n newTitle = \"Table Number\";\r\n newHeaderMode = HeaderMode.Normal;\r\n newFooterMode = FooterMode.TablePage;\r\n newShowBack = true;\r\n }\r\n\r\n if (action.path.includes(\"/name-or-nickname\")) {\r\n newTitle = \"Name or Nickname\";\r\n newHeaderMode = HeaderMode.Normal;\r\n newFooterMode = FooterMode.TablePage;\r\n newShowBack = true;\r\n }\r\n\r\n if (action.path === '/deals') {\r\n newTitle = \"Deals\";\r\n newHeaderMode = HeaderMode.Normal;\r\n newFooterMode = FooterMode.Basket;\r\n newShowBack = true;\r\n }\r\n\r\n if (action.path === '/deals/upgrade') {\r\n newTitle = \"Upgrade\"\r\n newHeaderMode = HeaderMode.Normal;\r\n newFooterMode = FooterMode.DealUpgradePage;\r\n newShowBack = true;\r\n }\r\n\r\n if (action.path === '/deal-summary') {\r\n newTitle = \"Build your deal\"\r\n newHeaderMode = HeaderMode.DealPage;\r\n newFooterMode = FooterMode.DealPage;\r\n newShowBack = true;\r\n }\r\n\r\n if (action.path.includes('/deal/')) {\r\n newTitle = \"Build your deal\"\r\n newHeaderMode = HeaderMode.DealPage;\r\n newFooterMode = FooterMode.DealPage;\r\n newShowBack = true;\r\n }\r\n\r\n console.debug(\"Setting title to:\" + newTitle);\r\n return {\r\n ...state,\r\n title: newTitle ,\r\n headerMode: newHeaderMode,\r\n footerMode: newFooterMode,\r\n showBack: newShowBack,\r\n\r\n };\r\n case 'SET_SHOW_BASKET_MODAL':\r\n return {\r\n ...state,\r\n showBasketModal: action.value\r\n }\r\n case 'SET_SHOW_MODAL':\r\n return {\r\n ...state,\r\n modals: {\r\n selectedModal: action.selectedModal,\r\n singleInstance: action.singleInstance\r\n }\r\n }\r\n case 'SET_HAS_STARTED_APP':\r\n return {\r\n ...state,\r\n hasStartedApp: true\r\n }\r\n case 'SHOW_DEBUG_LABELS':\r\n return {\r\n ...state,\r\n showDebugLabel: action.show\r\n }\r\n default:\r\n return state;\r\n }\r\n};\r\n","import { Action, Reducer } from 'redux';\r\nimport { batch } from 'react-redux';\r\nimport { AppThunkAction } from './';\r\nimport update from 'immutability-helper';\r\nimport { baseUrl } from '../helpers/configHelper';\r\nimport { Dispatch } from 'react';\r\nimport { calculateMenuItemTotalPrice } from '../helpers/menuHelpers';\r\nimport _ from \"lodash\";\r\nimport { resetMessage, ResetMessageAction } from '../store/ColleagueStore';\r\n\r\n// -----------------\r\n// STATE - This defines the type of data maintained in the Redux store.\r\n\r\nexport interface MenuItemDataState {\r\n isLoading: boolean;\r\n isBasket: boolean;\r\n menuItemId: number | null;\r\n sku: string | null;\r\n menuItem: IMopMenuItemDetail | null;\r\n\r\n}\r\n\r\n// -----------------\r\n// ACTIONS - These are serializable (hence replayable) descriptions of state transitions.\r\n// They do not themselves have any side-effects; they just describe something that is going to happen.\r\n\r\ninterface RequestProductAction {\r\n type: 'REQUEST_PRODUCT';\r\n menuItemId: number;\r\n pfIdentifier: string | undefined;\r\n}\r\n\r\ninterface RequestProductSkuAction {\r\n type: 'REQUEST_PRODUCT_SKU';\r\n sku: string;\r\n pfIdentifier?: string;\r\n}\r\n\r\ninterface ReceiveProductAction {\r\n type: 'RECEIVE_PRODUCT';\r\n menuItemId: number;\r\n menuItem: IMopMenuItemDetail;\r\n}\r\n\r\ninterface ReceiveProductSkuAction {\r\n type: 'RECEIVE_PRODUCT_SKU';\r\n sku: string;\r\n menuItem: IMopMenuItemDetail;\r\n}\r\n\r\ninterface RequestBasketItemAction {\r\n type: \"REQUEST_BASKET_PRODUCT\";\r\n menuItemId: number;\r\n}\r\n\r\ninterface UpdateModifierGroupItem { \r\n type: \"UPDATE_MODIFIER_GROUP_ITEM\";\r\n categoryIndex: number;\r\n menuItemIndex: number;\r\n quantity: number;\r\n}\r\n\r\ninterface UpdateModifierGroup {\r\n type: \"UPDATE_MODIFIER_GROUP\",\r\n index: number,\r\n item: IMopModifierGroup\r\n}\r\n\r\ninterface UpdateMenuItemQuantity {\r\n type: \"UPDATE_MENU_ITEM_QUANTITY\";\r\n quantity: number;\r\n}\r\n\r\ninterface UpdateMenuItemTotalPrice {\r\n type: \"UPDATE_MENU_ITEM_TOTAL_PRICE\";\r\n totalPrice: number;\r\n}\r\n\r\ninterface UpdateAuxFilterItemQuantity {\r\n type: \"UPDATE_AUX_FILTER_ITEM_QUANTITY\";\r\n quantity: number;\r\n modifierGroupIndex: number;\r\n filterGroupIndex: number;\r\n filterSelectorIndex: number;\r\n}\r\n\r\ninterface CalculateAuxFilterItems {\r\n type: \"CALCULATE_AUX_FILTER_ITEMS\"\r\n modifierGroupIndex: number;\r\n}\r\n\r\n// Declare a 'discriminated union' type. This guarantees that all references to 'type' properties contain one of the\r\n// declared type strings (and not any other arbitrary string).\r\ntype KnownAction = RequestProductAction | ReceiveProductAction | RequestBasketItemAction | UpdateModifierGroupItem | UpdateMenuItemQuantity | UpdateMenuItemTotalPrice | UpdateAuxFilterItemQuantity | CalculateAuxFilterItems | UpdateModifierGroup | ResetMessageAction | RequestProductSkuAction | ReceiveProductSkuAction;\r\n\r\n// ----------------\r\n// ACTION CREATORS - These are functions exposed to UI components that will trigger a state transition.\r\n// They don't directly mutate state, but they can have external side-effects (such as loading data).\r\n\r\nexport const actionCreators = {\r\n requestMenuItemBySku: (sku: string, pfIdentifier: string, upgradedFromSku?: string, callback?: any): AppThunkAction => (dispatch, getState) => {\r\n const appState = getState();\r\n\r\n let channelIdentifier = appState.location?.channelIdentifier;\r\n\r\n const params = new URLSearchParams();\r\n\r\n if (pfIdentifier) {\r\n params.append('pfIdentifier', pfIdentifier);\r\n }\r\n\r\n if (upgradedFromSku) {\r\n params.append('upgradedFromSku', upgradedFromSku);\r\n }\r\n\r\n fetch(`${baseUrl()}/menudata/${channelIdentifier}/MenuItemSku/${sku}?${params.toString()}`)\r\n .then(response => response.json() as Promise)\r\n .then((data: any) => {\r\n if (data.status === 401) {\r\n dispatch(resetMessage(\"showExpireModal\"))\r\n } else {\r\n data.quantity = 1;\r\n dispatch({ type: 'RECEIVE_PRODUCT_SKU', sku: sku, menuItem: data });\r\n callback && callback(data.menuItemId);\r\n }\r\n });\r\n\r\n dispatch({ type: 'REQUEST_PRODUCT_SKU', sku: sku, pfIdentifier: pfIdentifier });\r\n },\r\n\r\n requestMenuItem: (menuItemId: number, pfIdentifier: string, referrer: string | null, callback: any): AppThunkAction => (dispatch, getState) => {\r\n // Only load data if it's something we don't already have (and are not already loading)\r\n const appState = getState();\r\n\r\n let channelIdentifier = appState.location?.channelIdentifier;\r\n // if (appState && appState.weatherForecasts && startDateIndex !== appState.weatherForecasts.startDateIndex) {\r\n fetch(`${baseUrl()}/menudata/${channelIdentifier}/MenuItem/${menuItemId}${pfIdentifier ? \"?pfIdentifier=\" + pfIdentifier : \"\"}`)\r\n .then(response => response.json() as Promise)\r\n .then((data: any) => {\r\n if (data.status === 401) {\r\n dispatch(resetMessage(\"showExpireModal\"))\r\n }\r\n else {\r\n data.quantity = 1;\r\n data.referrer = referrer;\r\n dispatch({ type: 'RECEIVE_PRODUCT', menuItemId: menuItemId, menuItem: data, });\r\n // NOTE: We return the sku for Deals, so we can check if\r\n // it's in a deal. - Fletcher, 2024-04-24\r\n callback && callback(data);\r\n }\r\n });\r\n dispatch({ type: 'REQUEST_PRODUCT', menuItemId: menuItemId, pfIdentifier: pfIdentifier });\r\n // }\r\n },\r\n requestBasketMenuItem: (basketMenuItemId: number, callback: any): AppThunkAction => (dispatch: Dispatch, getState) => {\r\n const appState = getState();\r\n let basketItem = appState.basket?.basket.menuItems.find(item => item.basketMenuItemId === basketMenuItemId); \r\n\r\n batch(() => {\r\n if(basketItem){\r\n dispatch({ type: 'REQUEST_BASKET_PRODUCT', menuItemId: basketItem.menuItemId });\r\n dispatch({ type: 'RECEIVE_PRODUCT', menuItem: basketItem, menuItemId: basketItem.menuItemId });\r\n dispatch(actionCreators.updateMenuItemTotalPrice());\r\n callback && callback();\r\n } \r\n }); \r\n },\r\n updateModifierGroupItem: (menuItemId: number, quantity: number): AppThunkAction => (dispatch: Dispatch, getState) => {\r\n const appState = getState();\r\n\r\n let idx = appState.menuItemData?.menuItem?.modifierGroups.flatMap((mod, i) => { //Finds index of modifierGroup and the modifierGroupItem using menuItemId of option\r\n const j = mod.modifierGroupItems.findIndex((item: IMopModifierGroupItem) => item.menuItemId === menuItemId);\r\n return j > -1 ? [i, j] : [];\r\n });\r\n\r\n /*\r\n\r\n Take loop from footer and use it here to set total item price, store this as singularPrice as well, \r\n then when update quantity is called just multiply the price using this.\r\n */\r\n if(idx && idx.length > 0){\r\n let modifierGroup = appState.menuItemData?.menuItem?.modifierGroups[idx[0]] as IMopModifierGroup;\r\n\r\n //console.log(\"Updating group\", modifierGroup);\r\n if(modifierGroup){\r\n //let menuItemIndex = modifierGroup.modifierGroupItems.findIndex(item => item.menuItemId == menuItemId);\r\n\r\n //console.log(\"Updating menu item from\", modifierGroup.modifierGroupItems[idx[1]]);\r\n dispatch({ type: \"UPDATE_MODIFIER_GROUP_ITEM\", categoryIndex: idx[0], menuItemIndex: idx[1], quantity});\r\n dispatch(actionCreators.updateMenuItemTotalPrice());\r\n }\r\n }\r\n \r\n },\r\n updateMenuItemQuantity: (quantity: number): AppThunkAction => (dispatch: Dispatch) => {\r\n dispatch({ type: \"UPDATE_MENU_ITEM_QUANTITY\", quantity: quantity });\r\n dispatch(actionCreators.updateMenuItemTotalPrice());\r\n },\r\n updateAuxFilterItemQuantity: (quantity: number, modifierGroupIndex: number, filterGroupIndex: number, filterSelectorIndex: number): AppThunkAction => (dispatch) => {\r\n dispatch({ type: \"UPDATE_AUX_FILTER_ITEM_QUANTITY\", quantity: quantity, modifierGroupIndex: modifierGroupIndex, filterGroupIndex: filterGroupIndex, filterSelectorIndex: filterSelectorIndex});\r\n },\r\n updateMenuItemTotalPrice: () : AppThunkAction => (dispatch, getState) => {\r\n //console.log(\"Updating total price of menu item\");\r\n const appState = getState();\r\n\r\n let _price: number = 0;\r\n\r\n if(appState.menuItemData?.menuItem != null){\r\n _price = calculateMenuItemTotalPrice(appState.menuItemData.menuItem, false, appState.colleague?.isLoggedIn);\r\n }\r\n \r\n\r\n dispatch({ type: \"UPDATE_MENU_ITEM_TOTAL_PRICE\", totalPrice: _price });\r\n \r\n },\r\n calculateAuxFilterItems: (modifierGroupIndex: number) : AppThunkAction => (dispatch: Dispatch, getState) => {\r\n console.debug(\"STARTING calculateAuxFilterItems\");\r\n const appState = getState();\r\n if(appState.menuItemData?.menuItem){\r\n let modifierGroups = appState.menuItemData.menuItem.modifierGroups as IMopModifierGroup[];\r\n let targetModifierGroup: IMopModifierGroup = JSON.parse(JSON.stringify(modifierGroups[modifierGroupIndex]));\r\n\r\n \r\n\r\n //Grab the current selected filters from each group's selector array. \r\n //These filters will be used to find a match from the outcomes array.\r\n let selectedFilters = targetModifierGroup.auxMenuItemData?.auxJsonFilters?.groups.reduce((filterSelection: string[], group) =>{\r\n const selection = group.selectors.reduce((groupFilters: string[], selector) => {\r\n if(selector.quantitySelected == 1){\r\n return [...groupFilters, selector.tag ? selector.tag : selector.name];\r\n }\r\n else{\r\n return groupFilters;\r\n }\r\n }, []);\r\n return [...filterSelection, ...selection];\r\n }, []);\r\n //console.log(\"Tags selected:\", selectedFilters);\r\n\r\n let auxJsonFilters = targetModifierGroup.auxMenuItemData?.auxJsonFilters;\r\n if(auxJsonFilters){\r\n //Loop through each group, detect if a tag from that group has been selected and then loop through the selectors of the group\r\n //to calculate the price and whether it's enabled\r\n for(let i = 0; i < auxJsonFilters?.groups.length; i++){\r\n \r\n let group = auxJsonFilters.groups[i];\r\n //console.group(\"--Looping through group\", group.groupTitle);\r\n\r\n let selectedFilterInGroup = group.selectors.find((selector) => selectedFilters?.includes(selector.tag ? selector.tag : selector.name));\r\n //console.log(\"selectedFilterInGroup from \", group.groupTitle,\":\", selectedFilterInGroup);\r\n\r\n for(let j = 0; j < group.selectors.length; j++){\r\n let selector = group.selectors[j];\r\n //console.group(\"--Selector\", selector.name);\r\n\r\n let _availableOutcomes: AuxJsonOutcome[] = [];\r\n let _selectedFilters: string[] = JSON.parse(JSON.stringify(selectedFilters));\r\n let selectorTag = selector.tag ? selector.tag : selector.name;\r\n\r\n if(selectedFilterInGroup){\r\n let filterInGroupTag = selectedFilterInGroup.tag ? selectedFilterInGroup.tag : selectedFilterInGroup.name;\r\n let selectedFilterIndex = selectedFilters?.findIndex((filterSelected) => filterInGroupTag == filterSelected);\r\n //console.log(\"Replacing tag\", filterInGroupTag, \"at index\", selectedFilterIndex);\r\n\r\n if(selectedFilters != undefined && selectedFilterIndex != undefined && selectedFilterIndex > -1){ \r\n _selectedFilters[selectedFilterIndex] = selectorTag;\r\n }\r\n else{\r\n console.log(\"Cant find filterSelection or selectedFilterIndex\", selectedFilters, selectedFilterIndex);\r\n }\r\n }\r\n else{\r\n if(selectedFilters){\r\n _selectedFilters?.push(selectorTag);\r\n }\r\n else{\r\n console.log(\"Cant find selectedFilters or selectedFilterIndex\", selectedFilters);\r\n }\r\n }\r\n\r\n //console.log(\"Temp selectedFilters\", _selectedFilters);\r\n\r\n _availableOutcomes = auxJsonFilters?.outcomes.filter((outcome) => {\r\n return _selectedFilters.every((q) => outcome.filters.includes(q));\r\n })\r\n \r\n //console.log(\"Available Outcomes for this array:\", _availableOutcomes);\r\n\r\n if(_availableOutcomes && _availableOutcomes.length > 0){\r\n \r\n //Find the ModifierGroupItem equivalents of JsonOutcomes\r\n let availableModifierItems: IMopModifierGroupItem[] = targetModifierGroup.modifierGroupItems.filter((item: IMopModifierGroupItem) => _availableOutcomes.some((outcome) => outcome.sku == item.sku));\r\n availableModifierItems.sort((a, b) => (a.price ?? 0) - (b.price ?? 0));\r\n\r\n let samePrice = availableModifierItems.every((item) => availableModifierItems[0].price == item.price);\r\n selector.from = !samePrice;\r\n\r\n /*\r\n Chicken Selected - £6\r\n Plain Selected - £0\r\n\r\n selector = Peri peri\r\n\r\n */\r\n let currentPrice: number = auxJsonFilters.groups.reduce((price: number, _group, index) => {\r\n //console.group(\"Price for group\", _group.groupTitle, price);\r\n const selectionPrice = _group.selectors.reduce((groupPrice: number, _selector) => {\r\n //console.group(\"Price for selector\", _selector.name, groupPrice);\r\n //console.groupEnd();\r\n if(group.groupTitle == _group.groupTitle){\r\n //console.log(\"selectors group is in reducers group, returning\", groupPrice);\r\n return groupPrice\r\n } \r\n else{\r\n //console.log(\"returning\", (_selector.quantitySelected > 0) ? _selector.price + groupPrice : groupPrice);\r\n return (_selector.quantitySelected > 0) ? _selector.price + groupPrice : groupPrice;\r\n } \r\n }, 0);\r\n // console.groupEnd();\r\n\r\n return selectionPrice + price;\r\n }, 0);\r\n\r\n //console.log(\"currentPrice\", currentPrice);\r\n\r\n if(availableModifierItems.length == 0){\r\n console.log(\"Cannot find matching SKU's for outcomes\", _availableOutcomes, \"from the items\", targetModifierGroup.modifierGroupItems);\r\n }\r\n else{\r\n selector.price = (availableModifierItems[0].price ?? 0) - (i == 0 ? 0 : currentPrice);\r\n selector.enabled = true;\r\n } \r\n }\r\n else{\r\n selector.enabled = false;\r\n selector.price = 0;\r\n }\r\n\r\n if(i == 0){ //if the first group\r\n //selector.enabled = true;\r\n }\r\n else if((!selectedFilters || selectedFilters.length == 0)){\r\n //Selected is not in the first group and there's no filters selected\r\n selector.price = 0;\r\n selector.enabled = false;\r\n }\r\n\r\n //console.groupEnd();\r\n }\r\n\r\n //console.groupEnd();\r\n }\r\n\r\n let outcomeMatches = auxJsonFilters.outcomes.filter((outcome) => { \r\n if(selectedFilters){\r\n return _.isEqual(outcome.filters.sort(), selectedFilters.sort()); \r\n }\r\n else{\r\n return false;\r\n }\r\n })\r\n \r\n if(outcomeMatches.length > 0){\r\n //console.log(\"Outcome Matches found\", outcomeMatches);\r\n\r\n let prevSelectedModifier: number | undefined = targetModifierGroup.modifierGroupItems.findIndex((item: IMopModifierGroupItem) => item.quantitySelected == 1);\r\n if(prevSelectedModifier > -1){\r\n targetModifierGroup.modifierGroupItems[prevSelectedModifier].quantitySelected = 0;\r\n }\r\n\r\n let modifierMatches: IMopModifierGroupItem[] | undefined = targetModifierGroup.modifierGroupItems.filter((item: IMopModifierGroupItem) => outcomeMatches.some((outcome) => outcome.sku == item.sku));\r\n //console.log(\"ModifierMatches found\", modifierMatches);\r\n if(modifierMatches){\r\n modifierMatches.forEach((modifier) =>{\r\n let modIndex = targetModifierGroup.modifierGroupItems.findIndex((item: IMopModifierGroupItem) => item.sku == modifier.sku);\r\n targetModifierGroup.modifierGroupItems[modIndex].quantitySelected = 1;\r\n })\r\n }\r\n }\r\n \r\n //console.debug(\"DISPATCHING UPDATE_MODIFIER_GROUP\");\r\n dispatch({type: \"UPDATE_MODIFIER_GROUP\", index: modifierGroupIndex, item: targetModifierGroup});\r\n dispatch(actionCreators.updateMenuItemTotalPrice());\r\n\r\n }\r\n else{\r\n console.log(\"No auxJsonFilters\");\r\n }\r\n\r\n }\r\n else{\r\n console.error(\"No menuItem found in state\");\r\n }\r\n\r\n }\r\n};\r\n\r\n// ----------------\r\n// REDUCER - For a given state and action, returns the new state. To support time travel, this must not mutate the old state.\r\n\r\nconst unloadedState: MenuItemDataState = { menuItemId: null, sku: null, menuItem: null, isLoading: false, isBasket: false };\r\n\r\nexport const reducer: Reducer = (state: MenuItemDataState | undefined, incomingAction: Action): MenuItemDataState => {\r\n if (state === undefined) {\r\n return unloadedState;\r\n }\r\n const action = incomingAction as KnownAction;\r\n switch (action.type) {\r\n case 'REQUEST_PRODUCT':\r\n return {\r\n ...state,\r\n menuItemId: action.menuItemId,\r\n isBasket: false,\r\n isLoading: true\r\n };\r\n case 'REQUEST_PRODUCT_SKU':\r\n return {\r\n ...state,\r\n sku: action.sku,\r\n isBasket: false,\r\n isLoading: true\r\n };\r\n case 'REQUEST_BASKET_PRODUCT':\r\n console.log(\"Setting basket item to update with \" + action.menuItemId);\r\n return {\r\n ...state,\r\n menuItemId: action.menuItemId,\r\n isBasket: true\r\n }\r\n case 'RECEIVE_PRODUCT':\r\n // Only accept the incoming data if it matches the most recent request. This ensures we correctly\r\n // handle out-of-order responses.\r\n if (action.menuItemId === state.menuItemId) {\r\n\r\n console.log(\"Loading PDP with \", action.menuItem);\r\n return {\r\n ...state,\r\n menuItemId: action.menuItemId,\r\n menuItem: {\r\n ...action.menuItem,\r\n menuItemSinglePrice: action.menuItem.menuItemSinglePrice,\r\n menuItemTotalPrice: action.menuItem.menuItemTotalPrice\r\n },\r\n isLoading: false\r\n };\r\n }\r\n break;\r\n case 'RECEIVE_PRODUCT_SKU':\r\n // Only accept the incoming data if it matches the most recent request. This ensures we correctly\r\n // handle out-of-order responses.\r\n if (action.sku !== state.sku) {\r\n break;\r\n }\r\n\r\n console.log(\"Loading PDP with \", action.sku);\r\n return {\r\n ...state,\r\n menuItemId: action.menuItem.menuItemId,\r\n sku: action.sku,\r\n menuItem: {\r\n ...action.menuItem,\r\n menuItemSinglePrice: action.menuItem.menuItemSinglePrice,\r\n menuItemTotalPrice: action.menuItem.menuItemTotalPrice\r\n },\r\n isLoading: false\r\n };\r\n case 'UPDATE_MODIFIER_GROUP_ITEM':\r\n //console.log(\"Updating menu item modifier group to \", action.quantity);\r\n if(state.menuItem != null){\r\n //state.menuItem.modifierGroups[categoryIndex].modifierGroupItems[menuItemIndex].quantity\r\n //state.first.second[someId].fouth\r\n return update(state, {\r\n menuItem: {\r\n modifierGroups: {\r\n [action.categoryIndex]: {\r\n modifierGroupItems: {\r\n [action.menuItemIndex]: {\r\n $merge:{\r\n quantitySelected: action.quantity,\r\n defaultQuantitySelected: 0\r\n } \r\n }\r\n }\r\n }\r\n }\r\n }\r\n })\r\n } \r\n break; \r\n case 'UPDATE_AUX_FILTER_ITEM_QUANTITY':\r\n console.log(state.menuItem?.modifierGroups[0]);\r\n return update(state, {\r\n menuItem: {\r\n modifierGroups: {\r\n [action.modifierGroupIndex]: {\r\n auxMenuItemData: {\r\n auxJsonFilters: {\r\n groups: {\r\n [action.filterGroupIndex]: {\r\n selectors: {\r\n [action.filterSelectorIndex]: {\r\n $merge:{ \r\n quantitySelected: action.quantity\r\n } \r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n })\r\n case 'UPDATE_MENU_ITEM_QUANTITY':\r\n console.log(\"Updating menu item quantity to \", action.quantity);\r\n if(state.menuItem != null){\r\n return {\r\n ...state,\r\n menuItem: {\r\n ...state.menuItem,\r\n quantity: action.quantity\r\n },\r\n };\r\n }\r\n break;\r\n case 'UPDATE_MODIFIER_GROUP':\r\n return update(state, {\r\n menuItem: {\r\n modifierGroups: {\r\n [action.index]: {\r\n $merge: {\r\n ...action.item\r\n } \r\n }\r\n }\r\n }\r\n })\r\n case \"UPDATE_MENU_ITEM_TOTAL_PRICE\":\r\n console.log(\"Updating total price to £\", action.totalPrice);\r\n if(state.menuItem != null){\r\n return {\r\n ...state,\r\n menuItem:{\r\n ...state.menuItem,\r\n menuItemSinglePrice: action.totalPrice,\r\n menuItemTotalPrice: action.totalPrice * state.menuItem.quantity\r\n }\r\n }\r\n }\r\n }\r\n return state;\r\n};\r\n ","import React from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { RouteComponentProps } from 'react-router';\r\nimport { IonPage, IonSpinner } from '@ionic/react';\r\n\r\nimport CategoryMenuItemLister from '../components/CategoryMenuItemLister';\r\nimport './Categories.scss';\r\nimport * as MenuDataStore from '../store/MenuStore';\r\nimport * as HeaderFooterStore from '../store/HeaderFooterStore';\r\nimport * as MenuItemDataStore from '../store/MenuItemStore';\r\nimport { ApplicationState } from '../store';\r\n\r\nimport { MenuDataState } from '../store/MenuStoreTypes';\r\nimport * as DealStore from '../store/DealStore';\r\n\r\ninterface CategoryProps {\r\n useStoreA: boolean\r\n menuData: MenuDataState\r\n dealData: DealStore.DealState\r\n productData: MenuItemDataStore.MenuItemDataState\r\n headerData: HeaderFooterStore.HeaderFooterState\r\n pfIdentifier: string | undefined;\r\n}\r\n\r\ninterface CategoryState {\r\n isLoading: boolean;\r\n}\r\n\r\n// At runtime, Redux will merge together...\r\ntype CategoriesProps =\r\n typeof MenuDataStore.actionCreators // ... plus action creators we've requested\r\n & typeof MenuItemDataStore.actionCreators // ... plus action creators we've requested\r\n & typeof HeaderFooterStore.actionCreators // ... plus action creators we've requested\r\n & typeof DealStore.actionCreators\r\n & RouteComponentProps<{ categoryIdentifier: string }>\r\n & CategoryProps; // ... plus incoming routing parameters\r\n\r\nclass Categories extends React.Component {\r\n constructor(props: CategoriesProps){\r\n super(props);\r\n this.state = {\r\n isLoading: false\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n let requiredId = +this.props.match.params.categoryIdentifier;\r\n\r\n if (this.props.menuData.categoryId == requiredId) {\r\n console.debug(\"Showing correct content\");\r\n } else {\r\n console.debug(\"Not Showing correct content - force load\");\r\n this.setState({\r\n isLoading: true\r\n })\r\n this.props.requestCategoryList(+this.props.match.params.categoryIdentifier, this.props.useStoreA ? \"a\" : \"b\", this.props.pfIdentifier ?? \"\", () => {\r\n this.setState({\r\n isLoading: false\r\n }, () => { console.log(\"Setting state to false\", this.state.isLoading); });\r\n });\r\n }\r\n\r\n this.props.useStoreA && this.props.history.listen((location, action) => {\r\n // location is an object like window.location\r\n if (action == \"POP\") {\r\n let breakUrl = location.pathname.split(\"/\");\r\n let currentCatgegoryId: number = 0;\r\n\r\n if (breakUrl.length === 3) {\r\n currentCatgegoryId = +breakUrl[2];\r\n }\r\n\r\n this.props.setCurrentCategory(currentCatgegoryId);\r\n }\r\n\r\n console.debug(action, location.pathname, location.state)\r\n });\r\n }\r\n\r\n componentWillUnmount() {\r\n }\r\n\r\n onReceiveCategoryList(categoryId: number) {\r\n if (this.props.menuData.categoryCurrent) {\r\n this.props.history.push(`/categories${this.props.useStoreA ? \"b\" : \"\"}/${categoryId}`);\r\n } else {\r\n console.debug(\"No items in categoryCurrent\");\r\n }\r\n }\r\n\r\n navigateToCategory(categoryId: number) {\r\n if (this.props.useStoreA) {\r\n this.props.requestCategoryList(categoryId, \"b\", this.props.pfIdentifier ?? \"\", () => { this.onReceiveCategoryList(categoryId) });\r\n } else {\r\n this.props.requestCategoryList(categoryId, \"a\", this.props.pfIdentifier ?? \"\", () => { this.onReceiveCategoryList(categoryId) });\r\n }\r\n }\r\n\r\n navigateToMenuItem(menuItemId: number) {\r\n console.debug(\"Navigating to: \", menuItemId);\r\n\r\n this.props.requestMenuItem(menuItemId, this.props.pfIdentifier ?? \"\", \"\", (menuItem?: IMopMenuItemDetail) => {\r\n if (!menuItem ) {\r\n this.props.history.push(`/menuitem/${menuItemId}`);\r\n return;\r\n }\r\n\r\n const pfIdentifierValue = this.props.pfIdentifier;\r\n const isColleague = pfIdentifierValue ? true : false;\r\n\r\n if (isColleague) {\r\n this.props.history.push(`/menuitem/${menuItemId}`);\r\n return;\r\n }\r\n\r\n const dealSku = this.props.dealData.itemSkuToDealSku?.get(menuItem.sku);\r\n\r\n if (!dealSku) {\r\n if (menuItem.isDealItem) {\r\n this.props.history.push(`/deal/${menuItemId}`);\r\n } else {\r\n this.props.history.push(`/menuitem/${menuItemId}`);\r\n }\r\n\r\n return;\r\n }\r\n\r\n this.props.upgradeToDeal(menuItem.sku, dealSku);\r\n this.props.history.push(`/deals/upgrade`);\r\n });\r\n }\r\n\r\n goBack() {\r\n this.props.history.goBack();\r\n }\r\n\r\n render() {\r\n const { isLoading, categoryListA, categoryListB, categoryId } = this.props.menuData;\r\n let categoryList = this.props.useStoreA ? categoryListA : categoryListB\r\n\r\n const pfIdentifierValue = this.props.pfIdentifier;\r\n\r\n let isColleague = pfIdentifierValue ? true : false;\r\n\r\n console.debug(categoryList, this.props.useStoreA, this.state.isLoading, \"isLoading:\", isLoading, \" isColleague: \", isColleague);\r\n return (\r\n \r\n {this.state.isLoading\r\n ?\r\n
\r\n :\r\n \r\n }\r\n
\r\n );\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state: ApplicationState, ownProps: any) => ({\r\n menuData: state.menuData,\r\n dealData: state.deal,\r\n useStoreA: ownProps.useStoreA,\r\n pfIdentifier: localStorage.getItem(\"pfidentifier\")\r\n});\r\n\r\nconst mapDispatchToProps = (dispatch: any) => {\r\n return {\r\n requestCategoryList: (categoryId: number, container: string, pfIdentifier: string, callback: any) => dispatch(MenuDataStore.actionCreators.requestCategoryList(categoryId, container, pfIdentifier, callback)),\r\n setCurrentCategory: (categoryId: number) => dispatch(MenuDataStore.actionCreators.setCurrentCategory(categoryId)),\r\n setTitle: (title: string, showBack: boolean) => dispatch(HeaderFooterStore.actionCreators.setTitle(title,showBack)),\r\n requestMenuItem: (menuItemId: number, pfIdentifier: string, referer: string | null, callback: any) => dispatch(MenuItemDataStore.actionCreators.requestMenuItem(menuItemId, pfIdentifier,\"\", callback)),\r\n upgradeToDeal: (menuItemId: string, dealSku: string) => dispatch(DealStore.actionCreators.upgradeToDeal(menuItemId, dealSku)),\r\n };\r\n};\r\n\r\nexport default connect(\r\n mapStateToProps, // Selects which state properties are merged into the component's props\r\n mapDispatchToProps // Selects which action creators are merged into the component's props,\r\n)(Categories as any);\r\n","const pushToGoogleEcommerce = (event: string, ecommerce: any) => {\r\n (window as any).dataLayer.push({ ecommerce: null });\r\n (window as any).dataLayer.push({ \r\n event: event,\r\n ecommerce: ecommerce\r\n });\r\n} \r\n\r\nexport const addItemToGtagBasket = (currentMenuItem: IMopMenuItemDetail, affiliation: string, value: number ) => {\r\n //Old gtag method - (window as any).gtag('event', 'add_to_cart', getGtagBasketObject([currentMenuItem], value, affiliation));\r\n pushToGoogleEcommerce(\"add_to_cart\", getGtagBasketObject([currentMenuItem], value, affiliation));\r\n}\r\n\r\nexport const removeItemFromGtagBasket = (currentMenuItem: IMopMenuItemDetail, affiliation: string) => {\r\n //(window as any).gtag('event', 'remove_from_cart', getGtagBasketObject([currentMenuItem], currentMenuItem.menuItemSinglePrice, affiliation));\r\n pushToGoogleEcommerce(\"remove_from_cart\", getGtagBasketObject([currentMenuItem], currentMenuItem.menuItemSinglePrice, affiliation));\r\n}\r\n\r\nexport const addPurchaseToGtag = (transactionId: string, basket: IMopBasket, affiliation: string, orderType: string, collectionTime: string | undefined) => {\r\n if(basket.menuItems){\r\n let gtagPurchaseObject = {\r\n transaction_id: transactionId,\r\n affiliation: affiliation,\r\n collection_time: collectionTime,\r\n order_type: orderType,\r\n ...getGtagBasketObject(basket.menuItems, basket.totalPrice, affiliation, true)\r\n };\r\n \r\n //(window as any).gtag('event', 'purchase', gtagPurchaseObject);\r\n pushToGoogleEcommerce(\"purchase\", gtagPurchaseObject);\r\n\r\n //console.log(\"Sending basket to google e-commerce\", gtagPurchaseObject);\r\n } \r\n}\r\n\r\nconst getGtagBasketObject = (menuItems: IMopMenuItemDetail[], value: number, affiliation: string, addCoupon?: boolean) => {\r\n let _menuItems: IMopMenuItemDetail[] = [];\r\n let _discounts: IMopMenuItemDetail[] = [];\r\n let _googleItems: any[] = [];\r\n\r\n for(let i = 0; i < menuItems.length; i++){\r\n let menuItem = menuItems[i];\r\n if(!menuItem.isDiscount){\r\n _menuItems.push(menuItem);\r\n } \r\n else{\r\n _discounts.push(menuItem);\r\n }\r\n }\r\n \r\n let totalPricePreDiscount = _menuItems.reduce((prev, curr) => {\r\n return prev + (curr.menuItemSinglePrice * curr.quantity)\r\n }, 0);\r\n\r\n let discount: any = {};\r\n if(_discounts.length > 0){\r\n discount = _discounts.reduce((prev, curr, i) => {\r\n return {\r\n coupon: i == 0 ? curr.menuItemName : prev.coupon + \", \" + curr.menuItemName,\r\n totalDiscount: prev.totalDiscount == undefined ? curr.menuItemBasePrice : prev.totalDiscount + curr.menuItemBasePrice,\r\n percentage: 0\r\n }\r\n }, discount);\r\n discount.percentage = Number.parseFloat(((totalPricePreDiscount + discount.totalDiscount) / totalPricePreDiscount).toFixed(2));\r\n //console.log(discount, totalPricePreDiscount);\r\n }\r\n\r\n for(let i = 0; i < _menuItems.length; i++){\r\n let menuItem = _menuItems[i];\r\n let itemDiscount: any = { //will be undefined if no discount\r\n coupon: discount.coupon,\r\n discount: discount.percentage == undefined ? undefined : Number.parseFloat(((menuItem.menuItemSinglePrice) * (1 - discount.percentage)).toFixed(2))\r\n }\r\n _googleItems.push(formatMopMenuItemToGoogleMenuItem(menuItem, menuItem.quantity, affiliation, itemDiscount));\r\n }\r\n\r\n let gtagMenuItem = {\r\n currency: 'GBP',\r\n items: _googleItems,\r\n value: value,\r\n coupon: discount.coupon\r\n };\r\n \r\n return gtagMenuItem;\r\n}\r\n\r\nconst formatMopMenuItemToGoogleMenuItem = (currentMenuItem: IMopMenuItemDetail, quantity: number, affiliation: string, discount: any) => {\r\n //console.log(\"Discount format item \", discount);\r\n return {\r\n item_id: currentMenuItem.sku,\r\n affiliation: affiliation,\r\n item_name: currentMenuItem.menuItemName,\r\n price: currentMenuItem.menuItemSinglePrice,\r\n currency: 'GBP',\r\n quantity: quantity,\r\n item_category: currentMenuItem.categoryName,\r\n ...discount\r\n };\r\n}\r\n","import { apps, call, menu } from 'ionicons/icons';\r\nimport { Action, Reducer } from 'redux';\r\nimport { ApplicationState, AppThunkAction } from './';\r\nimport { baseUrl } from '../helpers/configHelper';\r\nimport update from 'immutability-helper';\r\nimport { Dispatch } from 'react';\r\nimport { calculateMenuItemTotalPrice, getSelectedSkus, shouldShowModifierGroup } from '../helpers/menuHelpers';\r\nimport { addItemToGtagBasket, removeItemFromGtagBasket } from '../helpers/googleHelpers';\r\nimport { useHistory, useLocation } from \"react-router-dom\";\r\nimport { resetMessage, ResetMessageAction } from '../store/ColleagueStore';\r\n\r\n// -----------------\r\n// STATE - This defines the type of data maintained in the Redux store.\r\n\r\nexport enum PaymentStatus {\r\n UNSET,\r\n REQUESTED,\r\n COMPLETE\r\n}\r\n\r\nexport interface BasketState {\r\n isLoading: boolean;\r\n totalQuantity: number;\r\n basket: IMopBasket ;\r\n tmpBasket: IMopBasket;\r\n upsells: IMopMenuItemDetail[];\r\n email: string;\r\n orderNumber: string;\r\n shouldOfferUpsellToCustomer: boolean;\r\n continueClicked: boolean;\r\n tableFormErrors: string | undefined;\r\n tableNumber: number | undefined;\r\n nicknameFormErrors: string | undefined;\r\n nickname: string | undefined;\r\n paymentStatus: PaymentStatus;\r\n upsellDone: boolean;\r\n showAllergen: boolean;\r\n toastNotificationOpen: boolean;\r\n abortController?: AbortController | null;\r\n isKefComplete: boolean;\r\n}\r\n\r\n// -----------------\r\n// ACTIONS - These are serializable (hence replayable) descriptions of state transitions.\r\n// They do not themselves have any side-effects; they just describe something that is going to happen.\r\n\r\ninterface UpdateBasketAction {\r\n type: 'BASKET_UPDATE';\r\n basket: IMopBasket ;\r\n totalQuantity: number;\r\n}\r\n\r\ninterface UpdateBasketItemQuantity {\r\n type: 'UPDATE_BASKET_ITEM_QUANTITY';\r\n basketItemIndex: number;\r\n quantity: number;\r\n price: number;\r\n}\r\n\r\n// Action to start loading\r\ninterface LoadingStartAction {\r\n type: 'LOADING_START';\r\n}\r\n\r\n// Action to end loading\r\ninterface LoadingEndAction {\r\n type: 'LOADING_END';\r\n}\r\n\r\ninterface RemovebasketItem {\r\n type: \"REMOVE_BASKET_ITEM\";\r\n basketItemIndex: number;\r\n}\r\n\r\ninterface UpdateBasketDetailsAction {\r\n type: 'BASKET_DETAILS_UPDATE';\r\n email: string;\r\n staffCardNumber: string;\r\n consent: boolean;\r\n}\r\n\r\ninterface UpdateBasketAbortControllerAction {\r\n type: 'UPDATE_BASKET_ABORT_CONTROLLER';\r\n abortController: AbortController;\r\n}\r\n\r\ninterface ClearBasket {\r\n type: \"CLEAR_BASKET\";\r\n}\r\n\r\ninterface OpenToast {\r\n type: \"OPEN_TOAST\";\r\n}\r\n\r\ninterface CloseToast {\r\n type: \"CLOSE_TOAST\";\r\n}\r\n\r\ninterface UpdateOrderNumber {\r\n type: \"UPDATE_ORDER_NUMBER\";\r\n orderNumber: string;\r\n}\r\n\r\ninterface SetUpsells {\r\n type: \"SET_UPSELLS\";\r\n upsells: IMopMenuItemDetail[]\r\n}\r\n\r\n\r\ninterface SetShouldOfferUpsellToCustomer {\r\n type: \"SET_SHOULD_OFFER_UPSELL\",\r\n value: boolean\r\n}\r\n\r\ninterface setContinueClicked {\r\n type: \"SET_CONTINUE_CLICKED\",\r\n value: boolean\r\n}\r\n\r\ninterface setTableFormErrors {\r\n type: \"SET_TABLE_FORM_ERRORS\",\r\n value: string | undefined\r\n}\r\n\r\ninterface SetTableNumber {\r\n type: \"SET_TABLE_NUMBER\",\r\n value: number\r\n}\r\n\r\ninterface setNicknameFormErrors {\r\n type: \"SET_NICKNAME_FORM_ERRORS\",\r\n value: string | undefined\r\n}\r\n\r\ninterface SetNickname {\r\n type: \"SET_NICKNAME\",\r\n value: string\r\n}\r\n\r\ninterface UpdateTempBasket {\r\n type: \"UPDATE_TEMP_BASKET\"\r\n}\r\n\r\ninterface ClearBasketItems {\r\n type: \"CLEAR_BASKET_ITEMS\"\r\n}\r\n\r\ninterface UpsellDone {\r\n type: \"UPSELL_DONE\"\r\n}\r\n\r\ninterface ShowAllergen {\r\n type: \"SHOW_ALLERGEN\"\r\n vlaue: boolean;\r\n}\r\n\r\ninterface UpdatePaymentStatus {\r\n type: 'UPDATE_PAYMENT_STATUS',\r\n value: PaymentStatus\r\n}\r\n\r\ninterface AddCouponCodeAction {\r\n type: \"ADD_COUPON_CODE\";\r\n couponCode: string;\r\n}\r\n\r\ninterface DeleteCouponCodeAction {\r\n type: \"DELETE_COUPON_CODE\";\r\n couponCode: string;\r\n}\r\n\r\ninterface SetDiscountAges {\r\n type: \"SET_DISCOUNT_AGES\";\r\n value?: AgeRestrictedDiscount[];\r\n}\r\n\r\ninterface SetIsKefComplete {\r\n type: \"SET_IS_KEF_COMPLETE\",\r\n value: boolean;\r\n}\r\n\r\n// Declare a 'discriminated union' type. This guarantees that all references to 'type' properties contain one of the\r\n// declared type strings (and not any other arbitrary string).\r\ntype KnownAction = UpdateBasketAction | UpdateBasketDetailsAction | UpdateBasketItemQuantity | LoadingStartAction | LoadingEndAction | RemovebasketItem |\r\n UpdateOrderNumber | ClearBasket | SetShouldOfferUpsellToCustomer | setContinueClicked | setTableFormErrors | SetTableNumber | setNicknameFormErrors | SetNickname |\r\n UpdateTempBasket | ClearBasketItems | UpdatePaymentStatus |\r\n AddCouponCodeAction | DeleteCouponCodeAction | SetUpsells | UpsellDone | OpenToast | CloseToast | UpdateBasketAbortControllerAction | ResetMessageAction |\r\n SetDiscountAges | SetIsKefComplete | ShowAllergen;\r\n\r\nconst unloadedState: BasketState = {\r\n isLoading: false,\r\n upsellDone: false,\r\n showAllergen: false,\r\n isKefComplete: false,\r\n basket: {\r\n menuItems: [],\r\n totalPrice: 0,\r\n staffCardNumber: \"\",\r\n moreCardNumber: \"\",\r\n mopUpsells: [],\r\n mopCoupons: [] = [],\r\n calculateExternalDiscounts: false,\r\n isColleagueDiscountBasket: false,\r\n externalPromotionsApplied: false,\r\n calculateExternalDiscountsFailed: false,\r\n externalCalculationMessages: [],\r\n ageConfirmations: [],\r\n ageRestrictedDiscounts: [],\r\n },\r\n tmpBasket: {\r\n menuItems: [],\r\n totalPrice: 0,\r\n staffCardNumber: \"\",\r\n moreCardNumber: \"\",\r\n mopUpsells: [],\r\n mopCoupons: [] = [],\r\n calculateExternalDiscounts: false,\r\n isColleagueDiscountBasket: false,\r\n externalPromotionsApplied: false,\r\n calculateExternalDiscountsFailed: false,\r\n externalCalculationMessages: [],\r\n ageConfirmations: [],\r\n ageRestrictedDiscounts: [],\r\n },\r\n upsells: [],\r\n email: \"\", \r\n orderNumber: \"\", \r\n totalQuantity: 0,\r\n shouldOfferUpsellToCustomer: true,\r\n continueClicked: false,\r\n tableFormErrors: undefined,\r\n tableNumber: undefined,\r\n nicknameFormErrors: undefined,\r\n nickname: undefined,\r\n paymentStatus: PaymentStatus.UNSET,\r\n toastNotificationOpen: false,\r\n abortController: null\r\n};\r\n\r\n// ----------------\r\n// ACTION CREATORS - These are functions exposed to UI components that will trigger a state transition.\r\n// They don't directly mutate state, but they can have external side-effects (such as loading data).\r\n\r\nexport const actionCreators = {\r\n /*\r\n * HACK: This works under the assumption it is called directly before\r\n * returning to the BasketPage.\r\n *\r\n * BasketPage calls 'calculateBasket', which would typically abort our\r\n * request and therefor any changes to the MenuItem.\r\n *\r\n * To solve this, we call 'BASKET_UPDATE' directly. And then rely on\r\n * BasketPage to pass the changes to the backend.\r\n *\r\n * BasketPage calls 'calculateBasket' to reset the Kids Eat Free promotion\r\n * when navigating back from the UpsellPage onwards.\r\n *\r\n * Fletcher, 2024-04-30\r\n */\r\n updateBasketItem: (): AppThunkAction => (dispatch: Dispatch, getState) => {\r\n const appState = getState();\r\n\r\n // Get the current menu item.\r\n let currentBasketItem = appState.menuItemData?.menuItem;\r\n console.log(\"Current Menu Item: \", currentBasketItem, \"Basket: \", appState.basket);\r\n\r\n if (currentBasketItem) {\r\n // Setting total price to single price for basket view.\r\n currentBasketItem.menuItemTotalPrice = currentBasketItem.menuItemSinglePrice;\r\n\r\n const selectedSkus = getSelectedSkus(currentBasketItem.modifierGroups);\r\n currentBasketItem.modifierGroups.forEach((group: IMopModifierGroup) => {\r\n group.selected = shouldShowModifierGroup(group, selectedSkus, currentBasketItem?.sku);\r\n })\r\n\r\n // Find index of menu item in basket.\r\n let basketItemIndex = appState.basket?.basket.menuItems.findIndex(item => (\r\n item.basketMenuItemId === currentBasketItem?.basketMenuItemId\r\n ));\r\n\r\n if (basketItemIndex !== undefined && basketItemIndex > -1) {\r\n if (appState.basket) {\r\n // Create a new basket to map updated items to.\r\n let basket: IMopBasket = {\r\n ...appState.basket.basket,\r\n menuItems: []\r\n };\r\n\r\n console.log(\"Menu Items: \", appState.basket.basket.menuItems);\r\n\r\n if (appState.basket.basket.menuItems) {\r\n let basketItems: IMopMenuItemDetail[] = appState.basket.basket.menuItems.map((item, index) => {\r\n if (index === basketItemIndex) {\r\n return currentBasketItem;\r\n }\r\n\r\n return item;\r\n }) as IMopMenuItemDetail[];\r\n\r\n basket.menuItems = basketItems;\r\n\r\n const actualItems = basket.menuItems.filter((x: IMopMenuItemDetail) => x.isDiscount === undefined || x.isDiscount === false);\r\n const totalQuantity = actualItems.reduce((prev: number, curr: IMopMenuItemDetail) => prev + (curr.quantity || 0), 0);\r\n\r\n dispatch({\r\n type: 'BASKET_UPDATE',\r\n basket: basket,\r\n totalQuantity: totalQuantity,\r\n });\r\n\r\n // dispatch(actionCreators.calculateBasket(basket));\r\n }\r\n }\r\n }\r\n }\r\n },\r\n\r\n addMenuItemToBasket: (): AppThunkAction => (dispatch: Dispatch, getState) => {\r\n // Only load data if it's something we don't already have (and are not already loading)\r\n const appState = getState();\r\n\r\n let currentMenuItem = appState.menuItemData?.menuItem;\r\n\r\n let newBasket: IMopBasket = appState.basket?.basket ? appState.basket?.basket : JSON.parse(JSON.stringify(unloadedState.basket));\r\n\r\n if (currentMenuItem) {\r\n let basketId = Math.floor(Math.random() * 10000);\r\n let conflictIndex = appState.basket?.basket.menuItems.findIndex(item => item.basketMenuItemId === basketId);\r\n currentMenuItem.menuItemTotalPrice = currentMenuItem.menuItemSinglePrice; //Change total price back to single price\r\n currentMenuItem.basketMenuItemId = (conflictIndex && conflictIndex > -1) ? Math.floor(Math.random() * 1000) : basketId;\r\n\r\n const selectedSkus = getSelectedSkus(currentMenuItem.modifierGroups);\r\n currentMenuItem.modifierGroups.forEach((group: IMopModifierGroup) => {\r\n group.selected = shouldShowModifierGroup(group, selectedSkus, currentMenuItem?.sku);\r\n })\r\n\r\n newBasket.menuItems.push(currentMenuItem);\r\n console.log(\"Adding: \", currentMenuItem, \"To basket\");\r\n }\r\n\r\n if(currentMenuItem){\r\n let affiliation = `${appState.location?.selectedStore?.storeName || \"\"} ${appState.location?.selectedStore?.storeNumber || \"\"}`;\r\n addItemToGtagBasket(currentMenuItem, affiliation, currentMenuItem.menuItemTotalPrice);\r\n dispatch(actionCreators.calculateBasket(newBasket));\r\n } \r\n \r\n dispatch({ type: \"OPEN_TOAST\", value: false });\r\n setTimeout(() => dispatch({ type: \"CLOSE_TOAST\", value: false }), 6000);\r\n \r\n },\r\n\r\n updateBasketDetails: (values: any, callback?: any): AppThunkAction => (dispatch: Dispatch) => {\r\n dispatch({ type: 'BASKET_DETAILS_UPDATE', email: values.email, staffCardNumber: values.staffCardNumber, consent: values.consent });\r\n console.log(values);\r\n let saveValues = values.consent;\r\n\r\n if (values.staffCardNumber != \"\") {\r\n dispatch(actionCreators.calculateBasket(undefined, undefined, () => {\r\n callback && callback();\r\n })); \r\n }\r\n else{\r\n localStorage.removeItem(\"staffCardNumber\");\r\n callback && callback();\r\n }\r\n\r\n if(saveValues){\r\n localStorage.setItem(\"consent\", values.consent);\r\n localStorage.setItem(\"staffCardNumber\", values.staffCardNumber);\r\n localStorage.setItem(\"email\", values.email);\r\n }\r\n else{\r\n localStorage.removeItem(\"email\");\r\n localStorage.removeItem(\"consent\");\r\n localStorage.removeItem(\"staffCardNumber\");\r\n }\r\n \r\n \r\n \r\n },\r\n getUpsells: (basket?: IMopBasket): AppThunkAction => (dispatch: Dispatch, getState) => {\r\n const appState = getState();\r\n\r\n let channelIdentifier = appState.location?.channelIdentifier\r\n let pfIdentifier = localStorage.getItem(\"pfidentifier\")\r\n\r\n if (appState && appState.basket) {\r\n\r\n\r\n // dispatch({ type: \"SET_SHOULD_OFFER_UPSELL\", value: false });\r\n\r\n fetch(`${baseUrl()}/basket/${channelIdentifier}/recommendations${pfIdentifier ? \"?pfIdentifier=\" + pfIdentifier : \"\"}`,\r\n {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n },\r\n body: JSON.stringify(appState.basket.basket)\r\n })\r\n .then(response => response.json() as Promise)\r\n .then((data: any) => {\r\n if (data.status === 401) {\r\n dispatch(resetMessage(\"showExpireModal\"))\r\n }\r\n else {\r\n console.log(\"Recommendations\", data);\r\n dispatch({ type: 'SET_UPSELLS', upsells: data });\r\n }\r\n\r\n });\r\n\r\n\r\n }\r\n },\r\n addCouponCode: (couponCode: string, callback?: any): AppThunkAction => (dispatch: Dispatch, getState) => {\r\n console.log(\"addCouponCode: \" + couponCode);\r\n dispatch({ type: \"ADD_COUPON_CODE\", couponCode: couponCode });\r\n dispatch(actionCreators.calculateBasket(undefined, undefined, (basket: any) => {\r\n console.log(\"DONE CALCULATE BASKET\");\r\n callback && callback(true, basket);\r\n }));\r\n },\r\n deleteCouponCode: (couponCode: string, callback?: any): AppThunkAction => (dispatch: Dispatch, getState) => {\r\n console.log(\"deleteCouponCode: \" + couponCode);\r\n dispatch({ type: \"DELETE_COUPON_CODE\", couponCode: couponCode });\r\n dispatch(actionCreators.calculateBasket(undefined, undefined, (basket: any) => {\r\n console.log(\"DONE CALCULATE BASKET\");\r\n callback && callback(true, basket);\r\n }));\r\n },\r\n updateBasketItemQuantity: (basketItemId: number, quantity: number): AppThunkAction => (dispatch: Dispatch, getState) => {\r\n dispatch({ type: 'LOADING_START' }); \r\n const appState = getState();\r\n\r\n if(appState.basket){\r\n let basketItemIndex: number = appState.basket.basket.menuItems.findIndex((item: IMopMenuItemDetail) => item.basketMenuItemId === basketItemId);\r\n console.log(\"Updating basket quantity to \", quantity, \"at index\", basketItemIndex);\r\n\r\n let currentMenuItem = appState.basket.basket.menuItems[basketItemIndex];\r\n let affiliation = `${appState.location?.selectedStore?.storeName || \"\"} ${appState.location?.selectedStore?.storeNumber || \"\"}`;\r\n if(quantity > currentMenuItem.quantity){ //Increase quantity\r\n addItemToGtagBasket({...currentMenuItem, quantity: 1}, affiliation, currentMenuItem.menuItemSinglePrice);\r\n }\r\n else{ //Decrease\r\n removeItemFromGtagBasket({...currentMenuItem, quantity: 1}, affiliation);\r\n }\r\n\r\n if(quantity > 0){\r\n\r\n let price: number = calculateMenuItemTotalPrice(appState.basket.basket.menuItems[basketItemIndex], false);\r\n\r\n dispatch({ type: \"UPDATE_BASKET_ITEM_QUANTITY\", basketItemIndex: basketItemIndex, quantity: quantity, price: price });\r\n }\r\n else{\r\n dispatch({ type: \"REMOVE_BASKET_ITEM\", basketItemIndex: basketItemIndex });\r\n }\r\n dispatch(actionCreators.calculateBasket()); //update basket price with new quantity\r\n }\r\n\r\n },\r\n\r\n setDiscountAges: (ageRestrictedDiscounts?: AgeRestrictedDiscount[], callback?: any): AppThunkAction => (dispatch: Dispatch, getState) => {\r\n const appState = getState();\r\n\r\n if (appState && appState.basket) {\r\n dispatch({ type: \"SET_DISCOUNT_AGES\", value: ageRestrictedDiscounts });\r\n callback && callback();\r\n }\r\n },\r\n\r\n calculateBasket: (basket?: IMopBasket, applyAgeRestrictedDiscounts?: boolean, callback?: any): AppThunkAction => (dispatch, getState) => {\r\n const appState = getState();\r\n\r\n let channelIdentifier = appState.location?.channelIdentifier\r\n let pfIdentifier = localStorage.getItem(\"pfidentifier\")\r\n const abortController = appState.basket?.abortController;\r\n\r\n basket = basket != undefined ? basket : appState.basket?.basket; //If parameter undefined, just update current basket.\r\n\r\n if (appState?.basket?.isKefComplete === true) {\r\n applyAgeRestrictedDiscounts = true;\r\n }\r\n\r\n console.log(\"fcc\", abortController)\r\n if (abortController) {\r\n abortController.abort();\r\n }\r\n\r\n const newAbortController = new AbortController();\r\n\r\n dispatch({ type: 'UPDATE_BASKET_ABORT_CONTROLLER', abortController: newAbortController });\r\n\r\n const requestOptions: RequestInit = {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify(basket || appState.basket?.basket),\r\n signal: newAbortController.signal,\r\n };\r\n\r\n fetch(`${baseUrl()}/basket/${channelIdentifier}/calculatebasket?applyAgeRestrictedDiscounts=${applyAgeRestrictedDiscounts ?? false}${pfIdentifier ? '&pfIdentifier=' + pfIdentifier : ''}`, requestOptions)\r\n .then((response) => response.json() as Promise)\r\n .then((data: any) => {\r\n if (data.status === 401) {\r\n dispatch(resetMessage(\"showExpireModal\"))\r\n }\r\n else {\r\n console.log('Setting basket', data);\r\n const actualItems = data.menuItems.filter((x:any) => x.isDiscount == null || x.isDiscount == false);\r\n const totalQuantity = actualItems.reduce((prev:any, curr:any) => prev + (curr.quantity || 0), 0);\r\n dispatch({ type: 'BASKET_UPDATE', basket: data, totalQuantity: totalQuantity });\r\n callback && callback(data);\r\n }\r\n })\r\n .catch((error) => {\r\n if (error.name === 'AbortError') {\r\n console.log('Fetch request aborted.');\r\n } else {\r\n console.error('Error during fetch:', error);\r\n }\r\n });\r\n },\r\n\r\n clearBasket: () : AppThunkAction => (dispatch) => {\r\n\r\n dispatch({ type: \"CLEAR_BASKET\" });\r\n },\r\n\r\n updateOrderNumber: (orderNumber: string) : AppThunkAction => (dispatch) => {\r\n dispatch({ type: \"UPDATE_ORDER_NUMBER\", orderNumber: orderNumber });\r\n },\r\n\r\n setShouldOfferUpsell: (value: boolean) : AppThunkAction => (dispatch) => {\r\n dispatch({ type: \"SET_SHOULD_OFFER_UPSELL\", value: value });\r\n },\r\n\r\n upsellDone: (): AppThunkAction => (dispatch) => {\r\n dispatch({ type: \"UPSELL_DONE\" });\r\n },\r\n\r\n showAllergen: (value: boolean): AppThunkAction => (dispatch: Dispatch) => {\r\n dispatch({ type: 'SHOW_ALLERGEN', value });\r\n },\r\n\r\n setIsKefComplete: (value: boolean): AppThunkAction => (dispatch: Dispatch) => {\r\n dispatch({ type: 'LOADING_START' });\r\n dispatch({ type: \"SET_IS_KEF_COMPLETE\", value: value });\r\n dispatch(actionCreators.calculateBasket(undefined, value));\r\n },\r\n\r\n setContinueClicked: (value: boolean): AppThunkAction => (dispatch) => {\r\n dispatch({ type: \"SET_CONTINUE_CLICKED\", value: value });\r\n },\r\n\r\n setTableFormErrors: (value: string | undefined): AppThunkAction => (dispatch) => {\r\n dispatch({ type: \"SET_TABLE_FORM_ERRORS\", value: value });\r\n },\r\n\r\n setTableNumber: (value: number): AppThunkAction => (dispatch) => {\r\n dispatch({ type: \"SET_TABLE_NUMBER\", value: value});\r\n },\r\n\r\n setNicknameFormErrors: (value: string | undefined): AppThunkAction => (dispatch) => {\r\n dispatch({ type: \"SET_NICKNAME_FORM_ERRORS\", value: value });\r\n },\r\n\r\n setNickname: (value: string): AppThunkAction => (dispatch) => {\r\n dispatch({ type: \"SET_NICKNAME\", value: value });\r\n },\r\n\r\n updateTempBasket: (callback?: () => void) : AppThunkAction => (dispatch) => {\r\n dispatch({ type: \"UPDATE_TEMP_BASKET\"});\r\n callback && callback();\r\n },\r\n\r\n clearBasketItems: () : AppThunkAction => (dispatchEvent) => {\r\n dispatchEvent({ type: 'CLEAR_BASKET_ITEMS' })\r\n },\r\n\r\n updatePaymentStatus: (value: PaymentStatus) : AppThunkAction => (dispatchEvent) =>{ \r\n dispatchEvent({ type: \"UPDATE_PAYMENT_STATUS\", value: value });\r\n }\r\n};\r\n\r\n// ----------------\r\n// REDUCER - For a given state and action, returns the new state. To support time travel, this must not mutate the old state.\r\n\r\n\r\n\r\nexport const reducer: Reducer = (state: BasketState = JSON.parse(JSON.stringify(unloadedState)), incomingAction: Action): BasketState => {\r\n const action = incomingAction as KnownAction;\r\n \r\n const _unloadedState = JSON.parse(JSON.stringify(unloadedState));\r\n //console.log(\"UNLOADED STATE: \", _unloadedState.basket.menuItems);\r\n switch (action.type) {\r\n case 'BASKET_UPDATE':\r\n return {\r\n ...state,\r\n isLoading: false,\r\n totalQuantity: action.totalQuantity,\r\n basket: action.basket\r\n };\r\n case 'LOADING_START':\r\n return {\r\n ...state,\r\n isLoading: true\r\n };\r\n case 'LOADING_END':\r\n return {\r\n ...state,\r\n isLoading: false\r\n };\r\n case 'BASKET_DETAILS_UPDATE':\r\n return {\r\n ...state,\r\n email: action.email,\r\n basket: {\r\n ...state.basket,\r\n staffCardNumber: action.staffCardNumber,\r\n calculateExternalDiscounts: true\r\n }\r\n };\r\n case 'REMOVE_BASKET_ITEM':\r\n if(state.basket.menuItems.length > 1){ //If there will still be items left\r\n return {\r\n ...state,\r\n basket: {\r\n ...state.basket,\r\n menuItems: [\r\n ...state.basket.menuItems.slice(0, action.basketItemIndex),\r\n ...state.basket.menuItems.slice(action.basketItemIndex + 1)\r\n ]\r\n }\r\n }\r\n }else{ //Else just use unloadedState\r\n console.log(\"Debug: Loading default basket state\", _unloadedState.basket);\r\n return {\r\n ..._unloadedState,\r\n // NOTE:This is required to allow us to abort existing `calculateBasket`\r\n // requests, and prevent stale data. - Fletcher, 2024-05-16.\r\n abortController: state.abortController,\r\n email: state.email,\r\n // NOTE: DO NOT CHANGE. This is used to solve a weird issue where the\r\n // unloadedState / initialState is somehow mutated.\r\n // 1. Make sure you're not logged in as a colleague. If you are, log out.\r\n // 2. Log in.\r\n // 3. Add an item to your basket.\r\n // 4. Remove the item from your basket.\r\n // Log the `unloadedState` or `_unloadedState`. You'll notice that it\r\n // contains the menuItem, even though it should be empty. Thus, we don't\r\n // rely on the `unloadedState` to clear the basket.\r\n // - Fletcher, 2024-05-16.\r\n basket: {\r\n menuItems: [],\r\n totalPrice: 0,\r\n staffCardNumber: state.basket.staffCardNumber,\r\n moreCardNumber: \"\",\r\n mopUpsells: [],\r\n mopCoupons: [] = [],\r\n calculateExternalDiscounts: false,\r\n isColleagueDiscountBasket: false,\r\n externalPromotionsApplied: false,\r\n calculateExternalDiscountsFailed: false,\r\n externalCalculationMessages: [],\r\n ageConfirmations: [],\r\n ageRestrictedDiscounts: [],\r\n }\r\n }\r\n }\r\n break;\r\n case 'UPDATE_BASKET_ITEM_QUANTITY':\r\n console.log(\"Updating quantity of \", state.basket.menuItems[action.basketItemIndex], \"to \", action.quantity);\r\n return update(state, {\r\n basket: {\r\n menuItems: {\r\n [action.basketItemIndex]: {\r\n $merge: {\r\n quantity: action.quantity,\r\n menuItemTotalPrice: action.price\r\n }\r\n }\r\n },\r\n calculateExternalDiscounts: { $set: true }\r\n }\r\n });\r\n case 'UPDATE_BASKET_ABORT_CONTROLLER':\r\n return {\r\n ...state,\r\n abortController: action.abortController,\r\n };\r\n case 'CLEAR_BASKET':\r\n console.log(\"Clearing basket\", {..._unloadedState});\r\n return {\r\n ..._unloadedState,\r\n email: state.email,\r\n basket: {\r\n ..._unloadedState.basket,\r\n staffCardNumber: state.basket.staffCardNumber,\r\n }\r\n }\r\n case 'UPDATE_ORDER_NUMBER':\r\n console.log(\"Updating order number\");\r\n return {\r\n ...state,\r\n orderNumber: action.orderNumber\r\n }\r\n case 'SET_SHOULD_OFFER_UPSELL':\r\n // debugger;\r\n return {\r\n ...state,\r\n shouldOfferUpsellToCustomer: action.value\r\n }\r\n\r\n case 'UPSELL_DONE':\r\n // debugger;\r\n return {\r\n ...state,\r\n upsellDone: true,\r\n shouldOfferUpsellToCustomer: false\r\n }\r\n\r\n case 'SHOW_ALLERGEN':\r\n return {\r\n ...state,\r\n showAllergen: action.value,\r\n }\r\n\r\n case 'SET_UPSELLS':\r\n var upsells = action.upsells;\r\n\r\n if (upsells.length > 0) {\r\n return {\r\n ...state,\r\n upsells: upsells,\r\n shouldOfferUpsellToCustomer: true,\r\n\r\n }\r\n } else {\r\n return {\r\n ...state\r\n }\r\n }\r\n\r\n case 'SET_CONTINUE_CLICKED':\r\n return {\r\n ...state,\r\n continueClicked: action.value\r\n }\r\n \r\n case 'SET_TABLE_FORM_ERRORS':\r\n return {\r\n ...state,\r\n tableFormErrors: action.value\r\n }\r\n\r\n case 'SET_TABLE_NUMBER':\r\n return {\r\n ...state,\r\n tableNumber: action.value\r\n }\r\n\r\n case 'SET_NICKNAME_FORM_ERRORS':\r\n return {\r\n ...state,\r\n nicknameFormErrors: action.value\r\n }\r\n\r\n case 'SET_NICKNAME':\r\n return {\r\n ...state,\r\n nickname: action.value\r\n }\r\n\r\n case 'OPEN_TOAST':\r\n return {\r\n ...state,\r\n toastNotificationOpen:true\r\n }\r\n\r\n case 'CLOSE_TOAST':\r\n return {\r\n ...state,\r\n toastNotificationOpen: false\r\n }\r\n case 'UPDATE_TEMP_BASKET':\r\n return {\r\n ...state,\r\n tmpBasket: state.basket\r\n }\r\n case 'CLEAR_BASKET_ITEMS':\r\n return {\r\n ...state,\r\n basket: {...unloadedState.basket}\r\n }\r\n case 'UPDATE_PAYMENT_STATUS':\r\n return {\r\n ...state,\r\n paymentStatus: action.value\r\n }\r\n\r\n case 'ADD_COUPON_CODE':\r\n console.log(`ADD_COUPON_CODE: code=${action.couponCode}, pre-calculateExternalDiscounts=${state.basket.calculateExternalDiscounts}`);\r\n let p: IMopCoupon[] = [];\r\n if (state.basket.mopCoupons) {\r\n p = state.basket.mopCoupons;\r\n }\r\n p = [...p, { couponCode: action.couponCode, reason: \"\", errorCode: 0, rejected: false }];\r\n return {\r\n ...state,\r\n basket: {\r\n ...state.basket,\r\n mopCoupons: p,\r\n calculateExternalDiscounts: true\r\n }\r\n }\r\n case 'DELETE_COUPON_CODE':\r\n const _coupons = state.basket.mopCoupons.filter((c: IMopCoupon) => c.couponCode != action.couponCode);\r\n state.basket.menuItems = state.basket.menuItems.filter((mi:IMopMenuItemDetail) => !mi.sku.includes(action.couponCode));\r\n const _calculateExternalDiscounts = _coupons.length > 0 || (state.basket.staffCardNumber != \"\" && state.basket.staffCardNumber != null);\r\n console.log(`DELETE_COUPON_CODE: code=${action.couponCode}, calculateExternalDiscounts=${_calculateExternalDiscounts}`);\r\n return {\r\n ...state,\r\n basket: {\r\n ...state.basket,\r\n mopCoupons: _coupons,\r\n calculateExternalDiscounts: _calculateExternalDiscounts\r\n }\r\n }\r\n case 'SET_DISCOUNT_AGES':\r\n return {\r\n ...state,\r\n basket: {\r\n ...state.basket,\r\n ageConfirmations: action.value,\r\n },\r\n }\r\n\r\n case \"SET_IS_KEF_COMPLETE\":\r\n return {\r\n ...state,\r\n isKefComplete: action.value,\r\n }\r\n\r\n default:\r\n return state;\r\n }\r\n return state;\r\n};\r\n","import * as Yup from \"yup\";\r\n\r\nexport const enterEmailSchema = Yup.object().shape({\r\n email: Yup.string().email(\"Email must be valid\")\r\n .test(\"valid-domain\", \"Must enter a morrisons email address\", (value) => {\r\n if (value && localStorage.getItem('isLoggedIn') === \"true\") {\r\n const [, domain] = value.split(\"@\");\r\n return domain === \"morrisonsplc.co.uk\";\r\n }\r\n return true;\r\n }).required(\"Email is required.\"),\r\n staffCardNumber: Yup.string()\r\n .nullable()\r\n .test('verify-card-number', 'Please enter a valid More Card card number', function (value) {\r\n const { path } = this;\r\n const isLoggedIn = localStorage.getItem('isLoggedIn') === \"true\";\r\n const genericCardErrorMessage = \"Please enter a valid More Card card number\";\r\n\r\n if (!isLoggedIn) {\r\n return true; // Skip validation if not logged in\r\n }\r\n\r\n if (value === null || value === \"\") {\r\n return this.createError({ path: path, message: genericCardErrorMessage });\r\n }\r\n\r\n if (typeof value !== 'string' || !/^[0-9]+$/.test(value)) {\r\n return this.createError({ path: path, message: genericCardErrorMessage });\r\n }\r\n\r\n const cardPrefix = \"98261\";\r\n if (value.substring(0, cardPrefix.length) !== cardPrefix || value.length !== 19) {\r\n return this.createError({ path: path, message: genericCardErrorMessage });\r\n }\r\n\r\n return true;\r\n })\r\n});\r\n\r\nexport const cardCheckoutSchema = Yup.object().shape({\r\n Name: Yup.string().required(\"Please enter your name as it appears on the card\"),\r\n Expiry: Yup.string().required(\"Please enter the card expiry date in MM/YY format\")\r\n});\r\n\r\nexport const tableNumberSchema = Yup.object().shape({\r\n TableNumber: Yup.number().max(999, \"Maximum 3 numbers\")\r\n});\r\n\r\nexport const nicknameSchema = Yup.object().shape({\r\n Nickname: Yup.string().max(20, \"Maximum 20 characters\")\r\n}); ","import React, { useState } from 'react';\r\nimport { IonInput } from '@ionic/react';\r\nimport {\r\n Field,\r\n FieldInputProps,\r\n FieldProps,\r\n FormikProps,\r\n } from 'formik';\r\n\r\ninterface GenericInputProps {\r\n name: string;\r\n ref?: any;\r\n className?: string;\r\n IonInputProps?: any;\r\n onError?: () => void;\r\n onIonChange?: (event: CustomEvent, field: FieldInputProps, form: FormikProps) => void;\r\n}\r\n\r\n\r\nconst GenericInput = ({ name, ref, IonInputProps, className, onError, onIonChange}: GenericInputProps) => {\r\n\r\n //IonInputProps = { type=\"email\", autofocus={true} } placeholder=\"Enter email...\"\r\n //className=\"emailInput \"\r\n\r\n return (\r\n \r\n {({ field, meta, form }: FieldProps) => {\r\n var error = (meta.error && meta.touched) ? meta.error : false;\r\n if(error){\r\n onError && onError();\r\n }\r\n return
\r\n { onIonChange != undefined ? onIonChange(e, field, form) : field.onChange(e); }}> \r\n {error &&
{error}
} \r\n
\r\n }}\r\n
\r\n )\r\n};\r\n\r\nexport default GenericInput;","import React, { ComponentProps } from \"react\";\r\nimport { IonButton } from '@ionic/react';\r\n\r\nimport './Button.scss';\r\n\r\ninterface IButtonProps extends ComponentProps {\r\n navigate?: never;\r\n rounded?: boolean;\r\n uppercase?: boolean;\r\n}\r\n\r\nfunction Button(props: IButtonProps) {\r\n return (\r\n
\r\n \r\n {props.children}\r\n \r\n
\r\n )\r\n}\r\n\r\nexport default Button;\r\n","import React, { useEffect, useState } from 'react';\r\nimport { IonRow, IonCol, IonContent, IonButton, IonPage, IonItem, IonLabel, IonCheckbox, IonText } from '@ionic/react';\r\nimport './EnterEmail.scss';\r\nimport { useHistory, useLocation } from \"react-router-dom\";\r\nimport {\r\n Formik,\r\n Field,\r\n FieldProps,\r\n} from 'formik';\r\nimport { connect } from 'react-redux';\r\nimport * as BasketStore from '../store/BasketStore';\r\nimport { ApplicationState } from '../store';\r\nimport { enterEmailSchema } from '../helpers/formValidationHelpers';\r\nimport GenericInput from '../inputs/GenericInput';\r\nimport 'react-slidedown/lib/slidedown.css'\r\nimport { baseUrl } from '../helpers/configHelper';\r\nimport Button from '../components/Button';\r\n\r\ninterface EmailProps {\r\n email: string\r\n staffCardNumber: string;\r\n consent: boolean;\r\n}\r\n\r\ntype EmailMergeProps =\r\n typeof BasketStore.actionCreators\r\n & EmailProps\r\n\r\nconst EnterEmail: React.FC = (props: EmailMergeProps) => {\r\n let history = useHistory();\r\n const location = useLocation();\r\n const [showStaffDiscount, setShowStaffDiscount] = useState(false); //localStorage.getItem(\"staffCardNumber\") != null - To show it when we find a staffCardNumber in localStorage\r\n const [initialValues, setInitialValues] = useState({});\r\n\r\n useEffect(() => {\r\n //console.log( \"Local storage: \", localStorage.getItem(\"email\"));\r\n setInitialValues({ email: localStorage.getItem(\"email\") || props.email, staffCardNumber: localStorage.getItem(\"staffCardNumber\") || props.staffCardNumber, consent: localStorage.getItem(\"consent\") == \"true\" });\r\n }, [location.pathname])\r\n\r\n return (\r\n \r\n \r\n
\r\n
Where should we send your receipt?
\r\n {\r\n //console.log(\"Submitting\");\r\n props.updateBasketDetails(values, () => {\r\n setTimeout(() => {\r\n //console.log(\"Pushing to order\");\r\n history.push({\r\n pathname: `/orderconfirmation` //Pushes to confirmation only when basket has been fully updated.\r\n });\r\n }, 500);\r\n });\r\n }}\r\n >\r\n {props => (\r\n
\r\n {localStorage.getItem('isLoggedIn') === \"true\" ? \"Your Morrisons email address\" : \"Your email address\"}*\r\n \r\n Your More Card number\r\n { setShowStaffDiscount(true) }}\r\n />\r\n\r\n Earn exclusive offers when you order from Morrisons Cafe. You'll find your More Card number in your app or your card.\r\n {localStorage.getItem('isLoggedIn') !== \"true\" && \"morrisons-save-card\"}\r\n \r\n {({ field, meta }: FieldProps) => {\r\n return
\r\n \r\n Remember my details on this device\r\n { props.setFieldValue(field.name, !field.value) }} />\r\n \r\n
\r\n }}\r\n
\r\n {/* Pressing Enter will not submit form without this hidden input */}\r\n
\r\n
\r\n \r\n Pay\r\n \r\n
\r\n
\r\n \r\n )}\r\n \r\n
\r\n
\r\n\r\n
\r\n );\r\n};\r\n\r\nconst mapStateToProps = (state: ApplicationState, ownProps: any) => ({\r\n email: state.basket?.email,\r\n staffCardNumber: state.basket?.basket.staffCardNumber\r\n});\r\n\r\nconst mapDispatchToProps = (dispatch: any) => {\r\n return {\r\n updateBasketDetails: (values: any, callback: any) => dispatch(BasketStore.actionCreators.updateBasketDetails(values, callback))\r\n };\r\n};\r\n\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(EnterEmail as any);\r\n","import React, { useState, useEffect, useRef } from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { getConfig } from '../helpers/configHelper';\r\nimport { ApplicationState } from '../store';\r\n\r\ninterface GooglePayProps {\r\n TotalPrice: number,\r\n GooglePayButtonContainer: HTMLElement,\r\n GooglePayButtonClickHandler: (paymentToken: any) => void,\r\n ShouldPaymentStart: (callback: (res: boolean) => void) => void,\r\n LivePayments: boolean\r\n}\r\n\r\nconst GooglePay: React.FC = (props) => {\r\n \r\n //const [totalPrice, setTotalPrice] = useState(props.TotalPrice.toString());\r\n const totalPrice = useRef(useSelector((state: ApplicationState) => state.basket?.basket.totalPrice)?.toString() || \"1.23\");\r\n\r\n //Step 1 - Define Google Pay API Version\r\n const baseRequest = {\r\n apiVersion: 2,\r\n apiVersionMinor: 0\r\n };\r\n\r\n //Step 2 - Request a payment token from Cybersrouce\r\n const tokenizationSpecification = {\r\n type: 'PAYMENT_GATEWAY',\r\n parameters: {\r\n 'gateway': 'cybersource',\r\n 'gatewayMerchantId': getConfig().isMarket ? props.LivePayments ? \"barcfuse1548282\" : \"marketkitchen_sit\" : props.LivePayments ? \"barcfuse1539368\" : 'morrisonscafeapp_sit'\r\n }\r\n };\r\n\r\n //Step 3\r\n const allowedCardNetworks = [\"AMEX\", \"JCB\", \"MASTERCARD\", \"VISA\"];\r\n const allowedAuthMethods = [\"PAN_ONLY\", \"CRYPTOGRAM_3DS\"];\r\n\r\n const merchantInfo = {\r\n merchantName: getConfig().isMarket ? \"Market Kitchen\" : \"Morrisons Cafe\",\r\n merchantId: props.LivePayments ? getConfig().isMarket ? \"BCR2DN6T36MOD52S\" : \"BCR2DN6T36MOD52S\" : \"12345678901234567890\"\r\n }\r\n\r\n //Step 4\r\n const baseCardPaymentMethod: any = {\r\n type: \"CARD\",\r\n parameters: {\r\n allowedCardNetworks: allowedCardNetworks,\r\n allowedAuthMethods: allowedAuthMethods,\r\n assuranceDetailsRequired: true\r\n }\r\n }\r\n\r\n const cardPaymentMethod = Object.assign(\r\n {tokenizationSpecification: tokenizationSpecification},\r\n baseCardPaymentMethod\r\n );\r\n\r\n let paymentDataRequest: google.payments.api.PaymentDataRequest = {\r\n ...baseRequest, //apiVersion, apiVersionMinor\r\n merchantInfo: merchantInfo,\r\n allowedPaymentMethods: [\r\n cardPaymentMethod\r\n ],\r\n transactionInfo: {\r\n totalPriceStatus: \"FINAL\",\r\n totalPrice: totalPrice.current,\r\n countryCode: \"GB\",\r\n currencyCode: \"GBP\",\r\n checkoutOption: \"COMPLETE_IMMEDIATE_PURCHASE\"\r\n }\r\n }\r\n\r\n const isReadyToPayRequest: google.payments.api.IsReadyToPayRequest = {\r\n ...baseRequest,\r\n allowedPaymentMethods: [\r\n cardPaymentMethod\r\n ]\r\n }\r\n\r\n let paymentsClient = new google.payments.api.PaymentsClient({ environment: props.LivePayments ? \"PRODUCTION\" : \"TEST\" });\r\n \r\n const googleButtonOnClick = () => {\r\n //console.log(paymentDataRequest);\r\n //console.log(\"PaymentDataRequest: \", paymentDataRequest, totalPrice, props.TotalPrice);\r\n paymentsClient.loadPaymentData({ ...paymentDataRequest, transactionInfo: {...paymentDataRequest.transactionInfo, totalPrice: totalPrice.current}})\r\n .then((paymentData: google.payments.api.PaymentData) => {\r\n props.GooglePayButtonClickHandler(paymentData) // CALLBACK WITH BASE64 TOKEN\r\n })\r\n .catch((err) => {\r\n console.log(err);\r\n }) \r\n }\r\n\r\n const clearElements = (container: HTMLElement) => {\r\n while (container.firstChild){\r\n container.removeChild(container.firstChild);\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n paymentsClient.isReadyToPay( isReadyToPayRequest )\r\n .then((response: google.payments.api.IsReadyToPayResponse) => {\r\n //console.log(response);\r\n if(response.result){\r\n //Add Google Pay payment button\r\n let button = paymentsClient.createButton({ \r\n onClick: () => {\r\n //console.log(\"Total Price state: \" + totalPrice);\r\n props.ShouldPaymentStart((res) => {\r\n if(res){\r\n googleButtonOnClick(); \r\n } \r\n })\r\n },\r\n buttonColor: \"black\",\r\n buttonSizeMode: \"fill\",\r\n buttonType: \"plain\"\r\n })\r\n clearElements(props.GooglePayButtonContainer);\r\n props.GooglePayButtonContainer.appendChild(button);\r\n }\r\n })\r\n .catch((err) => {\r\n console.log(err);\r\n })\r\n }, [props.GooglePayButtonContainer])\r\n\r\n useEffect(() => {\r\n //console.log(\"Price changed in GOogle component\", props.TotalPrice);\r\n //setTotalPrice(props.TotalPrice.toString());\r\n }, [props.TotalPrice])\r\n\r\n return(\r\n
\r\n\r\n
\r\n )\r\n};\r\n\r\nexport default GooglePay;","import React, { useState, useEffect } from 'react';\r\nimport \"./ApplePay.scss\"\r\nimport { baseUrl, getConfig } from '../helpers/configHelper';\r\nimport { add } from 'ionicons/icons';\r\nimport { useSelector } from 'react-redux';\r\nimport { ApplicationState } from '../store';\r\n\r\ndeclare global {\r\n interface Window {\r\n // @ts-ignore\r\n ApplePaySession: ApplePaySession;\r\n }\r\n}\r\n\r\ninterface IProps {\r\n Debug?: boolean,\r\n TotalPrice: number,\r\n SetShowButton: React.Dispatch>,\r\n ApplePayButtonClickHandler: (paymentToken: ApplePayJS.ApplePayPaymentToken, session: ApplePaySession) => void,\r\n ApplePayButton?: HTMLDivElement,\r\n ShouldPaymentStart: (callback: (res: boolean) => void) => void\r\n}\r\n\r\ninterface MerchantDetails {\r\n MerchantIdentifier: string;\r\n StoreName: string;\r\n}\r\n\r\nconst ApplePay: React.FC = (props) => {\r\n \r\n const [status, setStatus] = useState([]);\r\n const [merchantDetails, setMerchantDetails] = useState({ MerchantIdentifier: \"\", StoreName: \"\"});\r\n const basketStore = useSelector((state: ApplicationState) => state.basket);\r\n \r\n var request: ApplePayJS.ApplePayPaymentRequest = {\r\n countryCode: \"GB\", \r\n currencyCode: \"GBP\",\r\n supportedNetworks: [\"visa\", \"masterCard\", \"amex\", \"discover\"],\r\n merchantCapabilities: [\"supports3DS\"],\r\n total: {\r\n type: \"final\",\r\n label: getConfig().isMarket ? \"Market Kitchen Order\" : \"Morrisons Cafe Order\",\r\n amount: basketStore?.basket.totalPrice.toString() || \"1.23\"\r\n }\r\n }\r\n\r\n const beginPayment = () => {\r\n \r\n var session = new ApplePaySession(3, request);\r\n //console.log(\"Created a new apple pay session\", request);\r\n\r\n addToStatus(\"Created a new ApplePaySession\");\r\n \r\n session.onvalidatemerchant = (e: ApplePayJS.ApplePayValidateMerchantEvent) => {\r\n addToStatus(\"Merchant has been validated\");\r\n //console.log(e);\r\n //var validationUrl = `https://${e.validationURL}/paymentSession`;\r\n fetch(baseUrl() + \"/api/checkout/RequestApplePayPaymentSession\", {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\"\r\n },\r\n body: JSON.stringify({\r\n EndpointURL: e.validationURL\r\n })\r\n })\r\n .then(res => res.json() as Promise)\r\n .then(res => {\r\n addToStatus(\"Successfully requested an applepaypayment session from the server\");\r\n //console.log(res);\r\n session.completeMerchantValidation(res); \r\n\r\n /*\r\n Is the Domain verified properly?\r\n https://stackoverflow.com/questions/55072781/apple-pay-completemerchantvalidation-cancels-session\r\n \r\n\r\n */\r\n })\r\n .catch(err => {\r\n addToStatus(\"Could not request an applepaysession\");\r\n //console.log(err);\r\n \r\n }) \r\n } \r\n\r\n session.onpaymentmethodselected = (paymentMethodSelected) => {\r\n //console.log(\"Payment method has been selected, now completing it\", paymentMethodSelected);\r\n addToStatus(\"Payment method selected: \"+ paymentMethodSelected.paymentMethod.displayName);\r\n session.completePaymentMethodSelection({\r\n newTotal: {\r\n type: \"final\",\r\n label: getConfig().isMarket ? \"Market Kitchen Order\" : \"Morrisons Cafe Order\",\r\n amount: basketStore?.basket.totalPrice.toString() || \"1.23\"\r\n }\r\n });\r\n\r\n }\r\n\r\n\r\n session.onshippingcontactselected = (shippingContactSelected) => {\r\n //console.log(\"Shipping contact selected, now completing \", shippingContactSelected);\r\n addToStatus(\"Shipping contact selected\");\r\n session.completeShippingContactSelection({\r\n newTotal: {\r\n type: \"final\",\r\n label: getConfig().isMarket ? \"Market Kitchen Order\" : \"Morrisons Cafe Order\",\r\n amount: basketStore?.basket.totalPrice.toString() || \"1.23\"\r\n }\r\n });\r\n }\r\n\r\n session.onshippingmethodselected = (shippingSelected) => {\r\n //console.log(\"Shipping method contact selected\", shippingSelected);\r\n addToStatus(\"Shipping method selected\");\r\n session.completeShippingMethodSelection({\r\n newTotal: {\r\n type: \"final\",\r\n label: getConfig().isMarket ? \"Market Kitchen Order\" : \"Morrisons Cafe Order\",\r\n amount: basketStore?.basket.totalPrice.toString() || \"1.23\"\r\n }\r\n })\r\n }\r\n\r\n session.onpaymentauthorized = (paymentAuthorizedEvent) => {\r\n addToStatus(\"Payment has been authorized, now sending to Cybersource\\n\" + JSON.stringify(paymentAuthorizedEvent));\r\n //console.log(\"Payment has been authorized\", paymentAuthorizedEvent);\r\n var paymentToken = paymentAuthorizedEvent.payment.token;\r\n var paymentData = paymentToken.paymentData;\r\n //console.log(paymentToken.paymentMethod); // displayName, network, type = debit, credit, prepaid, store\r\n //console.log(paymentData); // JSON that's sent to Cybersource, paymentData.data, https://developer.apple.com/library/archive/documentation/PassKit/Reference/PaymentTokenJSON/PaymentTokenJSON.html#//apple_ref/doc/uid/TP40014929-CH8\r\n props.ApplePayButtonClickHandler(paymentToken, session);\r\n }\r\n\r\n session.oncancel = (cancelEvent) => {\r\n addToStatus(`Payment has been cancelled.`);\r\n }\r\n\r\n session.begin();\r\n }\r\n\r\n const showApplePayButton = () => {\r\n addToStatus(\"We can make payments using the active card on this device, showing apple pay button\");\r\n if(props.ApplePayButton != undefined){\r\n addToStatus(\"ApplePayButton is defined\");\r\n props.SetShowButton(true); // Display Apple Pay button here.\r\n //console.log(\"Showing apple pay button with price of \", totalPrice); \r\n } \r\n else{\r\n addToStatus(\"Cannot find ApplePayButton\");\r\n }\r\n }\r\n\r\n const checkForApplePay = () => {\r\n if(window.ApplePaySession && merchantDetails){\r\n addToStatus(\"Apple Pay Session found, now checking if we can make payments with active card\");\r\n var merchantIdentifier = merchantDetails.MerchantIdentifier;\r\n var promise = ApplePaySession.canMakePaymentsWithActiveCard(merchantIdentifier);\r\n promise.then((canMakePayments) => {\r\n\r\n if (canMakePayments && props.TotalPrice > 0){\r\n addToStatus(\"We can make a payment with the active card in Apple Pay wallet.\");\r\n showApplePayButton();\r\n } \r\n else if (ApplePaySession.canMakePayments() && props.TotalPrice > 0){\r\n addToStatus(\"canMakePaymentsWithActive card returned false. canMakePayments returned true but card is not legible for web payments\")\r\n showApplePayButton();\r\n } \r\n else{\r\n addToStatus(\"We cannot make any payments on this device, both canMakePaymentsWithActiveCard and canMakePayments returned false.\");\r\n }\r\n \r\n }).catch((reason) => {\r\n addToStatus(`Error in canMakePaymentsWithActiveCard(). ${JSON.stringify(reason)}`);\r\n });\r\n } else {\r\n addToStatus(`Unable to check for apple pay, window.ApplePaySession undefined? ${window.ApplePaySession == undefined}, merchantDetails undefined? ${merchantDetails == undefined}`);\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n const onClickApplePayButton = () =>{\r\n //console.log(\"Clicked Apple Pay button with total price of\", props.TotalPrice);\r\n props.ShouldPaymentStart((res) => {\r\n if(res){\r\n beginPayment(); \r\n }\r\n }) \r\n }\r\n\r\n if(props.ApplePayButton){\r\n props.ApplePayButton.addEventListener('click', onClickApplePayButton); \r\n\r\n return () => {\r\n props.ApplePayButton?.removeEventListener(\"click\", onClickApplePayButton);\r\n }\r\n } \r\n }, [props.TotalPrice, props.ApplePayButton]);\r\n\r\n useEffect(() => {\r\n if(merchantDetails){\r\n console.log(\"Updated merchant details\", merchantDetails);\r\n checkForApplePay();\r\n } \r\n }, [merchantDetails])\r\n\r\n useEffect(() => {\r\n //console.log(\"Total Price in Apple Pay now: from props\", props.TotalPrice, \"from useState\", totalPrice);\r\n addToStatus(`Getting StoreName and MID. Total Price: ${props.TotalPrice}`);\r\n fetch(baseUrl() + \"/api/checkout/GetMerchantDetails\")\r\n .then((res => res.json()))\r\n .then((res: MerchantDetails) => {\r\n setMerchantDetails({\r\n StoreName: res.StoreName,\r\n MerchantIdentifier: res.MerchantIdentifier\r\n });\r\n \r\n }) \r\n .catch((err) => {\r\n addToStatus(\"Unable to find Merchant details...\");\r\n console.log(err);\r\n })\r\n addToStatus(\"Checking if this device has ApplePaySession...\");\r\n }, []) \r\n\r\n const addToStatus = (s: string) => {\r\n console.log(s);\r\n if(props.Debug)\r\n {\r\n //setStatus(status => [...status, s]); //use this for debugging on mobile.\r\n } \r\n }\r\n\r\n return(\r\n
\r\n {status.map((s, i) => {\r\n return
\r\n APPLE: {s}\r\n
\r\n })}\r\n
\r\n )\r\n}\r\n\r\nexport default ApplePay;","import { baseUrl } from '../helpers/configHelper';\r\nimport { addPurchaseToGtag } from '../helpers/googleHelpers';\r\nimport { ApplicationState } from '../store';\r\nimport { simpleChannelType } from '../store/LocationStore';\r\n/// -- Checkout Request Typings --\r\n\r\nexport interface IMopCheckoutRequest {\r\n transactionType: string;\r\n ignoreCsvResult?: boolean;\r\n email?: string;\r\n timeslot: TimeSlot;\r\n channelIdentifier?: string;\r\n expiryDate?: string;\r\n orderNumber?: string;\r\n basket: IMopBasket;\r\n cardRequest?: ICardRequest;\r\n tableNumber: string;\r\n nickname?: string;\r\n digitalRequest?: IDigitalRequest;\r\n createPaymentRequest?: Ptsv2CreatePaymentRequest\r\n cardInformation?: Ptsv2PaymentInformationCard\r\n}\r\n\r\nexport interface ICardRequest {\r\n flexObj: string;\r\n referenceId?: string;\r\n returnUrl?: string;\r\n transactionId?: string;\r\n}\r\n\r\nexport interface IDigitalRequest {\r\n cardSummary: string;\r\n paymentSolution: string;\r\n descriptor?: string;\r\n encoding?: string;\r\n value: string;\r\n}\r\n\r\nexport interface IAuthenticatePaymentRequest {\r\n flexTokenInformation?: FlexTokenInformation\r\n paymentInformation?: Ptsv2PaymentInformation\r\n}\r\n\r\nexport interface IMopCheckoutResponse {\r\n checkoutRecord: MopCheckoutRecord\r\n paymentResult: Ptsv2PaymentResponse\r\n}\r\n\r\ninterface MopCheckoutRecord {\r\n channelIdentifier: string,\r\n basket: IMopBasket\r\n email: string\r\n orderUid: string,\r\n orderNumber: string\r\n}\r\n\r\nexport const AuthenticatePaymentRequest = async (request: PayerAuthSetupRequest) => {\r\n console.log(\"Authenticate called with\", request);\r\n let params: RequestInit = { \r\n method: \"POST\",\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify(request)\r\n }\r\n const response = await fetch(baseUrl() +'/api/checkout/Authenticate', params);\r\n const data = await response.json() as RiskV1AuthenticateResponse;\r\n return data;\r\n\r\n}\r\n\r\n\r\nexport const CreatePaymentRequest = async (request: IMopCheckoutRequest, affiliation: string, appState: ApplicationState, callback: (err: any, checkoutResponse: IMopCheckoutResponse | null) => void) => {\r\n\r\n let pfIdentifier = localStorage.getItem(\"pfidentifier\")\r\n\r\n let orderType = appState.location?.selectedChannel?.channelType;\r\n let _orderType = \"Unset\";\r\n switch(orderType){\r\n case simpleChannelType.ClickAndCollect:\r\n _orderType = \"Takeaway\";\r\n break;\r\n case simpleChannelType.TableOrder:\r\n _orderType = \"Eat In\";\r\n break;\r\n };\r\n\r\n let collectionTime = orderType == simpleChannelType.ClickAndCollect ? appState.location?.selectedTimeSlot.label : undefined;\r\n\r\n\r\n let params: RequestInit = {\r\n method: \"POST\",\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify(request)\r\n }\r\n fetch(baseUrl() + `/api/checkout/CreatePayment${pfIdentifier ? \"?pfIdentifier=\" + pfIdentifier : \"\"}`, params )\r\n .then(response => {\r\n if(!response.ok){\r\n return response.text().then(text => { throw new Error(text); })\r\n }\r\n else{\r\n return response.json();\r\n }\r\n })\r\n .then((responseData: IMopCheckoutResponse) => { \r\n\r\n callback(null, responseData);\r\n console.log(responseData);\r\n if(responseData.checkoutRecord.orderUid != undefined && responseData.checkoutRecord.basket.basketId != undefined){\r\n addPurchaseToGtag(responseData.checkoutRecord.basket.basketId, responseData.checkoutRecord.basket, affiliation, _orderType, collectionTime);\r\n console.log(\"Saving order to local storage....\");\r\n let previousOrders: string[] = JSON.parse(localStorage.getItem(\"mopOrders\") || \"[]\");\r\n previousOrders.push(responseData.checkoutRecord.orderUid);\r\n localStorage.setItem(\"mopOrders\", JSON.stringify(previousOrders));\r\n }\r\n else{\r\n console.log(\"Unable to add purchase to google tag manager, order UID undefined?\", responseData.checkoutRecord.orderUid == undefined, \"basketId undefined?\", responseData.checkoutRecord.basket.basketId == undefined);\r\n }\r\n \r\n })\r\n .catch((err) => {\r\n callback(err, null);\r\n })\r\n};","import { RecordWithTtl } from \"dns\";\r\nimport jwtDecode from \"jwt-decode\";\r\nimport React, { forwardRef, useEffect, useImperativeHandle, useMemo, useRef, useState } from \"react\";\r\nimport { useSelector, useDispatch } from \"react-redux\";\r\nimport { ApplicationState } from \"../store\";\r\nimport { AuthenticatePaymentRequest, CreatePaymentRequest, IAuthenticatePaymentRequest, IMopCheckoutRequest, IMopCheckoutResponse } from \"./checkoutHelper\";\r\nimport { baseUrl } from \"./configHelper\";\r\nimport { resetMessage } from '../store/ColleagueStore';\r\n\r\ntype TransactionType = \"Card\" | \"Google Pay\" | \"Apple Pay\";\r\n\r\nexport interface CardSummary {\r\n transactionType: TransactionType\r\n cardDetails: Ptsv2PaymentInformationCard\r\n}\r\n\r\nexport interface TransactionInformation {\r\n cardSummary: CardSummary\r\n authPayInfo: IAuthenticatePaymentRequest\r\n processingInformation: Ptsv2ProcessingInformation\r\n}\r\n\r\ninterface IPayerAuthentication {\r\n onError: (message: string) => void\r\n onPaymentSuccess: (response: IMopCheckoutResponse) => void\r\n}\r\n\r\nexport interface PayerAuthenticationHelpers {\r\n Authenticate: (initialTransactionInformation: TransactionInformation) => void\r\n CreatePayment: (authSetupRequest: IAuthenticatePaymentRequest, cardType: CardSummary, processingInformation: Ptsv2ProcessingInformation, consumerAuthenticationInformation?: Ptsv2ConsumerAuthenticationInformationRequest) => Promise\r\n}\r\n\r\n/*\r\n Explanation: forwardRef and useImperativeHandle https://reactjs.org/docs/hooks-reference.html#useimperativehandle\r\n Because CheckoutPayCard is a class component, it cannot use custom hooks, \r\n therefore we have to return PayerAuthentication as a functional component that allows a ref\r\n to be passed in props which can access the helper functions: Authenticate and CreatePayment\r\n\r\n const [Authenticate, CreatePayment] = usePayerAuthentication(props); <- Custom Hook\r\n\r\n const payerAuthRef = createRef() <- forwardRef\r\n payerAuthRef.current.Authenticate()\r\n \r\n \r\n*/\r\nconst PayerAuthentication = forwardRef(({ onError, onPaymentSuccess}, ref) => {\r\n\r\n /*\r\n General Overview of Payment/Authenticate flow\r\n 0) PayerAuthentication is functional component that handles methods and required DOM elements for payer authentication\r\n - There are 2 main methods, Authenticate and CreatePayment\r\n 1) Authenticate( cardTokenInformation ) method is used when Payer Authentication should be performed (Card payment, Non authenticated Google Pay token)\r\n - the card token information is supplied to this method, either a card flex object, or a digital wallet object\r\n - this returns values that are then set within payerAuthSetupResponse state, which is used for device data collection\r\n - we listen for a message event defined in index.html that calls window.listenToAuthentication defined here.\r\n 2) CreatePayment() method called with event payload to check if enrolled into 3DS\r\n - CreatePayment is a general method that can either complete a payment, fail, or require further authentication\r\n 3) Post returned stepUpUrl to iframe to show 3DS screen\r\n 4) Redirect 3DS response to returnUrl which is then returned to use through window.hideStepUpScreen\r\n 5) CreatePayment() method is called again with 3DS response data to validate authentication\r\n 6) Handle final response\r\n\r\n Update custom hook\r\n TODO\r\n Check what data google and apple pay return and create an interface/use existing definitions\r\n - There are 2 ways of attempting payment, \r\n 1) Authenticate() - Checking authentication, validating, then capturing settlement\r\n 2) CreatePayment() - Directly attemp payment request without authenticating because it's nto required\r\n Apple Pay doesn't require authentication and Google Pay has a flag in it's response indicating if it should\r\n */\r\n\r\n \r\n\r\n const [initialTransactionInformation, setInitialTransactionInformation] = useState();\r\n \r\n //Object returned when performing Payer Auth Setup against a token (Debit Card or Google Pay)\r\n // (1) - Values are used in payer auth setup iframe and form for Device Data collection.\r\n const [payerAuthSetupResponse, setPayerAuthSetupResponse] = useState();\r\n\r\n //Object returned when performing a payment request (which can include settlement attemp, or payer auth enrollment check)\r\n //Values are used to submit form that checks if enrolled into 3DS.\r\n const [checkoutResponse, setCheckoutResponse] = useState();\r\n const [expireMessage, setExpireMessage] = useState(\"\");\r\n const dispatch = useDispatch();\r\n\r\n const paymentResponse = checkoutResponse?.paymentResult;\r\n\r\n const appState = useSelector((state: ApplicationState) => state);\r\n const payerAuthSetupFormRef = useRef(null);\r\n const stepupFormRef = useRef(null);\r\n\r\n useEffect(() => {\r\n expireMessage && dispatch(resetMessage(expireMessage))\r\n }, [expireMessage])\r\n\r\n const handleError = (e: unknown) => {\r\n let result: string | undefined;\r\n if (typeof e === \"string\") {\r\n result = e;\r\n } else if (e instanceof Error) {\r\n result = e.message // works, `e` narrowed to Error\r\n }\r\n onError(result ?? \"Payment request error, please try again or use a different payment method. ERR:CREPAY\");\r\n }\r\n\r\n const Authenticate = async (_initialTransactionInformation: TransactionInformation) => {\r\n const { authPayInfo, processingInformation } = _initialTransactionInformation;\r\n try{\r\n if(authPayInfo && (authPayInfo.flexTokenInformation || authPayInfo.paymentInformation)){\r\n \r\n setInitialTransactionInformation(_initialTransactionInformation);\r\n try{\r\n let tokenInformation: Riskv1TokenInformation | undefined;\r\n if(authPayInfo.flexTokenInformation){\r\n tokenInformation = {\r\n transientToken: authPayInfo.flexTokenInformation.jti\r\n };\r\n }\r\n const res = await AuthenticatePaymentRequest({\r\n paymentInformation: authPayInfo.paymentInformation,\r\n tokenInformation: tokenInformation,\r\n processingInformation \r\n });\r\n if(res.status == \"COMPLETED\"){\r\n setPayerAuthSetupResponse(res.consumerAuthenticationInformation);\r\n }\r\n else{\r\n throw new Error(\"Authenticate setup request failed. Please try again. ERR:APSF\");\r\n }\r\n }\r\n catch(err){\r\n console.log(\"AuthenticatePaymentRequest error\", err);\r\n throw new Error(\"Authenticate setup request failed. Please try again. ERR:APRE\");\r\n }\r\n \r\n }\r\n else{\r\n console.log(\"AuthSetupRequest undefined\");\r\n throw new Error(\"Authenticate setup request failed. Please try again. ERR:ASRU\");\r\n }\r\n }\r\n catch(err){\r\n handleError(err);\r\n }\r\n }\r\n\r\n const CreatePayment = async (authPayInfo: IAuthenticatePaymentRequest, cardSummary: CardSummary, processingInformation: Ptsv2ProcessingInformation, consumerAuthenticationInformation?: Ptsv2ConsumerAuthenticationInformationRequest) => {\r\n\r\n \r\n try{\r\n if(appState.basket != undefined && appState.location?.selectedTimeSlot != undefined){ \r\n console.log(`Creating payment request with authSetupRequest ${authPayInfo}`);\r\n \r\n let tokenInformation: Ptsv2TokenInformation | undefined;\r\n let paymentInformation: Ptsv2PaymentInformation | undefined;\r\n\r\n if(authPayInfo?.flexTokenInformation){\r\n tokenInformation = {\r\n jti: authPayInfo.flexTokenInformation.jti\r\n };\r\n }\r\n else if(authPayInfo?.paymentInformation){\r\n paymentInformation = authPayInfo.paymentInformation;\r\n }\r\n else{\r\n throw new Error(\"Payment error. Please try again. ERR:CRPACT\");\r\n }\r\n let request: IMopCheckoutRequest = {\r\n basket: appState.basket.basket,\r\n email: appState.basket.email,\r\n tableNumber: appState.basket.tableNumber?.toString() || \"\",\r\n nickname: appState.basket.nickname?.toString() || \"\",\r\n timeslot: appState.location?.selectedTimeSlot,\r\n transactionType: cardSummary.transactionType,\r\n channelIdentifier: appState.location.channelIdentifier,\r\n createPaymentRequest: {\r\n processingInformation,\r\n consumerAuthenticationInformation,\r\n tokenInformation,\r\n paymentInformation\r\n },\r\n cardInformation: cardSummary.cardDetails\r\n }\r\n\r\n let affiliation = `${appState.location?.selectedStore?.storeName || \"\"} ${appState.location?.selectedStore?.storeNumber || \"\"}`;\r\n try{\r\n return new Promise((resolve, reject) => {\r\n\r\n CreatePaymentRequest(request, affiliation, appState, ((err, _checkoutResponse) => {\r\n if (err) {\r\n if (err instanceof Error && err.message.includes(\":401,\")) {\r\n setExpireMessage(\"showExpireModal\")\r\n }\r\n else {\r\n reject(\"Payment request error, please try again or use a different payment method. ERR:CREPAYERR\");\r\n //throw new Error(err);\r\n }\r\n }\r\n else if(_checkoutResponse){\r\n setCheckoutResponse(_checkoutResponse);\r\n resolve(_checkoutResponse);\r\n } \r\n else{\r\n reject(\"Payment request error, please try again or use a different payment method.. ERR:CREPAYE\");\r\n }\r\n }));\r\n })\r\n }\r\n catch(err){\r\n throw err;\r\n }\r\n }\r\n else{\r\n console.log(\"Could not process payment request. Basket undefined?\", appState.basket == undefined, \"TimeSlot undefined?\", appState.location?.selectedTimeSlot == undefined);\r\n throw new Error(\"Payment request error, please try again or use a different payment method. ERR:ASU\");\r\n }\r\n }\r\n catch(e){\r\n let result: string | undefined;\r\n if (typeof e === \"string\") {\r\n result = e;\r\n } else if (e instanceof Error) {\r\n result = e.message // works, `e` narrowed to Error\r\n }\r\n throw new Error(result ?? \"Payment request error, please try again or use a different payment method. ERR:CREPAY\");\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n\r\n window.hideStepUpScreen = function(transactionId: string){\r\n if(stepupFormRef.current){\r\n stepupFormRef.current.style.display = \"none\";\r\n }\r\n else{\r\n console.log(\"Cannot hide stepUpForm as ref is undefined.\");\r\n }\r\n\r\n if(initialTransactionInformation){\r\n \r\n CreatePayment(initialTransactionInformation.authPayInfo, initialTransactionInformation.cardSummary,\r\n {\r\n actionList: [\"VALIDATE_CONSUMER_AUTHENTICATION\"],\r\n ...initialTransactionInformation.processingInformation\r\n },\r\n {\r\n authenticationTransactionId: transactionId\r\n }).catch((err) => {\r\n handleError(err); \r\n })\r\n }\r\n else{\r\n console.log(\"No card token information, window.hideStepUpScreen, or cardType\");\r\n onError(\"Payment request error, please try again or use a different payment method. ERR:CTPISU\");\r\n }\r\n }\r\n\r\n return () => {\r\n window.hideStepUpScreen = undefined;\r\n }\r\n\r\n }, [initialTransactionInformation, stepupFormRef]);\r\n\r\n useEffect(() => { \r\n\r\n window.listenToAuthentication = (event: MessageEvent) => {\r\n // {MessageType: \"profile.completed\", Session Id: \"0_57f063fd-659a- \r\n // 4779-b45b-9e456fdb7935\", Status: true} \r\n \r\n // console.log(\"EVENT:\", event);\r\n if (event.origin === \"https://centinelapistag.cardinalcommerce.com\" || event.origin === \"https://centinelapi.cardinalcommerce.com\") { \r\n let data = JSON.parse(event.data); \r\n //console.log('-----Merchant received a message:', data); \r\n if (data !== undefined && data.Status) { \r\n //console.log(event);\r\n console.log('Songbird ran DF successfully'); \r\n if(initialTransactionInformation && payerAuthSetupResponse){\r\n try{\r\n CreatePayment(initialTransactionInformation.authPayInfo, initialTransactionInformation.cardSummary,\r\n {\r\n actionList: [\"CONSUMER_AUTHENTICATION\"],\r\n ...initialTransactionInformation.processingInformation\r\n },\r\n {\r\n referenceId: payerAuthSetupResponse.referenceId,\r\n returnUrl: window.location.origin + baseUrl() + \"/callback\"\r\n }).catch((err) => {\r\n handleError(err); \r\n })\r\n }\r\n catch(err){\r\n handleError(err);\r\n }\r\n }\r\n else{\r\n console.log(\"No card token information or payerAuthSetupResponse or cardType, songbird DF\");\r\n onError(\"Payment request error, please try again or use a different payment method. ERR:CTPISB\");\r\n }\r\n } \r\n } \r\n } \r\n\r\n return () => {\r\n window.listenToAuthentication = undefined;\r\n }\r\n },[initialTransactionInformation, payerAuthSetupResponse]);\r\n\r\n useEffect(() => {\r\n if(payerAuthSetupResponse){\r\n if(payerAuthSetupFormRef.current){\r\n payerAuthSetupFormRef.current.submit();\r\n }\r\n else{\r\n console.log(\"payerAuthSetupFormRef.current is undefined.\")\r\n onError(\"Payment request error, please try again or use a different payment method. ERR:PASFR\");\r\n } \r\n }\r\n }, [payerAuthSetupResponse]);\r\n\r\n useEffect(() => {\r\n if(checkoutResponse && paymentResponse){\r\n if(paymentResponse.status == \"PENDING_AUTHENTICATION\"){\r\n //Requires step up form\r\n if(stepupFormRef.current){\r\n \r\n stepupFormRef.current.submit();\r\n stepupFormRef.current.style.display = \"unset\";\r\n }\r\n else{\r\n console.log(\"stepUpFormRef.current undefined\");\r\n onError(\"Payment request error, please try again or use a different payment method. ERR:SUFU\");\r\n } \r\n }\r\n else if(paymentResponse.status == \"AUTHENTICATION_SUCCESSFUL\"){\r\n //Authentication was successful, validate result.\r\n if(initialTransactionInformation){ \r\n try{\r\n CreatePayment(initialTransactionInformation.authPayInfo, initialTransactionInformation.cardSummary, {\r\n actionList: [\"VALIDATE_CONSUMER_AUTHENTICATION\"],\r\n ...initialTransactionInformation.processingInformation\r\n },\r\n {\r\n authenticationTransactionId: paymentResponse.consumerAuthenticationInformation?.authenticationTransactionId\r\n }).catch((err) => {\r\n handleError(err); \r\n })\r\n }\r\n catch(err){\r\n handleError(err);\r\n }\r\n } else{\r\n console.log(\"No card token information\", initialTransactionInformation == undefined, \"or currentCardType\");\r\n onError(\"Payment request error, please try again or use a different payment method. ERR:CTPI\");\r\n }\r\n }\r\n else if(paymentResponse.status == \"AUTHORIZED\"){\r\n onPaymentSuccess(checkoutResponse);\r\n }\r\n else{\r\n if(paymentResponse.errorInformation){\r\n onError(paymentResponse.errorInformation.message)\r\n } else{\r\n onError(`Encountered an unexpected payment error. Status: ${paymentResponse.status}`);\r\n } \r\n }\r\n }\r\n },[checkoutResponse]);\r\n\r\n const payerAuthForm = useMemo(() => {\r\n if(payerAuthSetupResponse){\r\n return(\r\n <>\r\n \r\n
\r\n \r\n
\r\n \r\n )\r\n }\r\n }, [payerAuthSetupResponse])\r\n\r\n const stepUpForm = useMemo(() => {\r\n if(paymentResponse?.consumerAuthenticationInformation?.accessToken && paymentResponse.consumerAuthenticationInformation.stepUpUrl){\r\n return (\r\n <>\r\n \r\n
\r\n \r\n
\r\n \r\n )\r\n }\r\n }, [paymentResponse]);\r\n\r\n useImperativeHandle(ref, () => {\r\n return {\r\n Authenticate,\r\n CreatePayment\r\n }\r\n })\r\n\r\n return(\r\n <> {payerAuthForm} {stepUpForm} \r\n )\r\n/* \r\n return [\r\n <> {payerAuthForm} {stepUpForm} ,\r\n Authenticate,\r\n CreatePayment\r\n ] as const\r\n*/\r\n})\r\n\r\nexport default PayerAuthentication;","import React, { RefObject, useEffect, useRef, useState } from 'react';\r\nimport { IonGrid, IonRow, IonCol, IonContent, IonButton, IonPage, IonItem, IonSpinner } from '@ionic/react';\r\nimport AppHeader from '../components/AppHeader';\r\nimport GooglePay from '../components/GooglePay';\r\nimport './OrderConfirmation.scss';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { useHistory } from \"react-router-dom\";\r\nimport { ApplicationState } from '../store';\r\nimport BasketItemRow from '../components/BasketItemRow';\r\nimport { formatCurrency } from '../helpers/currencyHelpers';\r\nimport { CreatePaymentRequest, IAuthenticatePaymentRequest, IDigitalRequest, IMopCheckoutRequest, IMopCheckoutResponse } from '../helpers/checkoutHelper';\r\nimport { State } from 'ionicons/dist/types/stencil-public-runtime';\r\nimport { Base64 } from 'js-base64';\r\nimport { bindActionCreators } from 'redux';\r\nimport * as basketActions from '../store/BasketStore';\r\nimport { Redirect, useLocation } from \"react-router\";\r\nimport ApplePay from '../components/ApplePay';\r\nimport { baseUrl } from '../helpers/configHelper';\r\nimport \"../components/ApplePay.scss\";\r\nimport { STATUS_CODES } from 'http';\r\nimport { getConfig } from '../helpers/configHelper';\r\nimport { simpleChannelType } from '../store/LocationStore';\r\nimport PayerAuthentication, { CardSummary, PayerAuthenticationHelpers } from '../helpers/PayerAuthentication';\r\n\r\nenum TransactionType {\r\n GooglePay = \"Google Pay\",\r\n ApplePay = \"Apple Pay\"\r\n}\r\n\r\nconst OrderConfirmation: React.FC = () => {\r\n\r\n let history = useHistory();\r\n const location = useLocation();\r\n const basketStore = useSelector((state: ApplicationState) => state.basket);\r\n const locationState = useSelector((state: ApplicationState) => state.location);\r\n const appState = useSelector((state: ApplicationState) => state);\r\n const updateTempBasket = bindActionCreators(basketActions.actionCreators.updateTempBasket, useDispatch());\r\n const clearBasket = bindActionCreators(basketActions.actionCreators.clearBasketItems, useDispatch());\r\n const updateOrderNumber = bindActionCreators(basketActions.actionCreators.updateOrderNumber, useDispatch());\r\n const updatePaymentStatus = bindActionCreators(basketActions.actionCreators.updatePaymentStatus, useDispatch());\r\n const [error, setError] = useState(\"\");\r\n const [showAppleButton, setShowAppleButton] = useState(false)\r\n const googlePayButtonRef = useRef(null);\r\n const applePayButtonRef = useRef(null);\r\n const [paymentOptions, setPaymentOptions] = useState([]);\r\n const [totalPrice, setTotalPrice] = useState(0);\r\n const [isLoading, setIsLoading] = useState(false);\r\n //const [paymentsLive, setPaymentsLive] = useState(false);\r\n const paymentsLive = useRef(false);\r\n const debugApplePay = useRef(false);\r\n\r\n const stateRef = useRef(basketStore?.paymentStatus);\r\n stateRef.current = basketStore?.paymentStatus;\r\n\r\n const payerAuthRef = useRef(null);\r\n \r\n\r\n useEffect(() => {\r\n fetch(baseUrl() + \"/api/checkout/GetAvailablePaymentOptions\")\r\n .then(res => res.json() as Promise)\r\n .then((data: PaymentOptions) => {\r\n let res = data.options;\r\n let pLive = data.livePayments;\r\n let google = \"Google\";\r\n if(res.includes(google)){\r\n let navigator: any = window.navigator //Check if running in Home screen App Mode\r\n if((navigator.standalone != undefined) && navigator.standalone){\r\n res.splice(res.indexOf(google), 1);\r\n }\r\n }\r\n paymentsLive.current = pLive;\r\n debugApplePay.current = data.debugApplePay;\r\n setPaymentOptions(res);\r\n //setPaymentsLive(paymentsLive);\r\n \r\n });\r\n }, [])\r\n\r\n useEffect(() => {\r\n if(basketStore?.basket != undefined && basketStore.basket.menuItems.length < 1 && location.pathname == \"/orderconfirmation\")\r\n {\r\n setTimeout(() => {\r\n window.location.href = baseUrl() + \"/splash\"; //Restart app\r\n }, 500);\r\n }\r\n }, [location.pathname])\r\n\r\n useEffect(() => {\r\n if(basketStore?.basket.totalPrice){\r\n setTotalPrice(basketStore.basket.totalPrice);\r\n } \r\n }, [basketStore?.basket.totalPrice])\r\n\r\n const shouldPaymentStart = (callback: (res: boolean) => void) =>{\r\n \r\n let status = stateRef.current;\r\n //console.log(status);\r\n switch(status){\r\n case basketActions.PaymentStatus.REQUESTED:\r\n callback(false);\r\n break;\r\n default:\r\n callback(true);\r\n break;\r\n }\r\n }\r\n\r\n const onPaymentStart = () => {\r\n setIsLoading(true);\r\n updatePaymentStatus(basketActions.PaymentStatus.REQUESTED);\r\n }\r\n\r\n const onError = (err: string) => {\r\n console.log(err);\r\n setError(err);\r\n setIsLoading(false);\r\n updatePaymentStatus(basketActions.PaymentStatus.UNSET);\r\n }\r\n\r\n const onPaymentSuccess = (response: IMopCheckoutResponse) => {\r\n\r\n updatePaymentStatus(basketActions.PaymentStatus.COMPLETE);\r\n history.push(`/payment/success`);\r\n updateOrderNumber(response.checkoutRecord.orderNumber);\r\n updateTempBasket(() => {\r\n clearBasket();\r\n })\r\n }\r\n\r\n const handleApplePayButtonClick = async (paymentToken: ApplePayJS.ApplePayPaymentToken, session: ApplePaySession) => {\r\n \r\n var status: number = 0;\r\n let paymentData = paymentToken.paymentData;\r\n let paymentData64 = Base64.encode(JSON.stringify(paymentData));\r\n console.log(\"Apple Pay button clicked\")\r\n onPaymentStart();\r\n\r\n try{\r\n if(payerAuthRef.current){\r\n try{\r\n const response = await payerAuthRef.current.CreatePayment({\r\n paymentInformation: {\r\n fluidData: {\r\n descriptor: \"RklEPUNPTU1PTi5BUFBMRS5JTkFQUC5QQVlNRU5U\",\r\n encoding: \"Base64\",\r\n value: paymentData64 \r\n }\r\n }\r\n },{\r\n transactionType: \"Apple Pay\",\r\n cardDetails: {\r\n number: paymentToken.paymentMethod.displayName,\r\n }\r\n }, {\r\n paymentSolution: \"001\",\r\n authorizationOptions: {\r\n ignoreCsvResult: true\r\n }\r\n });\r\n if(response.paymentResult.status == \"AUTHORIZED\"){\r\n status = ApplePaySession.STATUS_SUCCESS;\r\n }\r\n else{\r\n throw new Error(\"Unhandled Apple Pay error. ERR:UAPE\");\r\n }\r\n }\r\n catch(err){\r\n throw err; //rethrow so we can handle payerAuthRef error at the same time\r\n }\r\n }\r\n else{\r\n console.log(\"payerAuthRef.current undefined applepay click\")\r\n throw new Error(\"Unexpected payment error, please try again. ERR:APPAR\");\r\n }\r\n }\r\n catch(e){\r\n let result: string | undefined;\r\n if (typeof e === \"string\") {\r\n result = e;\r\n } else if (e instanceof Error) {\r\n result = e.message // works, `e` narrowed to Error\r\n }\r\n status = ApplePaySession.STATUS_FAILURE;\r\n onError(result ?? \"Unexpected payment error. ERR:APPUE\");\r\n }\r\n finally{\r\n //non apple specific stuff is managed by onPaymentSuccess\r\n session.completePayment(status);\r\n }\r\n }\r\n\r\n const handleGooglePayButtonClick = (paymentData: google.payments.api.PaymentData) => {\r\n console.log(\"Got data: \", paymentData);\r\n let paymentToken = paymentData.paymentMethodData.tokenizationData.token;\r\n let paymentToken64 = Base64.encode(paymentToken);\r\n onPaymentStart();\r\n\r\n try{\r\n if(payerAuthRef.current){\r\n try{\r\n\r\n let cardSummary: CardSummary = {\r\n transactionType: \"Google Pay\",\r\n cardDetails: {\r\n number: paymentData.paymentMethodData.description || \"Card using Google Pay\"\r\n }\r\n }\r\n let authSetupRequest: IAuthenticatePaymentRequest = {\r\n paymentInformation: {\r\n fluidData: {\r\n descriptor: \"RklEPUNPTU1PTi5BUFBMRS5JTkFQUC5QQVlNRU5U\",\r\n encoding: \"Base64\",\r\n value: paymentToken64 \r\n }\r\n }\r\n }\r\n let processingInformation: Ptsv2ProcessingInformation = {\r\n paymentSolution: \"012\",\r\n authorizationOptions: {\r\n ignoreCsvResult: true\r\n }\r\n }\r\n //Need to perform SCA\r\n if(paymentData.paymentMethodData.info && (paymentData.paymentMethodData.info as any).assuranceDetails?.cardHolderAuthenticated != undefined && (paymentData.paymentMethodData.info as any).assuranceDetails?.cardHolderAuthenticated == false){\r\n payerAuthRef.current.Authenticate({\r\n authPayInfo: authSetupRequest,\r\n cardSummary: cardSummary,\r\n processingInformation: processingInformation\r\n })\r\n }\r\n else{\r\n payerAuthRef.current.CreatePayment(authSetupRequest, cardSummary, processingInformation).catch((err) => {\r\n throw err; \r\n });\r\n }\r\n }\r\n catch(err){\r\n throw err; //rethrow so we can handle payerAuthRef error at the same time\r\n }\r\n }\r\n else{\r\n console.log(\"payerAuthRef.current undefined googlepay click\")\r\n throw new Error(\"Unexpected payment error, please try again. ERR:GPPAR\");\r\n }\r\n }\r\n catch(e){\r\n let result: string | undefined;\r\n if (typeof e === \"string\") {\r\n result = e;\r\n } else if (e instanceof Error) {\r\n result = e.message // works, `e` narrowed to Error\r\n }\r\n onError(result ?? \"Unexpected payment error. ERR:APPUE\");\r\n }\r\n } \r\n \r\n\r\n return (\r\n \r\n \r\n {\r\n totalPrice > 0 &&\r\n <>\r\n {\r\n paymentOptions?.map((option, index) => {\r\n switch(option){\r\n case \"Google\":\r\n return \r\n case \"Apple\":\r\n return \r\n }\r\n })\r\n } \r\n \r\n } \r\n \r\n \r\n \r\n
Please choose your payment method
\r\n
\r\n \r\n \r\n
Order total
\r\n
{formatCurrency(basketStore?.basket.totalPrice)}
\r\n { error !== undefined &&
{error}
} \r\n
\r\n
\r\n \r\n \r\n {isLoading &&
Processing Payment
}\r\n
\r\n
\r\n { if(!isLoading) { history.push(`/payment`); } }}>Pay with Card \r\n
\r\n
\r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default OrderConfirmation;","import React, { useEffect, useState, useRef } from 'react';\r\nimport './AltQuantityInput.scss'; //Styling for plus minus buttons used in MopFooterMenuItem.tsx\r\nimport { ApplicationState } from '../store';\r\nimport { actionCreators } from '../store/BasketStore';\r\nimport { useDispatch } from \"react-redux\";\r\n\r\ninterface IAltQuantityInput {\r\n value: number;\r\n subtractButtonColour?: string; //grey, green\r\n addButtonColour?: string;\r\n valueColour?: string; //white\r\n disableAddQuantityButton?: boolean;\r\n disableDecreaseQuantityButton?: boolean;\r\n onChange: (value: number) => void;\r\n className?: string;\r\n}\r\n\r\n\r\n// Will rename this to QuantityInput later in the re-style (MTR)\r\n\r\nconst AltQuantityInput: React.FC = (\r\n { value, \r\n onChange, \r\n subtractButtonColour, \r\n addButtonColour, \r\n disableAddQuantityButton, \r\n disableDecreaseQuantityButton, \r\n valueColour, \r\n className\r\n }) => {\r\n\r\n const onClickDecrease = (event: React.MouseEvent) => {\r\n if (!disableDecreaseQuantityButton && value > 0){\r\n //event.stopPropagation();\r\n onChange(value - 1);\r\n }\r\n }\r\n\r\n const onClickAdd = (event: React.MouseEvent) => {\r\n if (!disableAddQuantityButton){\r\n //event.stopPropagation();\r\n onChange(value + 1);\r\n }\r\n }\r\n\r\n console.log(`disableDecreaseQuantityButton = ${disableDecreaseQuantityButton} / disableAddQuantityButton = ${disableAddQuantityButton} / ${value}`);\r\n\r\n return(\r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
{value}
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default AltQuantityInput;\r\n\r\n/*\r\n\r\n\r\nconst AltQuantityInput: React.FC = ({value, onChange, subtractButtonColour, addButtonColour, disableAddQuantityButton, disableDecreaseQuantityButton, valueColour, className}) => {\r\n\r\n return (\r\n \r\n \r\n
{\r\n if(value > 0 && !disableDecreaseQuantityButton){\r\n onChange(value - 1);\r\n } }}>-
\r\n
\r\n \r\n
{value}
\r\n
\r\n \r\n
{ if(!disableAddQuantityButton) { onChange(value + 1) } }}>+
\r\n
\r\n
\r\n );\r\n};\r\n\r\n\r\n\r\n*/","import React, { memo } from \"react\";\r\nimport { IonIcon, IonImg, IonItem } from \"@ionic/react\";\r\nimport { formatCurrency } from '../helpers/currencyHelpers';\r\nimport './ModifierGroupItem.scss'\r\nimport AltQuantityInput from \"./AltQuantityInput\";\r\nimport { baseUrl, cacheBust } from \"../helpers/configHelper\";\r\nimport { checkmarkOutline } from \"ionicons/icons\";\r\nimport { inlineBrandImage } from \"../helpers/menuHelpers\";\r\n\r\ninterface ModifierGroupItemCommonProps {\r\n showImage?: boolean;\r\n showPrice?: boolean;\r\n showQuantityComponent?: boolean;\r\n\r\n menuItemName: string;\r\n sku: string;\r\n price: number;\r\n kcal?: number;\r\n hasBrandImage: boolean;\r\n productFlags: string[];\r\n}\r\n\r\nfunction ModifierGroupItemCommon(props: ModifierGroupItemCommonProps) {\r\n function getMenuItemName(): string {\r\n return inlineBrandImage(props.menuItemName, true);\r\n }\r\n\r\n return (\r\n
\r\n {props.showImage &&\r\n \r\n }\r\n
\r\n

\r\n \r\n\r\n {props.showPrice && props.price > 0 &&\r\n \r\n {` + ${formatCurrency(props.price)}`}\r\n \r\n }\r\n

\r\n\r\n {(props.kcal ?? 0) > 0 &&\r\n \r\n {props.productFlags.map((v: string) => {\r\n return (\r\n \r\n )\r\n })}\r\n\r\n {` (${props.kcal}kcal)`}\r\n \r\n }\r\n
\r\n
\r\n );\r\n}\r\n\r\ninterface IModifierGroupItemProps {\r\n inStock: boolean;\r\n\r\n canSelectMultiple?: boolean;\r\n showPrice?: boolean;\r\n showImage?: boolean;\r\n showQuantityComponent?: boolean;\r\n\r\n menuItem: IMopModifierGroupItem;\r\n disabled?: boolean;\r\n\r\n onSelect?: (menuItemName: string) => void;\r\n onChange?: (menuItem: IMopModifierGroupItem, quantity: number) => void;\r\n\r\n disableSelect?: boolean;\r\n disableAddQuantityButton?: boolean;\r\n}\r\n\r\n// NOTE: React normally re-renders a component whenever the parent re-renders.\r\n// memo will not re-render when the parent re-renders as long as the new props\r\n// are the same as old props.\r\nconst ModifierGroupItem = memo(function ModifierGroupItem(props: IModifierGroupItemProps) {\r\n function handleItemSelected() {\r\n if (props.canSelectMultiple) {\r\n if (props.onChange) {\r\n props.onChange(props.menuItem, props.menuItem.quantitySelected ? 0 : 1);\r\n }\r\n } else {\r\n if (props.onSelect) {\r\n props.onSelect(props.menuItem.menuItemName);\r\n }\r\n }\r\n }\r\n\r\n function handleItemQuantity(quantity: number) {\r\n if (props.onChange) {\r\n props.onChange(props.menuItem, quantity);\r\n }\r\n }\r\n\r\n return (\r\n
\r\n {props.showQuantityComponent\r\n ?\r\n
0 ? 'selected' : ''}`}>\r\n
\r\n {props.menuItem.quantitySelected > 0 &&\r\n \r\n }\r\n
\r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n :\r\n 0 ? \"checked\" : \"\"}\r\n disabled={props.disabled || (props.canSelectMultiple && props.disableSelect)}\r\n lines=\"none\"\r\n onClick={handleItemSelected}\r\n >\r\n
\r\n {props.menuItem.quantitySelected > 0 &&\r\n \r\n }\r\n
\r\n \r\n \r\n }\r\n {props.inStock === false &&\r\n <>\r\n
\r\n
\r\n
\r\n

Sorry, currently unavailable

\r\n
\r\n \r\n }\r\n
\r\n );\r\n});\r\n\r\nexport default ModifierGroupItem;\r\n","import React, { useState, useEffect } from 'react';\r\nimport './ModifierGroup.scss';\r\nimport { menuSingleItemSelected } from '../helpers/menuHelpers';\r\n\r\nimport { ApplicationState } from '../store';\r\nimport { useSelector, useDispatch } from 'react-redux';\r\nimport * as menuItemStore from '../store/MenuItemStore';\r\nimport { bindActionCreators } from 'redux';\r\n\r\nimport 'react-slidedown/lib/slidedown.css'\r\nimport ModifierGroupItem from './ModifierGroupItem';\r\n\r\ninterface IModifierGroup {\r\n modifierGroup: IMopModifierGroup;\r\n onSelectedSingle?: (id: string) => void;\r\n localId: string;\r\n isColleague: boolean | null;\r\n}\r\n\r\nconst ModifierGroup: React.FC = ({ modifierGroup, localId, onSelectedSingle, isColleague }) => {\r\n const {\r\n groupTitle,\r\n groupDescription,\r\n canSelectMultiple,\r\n itemsAreChargeable,\r\n maxDifferentItems,\r\n modifierGroupItems,\r\n groupType\r\n } = modifierGroup;\r\n\r\n const isBasket = useSelector((state: ApplicationState) => state.menuItemData?.isBasket);\r\n const boundUpdateItem = bindActionCreators(menuItemStore.actionCreators.updateModifierGroupItem, useDispatch());\r\n\r\n const [selected, setSelected] = useState();\r\n const [totalQuantitySelected, setTotalQuantitySelected] = useState(0);\r\n\r\n /*\r\n onModifierGroupItemSelected\r\n if min is 1 (OR max met?), and it's the first time it's been changed (or totalSelected == max)\r\n tryOpenNextModifierGroup\r\n if there is a next modifier group\r\n move on to next\r\n */\r\n\r\n /*\r\n TODO:\r\n Group 10 - Radio - DONE\r\n Group 20 - Quantity No Checkbox ChargeableExtras\r\n Group 30 - Checkbox Customisations\r\n Group 40 - Quantity with Checkbox Swaps -\r\n Group 50 - Extras\r\n\r\n */\r\n\r\n useEffect(() => {\r\n var startSelected = menuSingleItemSelected(modifierGroup, isBasket as boolean); //Pass through isBasketUpdate flag to decide whether to check defaultQuantitySelected or quantitySelected\r\n setSelected(startSelected);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (groupType === 10) { //Only perform this check if it's a radio group modifier, could use maxDifferentItems instead\r\n let menuItem: IMopModifierGroupItem = modifierGroupItems.find((item: IMopModifierGroupItem) => item.menuItemName == selected);\r\n let prevItem: IMopModifierGroupItem = modifierGroupItems.find((item: IMopModifierGroupItem) => item.quantitySelected == 1);\r\n\r\n console.log(\"Selected\", selected, menuItem, prevItem, \"isBasket\", isBasket, \"isColleague\", isColleague);\r\n console.log(`D: Selected: ${selected}, menuItem: ${menuItem?.menuItemName}, prevItem: ${prevItem?.menuItemName}`);\r\n\r\n if (menuItem) {\r\n handleChange(menuItem, 1);\r\n if (prevItem && prevItem.menuItemId !== menuItem.menuItemId) {\r\n handleChange(prevItem, 0);\r\n //console.log(menuItem, prevItem);\r\n onSelectedSingle && onSelectedSingle(localId);\r\n }\r\n else {\r\n if (!isBasket && menuItem.defaultQuantitySelected > 0) {\r\n //Program selected this option.\r\n }\r\n else if (isBasket && menuItem.quantitySelected > 0) {\r\n //Program selected this option.\r\n }\r\n else {\r\n onSelectedSingle && onSelectedSingle(localId);\r\n }\r\n }\r\n }\r\n }\r\n }, [selected])\r\n\r\n // Max Quantity Handler\r\n useEffect(() => {\r\n const total = modifierGroupItems.reduce((total: number, currentValue: IMopModifierGroupItem) => (\r\n total += currentValue.quantitySelected\r\n ), 0);\r\n\r\n setTotalQuantitySelected(total);\r\n }, [modifierGroupItems]);\r\n\r\n const handleChange = (menuItem: IMopModifierGroupItem, quantity: number) => {\r\n //console.log(\"Updating menu item in group at \", menuItem.menuItemId, \"Quantity = \", quantity);\r\n boundUpdateItem(menuItem.menuItemId, quantity);\r\n }\r\n\r\n return (\r\n
\r\n <>\r\n
\r\n {groupTitle &&\r\n
\r\n

\r\n {groupTitle}\r\n {groupType === 10 &&\r\n *\r\n }\r\n

\r\n
\r\n }\r\n
\r\n

\r\n {groupDescription}\r\n {!groupTitle && groupType === 10 &&\r\n *\r\n }\r\n

\r\n
\r\n
\r\n
\r\n {\r\n modifierGroupItems?.map((mgi: IMopModifierGroupItem) => {\r\n return (\r\n 0}\r\n menuItem={mgi}\r\n onSelect={setSelected}\r\n onChange={handleChange}\r\n disableSelect={\r\n maxDifferentItems > 0\r\n && totalQuantitySelected >= maxDifferentItems\r\n && mgi.quantitySelected < 1\r\n }\r\n disableAddQuantityButton={\r\n (totalQuantitySelected >= maxDifferentItems && maxDifferentItems > 0)\r\n || (mgi.maxQuantity != null && totalQuantitySelected >= mgi.maxQuantity)\r\n }\r\n />\r\n )\r\n })\r\n }\r\n
\r\n \r\n
\r\n );\r\n};\r\n\r\nexport default ModifierGroup;\r\n\r\n// NOTE: Dropdown for when we have a flag for it. - Fletcher 2024-04-20\r\n//<>\r\n// { onToggleDropdown(!isDropdownOpen, localId); }}>\r\n//
0 ? \"selected\" : \"\"}`}>\r\n//

DROPDOWN?

\r\n//
\r\n// {\r\n// totalQuantitySelected > 0\r\n// ?\r\n//
\r\n//
{auxData?.name ? auxData.name + \": \" : \"\"}Click to change
\r\n//
\r\n// {\r\n// chosenItems.map((chosen, i) => {\r\n// /*\r\n// chosen += chosen == \"\" ? \"\" : \", \";\r\n// chosen += `${item.quantitySelected > 1 ? item.quantitySelected + \" x \" : \"\"}${item.menuItemName}`;\r\n// */\r\n// let prefix = i > 0 ? \", \" : \"\";\r\n// return {prefix}\r\n// })\r\n// }\r\n//
\r\n//
\r\n// :\r\n//
{auxData.preSelectedTitle ? auxData.preSelectedTitle : auxData.name}
\r\n// }\r\n//
\r\n// {\r\n// isDropdownOpen\r\n// ? \r\n// : \r\n// }\r\n//
\r\n//
\r\n// \r\n// {getModifierComponent(modifierGroupItems.length === 1)}\r\n// \r\n//\r\n","import React, { useEffect, useState } from 'react';\r\nimport { IonHeader, IonTitle, IonToolbar, IonIcon, IonGrid, IonRow, IonCol, IonModal, IonContent } from '@ionic/react';\r\nimport './MopHeaderMenusModal.scss';\r\nimport { closeCircle, chevronForward, menu, chevronBack } from 'ionicons/icons';\r\nimport { useSelector, useDispatch } from 'react-redux';\r\nimport { useHistory } from \"react-router-dom\";\r\nimport '../theme/common.scss';\r\nimport * as headerFooterStore from '../store/HeaderFooterStore';\r\n\r\n\r\n\r\nconst AllergenInfoModal: React.FC<{ isModalOpen: boolean, closeModalClick: any,allergenHtml:string | undefined }> = ({ isModalOpen, closeModalClick,allergenHtml }) => {\r\n\r\n const modalCss = ['AppHeaderMenu','allergen-modal']\r\n\r\n return (\r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n \r\n
\r\n

DUE TO THE WAY WE PREPARE OUR FOOD, IT IS POSSIBLE THAT OTHER ALLERGENS ARE PRESENT

\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default AllergenInfoModal;\r\n","import { IonCol, IonGrid, IonImg, IonRow } from '@ionic/react';\r\nimport React, { useState, useEffect } from 'react';\r\nimport { baseUrl, cacheBust } from '../helpers/configHelper';\r\nimport * as currencyHelpers from '../helpers/currencyHelpers';\r\nimport AllergenInfoModal from '../modals/AllergenInfoModal';\r\nimport { useSelector } from 'react-redux';\r\nimport { ApplicationState } from '../store';\r\nimport { inlineBrandImage, downloadAllergenFile } from '../helpers/menuHelpers';\r\n\r\ninterface IHeaderDescription {\r\n menuItem: IMopMenuItemDetail;\r\n headerImage: string | null;\r\n hideText: boolean;\r\n}\r\n\r\nconst HeaderDescription: React.FC = ({\r\n menuItem,\r\n headerImage,\r\n hideText,\r\n}) => {\r\n const headerState = useSelector((state: ApplicationState) => state.headerFooter);\r\n const [allergenInfoOpen, setAllergenInfoOpen] = useState(false);\r\n\r\n let priceValue = (menuItem && (menuItem.menuItemBasePrice ?? 0) > 0) ? menuItem.menuItemBasePrice:null;\r\n if (!priceValue && menuItem.menuItemFromPrice) priceValue = menuItem.menuItemFromPrice;\r\n let price = currencyHelpers.formatCurrency(priceValue);\r\n\r\n function getMenuItemName() {\r\n return inlineBrandImage(menuItem.menuItemName, menuItem.hasBrandImage);\r\n }\r\n\r\n // NOTE: This is used to display progress for menu items where you pick up\r\n // to X, such as Build Your Breakfast. - 2024-05-07\r\n const modifierGroup = menuItem.modifierGroups.find((modifierGroup: IMopModifierGroup) => (\r\n modifierGroup.maxDifferentItems > 0\r\n ));\r\n\r\n const maxDifferentItems = modifierGroup?.maxDifferentItems;\r\n const modifierGroupItems = modifierGroup?.modifierGroupItems;\r\n\r\n const [totalQuantitySelected, setTotalQuantitySelected] = useState(0);\r\n\r\n useEffect(() => {\r\n const total = modifierGroupItems?.reduce((total: number, currentValue: IMopModifierGroupItem) => (\r\n total += currentValue.quantitySelected\r\n ), 0);\r\n\r\n setTotalQuantitySelected(total);\r\n }, [modifierGroupItems]);\r\n\r\n return (\r\n
\r\n \r\n \r\n { headerState?.showDebugLabel &&\r\n
\r\n {menuItem?.sku} img:{headerImage}\r\n
\r\n }\r\n {!hideText && headerImage &&\r\n \r\n }\r\n {menuItem?.productFlags?.includes(\"N\") &&\r\n \r\n }\r\n
\r\n { !hideText &&\r\n \r\n \r\n

\r\n \r\n {price &&\r\n \r\n {currencyHelpers.hasPrefixSymbol(price)\r\n ?\r\n <>\r\n {price[0]}\r\n {price.substring(1)}\r\n \r\n :\r\n price\r\n }\r\n \r\n }\r\n

\r\n {maxDifferentItems && totalQuantitySelected > 0 ?\r\n

\r\n Added {totalQuantitySelected} of {maxDifferentItems} items\r\n

\r\n :\r\n

\r\n }\r\n

\r\n { menuItem && (menuItem.kcal ?? 0) > 0 &&\r\n
{menuItem.kcal}kcal
\r\n }\r\n { menuItem && (menuItem.allergenInfo ?? \"\").length > 0 &&\r\n { downloadAllergenFile() }}\r\n >\r\n View Allergens\r\n

\r\n }\r\n
\r\n { menuItem && menuItem.productFlags.length > 0 &&\r\n
\r\n {menuItem.productFlags.map((v) => {\r\n return \r\n })}\r\n
\r\n }\r\n
\r\n
\r\n }\r\n
\r\n { setAllergenInfoOpen(false) }} allergenHtml={menuItem?.allergenInfo}>\r\n
\r\n )\r\n}\r\n\r\nexport default HeaderDescription;\r\n","import React, { useState, useEffect, useMemo } from \"react\";\r\nimport { formatCurrency } from \"../helpers/currencyHelpers\";\r\nimport './DealHeader.scss'\r\nimport { IonIcon } from \"@ionic/react\";\r\nimport { add } from \"ionicons/icons\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { ApplicationState } from \"../store\";\r\nimport { baseUrl } from \"../helpers/configHelper\";\r\nimport { inlineBrandImage } from \"../helpers/menuHelpers\";\r\n\r\ninterface DealComponentProps {\r\n primaryDefaultText: string;\r\n primarySelectedText: string;\r\n selected?: string;\r\n}\r\n\r\nfunction DealComponent(props: DealComponentProps) {\r\n const [imageFailed, setImageFailed] = useState(false);\r\n\r\n useEffect(() => {\r\n setImageFailed(false);\r\n }, [props.selected]);\r\n\r\n return (\r\n
\r\n {props.selected !== undefined\r\n ?\r\n <>\r\n {props.selected && !imageFailed\r\n ?\r\n setImageFailed(true)}\r\n />\r\n :\r\n

{props.primarySelectedText}

\r\n }\r\n \r\n :\r\n

{props.primaryDefaultText}

\r\n }\r\n
\r\n )\r\n}\r\n\r\nfunction DealGraphic() {\r\n const menuItem = useSelector((state: ApplicationState) => state.menuItemData?.menuItem);\r\n\r\n const mainItemImage = useMemo(() => {\r\n var image = menuItem?.overrideMenuItemImageInDealComponents ?? `${menuItem?.sku}_PDP`;\r\n\r\n if (menuItem?.productNameBasketOverride && menuItem?.showMenuItemImageInDealComponents) {\r\n return image;\r\n }\r\n\r\n return null;\r\n }, [menuItem]);\r\n\r\n const filteredModifierGroups = useMemo(() => {\r\n return menuItem?.modifierGroups\r\n ?.filter((v: IMopModifierGroup) => {\r\n return v.primaryModifierGroup;\r\n })\r\n ?.sort((a: IMopModifierGroup, b: IMopModifierGroup) => {\r\n return a.showOnPage - b.showOnPage || a.order - b.order;\r\n })\r\n }, [menuItem]);\r\n\r\n const totalModifierGroups = useMemo(() => {\r\n return menuItem?.modifierGroups.filter((v: IMopModifierGroup) => v.primaryModifierGroup).length ?? 0\r\n }, [menuItem]);\r\n\r\n function getSelected(mg: IMopModifierGroup): string | undefined {\r\n const selected = mg.modifierGroupItems.find((v: IMopModifierGroupItem) => {\r\n return v.quantitySelected > 0;\r\n });\r\n\r\n return selected?.sku;\r\n }\r\n\r\n return (\r\n
\r\n {mainItemImage &&\r\n <>\r\n \r\n \r\n \r\n }\r\n {filteredModifierGroups?.map((v: IMopModifierGroup, index: number) => {\r\n let selected = getSelected(v);\r\n\r\n return (\r\n <>\r\n \r\n {index + 1 < (totalModifierGroups ?? 0) &&\r\n \r\n }\r\n \r\n )\r\n })\r\n }\r\n
\r\n );\r\n}\r\n\r\ninterface DealHeaderProps {\r\n menuItem?: IMopMenuItemDetail;\r\n}\r\n\r\nfunction DealHeader(props: DealHeaderProps) {\r\n const dealIndex = props.menuItem?.menuItemName.indexOf('Deal');\r\n const isDeal = dealIndex !== -1;\r\n\r\n return (\r\n
\r\n
\r\n

\r\n \r\n \r\n {isDeal &&\r\n ' Deal'\r\n }\r\n \r\n {` ${formatCurrency(props.menuItem?.menuItemBasePrice)}`}\r\n \r\n

\r\n
\r\n \r\n
\r\n );\r\n}\r\n\r\nexport default DealHeader;\r\n","import React, { useEffect, useRef, useMemo } from 'react';\r\nimport { connect, useSelector, useDispatch } from 'react-redux';\r\nimport { IonContent, IonPage } from '@ionic/react';\r\nimport { ApplicationState } from '../store';\r\nimport * as HeaderFooterStore from '../store/HeaderFooterStore';\r\nimport * as MenuItemDataStore from '../store/MenuItemStore';\r\nimport { RouteComponentProps, useLocation } from 'react-router';\r\nimport './MenuItem.scss';\r\nimport ModifierGroup from '../components/ModifierGroup';\r\nimport { baseUrl } from '../helpers/configHelper';\r\nimport HeaderDescription from '../components/HeaderDescription';\r\nimport DealHeader from '../components/DealHeader';\r\nimport { bindActionCreators } from 'redux';\r\nimport { showDealHeader, showModifierGroupsOnPages, shouldShowModifierGroup, getSelectedSkus } from '../helpers/menuHelpers';\r\n\r\ninterface MenuItemOwnProps {\r\n menuItemData: MenuItemDataStore.MenuItemDataState\r\n isBasket: boolean,\r\n isColleague: boolean\r\n}\r\n\r\ntype MenuItemProps =\r\n & RouteComponentProps<{ categoryIdentifier: string }>\r\n & MenuItemOwnProps;\r\n\r\nfunction MenuItem(props: MenuItemProps) {\r\n const dispatch = useDispatch();\r\n const location = useLocation();\r\n\r\n const menuItem = useSelector((state: ApplicationState) => state.menuItemData?.menuItem);\r\n const currentPage = useSelector((state: ApplicationState) => state.deal?.currentPage);\r\n\r\n const setTitle = bindActionCreators(HeaderFooterStore.actionCreators.setTitle, dispatch);\r\n const setBasketShowModal = bindActionCreators(HeaderFooterStore.actionCreators.setBasketShowModal, dispatch);\r\n\r\n const contentRef = useRef(null);\r\n\r\n const selectedSkus = useMemo(() => {\r\n if (!menuItem?.modifierGroups) {\r\n return [];\r\n }\r\n\r\n return getSelectedSkus(menuItem.modifierGroups);\r\n }, [menuItem?.modifierGroups])\r\n\r\n useEffect(() => {\r\n return () => {\r\n // Check if it's basket update, if so then dispatch SHOW_BASKET_MODAL\r\n if (props.isBasket) {\r\n setBasketShowModal(true);\r\n }\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (!menuItem) {\r\n return;\r\n }\r\n\r\n const title = menuItem.menuItemName.replace(/\\[\\[.*\\]\\]/, '')\r\n setTitle(title, true);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [menuItem])\r\n\r\n useEffect(() => {\r\n contentRef.current?.scrollToTop();\r\n }, [contentRef]);\r\n\r\n useEffect(() => {\r\n contentRef.current?.scrollToTop();\r\n }, [contentRef, location.search]);\r\n\r\n return (\r\n \r\n \r\n {menuItem &&\r\n <>\r\n {showDealHeader(menuItem, props.isColleague)\r\n ?\r\n \r\n :\r\n \r\n }\r\n {menuItem.modifierGroups\r\n ?.filter((group: IMopModifierGroup) => {\r\n if (!shouldShowModifierGroup(group, selectedSkus, menuItem.sku)) {\r\n return false;\r\n }\r\n\r\n if (!showModifierGroupsOnPages(menuItem)) {\r\n return true;\r\n }\r\n\r\n return group.showOnPage === currentPage;\r\n })\r\n .sort((a: IMopModifierGroup, b: IMopModifierGroup) => {\r\n return a.showOnPage - b.showOnPage || a.order - b.order;\r\n })\r\n .map((modifierGroup: IMopModifierGroup, index: number) => {\r\n return (\r\n \r\n )\r\n })\r\n }\r\n \r\n }\r\n \r\n \r\n );\r\n}\r\n\r\nconst mapStateToProps = (state: ApplicationState, ownProps: any) => ({\r\n menuItemData: state.menuItemData,\r\n isBasket: state.menuItemData?.isBasket,\r\n totalPrice: state.basket?.basket.totalPrice,\r\n isColleague: state.colleague?.isLoggedIn\r\n});\r\n\r\nconst mapDispatchToProps = (\r\n dispatch: any) => {\r\n return {\r\n requestMenuItem: (menuItemId: number, pfIdentifier: string, referer: string | null, callback: any) => dispatch(MenuItemDataStore.actionCreators.requestMenuItem(menuItemId, pfIdentifier, \"\", callback)),\r\n setBasketShowModal: (value: boolean) => dispatch(HeaderFooterStore.actionCreators.setBasketShowModal(value)),\r\n setTitle: (value: string, showBack: boolean) => dispatch(HeaderFooterStore.actionCreators.setTitle(value, showBack))\r\n };\r\n};\r\n\r\nexport default connect(\r\n mapStateToProps, // Selects which state properties are merged into the component's props\r\n mapDispatchToProps // Selects which action creators are merged into the component's props,\r\n)(MenuItem as any);\r\n","import React, { useEffect, useState, useMemo } from 'react';\r\nimport { IonRow, IonCol, IonText, IonAlert, IonGrid, IonButton } from '@ionic/react';\r\nimport './BasketItemRow.scss';\r\nimport { formatCurrency } from '../helpers/currencyHelpers';\r\nimport { getConfig } from '../helpers/configHelper';\r\nimport * as MenuItemDataStore from '../store/MenuItemStore';\r\nimport * as BasketStore from '../store/BasketStore';\r\nimport * as DealStore from '../store/DealStore';\r\nimport { useHistory } from \"react-router-dom\";\r\nimport { bindActionCreators } from 'redux';\r\nimport { useDispatch } from 'react-redux';\r\nimport AltQuantityInput from './AltQuantityInput';\r\nimport { inlineBrandImage } from '../helpers/menuHelpers';\r\n\r\ninterface BasketItemRowProps {\r\n basketItem: IMopMenuItemDetail;\r\n readOnly: boolean;\r\n //onClick?: (basketItemId: number) => void;\r\n isColleague?: boolean;\r\n}\r\n\r\ntype BasketItemRowMergeProps =\r\n typeof MenuItemDataStore.actionCreators\r\n & BasketItemRowProps;\r\n\r\nconst BasketItemRow: React.FC = ({ basketItem, readOnly, isColleague }) => {\r\n\r\n let history = useHistory();\r\n const boundRequestBasketItem = bindActionCreators(MenuItemDataStore.actionCreators.requestBasketMenuItem, useDispatch());\r\n const boundUpdateBasketItemQuantity = bindActionCreators(BasketStore.actionCreators.updateBasketItemQuantity, useDispatch());\r\n const boundStartDeal = bindActionCreators(DealStore.actionCreators.startDeal, useDispatch());\r\n const [removeAlertIsOpen, setRemoveAlertIsOpen] = useState(false);\r\n const [totalPrice, setTotalPrice] = useState(basketItem.menuItemTotalPrice);\r\n\r\n // put in back pocket\r\n const isCoupon = basketItem.sku.split('_').length == 2 && basketItem.isDiscount;\r\n\r\n const getCouponCode = () => {\r\n return basketItem.sku.split(\"_\")[1];\r\n }\r\n\r\n const menuItemName = useMemo(() => {\r\n let menuItemName = \"\";\r\n if (basketItem.quantity > 1 && totalPrice < 0) {\r\n menuItemName += `${basketItem.quantity} x `;\r\n }\r\n\r\n if (basketItem.productNameBasketOverride && !isColleague) {\r\n menuItemName += basketItem.productNameBasketOverride;\r\n } else {\r\n menuItemName += inlineBrandImage(basketItem.menuItemName, basketItem.hasBrandImage);\r\n }\r\n\r\n return menuItemName;\r\n }, [basketItem.menuItemName, basketItem.productNameBasketOverride, basketItem.quantity, basketItem.hasBrandImage, totalPrice, isColleague]);\r\n\r\n useEffect(() => {\r\n setTotalPrice(basketItem.menuItemTotalPrice);\r\n }, [basketItem.menuItemTotalPrice])\r\n\r\n return (\r\n
\r\n { setRemoveAlertIsOpen(false) }}\r\n header={\"Remove Product\"}\r\n buttons={[\r\n {\r\n text: \"No\",\r\n role: \"cancel\"\r\n },\r\n {\r\n text: \"Yes, remove it\",\r\n handler: () => {\r\n boundUpdateBasketItemQuantity(basketItem.basketMenuItemId, 0);\r\n }\r\n }\r\n ]}\r\n message={\"Are you sure you want to remove this product from your basket?\"}\r\n />\r\n {basketItem &&\r\n \r\n \r\n \r\n \r\n \r\n \r\n {isCoupon &&\r\n {getCouponCode()} - \r\n }\r\n\r\n \r\n \r\n \r\n \r\n \r\n {`${formatCurrency(totalPrice * basketItem.quantity)}${basketItem.quantity > 1 ? ` (${formatCurrency(totalPrice)} each)` : \"\"}`}\r\n \r\n \r\n \r\n \r\n \r\n
    \r\n <>\r\n {basketItem.productNameBasketOverride && !isColleague &&\r\n

    \r\n \r\n

    \r\n }\r\n {basketItem.optionsTextList?.map((row) => {\r\n const text = row.text.replace(/\\[\\[.*\\]\\] /, '').trim();\r\n\r\n if (row?.isExtra) {\r\n return (\r\n

    \r\n {'+ '}\r\n \r\n

    \r\n )\r\n } else {\r\n return (\r\n

    \r\n \r\n \r\n

    \r\n )\r\n }\r\n })}\r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n {(!readOnly && basketItem.editable) &&
{\r\n if (basketItem.isDealItem) {\r\n boundStartDeal(basketItem.sku);\r\n }\r\n\r\n boundRequestBasketItem(basketItem.basketMenuItemId, () => {\r\n if (basketItem.isDealItem) {\r\n const params = new URLSearchParams();\r\n params.set('page', '1');\r\n\r\n history.push(`/deal/${basketItem.menuItemId}?${params.toString()}`);\r\n } else {\r\n history.push(`/menuitem/${basketItem.menuItemId}`);\r\n }\r\n })\r\n }}>Edit
}\r\n
\r\n \r\n\r\n {(!readOnly && !basketItem.isDiscount) && {\r\n\r\n let proceed = true;\r\n if (quantity < 1) {\r\n proceed = false;\r\n setRemoveAlertIsOpen(true);\r\n }\r\n if (proceed) {\r\n boundUpdateBasketItemQuantity(basketItem.basketMenuItemId, quantity);\r\n }\r\n }}\r\n />}\r\n\r\n \r\n
\r\n
\r\n
\r\n
\r\n }\r\n
\r\n );\r\n};\r\n\r\nexport default BasketItemRow;\r\n\r\n/*\r\n\r\n\r\n \r\n \r\n
-
\r\n\r\n
\r\n \r\n
5
\r\n
\r\n \r\n
+
\r\n
\r\n
\r\n
\r\n*/\r\n","import React, { useEffect, useState, useMemo } from 'react';\r\nimport { IonContent, IonAlert, IonPage } from '@ionic/react';\r\nimport './BasketPage.scss';\r\n\r\nimport BasketItemRow from '../components/BasketItemRow';\r\nimport { ApplicationState } from '../store';\r\nimport { useSelector, useDispatch } from 'react-redux';\r\n\r\nimport { bindActionCreators } from 'redux';\r\nimport * as BasketStore from '../store/BasketStore';\r\n\r\nconst BasketPage: React.FC = () => {\r\n const isColleagueDiscountBasket = useSelector((state: ApplicationState) => state.basket?.basket.isColleagueDiscountBasket);\r\n const externalPromotionsApplied = useSelector((state: ApplicationState) => state.basket?.basket.externalPromotionsApplied);\r\n const menuItems = useSelector((state: ApplicationState) => state.basket?.basket.menuItems);\r\n const [showAlert, setShowAlert] = useState(false);\r\n const boundClearBasket = bindActionCreators(BasketStore.actionCreators.clearBasket, useDispatch());\r\n const boundGetUpsells = bindActionCreators(BasketStore.actionCreators.getUpsells, useDispatch());\r\n const isColleague = useSelector((state: ApplicationState) => state.colleague?.isLoggedIn);\r\n\r\n useEffect(() => {\r\n console.log(\"Request upsells\");\r\n boundGetUpsells();\r\n }, []);\r\n\r\n const sortedMenuItems = useMemo(() => {\r\n const sortedMenuItems: { [key: string]: IMopMenuItemDetail } = {};\r\n\r\n menuItems?.forEach(obj => {\r\n let key = \"\";\r\n\r\n if (obj.menuItemTotalPrice < 0) {\r\n key = obj.menuItemName + '_' + obj.menuItemTotalPrice;\r\n } else {\r\n key = obj.basketMenuItemId.toString();\r\n }\r\n\r\n if (sortedMenuItems[key]) {\r\n sortedMenuItems[key].quantity++;\r\n } else {\r\n sortedMenuItems[key] = { ...obj };\r\n }\r\n });\r\n\r\n return Object.values(sortedMenuItems);\r\n }, [menuItems]);\r\n\r\n return (\r\n \r\n\r\n \r\n { setShowAlert(false) }}\r\n header={\"Cancel Order\"}\r\n buttons={[\r\n {\r\n text: \"No, don't cancel\",\r\n role: \"cancel\"\r\n },\r\n {\r\n text: \"Yes, cancel Order\",\r\n handler: () => {\r\n boundClearBasket();\r\n }\r\n }\r\n ]}\r\n message={\"Are you sure you want to cancel your order?\"}\r\n />\r\n\r\n \r\n {isColleagueDiscountBasket && externalPromotionsApplied &&\r\n
\r\n
Note: Your colleague discount will be recalculated at checkout
\r\n
\r\n }\r\n {sortedMenuItems?.map((basketItem: IMopMenuItemDetail, index: number) => {\r\n return \r\n })}\r\n
\r\n\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default BasketPage;\r\n","import React from 'react';\r\nimport { IonCol, IonImg } from '@ionic/react';\r\nimport './MenuItemRow.scss';\r\nimport { baseUrl, cacheBust } from '../helpers/configHelper';\r\nimport { useSelector } from 'react-redux';\r\nimport { ApplicationState } from '../store';\r\n\r\ninterface MenuItemTileProps {\r\n menuItemId: number;\r\n sku: string;\r\n price?: string;\r\n fromPrice?: boolean;\r\n productFlags: string[];\r\n inStock: boolean;\r\n name: string;\r\n onClick?: (menuItemId: number) => void;\r\n kcal?: number\r\n onAddClick?: (menuItemId: number) => void;\r\n plpRoundels?: string[]\r\n}\r\n\r\nconst MenuItemTile: React.FC = ({\r\n name,\r\n menuItemId,\r\n fromPrice,\r\n price,\r\n onClick,\r\n onAddClick,\r\n sku,\r\n productFlags,\r\n inStock,\r\n kcal,\r\n}) => {\r\n const headerState = useSelector((state: ApplicationState) => state.headerFooter);\r\n\r\n return (\r\n <>\r\n inStock && onClick && onClick(menuItemId)}>\r\n
\r\n
\r\n {productFlags &&\r\n
\r\n {productFlags.map((v) => {\r\n return \r\n })}\r\n
\r\n }\r\n \r\n \r\n \r\n
\r\n
\r\n
{name}
\r\n\r\n
\r\n {kcal!=null &&
{kcal}kcal
}\r\n
{fromPrice && price &&
from
}
{price}
\r\n
\r\n
\r\n\r\n
{ inStock && onAddClick && inStock && onAddClick(menuItemId) }}>Add
\r\n\r\n
\r\n {\r\n headerState?.showDebugLabel &&\r\n
\r\n {sku} {name}\r\n
\r\n }\r\n
\r\n \r\n );\r\n};\r\n\r\nexport default MenuItemTile;\r\n","import React from \"react\";\r\nimport { IonModal } from \"@ionic/react\";\r\nimport Button from \"../components/Button\";\r\nimport './AllergenPopup.scss';\r\nimport { downloadAllergenFile } from \"../helpers/menuHelpers\";\r\n\r\ninterface AllergenPopupProps {\r\n show?: boolean;\r\n close: () => void;\r\n accept: () => void;\r\n}\r\n\r\nfunction AllergenPopup(props: AllergenPopupProps) {\r\n return (\r\n \r\n
\r\n

Allergy Information

\r\n\r\n \r\n View the Allergen Information Guide\r\n

\r\n\r\n

We freshly prepare food in a busy kitchen which means that it may contain other allergens than those listed and may not be suitable for you.

\r\n\r\n

Do you want to continue?

\r\n\r\n \r\n \r\n No\r\n \r\n \r\n Yes\r\n \r\n
\r\n \r\n \r\n );\r\n}\r\n\r\nexport default AllergenPopup;\r\n","import React from 'react';\r\nimport { IonContent, IonRow, IonPage } from '@ionic/react';\r\nimport { useHistory } from \"react-router-dom\";\r\nimport './UpsellPage.scss';\r\n\r\nimport { formatCurrency } from '../helpers/currencyHelpers';\r\n\r\nimport { ApplicationState } from '../store';\r\nimport { useSelector } from 'react-redux';\r\n\r\nimport { bindActionCreators } from 'redux';\r\nimport { useDispatch } from 'react-redux';\r\n\r\nimport * as BasketStore from '../store/BasketStore';\r\nimport * as MenuItemStore from '../store/MenuItemStore';\r\nimport MenuItemTile from '../components/MenuItemTile';\r\nimport { simpleChannelType } from '../store/LocationStore';\r\nimport AllergenPopup from '../modals/AllergenPopup';\r\n\r\nconst UpsellPage: React.FC = () => {\r\n let history = useHistory();\r\n\r\n const basketStore = useSelector((state: ApplicationState) => state.basket);\r\n const pfIdentifier = localStorage.getItem(\"pfidentifier\");\r\n\r\n const boundUpsellDone = bindActionCreators(BasketStore.actionCreators.upsellDone, useDispatch());\r\n\r\n const boundRequestMenuItem = bindActionCreators(MenuItemStore.actionCreators.requestMenuItem, useDispatch());\r\n\r\n const locationStore = useSelector((state: ApplicationState) => state.location);\r\n\r\n const showAllergenPopup = useSelector((state: ApplicationState) => state.basket?.showAllergen);\r\n const setShowAllergenPopup = bindActionCreators(BasketStore.actionCreators.showAllergen, useDispatch());\r\n\r\n const isLoggedIn = localStorage.getItem('isLoggedIn') === \"true\" ? true : false\r\n\r\n const goToNextPage = () => {\r\n setShowAllergenPopup(false);\r\n\r\n switch (locationStore?.selectedChannel?.channelType) {\r\n case simpleChannelType.ClickAndCollect:\r\n isLoggedIn ?\r\n history.push(\"/name-or-nickname\")\r\n :\r\n history.push(\"/enteremail\");\r\n break;\r\n case simpleChannelType.TableOrder:\r\n isLoggedIn ?\r\n history.push(\"/name-or-nickname\")\r\n :\r\n history.push(\"/tablenumber\");\r\n break;\r\n }\r\n };\r\n\r\n const navigateToMenuItem = (menuItemId: number, referrer: string | null,) => {\r\n boundUpsellDone();\r\n\r\n boundRequestMenuItem(menuItemId, pfIdentifier ?? \"\", referrer, () => {\r\n history.push(`/menuitem/${menuItemId}`);\r\n });\r\n }\r\n\r\n return (\r\n \r\n \r\n
\r\n \r\n {basketStore && basketStore.upsells && basketStore.upsells.map((a: IMopMenuItemDetail, i) => {\r\n return (\r\n navigateToMenuItem(a.menuItemId, a.referrer)} sku={a.sku} productFlags={a.productFlags}\r\n plpRoundels={a.plpRoundels} />\r\n )\r\n })}\r\n \r\n
\r\n setShowAllergenPopup(false)}\r\n accept={goToNextPage}\r\n />\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default UpsellPage;\r\n","import { useSelector } from \"react-redux\";\r\nimport { ApplicationState } from \"../store\";\r\n\r\nexport const secondsToMinutes = (seconds: number) => Math.floor(seconds / 60);\r\n\r\nexport const displayWaitTimes = (anticipatedWait: number) => {\r\n return anticipatedWait > 0;\r\n}\r\n\r\nexport interface IUseWaitTimes {\r\n displayWaitTimes: boolean;\r\n anticipatedWaitTimeSeconds: number | null;\r\n waitingRange: string;\r\n waitingLabel: string;\r\n}\r\n\r\nconst waitingText = (minutes: number): { waitingLabel: string, waitingRange: string } => {\r\n if (minutes < 5) {\r\n return { waitingRange: \"5\", waitingLabel: \"up to\" };\r\n } else if (minutes < 10) {\r\n return { waitingRange: \"5 - 10\", waitingLabel: \"between\" };\r\n } else if (minutes < 15) {\r\n return { waitingRange: \"10 - 15\", waitingLabel: \"between\" };\r\n } else if (minutes < 20) {\r\n return { waitingRange: \"15 - 20\", waitingLabel: \"between\" };\r\n }\r\n\r\n return { waitingRange: \"20\", waitingLabel: \"over\" };\r\n}\r\n\r\nexport const useWaitTimes = (): IUseWaitTimes => {\r\n let anticipatedWaitTimeSeconds = 0;\r\n const selectedStore = useSelector((state: ApplicationState) => state.location?.selectedStore);\r\n if(selectedStore)\r\n anticipatedWaitTimeSeconds = selectedStore.waitTimeModel.anticipatedWaitTimeSeconds ?? 0;\r\n \r\n const minutes = secondsToMinutes(anticipatedWaitTimeSeconds);\r\n\r\n return {\r\n displayWaitTimes: displayWaitTimes(minutes),\r\n ...waitingText(minutes),\r\n anticipatedWaitTimeSeconds,\r\n }\r\n}\r\n","import \"./WaitTimesModal.scss\"\r\nimport {IonCol, IonIcon, IonImg, IonModal, IonRow} from \"@ionic/react\";\r\nimport React, {FC, ReactNode, useMemo, useState} from \"react\";\r\nimport {useWaitTimes} from \"../../helpers/waitTimesHelper\";\r\nimport Button from \"../Button\";\r\nimport {baseUrl} from \"../../helpers/configHelper\";\r\nimport {timeOutline} from \"ionicons/icons\";\r\n\r\ninterface IWaitTimesModal {\r\n onDidDismiss: () => void;\r\n showing: boolean;\r\n}\r\n\r\nexport const WaitTimesModal: FC = ({showing, onDidDismiss}) => {\r\n const {\r\n waitingRange,\r\n waitingLabel,\r\n } = useWaitTimes();\r\n \r\n return \r\n \r\n \r\n \r\n onDidDismiss()}\r\n src={`${baseUrl()}/images/assets/dismiss_button.svg`}\r\n />\r\n \r\n \r\n

Current order wait time is

\r\n
\r\n \r\n

{waitingLabel} {waitingRange} minutes

\r\n
\r\n \r\n This is an estimate based on recent orders. Times may vary.\r\n \r\n \r\n \r\n OK\r\n \r\n \r\n
\r\n
\r\n
\r\n}\r\n\r\nexport const WaitTimesButton: FC<{onClick: () => void}> = ({onClick}) => {\r\n return
onClick()}>\r\n Wait times\r\n \r\n
\r\n}\r\n","import React, {useEffect, useRef, useState} from 'react';\r\nimport {IonRow, IonCol, IonButton, IonModal, useIonModal, IonIcon} from '@ionic/react';\r\nimport './MopFooter.scss';\r\nimport { ApplicationState } from '../store';\r\nimport * as BasketStore from '../store/BasketStore';\r\nimport { bindActionCreators } from 'redux';\r\nimport { useDispatch } from 'react-redux';\r\nimport { useSelector } from 'react-redux';\r\nimport * as currencyHelpers from '../helpers/currencyHelpers';\r\n\r\nimport { useHistory } from 'react-router';\r\nimport { simpleChannelType } from '../store/LocationStore';\r\nimport Button from './Button';\r\nimport {documentTextOutline, timeOutline} from \"ionicons/icons\";\r\nimport {useWaitTimes} from \"../helpers/waitTimesHelper\";\r\nimport { WaitTimesButton, WaitTimesModal } from \"./wait-times/WaitTimesModal\";\r\n\r\nconst MopFooterList: React.FC = () => {\r\n const [showModal, setShowModal] = useState(false);\r\n const locationState = useSelector((state: ApplicationState) => state.location);\r\n const headerFooterStore = useSelector((state: ApplicationState) => state.headerFooter);\r\n const boundCalculateBasket = bindActionCreators(BasketStore.actionCreators.calculateBasket, useDispatch());\r\n const basketStore = useSelector((state: ApplicationState) => state.basket);\r\n\r\n let price: string = currencyHelpers.formatCurrency(basketStore?.basket.totalPrice);\r\n let basketEnabled = true;\r\n\r\n const history = useHistory();\r\n\r\n const { displayWaitTimes } = useWaitTimes();\r\n const [showWaitingModal, setShowWaitingModal] = useState(false);\r\n\r\n if (!basketStore?.basket.totalPrice) {\r\n price = String.fromCharCode(163) + `0.00`;\r\n basketEnabled = false;\r\n }\r\n\r\n const goToBasket = () => {\r\n boundCalculateBasket(undefined);\r\n history.push(`/basketpage`);\r\n }\r\n\r\n useEffect(() => {\r\n if (headerFooterStore?.showBasketModal !== undefined) {\r\n setShowModal(headerFooterStore.showBasketModal);\r\n }\r\n }, [headerFooterStore?.showBasketModal]);\r\n \r\n return (\r\n
\r\n \r\n \r\n
history.push(\"/storesearch\")}>\r\n {locationState?.selectedChannel === undefined ? \"Store\" : locationState.selectedChannel.channelType === simpleChannelType.ClickAndCollect ? \"Take away\" : \"Eat in\"}
\r\n {locationState?.selectedStore === undefined ? \"Select a store\" : locationState?.selectedStore.storeName}\r\n {locationState?.selectedStore?.takingMopOrders === false ?\r\n - Order ahead not available : null}\r\n
\r\n {displayWaitTimes && setShowWaitingModal(true)} />}\r\n
\r\n \r\n \r\n \r\n {currencyHelpers.hasPrefixSymbol(price)\r\n ?\r\n <>\r\n {price[0]}\r\n {price.substring(1)}\r\n \r\n :\r\n price\r\n }\r\n \r\n \r\n
{basketStore?.totalQuantity}
\r\n
\r\n
\r\n setShowWaitingModal(false)} showing={showWaitingModal} />\r\n
\r\n );\r\n};\r\n\r\nexport default MopFooterList;\r\n","import React, { useState, useEffect } from 'react';\r\nimport { IonRow, IonCol } from '@ionic/react';\r\nimport './MopFooterMenuItem.scss';\r\nimport { ApplicationState } from '../store';\r\nimport * as currencyHelpers from '../helpers/currencyHelpers';\r\nimport { useHistory } from \"react-router-dom\";\r\n\r\nimport { useSelector, useDispatch } from 'react-redux';\r\nimport * as basketStore from '../store/BasketStore';\r\nimport { bindActionCreators } from 'redux';\r\n\r\nimport { simpleChannelType } from '../store/LocationStore';\r\nimport Button from './Button';\r\n\r\nconst MopFooterMenuItem: React.FC = () => {\r\n const locationState = useSelector((state: ApplicationState) => state.location);\r\n const isBasket = useSelector((state: ApplicationState) => state.menuItemData?.isBasket);\r\n const menuItem = useSelector((state: ApplicationState) => state.menuItemData?.menuItem);\r\n const totalPrice = useSelector((state: ApplicationState) => state.menuItemData?.menuItem?.menuItemTotalPrice);\r\n const boundAddToBasket = bindActionCreators(basketStore.actionCreators.addMenuItemToBasket, useDispatch());\r\n const boundUpdateBasket = bindActionCreators(basketStore.actionCreators.updateBasketItem, useDispatch());\r\n\r\n const history = useHistory();\r\n const [price, setPrice] = useState(\"\");\r\n const [enableButton, setEnableButton] = useState(false);\r\n\r\n const handleClick = () => {\r\n if (!isBasket) {\r\n boundAddToBasket();\r\n } else {\r\n boundUpdateBasket();\r\n }\r\n\r\n history.goBack();\r\n }\r\n\r\n useEffect(() => {\r\n setPrice(currencyHelpers.formatCurrency(totalPrice));\r\n }, [totalPrice]);\r\n\r\n useEffect(() => {\r\n const canAddOrUpdate = menuItem?.modifierGroups\r\n .every((group: IMopModifierGroup) => {\r\n if (group.groupType === 10) {\r\n return group.modifierGroupItems.some((item: IMopModifierGroupItem) => (\r\n item.quantitySelected > 0\r\n ));\r\n }\r\n\r\n if (group.itemsAreChargeable === false && group.maxDifferentItems > 1) {\r\n return group.modifierGroupItems.reduce((acc: number, item: IMopModifierGroupItem) => (\r\n acc + item.quantitySelected\r\n ), 0) === group.maxDifferentItems;\r\n }\r\n\r\n return true;\r\n }) ?? false;\r\n\r\n let hasPriceSet = (totalPrice ?? 0) > 0;\r\n\r\n setEnableButton(canAddOrUpdate && hasPriceSet);\r\n }, [menuItem?.modifierGroups, totalPrice]);\r\n\r\n return (\r\n
\r\n {menuItem &&\r\n \r\n \r\n {locationState?.selectedChannel === undefined ? \"Store\" : locationState.selectedChannel.channelType === simpleChannelType.ClickAndCollect ? \"Take away\" : \"Eat in\"}
\r\n {locationState?.selectedStore === undefined ? \"Select a store\" : locationState?.selectedStore.storeName}\r\n {locationState?.selectedStore?.takingMopOrders === false ? - Order ahead not available : null}\r\n
\r\n \r\n \r\n {isBasket ? \"Update Item\" : \"Add to Order\"}\r\n {(totalPrice ?? 0) > 0 &&\r\n  - {price}\r\n }\r\n \r\n \r\n
\r\n }\r\n
\r\n );\r\n};\r\n\r\nexport default MopFooterMenuItem;\r\n","import React from \"react\";\r\nimport './AgeSelect.scss'\r\n\r\ninterface IAgeSelect {\r\n\tonChangeValue: (change: number) => void\r\n\tvalue: number | null\r\n\tdisableSubtract: boolean\r\n\tdisableAdd: boolean\r\n\terror: boolean\r\n}\r\n\r\nconst AgeSelect: React.FC = ({ onChangeValue, value, disableSubtract, disableAdd, error }) => {\r\n\tconst onClickSubtract = (e?: React.MouseEvent) => {\r\n\t\tif (!disableSubtract) {\r\n\t\t\tonChangeValue(-1);\r\n\t\t}\r\n\t}\r\n\r\n\tconst onClickAdd = (e?: React.MouseEvent) => {\r\n\t\tif (!disableAdd) {\r\n\t\t\tonChangeValue(1);\r\n\t\t}\r\n\t}\r\n\r\n\treturn (\r\n\t\t\r\n\t\t\t
\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t
\r\n\r\n\t\t\t\r\n\t\t\t\t{value === null ? \"\" : value}\r\n\t\t\t\r\n\r\n\t\t\t
\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t
\r\n\t\t
\r\n\t)\r\n}\r\n\r\nexport default AgeSelect;\r\n","import React, { useState, useEffect } from 'react';\r\nimport { IonModal } from '@ionic/react';\r\nimport * as BasketStore from '../store/BasketStore';\r\nimport './MopHeaderMenusModal.scss';\r\nimport { bindActionCreators } from 'redux';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { useHistory } from 'react-router';\r\nimport { baseUrl, cacheBust } from '../helpers/configHelper';\r\nimport '../theme/common.scss';\r\nimport AgeSelect from '../components/AgeSelect';\r\nimport { ApplicationState } from '../store';\r\n\r\ninterface KidsEatFreeModalProps {\r\n\tshowModal: boolean;\r\n\tcloseModal: () => void;\r\n completeModal: () => void;\r\n\tkidsMeals: AgeRestrictedDiscount[];\r\n}\r\n\r\nconst KefList = (props: { kidsMeals: AgeRestrictedDiscount[], index: number }) => {\r\n\tconst kids = props.kidsMeals.map((_, i) => {\r\n\t\tif (i === props.index) {\r\n\t\t\treturn \r\n\t\t\t\t\r\n\t\t\t\r\n\t\t}\r\n\r\n\t\treturn \r\n\t\t\t\r\n\t\t\r\n\t});\r\n\r\n\treturn (\r\n\t\t
    {kids}
\r\n\t);\r\n}\r\n\r\nconst KidsEatFreeModal = (props: KidsEatFreeModalProps) => {\r\n const basketStore = useSelector((state: ApplicationState) => state.basket);\r\n\r\n\tconst [kid, setKid] = useState(0);\r\n\tconst [age, setAge] = useState(null);\r\n\tconst [error, setError] = useState(\"\");\r\n\tconst [kidsMeals, setKidsMeals] = useState(props.kidsMeals);\r\n\r\n\tconst boundSetDiscountAges = bindActionCreators(BasketStore.actionCreators.setDiscountAges, useDispatch());\r\n\tconst boundSetIsKefComplete = bindActionCreators(BasketStore.actionCreators.setIsKefComplete, useDispatch());\r\n\tconst history = useHistory();\r\n\r\n useEffect(() => {\r\n if (basketStore?.basket?.ageRestrictedDiscounts) {\r\n setKidsMeals(basketStore.basket.ageRestrictedDiscounts);\r\n }\r\n }, [basketStore?.basket?.ageRestrictedDiscounts])\r\n\r\n\tconst nextKid = () => {\r\n\t\tsetKid(k => k + 1);\r\n\t\tsetAge(null);\r\n\t}\r\n\r\n\tconst handleAgeClick = (change: number) => {\r\n\t\tsetAge(a => {\r\n\t\t\tif (a === null) {\r\n\t\t\t\tsetError(\"\")\r\n\r\n\t\t\t\tif (change < 0) {\r\n\t\t\t\t\treturn 16;\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn 0;\r\n\t\t\t}\r\n\r\n\t\t\tif (a + change <= 16) {\r\n\t\t\t\tsetError(\"\");\r\n\t\t\t}\r\n\r\n\t\t\treturn clamp(a + change, 0, 100);\r\n\t\t});\r\n\t}\r\n\r\n\tconst clamp = (value: number, min: number, max: number) => {\r\n\t\treturn Math.min(max, Math.max(min, value));\r\n\t}\r\n\r\n\tconst handleConfirmClick = () => {\r\n\t\tif (age === null) {\r\n\t\t\tsetError(\"You must enter the child's age\");\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (age > 16) {\r\n\t\t\tsetError(\"The child must be 16 or under\");\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tsetError(\"\");\r\n\r\n\t\tconst newKidsMeals = kidsMeals.map((m, i) => {\r\n\t\t\tif (i === kid) {\r\n\t\t\t\tm.ageIsValid = true;\r\n\t\t\t}\r\n\r\n\t\t\treturn m;\r\n\t\t});\r\n\r\n\t\tsetKidsMeals(newKidsMeals);\r\n\r\n\t\tif (kid + 1 < props.kidsMeals.length) {\r\n\t\t\tnextKid();\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tcompleteModal();\r\n\t}\r\n\r\n\tconst handleCancelClick = () => {\r\n\t\tsetError(\"\");\r\n\r\n\t\tif (kid + 1 < props.kidsMeals.length) {\r\n\t\t\tnextKid();\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tcompleteModal();\r\n\t}\r\n\r\n\tconst resetState = () => {\r\n\t\tsetKid(0);\r\n\t\tsetAge(null);\r\n\t\tsetError(\"\");\r\n\t\tsetKidsMeals(JSON.parse(JSON.stringify(props.kidsMeals)));\r\n\t}\r\n\r\n\tconst completeModal = () => {\r\n\t\tboundSetDiscountAges(kidsMeals, () => {\r\n\t\t\tresetState();\r\n\t\t boundSetIsKefComplete(true);\r\n\t\t\tprops.completeModal();\r\n\t\t});\r\n\t}\r\n\r\n\tconst exitModal = () => {\r\n\t\tresetState();\r\n\t\tprops.closeModal();\r\n\t}\r\n\r\n\treturn (\r\n\t\t\r\n\t\t\t\r\n\t\t\t
\r\n\t\t\t\t
\r\n\t\t\t\t\t

{props.kidsMeals[kid]?.rewardNames}

\r\n\t\t\t\t\t

\r\n\t\t\t\t\t\tTo enjoy our kids eat free offer your child needs to be 16\r\n\t\t\t\t\t\tor under.\r\n\t\t\t\t\t

\r\n\t\t\t\t\t

\r\n\t\t\t\t\t\tPlease enter your child's age and press\r\n\t\t\t\t\t\t {\r\n\t\t\t\t\t\t\t(props.kidsMeals.length === 1)\r\n\t\t\t\t\t\t\t\t? \" 'I'm with a child who is 16 or under'\"\r\n\t\t\t\t\t\t\t\t: ` 'Child ${kid + 1} is 16 or under'`\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t.\r\n\t\t\t\t\t

\r\n\t\t\t\t\t

\r\n\t\t\t\t\t\tIf you would like to enjoy our kids meal as a paid for small\r\n\t\t\t\t\t\tportion then please press\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\" 'Add to basket at full price'\"\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t.\r\n\t\t\t\t

\r\n\t\t\t\t
\r\n\r\n\t\t\t\t
\r\n\t\t\t\t\t{props.kidsMeals.length > 1 &&\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t

{\r\n\t\t\t\t\t\t(props.kidsMeals.length === 1)\r\n\t\t\t\t\t\t\t? \"Child's age\"\r\n\t\t\t\t\t\t\t: `Child ${kid + 1}'s age`\r\n\t\t\t\t\t}

\r\n\r\n\t\t\t\t\t handleAgeClick(value)}\r\n\t\t\t\t\t\tvalue={age}\r\n\t\t\t\t\t\tdisableSubtract={age === null ? false : age <= 0}\r\n\t\t\t\t\t\tdisableAdd={age === null ? false : age >= 100}\r\n\t\t\t\t\t\terror={error.length > 0}\r\n\t\t\t\t\t/>\r\n\r\n\t\t\t\t\t

\r\n\t\t\t\t\t\t{error ? error : \"None\"}\r\n\t\t\t\t\t

\r\n\t\t\t\t
\r\n\t\t\t\t
\r\n\t\t\t\t\t\r\n\t\t\t\t\t
\r\n\t\t\t\t\t\r\n\t\t\t\t\t
\r\n\t\t\t\t\t

\r\n\t\t\t\t\t\tChange my order\r\n\t\t\t\t\t

\r\n\t\t\t\t
\r\n\t\t\t
\r\n\t\t\r\n\t)\r\n}\r\n\r\nexport default KidsEatFreeModal;\r\n","import \"./WaitTimesModal.scss\"\r\nimport {IonCol, IonIcon, IonImg, IonModal, IonRow} from \"@ionic/react\";\r\nimport React, {FC, ReactNode, useMemo, useState} from \"react\";\r\nimport {useWaitTimes} from \"../../helpers/waitTimesHelper\";\r\nimport Button from \"../Button\";\r\nimport {baseUrl} from \"../../helpers/configHelper\";\r\n\r\ninterface IWaitTimesCheckoutModal {\r\n onDidDismiss: () => void;\r\n onDidAccept: () => void;\r\n showing: boolean;\r\n}\r\n\r\nexport const WaitTimesCheckoutModal: FC = ({showing, onDidDismiss, onDidAccept}) => {\r\n const {\r\n waitingRange,\r\n waitingLabel,\r\n } = useWaitTimes();\r\n\r\n return \r\n \r\n \r\n \r\n onDidDismiss()}\r\n src={`${baseUrl()}/images/assets/dismiss_button.svg`}\r\n />\r\n \r\n \r\n

Please note

\r\n
\r\n \r\n We are currently experiencing longer than usual wait times\r\n \r\n \r\n The current estimated wait time is\r\n \r\n \r\n

{waitingLabel} {waitingRange} minutes

\r\n
\r\n \r\n This is an estimate based on recent orders. Times may vary.\r\n \r\n \r\n \r\n OK\r\n \r\n \r\n
\r\n
\r\n
\r\n}\r\n","import React, { useState } from 'react';\r\nimport { IonRow, IonCol } from '@ionic/react';\r\nimport { ApplicationState } from '../store';\r\nimport { useHistory } from \"react-router-dom\";\r\nimport { useSelector } from 'react-redux';\r\nimport { simpleChannelType } from '../store/LocationStore';\r\nimport KidsEatFreeModal from '../modals/KidsEatFreeModal';\r\nimport Button from './Button';\r\nimport AllergenPopup from '../modals/AllergenPopup';\r\nimport {secondsToMinutes, useWaitTimes} from \"../helpers/waitTimesHelper\";\r\nimport { WaitTimesButton, WaitTimesModal } from \"./wait-times/WaitTimesModal\";\r\nimport {WaitTimesCheckoutModal} from \"./wait-times/WaitTimesCheckoutModal\";\r\n\r\nconst MopFooterBasketPage: React.FC = () => {\r\n const locationState = useSelector((state: ApplicationState) => state.location);\r\n const menuItemData = useSelector((state: ApplicationState) => state.menuItemData);\r\n const isLoading = useSelector((state: ApplicationState) => state?.basket?.isLoading);\r\n const basketStore = useSelector((state: ApplicationState) => state.basket);\r\n\r\n const upsells = useSelector((state: ApplicationState) => state.basket?.upsells);\r\n const upsellDone = useSelector((state: ApplicationState) => state.basket?.upsellDone);\r\n\r\n const [showKefModal, setShowKefModal] = useState(false);\r\n const [showAllergenPopup, setShowAllergenPopup] = useState(false);\r\n\r\n const isLoggedIn = localStorage.getItem('isLoggedIn') === \"true\" ? true : false\r\n\r\n let history = useHistory();\r\n\r\n const { displayWaitTimes, anticipatedWaitTimeSeconds } = useWaitTimes();\r\n const [showWaitingModal, setShowWaitingModal] = useState(false);\r\n const [showWaitingCheckoutModal, setShowWaitingCheckoutModal] = useState(false);\r\n\r\n function showUpsellPage() {\r\n return upsells && upsells.length > 0 && !upsellDone\r\n }\r\n\r\n const handleCheckout = () => {\r\n if(secondsToMinutes(anticipatedWaitTimeSeconds ?? 0) >= 10) {\r\n setShowWaitingCheckoutModal(true);\r\n } else {\r\n handleKef();\r\n }\r\n }\r\n\r\n const handleAcceptWaitingCheckout = () => {\r\n setShowWaitingCheckoutModal(false);\r\n handleKef();\r\n }\r\n \r\n const handleKef = () => {\r\n if (basketStore?.basket.ageRestrictedDiscounts) {\r\n setShowKefModal(true);\r\n } else {\r\n handleCloseKef();\r\n }\r\n }\r\n\r\n const handleCloseKef = () => {\r\n setShowKefModal(false);\r\n\r\n if (showUpsellPage()) {\r\n history.push(\"/temptyou\");\r\n } else {\r\n setShowAllergenPopup(true);\r\n }\r\n }\r\n\r\n function handleCloseAllergen() {\r\n switch (locationState?.selectedChannel?.channelType) {\r\n case simpleChannelType.ClickAndCollect:\r\n isLoggedIn\r\n ? history.push(\"/name-or-nickname\")\r\n : history.push(\"/enteremail\");\r\n break;\r\n case simpleChannelType.TableOrder:\r\n isLoggedIn\r\n ? history.push(\"/name-or-nickname\")\r\n : history.push(\"/tablenumber\");\r\n break;\r\n }\r\n }\r\n\r\n return (\r\n
\r\n { menuItemData?.menuItem &&\r\n \r\n \r\n {locationState?.selectedChannel === undefined ? \"Store\" : locationState.selectedChannel.channelType === simpleChannelType.ClickAndCollect ? \"Take away\" : \"Eat in\" }
\r\n {locationState?.selectedStore === undefined ? \"Select a store\" : locationState?.selectedStore.storeName}\r\n {locationState?.selectedStore?.takingMopOrders === false ? - Order ahead not available : null}\r\n {displayWaitTimes && setShowWaitingModal(true)} />}\r\n
\r\n \r\n \r\n Checkout\r\n \r\n \r\n
\r\n }\r\n\r\n {basketStore?.basket?.ageRestrictedDiscounts &&\r\n setShowKefModal(false)}\r\n completeModal={handleCloseKef}\r\n kidsMeals={basketStore.basket.ageRestrictedDiscounts}\r\n />\r\n }\r\n\r\n setShowAllergenPopup(false)}\r\n accept={handleCloseAllergen}\r\n />\r\n setShowWaitingModal(false)} showing={showWaitingModal} />\r\n setShowWaitingCheckoutModal(false)} onDidAccept={() => handleAcceptWaitingCheckout()} showing={showWaitingCheckoutModal} />\r\n
\r\n );\r\n};\r\n\r\nexport default MopFooterBasketPage;\r\n","import moment from 'moment';\r\nimport React, { useState, useEffect } from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { useHistory, useLocation } from 'react-router';\r\nimport { bindActionCreators } from 'redux';\r\nimport { ApplicationState } from '../store';\r\nimport * as LocationStore from '../store/LocationStore';\r\n\r\n\r\n\r\nconst useMopHooks = () => {\r\n\r\n let history = useHistory();\r\n const location = useLocation();\r\n const locationState = useSelector((state: ApplicationState) => state.location);\r\n const boundSelectTimeslot = bindActionCreators(LocationStore.actionCreators.selectTimeslot, useDispatch());\r\n const boundSetChannel = bindActionCreators(LocationStore.actionCreators.setChannel, useDispatch());\r\n\r\n const onChannelSelected = (channel: LocationStore.SimpleChannel) => {\r\n boundSetChannel(channel);\r\n switch(channel.channelType){\r\n case LocationStore.simpleChannelType.ClickAndCollect:\r\n if (locationState?.selectedStore) { //undefined check\r\n if(locationState.selectedStore.enableTimeSlots) { //timeslots enabled\r\n history.push('/choosetimeslot'); \r\n } \r\n else { \r\n setAsapTimeSlot();\r\n history.push(`/categories`); \r\n } \r\n } \r\n break;\r\n case LocationStore.simpleChannelType.TableOrder:\r\n console.log(\"Eat in called\");\r\n\r\n if (localStorage.getItem('isLoggedIn') === \"true\") {\r\n // Colleague is logged in, retrieve time slots is they are available\r\n if (locationState?.selectedStore) { //undefined check\r\n if (locationState.selectedStore.enableTimeSlots) { //timeslots enabled\r\n history.push('/choosetimeslot');\r\n break;\r\n }\r\n } \r\n }\r\n\r\n setAsapTimeSlot(); \r\n history.push(\"/categories\");\r\n break;\r\n }\r\n }\r\n\r\n const setAsapTimeSlot = () => {\r\n if(locationState?.selectedStore){ \r\n let serverTime = locationState.selectedStore.serverTime;\r\n let remainder = (moment(serverTime).minute() % 15);\r\n let startTime = moment(serverTime).subtract(remainder, \"m\");\r\n //console.log(moment(serverTime).minute() % 15);\r\n boundSelectTimeslot({\r\n label: \"ASAP\", \r\n startDateTime: moment(startTime).format(),\r\n endDateTime: moment(startTime).add(15, 'm').format(),\r\n startTime: moment(startTime).format(\"HH:mm\"),\r\n endTime: moment(startTime).add(15, 'm').format(\"HH:mm\"),\r\n takingOrders: true\r\n })\r\n }\r\n }\r\n\r\n return {\r\n onChannelSelected: onChannelSelected\r\n }\r\n\r\n}\r\n\r\nexport default useMopHooks;","import React, { useEffect, useState } from 'react';\r\nimport { IonRow, IonCol } from '@ionic/react';\r\nimport { ApplicationState } from '../store';\r\nimport { useSelector } from 'react-redux';\r\nimport { useHistory, useLocation } from \"react-router-dom\";\r\nimport useMopHooks from '../helpers/useMopHook';\r\nimport { simpleChannelType } from '../store/LocationStore';\r\nimport Button from './Button';\r\n\r\nconst MopFooterConfirmStore: React.FC = () => {\r\n let history = useHistory();\r\n const location = useLocation();\r\n const locationState = useSelector((state: ApplicationState) => state.location);\r\n const { onChannelSelected } = useMopHooks();\r\n const [showButton, setShowButton] = useState(true);\r\n\r\n useEffect(() => {\r\n setShowButton(location.pathname !== \"/ordertype\");\r\n }, [location.pathname]);\r\n\r\n const handleClick = () => {\r\n // Use selected store channel instead of having extra state for order type?\r\n if (location.pathname.includes('/storesearch')) {\r\n if (locationState?.selectedStore){\r\n // If selectedStore supports both eat in and takeaway, then orderType, else onEatInSelected();\r\n if (locationState?.selectedStore?.supportedChannels.length > 0) {\r\n history.push('/ordertype');\r\n } else {\r\n onChannelSelected(locationState.selectedStore.supportedChannels[0]);\r\n }\r\n }\r\n } else {\r\n history.push(`/categories`);\r\n }\r\n }\r\n\r\n return (\r\n
\r\n \r\n \r\n
\r\n {location.pathname === \"/storesearch\" || location.pathname === \"/ordertype\" ? \"Store\" : locationState?.selectedChannel?.channelType === simpleChannelType.ClickAndCollect ? \"Collect from\" : \"Eat in\"}
\r\n {locationState?.selectedStore === undefined ? \"Select a store\" : locationState?.selectedStore.storeName}\r\n {locationState?.selectedStore?.takingMopOrders === false ? - Order ahead not available: null}\r\n
\r\n
\r\n { showButton &&\r\n \r\n \r\n Confirm\r\n \r\n \r\n }\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default MopFooterConfirmStore;\r\n","import React from 'react';\r\nimport { IonRow, IonCol } from '@ionic/react';\r\n\r\nimport { ApplicationState } from '../store';\r\n\r\nimport { useSelector, useDispatch } from 'react-redux';\r\n\r\nimport { simpleChannelType } from '../store/LocationStore';\r\nimport Button from './Button';\r\nimport * as BasketStore from '../store/BasketStore';\r\n\r\nconst MopFooterUpsellPage: React.FC = () => {\r\n const locationState = useSelector((state: ApplicationState) => state.location);\r\n const menuItemData = useSelector((state: ApplicationState) => state.menuItemData);\r\n const dispatch = useDispatch();\r\n\r\n const goToNextPage = () => {\r\n dispatch(BasketStore.actionCreators.showAllergen(true))\r\n };\r\n\r\n return (\r\n
\r\n { menuItemData?.menuItem &&\r\n \r\n \r\n {locationState?.selectedChannel === undefined ? \"Store\" : locationState.selectedChannel.channelType === simpleChannelType.ClickAndCollect ? \"Take away\" : \"Eat in\" }
\r\n {locationState?.selectedStore === undefined ? \"Select a store\" : locationState?.selectedStore.storeName}\r\n {locationState?.selectedStore?.takingMopOrders === false ? - Order ahead not available : null}\r\n
\r\n \r\n \r\n Continue\r\n \r\n \r\n
\r\n }\r\n
\r\n );\r\n};\r\n\r\nexport default MopFooterUpsellPage;\r\n","import React from 'react';\r\nimport { IonRow, IonCol } from '@ionic/react';\r\n\r\nimport { ApplicationState } from '../store';\r\nimport { useHistory } from \"react-router-dom\";\r\n\r\nimport { useSelector, useDispatch } from 'react-redux';\r\nimport { bindActionCreators } from 'redux';\r\nimport * as BasketStore from '../store/BasketStore';\r\n\r\nimport { simpleChannelType } from '../store/LocationStore';\r\nimport Button from './Button';\r\n\r\nconst MopFooterTablePage: React.FC = () => {\r\n const locationState = useSelector((state: ApplicationState) => state.location);\r\n const BasketTableNumber = useSelector((state: ApplicationState) => state.basket?.tableNumber);\r\n const BasketNickname = useSelector((state: ApplicationState) => state.basket?.nickname);\r\n const tableFormErrors = useSelector((state: ApplicationState) => state.basket?.tableFormErrors);\r\n const nicknameFormErrors = useSelector((state: ApplicationState) => state.basket?.nicknameFormErrors);\r\n\r\n const boundSetContinueClicked = bindActionCreators(BasketStore.actionCreators.setContinueClicked, useDispatch());\r\n const boundSetTableFormError = bindActionCreators(BasketStore.actionCreators.setTableFormErrors, useDispatch());\r\n const boundSetNicknameFormError = bindActionCreators(BasketStore.actionCreators.setNicknameFormErrors, useDispatch());\r\n const boundSetTableNumber = bindActionCreators(BasketStore.actionCreators.setTableNumber, useDispatch());\r\n const boundSetNickname = bindActionCreators(BasketStore.actionCreators.setNickname, useDispatch());\r\n const history = useHistory();\r\n\r\n if (localStorage.getItem('isLoggedIn') === \"true\") {\r\n if (!BasketNickname) {\r\n boundSetNicknameFormError(\"Please enter a valid Name or nickname\");\r\n } else {\r\n boundSetNicknameFormError(\"\");\r\n }\r\n }\r\n else {\r\n if (!BasketTableNumber) {\r\n boundSetTableFormError(\"Please enter a valid table number\");\r\n } else {\r\n if (BasketTableNumber === 0) {\r\n boundSetTableFormError(\"Table number must be greater than 0\");\r\n } else {\r\n boundSetTableFormError(\"\");\r\n }\r\n }\r\n }\r\n\r\n const submitTableNumber = () => {\r\n boundSetContinueClicked(true)\r\n\r\n if (!tableFormErrors && !nicknameFormErrors) {\r\n boundSetTableNumber(BasketTableNumber as number);\r\n boundSetNickname(BasketNickname as string)\r\n history.push(\"/enteremail\");\r\n }\r\n }\r\n\r\n return (\r\n
\r\n \r\n \r\n {locationState?.selectedChannel === undefined ? \"Store\" : locationState.selectedChannel.channelType === simpleChannelType.ClickAndCollect ? \"Take away\" : \"Eat in\"}
\r\n {locationState?.selectedStore === undefined ? \"Select a store\" : locationState?.selectedStore.storeName}\r\n {locationState?.selectedStore?.takingMopOrders === false ? - Order ahead not available : null}\r\n
\r\n \r\n \r\n Continue\r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default MopFooterTablePage;\r\n","import React, { useState } from 'react';\r\nimport { IonGrid, IonCol, IonButton, IonRow, IonInput, IonIcon} from '@ionic/react';\r\nimport './BasketTotalAndCoupons.scss';\r\nimport { ApplicationState } from '../store';\r\nimport { useSelector, connect } from 'react-redux';\r\nimport * as currencyHelpers from '../helpers/currencyHelpers';\r\nimport { chevronDownOutline,chevronUpOutline } from 'ionicons/icons';\r\nimport * as BasketStore from '../store/BasketStore';\r\nimport Button from './Button';\r\n\r\ninterface KeyedErrorMappings {\r\n [index: number]: string;\r\n}\r\n\r\nconst couponErrorMappings: KeyedErrorMappings = {\r\n 1: \"This coupon has expired.\",\r\n 2: \"The qualifying spend for this coupon has not been met.\",\r\n 3: \"Item required for coupon is not in basket.\",\r\n 4: \"Not enough qualifying products in basket. Coupon not valid.\",\r\n 5: \"Invalid Coupon.\",\r\n 6: \"This coupon has already been used and is no longer valid.\",\r\n 7: \"This coupon is worth more than the total spend.\",\r\n 8: \"This coupon cannot be used on this till type.\",\r\n 9: \"This coupon has already been used in this transaction.\",\r\n 10: \"The customer is not eligible for this coupon.\",\r\n 11: \"Please use More Card card.\",\r\n 12: \"Service is unavailable, coupon cannot be redeemed.\",\r\n 989: \"Digital money off coupons cannot be redeemed at this time.\",\r\n 20: \"Colleage Discount limit reached.\",\r\n 21: \"No items qualify for Colleague Discount.\",\r\n 50: \"We are really sorry some promotions and discounts are unavailable at this time.\",\r\n 1001: \"Your coupon is not supported here. Place your order at the till.\"\r\n};\r\n\r\ninterface BasketTotalAndCouponsProps {\r\n mopCoupons: any[];\r\n menuItems: IMopMenuItemDetail[];\r\n}\r\n\r\ntype BasketTotalAndCouponsPropsMergeProps =\r\n typeof BasketStore.actionCreators\r\n & BasketTotalAndCouponsProps;\r\n\r\nfunction CouponCheckMarkSvg() {\r\n return(\r\n \r\n );\r\n}\r\n\r\nfunction ErrorSvg() {\r\n return(\r\n \r\n );\r\n}\r\n\r\nconst BasketTotalAndCoupons: React.FC = (props: BasketTotalAndCouponsPropsMergeProps) => {\r\n const [CouponCode, SetCouponCode] = useState(\"\");\r\n const [showCouponEntry, setShowCouponEntry] = useState(false);\r\n const [Error, SetError] = useState(\"\");\r\n const [IsBusy, SetIsBusy] = useState(false);\r\n const basketStoreEx = useSelector((state: ApplicationState) => state.basket);\r\n const isLoading = useSelector((state: ApplicationState) => state?.basket?.isLoading);\r\n\r\n const calculateCouponsTotal = () => {\r\n let couponsTotal:number = 0;\r\n if(props.mopCoupons) {\r\n const validCoupons = props.mopCoupons.filter((c: IMopCoupon) => !c.rejected);\r\n validCoupons.forEach((coupon: IMopCoupon) => {\r\n const couponMenuItem = props.menuItems.filter((c: IMopMenuItemDetail) => c.sku.includes(coupon.couponCode));\r\n if(couponMenuItem.length === 1) {\r\n couponsTotal += couponMenuItem[0].menuItemTotalPrice;\r\n }\r\n });\r\n }\r\n return couponsTotal;\r\n }\r\n\r\n const couponsTotal = calculateCouponsTotal();\r\n const subTotal = basketStoreEx?.basket.totalPrice ? basketStoreEx.basket.totalPrice - couponsTotal : basketStoreEx?.basket.totalPrice;\r\n\r\n return (
\r\n \r\n \r\n Subtotal\r\n {currencyHelpers.formatCurrency(subTotal)}\r\n \r\n {couponsTotal !== 0 &&\r\n \r\n Coupons\r\n {currencyHelpers.formatCurrency(couponsTotal)}\r\n }\r\n \r\n Order Total\r\n {currencyHelpers.formatCurrency(basketStoreEx?.basket.totalPrice)}\r\n \r\n \r\n \r\n {localStorage.getItem('isLoggedIn') !== \"true\" &&\r\n
\r\n
{ setShowCouponEntry(show => !show) }}>\r\n Add coupon{!showCouponEntry && }{showCouponEntry && }\r\n
\r\n
\r\n }\r\n { showCouponEntry &&
\r\n
Enter coupon number
\r\n
0 && \"error\"}` }>\r\n
\r\n {\r\n if (s.detail.value != undefined) {\r\n SetCouponCode(s.detail.value);\r\n SetError(\"\");\r\n }\r\n }}\r\n type=\"number\" min=\"0\" />\r\n
\r\n
\r\n {\r\n const canAdd = CouponCode?.length === 13 && CouponCode.substring(0, 3) === \"992\";\r\n\r\n if (canAdd === false) {\r\n SetError(\"Coupon not recognised\");\r\n return;\r\n }\r\n\r\n SetError(\"\");\r\n\r\n let duplicatCoupon: any = [];\r\n\r\n if (props.mopCoupons != null) {\r\n duplicatCoupon = props.mopCoupons.filter((c: any) => c.couponCode == CouponCode);\r\n }\r\n\r\n if (duplicatCoupon.length == 0) {\r\n SetError(\"\");\r\n SetIsBusy(true);\r\n props.addCouponCode(CouponCode, (r: boolean, basket: any) => {\r\n if (basket) {\r\n const couponsAdded = basket.mopCoupons.filter((c: any) => c.couponCode == CouponCode);\r\n if (couponsAdded.length > 0) {\r\n const thatCoupon = couponsAdded[0] as IMopCoupon;\r\n if (thatCoupon.rejected) {\r\n const mappedError = couponErrorMappings[thatCoupon.errorCode];\r\n if (mappedError) {\r\n SetError(mappedError);\r\n }\r\n else {\r\n SetError(\"An unknown error has occurred\");\r\n }\r\n props.deleteCouponCode(thatCoupon.couponCode, (r: boolean) => {\r\n SetIsBusy(false);\r\n });\r\n }\r\n else {\r\n SetCouponCode(\"\");\r\n }\r\n }\r\n }\r\n SetIsBusy(false);\r\n });\r\n }\r\n else {\r\n SetError(\"This coupon has already been added\");\r\n }\r\n }}\r\n >\r\n Apply\r\n \r\n
\r\n
\r\n { Error.length > 0 &&\r\n
\r\n
\r\n
{Error}
\r\n
}\r\n
}\r\n
\r\n
\r\n {props.mopCoupons != null && props.mopCoupons.filter((b: IMopCoupon) => b.rejected === false).map((c: IMopCoupon, idx: number) => (\r\n \r\n \r\n
\r\n
{c.couponCode}
\r\n
\r\n
{\r\n SetIsBusy(true);\r\n props.deleteCouponCode(c.couponCode, (r: boolean) => {\r\n SetIsBusy(false);\r\n });\r\n }}>Remove\r\n
\r\n
\r\n
))}\r\n
\r\n
)};\r\n\r\nconst mapStateToProps = (state: ApplicationState, ownProps: any) => ({\r\n mopCoupons: state.basket?.basket.mopCoupons,\r\n menuItems: state.basket?.basket.menuItems\r\n});\r\n\r\nconst mapDispatchToProps = (dispatch: any) => ({\r\n addCouponCode: (couponCode: string, callback: any) => dispatch(BasketStore.actionCreators.addCouponCode(couponCode, callback)),\r\n deleteCouponCode: (couponCode: string, callback: any) => dispatch(BasketStore.actionCreators.deleteCouponCode(couponCode, callback))\r\n});\r\n\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(BasketTotalAndCoupons as any)\r\n\r\n// 9928220872006\r\n","import React from 'react';\r\nimport { IonRow, IonCol } from '@ionic/react';\r\nimport './MopFooterPaymentSuccessPage.scss';\r\n\r\nimport { baseUrl } from '../helpers/configHelper';\r\nimport Button from './Button';\r\n\r\nconst MopFooterPaymentSuccessPage: React.FC = () => {\r\n function handleClick() {\r\n window.location.href = baseUrl() + \"/splash?newOrder=true\";\r\n }\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n Start a new order\r\n \r\n \r\n \r\n
\r\n );\r\n};\r\n\r\nexport default MopFooterPaymentSuccessPage;\r\n","import React from \"react\";\r\nimport { IonRow, IonCol } from '@ionic/react';\r\nimport Button from './Button';\r\nimport './MopFooterDealUpgrade.scss';\r\nimport { useHistory } from \"react-router\";\r\nimport { useSelector, useDispatch } from \"react-redux\";\r\nimport { ApplicationState } from \"../store\";\r\nimport * as MenuItemStore from '../store/MenuItemStore';\r\n\r\nfunction MopFooterDealUpgrade() {\r\n const history = useHistory();\r\n const dispatch = useDispatch();\r\n const menuItemId = useSelector((state: ApplicationState) => state.menuItemData?.menuItem?.menuItemId);\r\n\r\n const deal = useSelector((state: ApplicationState) => {\r\n return state.deal?.deals?.find(deal => deal.dealSku === state.deal?.currentDealSku);\r\n });\r\n\r\n const upgradedFromSku = useSelector((state: ApplicationState) => {\r\n return state.deal?.upgradedFromSku;\r\n });\r\n\r\n function handleCancel() {\r\n if (menuItemId) {\r\n history.replace(`/menuitem/${menuItemId}`);\r\n }\r\n }\r\n\r\n function handleUpgrade() {\r\n if (!deal) {\r\n console.error(\"deal is null\");\r\n return;\r\n }\r\n\r\n dispatch(MenuItemStore.actionCreators.requestMenuItemBySku(deal.dealSku, \"\", upgradedFromSku, () => {\r\n const params = new URLSearchParams();\r\n params.set('page', '1');\r\n\r\n history.replace(`/deal/${menuItemId}?${params.toString()}`);\r\n }));\r\n }\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n
\r\n

No thanks

\r\n

Add item only

\r\n
\r\n \r\n
\r\n \r\n \r\n
\r\n

Yes please

\r\n

Make it a deal

\r\n
\r\n \r\n
\r\n
\r\n
\r\n )\r\n}\r\n\r\nexport default MopFooterDealUpgrade;\r\n","import React, { useEffect, useState, useMemo } from \"react\";\r\nimport { IonRow, IonCol, IonToast, useIonToast, IonicSafeString } from \"@ionic/react\";\r\nimport Button from \"./Button\";\r\nimport { ApplicationState } from \"../store\";\r\nimport { useSelector, useDispatch } from \"react-redux\";\r\nimport * as DealStore from '../store/DealStore';\r\nimport * as BasketStore from '../store/BasketStore';\r\nimport { bindActionCreators } from \"redux\";\r\nimport { useHistory, useLocation } from \"react-router\";\r\nimport { shouldShowModifierGroup, getSelectedSkus } from \"../helpers/menuHelpers\";\r\n\r\nfunction MopFooterDeal() {\r\n const dispatch = useDispatch();\r\n const history = useHistory();\r\n const location = useLocation();\r\n\r\n const menuItem = useSelector((state: ApplicationState) => state.menuItemData?.menuItem);\r\n const isBasket = useSelector((state: ApplicationState) => state.menuItemData?.isBasket);\r\n const currentPage = useSelector((state: ApplicationState) => state.deal?.currentPage);\r\n\r\n const cancelDeal = bindActionCreators(DealStore.actionCreators.cancelDeal, dispatch);\r\n const setCurrentPage = bindActionCreators(DealStore.actionCreators.setCurrentPage, dispatch);\r\n const addToBasket = bindActionCreators(BasketStore.actionCreators.addMenuItemToBasket, dispatch);\r\n const updateBasket = bindActionCreators(BasketStore.actionCreators.updateBasketItem, dispatch);\r\n\r\n const selectedSkus = useMemo(() => {\r\n if (!menuItem?.modifierGroups) {\r\n return [];\r\n }\r\n\r\n return getSelectedSkus(menuItem.modifierGroups);\r\n }, [menuItem?.modifierGroups, currentPage])\r\n\r\n const pages = useMemo(() => {\r\n if (!menuItem?.modifierGroups) {\r\n return [];\r\n }\r\n\r\n const pages = menuItem.modifierGroups\r\n .filter((group: IMopModifierGroup) => shouldShowModifierGroup(group, selectedSkus, menuItem.sku))\r\n .map((group: IMopModifierGroup) => group.showOnPage);\r\n\r\n const unique = new Set(pages);\r\n\r\n return Array.from(unique).sort();\r\n }, [menuItem?.modifierGroups, selectedSkus]);\r\n\r\n const lastPage = useMemo(() => {\r\n return pages.slice(-1)[0];\r\n }, [pages]);\r\n\r\n const [enableButton, setEnableButton] = useState(false);\r\n\r\n const [isGreyedOut, setIsGreyedOut] = useState(false);\r\n const [requiredItems, setRequiredItems] = useState(0);\r\n const [showToastError, setShowToastError] = useState(false);\r\n const [showToastSuccess, setShowToastSuccess] = useState(false);\r\n\r\n function handleBack() {\r\n if (currentPage === 1) {\r\n cancelDeal();\r\n }\r\n\r\n history.goBack();\r\n }\r\n\r\n // HACK: history.go(-pages.size) does not update the UI.\r\n // This might lead to issues on slow phones where it shows each page.\r\n function goBackRecursive(to: string) {\r\n history.goBack();\r\n\r\n setTimeout(() => {\r\n if (!history.location.pathname.includes(to)) {\r\n goBackRecursive(to);\r\n } else {\r\n return;\r\n }\r\n }, 100);\r\n }\r\n\r\n function completeDeal() {\r\n if (isBasket) {\r\n updateBasket();\r\n goBackRecursive('basket');\r\n } else {\r\n addToBasket();\r\n goBackRecursive('categories');\r\n }\r\n }\r\n\r\n function getFirstValidPage(page: number) {\r\n let validPage = page;\r\n\r\n while (validPage < lastPage && pages.indexOf(validPage) === -1) {\r\n validPage += 1;\r\n }\r\n\r\n return validPage;\r\n }\r\n\r\n function goToNextPage() {\r\n let nextPage = (currentPage ?? 1) + 1;\r\n\r\n nextPage = getFirstValidPage(nextPage);\r\n\r\n let pathname = location.pathname;\r\n const params = new URLSearchParams();\r\n params.set('page', nextPage.toString());\r\n\r\n if (pages.indexOf(nextPage) === -1) {\r\n pathname = '/deal-summary';\r\n params.set('count', (pages.length + 1).toString())\r\n } else {\r\n params.set('count', (pages.indexOf(nextPage) + 1).toString());\r\n }\r\n\r\n history.push(`${pathname}?${params.toString()}`);\r\n }\r\n\r\n function handleNext() {\r\n if (isGreyedOut) {\r\n setShowToastError(true);\r\n return;\r\n }\r\n\r\n setShowToastError(false);\r\n setShowToastSuccess(false);\r\n\r\n if ((currentPage ?? 1) > lastPage) {\r\n completeDeal();\r\n return;\r\n }\r\n\r\n goToNextPage();\r\n }\r\n\r\n // Use the current page to set the global state.\r\n useEffect(() => {\r\n const params = new URLSearchParams(location.search.substr(1));\r\n const page = params.get('page')\r\n\r\n let validPage = 0;\r\n\r\n if (page) {\r\n validPage = parseInt(page, 10);\r\n }\r\n\r\n validPage = getFirstValidPage(validPage);\r\n\r\n setCurrentPage(validPage);\r\n }, [location.search, setCurrentPage]);\r\n\r\n const modifierGroups = useMemo(() => {\r\n return menuItem?.modifierGroups\r\n .filter((group: IMopModifierGroup) => (\r\n group.showOnPage === currentPage\r\n ));\r\n }, [menuItem, currentPage]);\r\n\r\n useEffect(() => {\r\n if (!modifierGroups) {\r\n return\r\n }\r\n\r\n const isPageComplete = modifierGroups.every((group: IMopModifierGroup) => {\r\n if (group.groupType === 10) {\r\n return group.modifierGroupItems.some((item: IMopModifierGroupItem) => (\r\n item.quantitySelected > 0\r\n ));\r\n }\r\n\r\n return true;\r\n })\r\n\r\n const hasPriceSet = (menuItem?.menuItemTotalPrice ?? 0) > 0;\r\n\r\n setEnableButton(isPageComplete && hasPriceSet);\r\n }, [modifierGroups, menuItem?.menuItemTotalPrice]);\r\n\r\n useEffect(() => {\r\n if (!modifierGroups) {\r\n return;\r\n }\r\n\r\n const modifierGroup = modifierGroups.find((group: IMopModifierGroup) => {\r\n if (group.isMandatory && group.canSelectMultiple && group.maxDifferentItems && group.maxDifferentItems > 1) {\r\n return group;\r\n }\r\n\r\n return null;\r\n })\r\n\r\n if (!modifierGroup) {\r\n return;\r\n }\r\n\r\n setRequiredItems(modifierGroup.maxDifferentItems);\r\n\r\n const quantitySelected = modifierGroup.modifierGroupItems.reduce((acc: number, item: IMopModifierGroupItem) => (\r\n acc + item.quantitySelected\r\n ), 0)\r\n\r\n if (quantitySelected === modifierGroup.maxDifferentItems) {\r\n setIsGreyedOut(false);\r\n setShowToastError(false);\r\n setShowToastSuccess(true);\r\n } else {\r\n setIsGreyedOut(true);\r\n setShowToastSuccess(false);\r\n }\r\n }, [modifierGroups])\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n {currentPage === 1\r\n ?\r\n

Cancel

\r\n :\r\n

Back

\r\n }\r\n \r\n
\r\n \r\n \r\n {(currentPage ?? 1) > lastPage\r\n ?\r\n <>\r\n {isBasket\r\n ?\r\n

Update order

\r\n :\r\n

Add to order

\r\n }\r\n \r\n :\r\n

Next

\r\n }\r\n \r\n \r\n
\r\n setShowToastError(false)}\r\n />\r\n setShowToastSuccess(false)}\r\n />\r\n
\r\n )\r\n}\r\n\r\nexport default MopFooterDeal;\r\n","import React from 'react';\r\nimport { IonFooter } from '@ionic/react';\r\nimport './MopFooter.scss';\r\nimport * as headerFooterStore from '../store/HeaderFooterStore';\r\nimport { ApplicationState } from '../store';\r\nimport { useSelector } from 'react-redux';\r\nimport MopFooterList from './MopFooterList';\r\nimport MopFooterMenuItem from './MopFooterMenuItem';\r\nimport MopFooterBasketPage from './MopFooterBasketPage';\r\nimport MopFooterConfirmStore from './MopFooterConfirmStore';\r\nimport MopFooterUpsellPage from './MopFooterUpsellPage';\r\nimport MopFooterTablePage from './MopFooterTablePage';\r\nimport BasketTotalAndCoupons from './BasketTotalsAndCoupons';\r\nimport MopFooterPaymentSuccessPage from './MopFooterPaymentSuccessPage';\r\nimport MopFooterDealUpgrade from './MopFooterDealUpgrade';\r\nimport MopFooterDeal from './MopFooterDeal';\r\n\r\nconst MopFooter: React.FC = () => {\r\n const headerFooter = useSelector((state: ApplicationState) => state.headerFooter);\r\n return (\r\n <>\r\n {headerFooter?.footerMode === headerFooterStore.FooterMode.BasketPage && }\r\n \r\n \r\n );\r\n};\r\n\r\nexport default MopFooter;\r\n","import React from 'react';\r\nimport { IonHeader, IonIcon, IonModal, IonContent } from '@ionic/react';\r\nimport './MopHeaderMenusModal.scss';\r\nimport '../theme/common.scss';\r\nimport { chevronBack } from 'ionicons/icons';\r\n\r\n// eslint-disable-next-line arrow-body-style\r\nconst TermsCondModal: React.FC<{ isModalOpen: boolean, closeModalClick: any }> = ({ isModalOpen, closeModalClick }) => {\r\n return (\r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n \r\n {true &&\r\n
\r\n

Café Click and Collect terms and conditions of sale

\r\n

Welcome to the Morrisons Café Click and Collect terms and conditions of sale.

\r\n

What these terms cover

\r\n

These terms and conditions together with our Privacy Policy apply to any products that you may purchase from our website morrisons.com/Cafe (the \"Website\").

\r\n

Please read all of these terms and conditions carefully before you order any products because by ordering, you agree to be bound by them. Each time you place an order you will be asked to agree to these terms and conditions. We revise our terms and conditions from time to time (the \"terms\") - you and your order will be subject to the terms and conditions in force at the time that you submit your order

\r\n

If you do not accept these terms and conditions, you should not order any products from us.

\r\n

You should print and save a copy of these terms and conditions for your future reference.

\r\n
    \r\n
  1. \r\n
    About Us
    \r\n
      \r\n
    1. Our full legal name is WM Morrison Supermarkets Limited. We are a public limited company incorporated in England and Wales. Our registered company number is 358949 and our registered office address is Hilmore House, Gain Lane, Bradford, West Yorkshire BD37DL. Our VAT number is 343 4753 55.

    2. \r\n
    \r\n
  2. \r\n
  3. \r\n
    UK Consumers Only
    \r\n
      \r\n
    1. Our Website is only intended for use by people resident on mainland England, Scotland and Wales. We are unable to accept orders from people resident in any other countries.

    2. \r\n
    3. Our Website is also only intended for use by consumers; that means people who want to buy our products for personal use and not for any business purposes. We reserve the right to reject or cancel your order if we reasonably think that you are buying our products for business purposes.

    4. \r\n
    \r\n
  4. \r\n
  5. \r\n
    Morrisons Café Click and Collect Service
    \r\n
      \r\n
    1. The Café click and collect service allows customers to pre-order and pay for selected food and drink items featuring on the takeaway menu, via the Website, for same day collection from selected Morrisons storesor for customers choosing the eat-in option to order items to be delivered to your table at selected Morrisons stores (\"eat in\") subject to any local store restrictions.

    2. \r\n
    3. The Café click and collect service will only be available in participating Morrisons stores. In order to place an order, you must access the Website and we will ask you for permission to access your data location so that we can ensure that you are provided with the details of the closest participating store. If you do not accept our request then you may manually check whether your local Morrisons store offers the Café click and collect service by using the city, town or postcode finder.

    4. \r\n
    5. You may order items from the listed Café takeaway menu and use our Website without registering with us. You will need to enter certain details during the \"checkout\" process.

    6. \r\n
    7. In order to purchase items from our Website, you must:

      \r\n
        \r\n
      • confirm that you are over the age of 18 and provide your name, email address and any other details that we may require to process your order;

      • \r\n
      • follow the instructions on the Website to choose the item(s) that you wish to purchase from the participating Morrisons store;

      • \r\n
      • follow the instructions on the \"order\" and \"checkout\" sections and finalise the order by making payment of the items ordered.

      • \r\n
      \r\n
    8. \r\n
    9. All items offered on our Website are subject to availability and will differ per store. We will not be liable to you if we are unable to provide any item(s) for any reason and if any item is unavailable or out of stock, you may be prevented from purchasing the item. If an order is finalised and payment is processed but the item becomes unavailable, we will notify you of this as soon as possible and issue a full refund of the unavailable item(s) to you on to the same card as used for payment.

    10. \r\n
    11. During the order process you will be able to view the order in your basket prior to submitting payment. You will be able to see the items that you have ordered and the total price for the order. Once an order is placed, an order confirmation will be sent to the email address provided during the checkout process. Please ensure that the email address is correct as this is necessary to complete your order.

    12. \r\n
    13. The order confirmation will provide an order number and confirm the payment method used to process the order. You must provide the order number when you visit the designated collection point at the participating Morrisons store to collect your order.

    14. \r\n\r\n
    15. Morrisons reserves the right at any time without notice or liability to:

      \r\n
        \r\n
      • decline a new customer at any time and at our sole discretion;

      • \r\n
      • terminate your access to all or part of the Website and/or the Café click and collect service with or without notice;

      • \r\n
      • change or withdraw the Website and/or the Café click and collect service or any part of it at any time with or without any notice at our sole discretion;

      • \r\n
      • cancel orders due to unforeseeable circumstances or shortages;

      • \r\n
      • restrict access to the Website to allow for maintenance repairs or renewals;

      • \r\n
      • block your use of the Website and/or the Café click and collect Service at any time if you do not comply with these terms and conditions. Your statutory rights are not affected;

      • \r\n
      • report any suspected abuse of the Website and/or the Café click and collect service to the police and/or to instruct a debt recovery agent to seek payment from you on Morrisons behalf.

      • \r\n
      \r\n
    16. \r\n
    17. Morrisons cannot guarantee that the Website will be error free or that it will meet your requirements. The Website is provide on an 'as-is' basis however if you experience any technical issues you may report them to a member of staff at the participating store or to the Morrisons Customer Services Team.

    18. \r\n
    \r\n
  6. \r\n
  7. \r\n
    Price and Payment
    \r\n
      \r\n
    1. We require immediate payment when you order from our Website and all items purchased must be paid for in full at the time that the order is placed.

    2. \r\n
    3. All of the prices for our items will be shown in pounds sterling and are inclusive of VAT. The price of the items are as quoted on our Website at the time that you use it and will only apply to the items listed on the Website. We accept payments by Visa, Mastercard, Apple and Google Pay.

    4. \r\n
    5. When you place an order, payment will be taken for an amount of money equal to the value of the order against the card that you have used for payment when you place your order with us by clicking the 'Confirm Payment' button at the end of the checkout process.

    6. \r\n
    7. To ensure that your credit, debit or charge card is not being used without your consent and to verify that you are over 18 years of age (see our \"Age Restrictions\" section below) your payment provider may carry out certain fraud checks, to validate the payment details that you have provided during the \"checkout\" process.

    8. \r\n
    9. We reserve the right to reject or cancel an order at our discretion at any time if we are notified that the fraud checks have not been satisfied in full.

    10. \r\n
    11. Your order, your credit, debit or charge card will be processed by a reputable third party banking and distribution institution. These organisations are under strict legal and contractual obligations to keep your personal information private and comply with the relevant Data Protection Laws.

    12. \r\n
    13. If connectivity is lost or any other technical issue occurs which prevents a transaction from completing, you will need to restart your order.

    14. \r\n
    15. Once an order is placed, you may access the details of your order by reviewing your order acknowledgment email.

    16. \r\n
    \r\n
  8. \r\n
  9. \r\n
    Age Restrictions
    \r\n
      \r\n
    1. We will not sell products to people under the age of 18.

    2. \r\n
    3. We are an ethical retailer and are committed to upholding both our legal and social obligations as a retailer of products. To achieve this position, we have a number of control checks throughout our purchase and delivery process, for example we may ask you to confirm your date of birth when you place an order with us, verify who you say you are through personal identity checks and we may, where appropriate, take steps to ensure that we do not provide the order to somebody who is not, in our reasonable opinion, aged 18 or over. Accordingly, upon collection, if the person collecting the order appears to be under the age of 25, we may request photo ID (such as a driving licence or passport) to prove that they are over the age of 18.

    4. \r\n
    5. It is your responsibility to ensure that the person collecting the order is over 18 and can demonstrate this to us if challenged. If we are not satisfied that the person collecting the order is over the age of 18, then we may not hand over your order.

    6. \r\n
    \r\n
  10. \r\n
  11. \r\n
    Your Status
    \r\n
      \r\n
    1. By placing an order with us, you are confirming that:

      \r\n
        \r\n
      • you are a consumer and are not purchasing our products for any business purposes;

      • \r\n
      • you are at least 18 years old;

      • \r\n
      • you are able to collect your order from a participating store;

      • \r\n
      • you (and the individual who will collect the item where applicable) are resident on mainland England, Scotland or Wales.

      • \r\n
      \r\n
    2. \r\n
    \r\n
  12. \r\n
  13. \r\n
    How is the Contract Formed Between You and Us?
    \r\n
    Forming the contract
    \r\n
      \r\n
    1. \r\n

      The technical steps required to create a contract between you and us for the Café click and collect service and use of the Website are as follows:

      \r\n
        \r\n
      • You must select the items that you wish to order and place an order on the Website through the \"checkout\" process.

      • \r\n
      • You will be guided through the \"checkout\" process by a series of instructions.

      • \r\n
      • You place an order on our Website by clicking the \"Confirm Payment\" button at the end of the \"checkout\" process.

      • \r\n
      • We will send you an automated message which will be shown to you on our Website immediately after you have placed your order. We will also send you an order confirmation email to confirm that the details of your order. This is not acceptance of your order.

      • \r\n
      • A binding contract is formed between you and us when you collect your goods from the designated collection point.

      • \r\n
      \r\n
    2. \r\n
      Please note the following
      \r\n
    3. From time to time, we may not be able to accept an order or we may cancel an order. This may be due to circumstances beyond our control and if we cannot accept your order, we will inform you of this by email as soon as we can and we will not charge you for the order.

    4. \r\n
    5. If we cancel an order or issue you with a refund for any reason, we shall refund the amount paid by you.

    6. \r\n
      Product Information
      \r\n
    7. The product information contained on our Website has been published in good faith and we will do our best to ensure that it is accurate. However, occasionally, it may be incorrect, incomplete or out of date due to human error or circumstances beyond our control. Where information is incorrect due to human error or circumstances beyond our control, we reserve the right not to accept your order for the affected products, or if your order has already been accepted, not to supply the affected products to you. We will notify you if this is the case and will not charge you for the product.

    8. \r\n
    9. The images of products on our Website are for illustrative purposes only. Although we have made every effort to display colours and appearances of products accurately, we cannot guarantee that a computer, tablet or mobile device screen will accurately reflect actual products delivered as devices may vary slightly. If you think that the product you have received does not match its description, then you can reject it in accordance with section 'Cancellation, Refunds, and Returns Policy' below.

    10. \r\n
    \r\n
  14. \r\n
  15. \r\n
    Collection of your Order
    \r\n
      \r\n
    1. Items ordered from our Website may only be collected from your selected Morrisons store and cannot be delivered to any other store or any other address. Orders cannot be added or delivered with any online grocery order that have been placed with us.

    2. \r\n
    3. You must not consume an item that is damaged or does not match the order that you placed on the Website. If you use such items you will be deemed to have accepted them and you may be unable return them because they are different to your order or are damaged.

      \r\n

      Same day collection orders

    4. \r\n\r\n
    5. Collection times may vary depending on the participating store and items ordered on the Website must be collected from your nominated Morrisons store at the allotted or selected collection time which will be stated on the order confirmation.

    6. \r\n
    7. The order will be collected from our Café counters or at any other collection point notified to you at the store. Upon arrival at the designated collection point, you must make yourself known to a member of staff and provide the order number stated in the order confirmation email to collect your order. A Morrisons member of staff will use this order number to identify your order.

    8. \r\n
    9. We reserve the right to dispose of your order if it is not collected within one (1) hour of the selected or allotted collection time and you will not receive a refund or replacement items.

      \r\n

      Eat in orders

    10. \r\n
    11. For customers choosing the eat-in option you must have a designated table and a table number before you place an order on the Website and before you make payment for the items ordered. A Morrisons member of staff will use the table number and order number to identify you.

    12. \r\n
    13. You are required to collect drinks orders from the caf\\u00E9 counter or at any other collection point notified to you at the store in accordance with Clause 8.4. Food orders will be brought to your table by a Morrisons member of staff.

    14. \r\n
    15. We reserve the right to dispose of your order if you are not at your table within a reasonable time of a Morrisons member of staff bringing your food order to your table and you will not receive a refund or replacement items.

    16. \r\n
    \r\n
  16. \r\n
  17. \r\n
    More Card Points and Promotions
    \r\n
      \r\n
    1. More Card points will not apply to orders placed on the Website.

    2. \r\n
    3. Morrisons vouchers or coupons cannot be redeemed when placing an order on the Website. You cannot redeem any other discounts against purchases made on the Website.

    4. \r\n
    5. Morrisons colleague discounts will apply to orders placed on the Website.

    6. \r\n
    \r\n
  18. \r\n\r\n
  19. \r\n
    Cancellation, Refunds, and Returns Policy
    \r\n
      \r\n
    1. Once payment is made, you do not have a right to cancel any order made through the Website.

    2. \r\n
    3. Our refund policy will not apply to items ordered from the Website and items may not be returned unless they are faulty or are of poor quality. In the event that your order is faulty or of poor quality, you should notify one of our Café colleagues in the Morrisons participating store or by contact our Customer Service Team on 0345 611 6111 and selecting option 6 to report the issues with your order.

    4. \r\n
    5. On collection of your order, please check that the items collected match the order that you placed. Please refer to the \"best by\" or \"use by\" dates on the packaging and store the items as instructed on the packaging.

    6. \r\n
    \r\n
  20. \r\n
  21. \r\n
    Our lIability
    \r\n
      \r\n
    1. The Website is provided without any warranties, either express or implied, including any implied warranties of satisfactory quality, or fitness for particular purpose.

    2. \r\n
    3. If we fail to comply with these terms and conditions, we shall only be liable to you for the purchase price of the products and other losses that you suffer as a result of our failure to comply which are a foreseeable consequence of such failure.

    4. \r\n
    5. Nothing in these terms and conditions excludes or limits our liability for:

      \r\n
        \r\n
      • death or personal injury caused by our negligence;

      • \r\n
      • fraud or fraudulent misrepresentation;

      • \r\n
      • liability which may not be limited or excluded by section 31 (1) Consumer Rights Act 2015;

      • \r\n
      • defective products under the Consumer Protection Act 1987; or

      • \r\n
      • any other matter for which it would be illegal for us to exclude or attempt to exclude our liability.

      • \r\n\r\n
      \r\n
    6. \r\n
    7. Subject to the above, we will not be liable for losses suffered or costs incurred arising out of your use of, or the availability or lack of availability of the Café click and collect service.

    8. \r\n
    9. We only supply the products for domestic and private use. If you use the products for any commercial, business or re-sale purpose we will have no liability to you for any loss of profit, loss of business, business interruption, or loss of business opportunity.\t

    10. \r\n
    \r\n
  22. \r\n
  23. \r\n
    General
    \r\n
      \r\n
    1. Nothing under the contract shall give rights to any person who is not a party to it (whether under the Contracts (Rights of Third Parties) Act 1999) or otherwise.

    2. \r\n
    3. We may revise our terms and conditions from time to time. You will be subject to the terms and conditions in force at the time that a contract is formed between you and us (as set out above).

    4. \r\n
    5. You are not permitted to transfer or assign any of the rights granted under these terms and conditions. Should we decide not to pursue a breach of these conditions immediately, we may decide to do so at a later date. We are not responsible for any breach of these terms and conditions caused by unforeseen circumstances over which we have no control. Should any part of these terms and conditions be found to be invalid, this shall not affect the validity of the remaining provisions which will remain in full force.

    6. \r\n
    7. These terms are governed by English law and you can bring legal proceedings in respect of the Website and the services offered under these terms and conditions in the English and Welsh courts. If you live in Scotland you can bring legal proceedings in respect of the products in either the Scottish or the English courts. The European Commission provides for an online dispute resolution platform which you can access here . If you have a complaint, or would like to bring a matter to our attention please contact our Customer Services team in the first instance.

    8. \r\n
    \r\n
  24. \r\n
  25. \r\n
    Customer Services
    \r\n
      \r\n
    1. If you have any questions or complaints, please contact our Customer Services team on 0345 611 6111 between the hours of 8.00am to 11.00pm every day of the week.

      \r\n

      Alternatively, please write to us at:

      \r\n

      Customer Services Department
      \r\n Wm Morrisons Supermarkets Limited
      \r\n Hilmore House
      \r\n Gain Lane
      \r\n Bradford
      \r\n BD3 7DL

      \r\n

      We are always interested to hear your feedback in relation to the Café click and collect service.

      \r\n
    2. \r\n
    \r\n
  26. \r\n
  27. \r\n
    Alternative Dispute Resolution
    \r\n
      \r\n
    1. Alternative dispute resolution is a process where an independent body considers the facts of a dispute and seeks to resolve it, without you having to go to court. If you are not happy with how we have handled any complaint, you may want to contact the alternative dispute resolution provider we use. You can submit a complaint to The Retail Ombudsman via their Website at http://www.theretailombudsman.org.uk/. The Retail Ombudsman will not charge you for making a complaint and if you are not satisfied with the outcome you can still bring legal proceedings. In addition, please note that disputes may be submitted for online resolution to the European Commission Online Dispute Resolution platform.

    2. \r\n
    \r\n
  28. \r\n
\r\n\r\n
}\r\n\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default TermsCondModal;\r\n","import React from 'react';\r\nimport { IonHeader, IonIcon, IonModal, IonContent } from '@ionic/react';\r\nimport './MopHeaderMenusModal.scss';\r\nimport '../theme/common.scss';\r\nimport { chevronBack } from 'ionicons/icons';\r\n\r\nconst AllergenModal: React.FC<{ isModalOpen: boolean, closeModalClick: any }> = ({ isModalOpen, closeModalClick }) => (\r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n

Important Allergen & Product Information*

\r\n

For allergen information please click the link on each page. Please bear in mind that we work in a busy kitchen and it is possible that, due to the way we prepare food, other allergens may be present.

\r\n

Vegan Recipe: Although the recipe for these products are suitable for vegans, they are prepared in an area where food that is not suitable for vegans is also handled.

\r\n

Our fish may contain bones.

\r\n
\r\n
\r\n
\r\n);\r\n\r\nexport default AllergenModal;\r\n","import React, { useState, useEffect } from 'react';\r\nimport {\r\n IonHeader, IonIcon, IonModal, IonContent, IonText, IonInput, IonItem,\r\n IonCheckbox, IonRow, IonFooter\r\n} from '@ionic/react';\r\n\r\nimport './MopHeaderMenusModal.scss';\r\nimport { useHistory } from \"react-router-dom\";\r\nimport '../theme/common.scss';\r\nimport { InputChangeEventDetail } from '@ionic/core';\r\nimport { bindActionCreators } from 'redux';\r\nimport * as ColleaguesStore from '../store/ColleagueStore';\r\nimport { ApplicationState } from '../store';\r\nimport { connect, useDispatch } from 'react-redux';\r\nimport { chevronBack } from 'ionicons/icons';\r\nimport * as basketActions from '../store/BasketStore';\r\nimport Button from '../components/Button';\r\n\r\ninterface LoginModalProps {\r\n isModalOpen: boolean;\r\n parentModalClick: () => void;\r\n closeModalClick: () => void;\r\n message: string | null | undefined;\r\n error: string | null | undefined;\r\n isLoggedIn: boolean;\r\n}\r\n\r\nconst LoginModal: React.FC = ({\r\n isModalOpen,\r\n parentModalClick,\r\n closeModalClick,\r\n error,\r\n isLoggedIn\r\n}) => {\r\n const validatePin = bindActionCreators(ColleaguesStore.actionCreators.validatePin, useDispatch());\r\n\r\n const [errorMessage, setErrorMessage] = useState('');\r\n const [getConfirmPinErrorMessage, setConfirmPinErrorMessage] = useState('')\r\n const [pinConfirmed, setPinConfirmed] = useState(false);\r\n const [pin, setPin] = useState('');\r\n const clearBasket = bindActionCreators(basketActions.actionCreators.clearBasketItems, useDispatch());\r\n\r\n const history = useHistory();\r\n\r\n const handleTextClick = () => {\r\n setPinConfirmed(!pinConfirmed);\r\n };\r\n\r\n const handlePinChange = (event: CustomEvent) => {\r\n const input = event.target as HTMLInputElement;\r\n const inputValue = input.value;\r\n\r\n setPin(inputValue);\r\n };\r\n\r\n const handleCheckboxChange = (event: CustomEvent) => {\r\n const checkbox = event.target as HTMLIonCheckboxElement;\r\n setPinConfirmed(checkbox.checked);\r\n };\r\n\r\n const handleSubmit = () => {\r\n if (pin.length === 0) {\r\n setErrorMessage(\"Enter a valid code.\");\r\n } else if (pin.length < 4) {\r\n setErrorMessage(\"Please enter at least a 4 digit code.\");\r\n } else {\r\n setErrorMessage(\"\");\r\n\r\n if (pinConfirmed) {\r\n setConfirmPinErrorMessage(\"\")\r\n validatePin(pin);\r\n } else {\r\n setConfirmPinErrorMessage(\"Please confirm that you agree with the statement above.\");\r\n }\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n if (isLoggedIn && isModalOpen) {\r\n closeModalClick()\r\n parentModalClick()\r\n clearBasket()\r\n history.push(\"/storesearch\")\r\n }\r\n }, [isLoggedIn]);\r\n\r\n return (\r\n <>\r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n

Log in to Colleague Area Access

\r\n
\r\n \r\n

Colleague Area Access code*

\r\n
\r\n \r\n \r\n \r\n {(errorMessage || error) &&\r\n \r\n

{errorMessage || (!pinConfirmed && !error?.startsWith(\"I\") && error) || (pinConfirmed && error)}

\r\n
\r\n }\r\n \r\n \r\n handleTextClick()}>\r\n

I confirm I am a Morrisons employee and currently working a shift in store

\r\n
\r\n
\r\n {getConfirmPinErrorMessage && !pinConfirmed &&\r\n \r\n

{getConfirmPinErrorMessage}

\r\n
\r\n }\r\n
\r\n \r\n \r\n Confirm\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nconst mapStateToProps = (state: ApplicationState) => ({\r\n loading: state.colleague?.loading,\r\n error: state.colleague?.error,\r\n message: state.colleague?.message,\r\n isLoggedIn: state.colleague?.isLoggedIn ?? false\r\n});\r\n\r\nexport default connect(mapStateToProps)(LoginModal);\r\n","import React, { useEffect, useState } from 'react';\r\nimport { IonHeader, IonIcon, IonGrid, IonRow, IonCol, IonModal, IonContent, IonRefresher, IonRefresherContent, IonAlert } from '@ionic/react';\r\nimport './MopHeaderMenusModal.scss';\r\nimport { warningOutline, documentTextOutline, personCircle, chevronBack } from 'ionicons/icons';\r\nimport { useSelector, useDispatch } from 'react-redux';\r\nimport '../theme/common.scss';\r\nimport * as headerFooterStore from '../store/HeaderFooterStore';\r\nimport TermsCondModal from '../modals/TermsCondModal';\r\nimport AllergenModal from '../modals/AllergenModal';\r\nimport LoginModal from '../modals/LoginModal';\r\nimport { ApplicationState } from '../store';\r\nimport { bindActionCreators } from 'redux';\r\nimport { baseUrl } from '../helpers/configHelper';\r\nimport moment from 'moment';\r\nimport * as currencyHelpers from '../helpers/currencyHelpers';\r\nimport * as ColleaguesStore from '../store/ColleagueStore';\r\nimport { downloadAllergenFile } from '../helpers/menuHelpers';\r\n\r\ninterface MopOrderStatus {\r\n mopOrderUid: string;\r\n customerOrderNumber: string;\r\n status: string;\r\n orderPlaced: string | Date;\r\n completed: boolean;\r\n orderTotal: number;\r\n orderStoreLocation: string;\r\n}\r\n\r\nconst MopHeaderMenusModal: React.FC<{ isModalOpen: boolean, closeModalClick: any }> = ({ isModalOpen, closeModalClick }) => {\r\n\r\n const headerFooter = useSelector((state: ApplicationState) => state.headerFooter);\r\n const boundSetShowModal = bindActionCreators(headerFooterStore.actionCreators.setShowModal, useDispatch());\r\n const [orders, setOrders] = useState([]);\r\n const [showLogoutAlert, setShowLogoutAlert] = useState(false);\r\n const setIsLoggedIn = bindActionCreators(ColleaguesStore.actionCreators.logout, useDispatch());\r\n\r\n const getOrderStatus = (event?: CustomEvent) => {\r\n const test = false;\r\n const orderGUIDs: string[] = test ? [\"049767f4-fa3c-4462-b3be-7f28a6603d24\", \"049767f4-fa3c-4462-b3be-7f28a6603d24\", \"049767f4-fa3c-4462-b3be-7f28a6603d24\"] : JSON.parse(localStorage.getItem(\"mopOrders\") || '[]');\r\n if (orderGUIDs.length > 0) {\r\n console.log(\"getOrderStatus called\");\r\n fetch(`${baseUrl()}/orders/GetOrderStatus`, {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\"\r\n },\r\n body: JSON.stringify(orderGUIDs)\r\n })\r\n .then(res => res.json() as Promise)\r\n .then(res => {\r\n console.log(\"got back orders, count: \" + orders.length);\r\n setOrders(res.map(order => ({ ...order, orderPlaced: moment(order.orderPlaced).format(\"Do MMMM YYYY\") })));\r\n })\r\n .finally(() => {\r\n if (event != undefined) {\r\n event.detail.complete();\r\n }\r\n })\r\n } else {\r\n if (event != undefined) {\r\n event.detail.complete();\r\n }\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n getOrderStatus();\r\n }, []);\r\n\r\n const handleLogout = () => {\r\n setShowLogoutAlert(true);\r\n };\r\n\r\n const handleLogoutConfirmation = (confirmed: boolean) => {\r\n if (confirmed) {\r\n setIsLoggedIn(false)\r\n localStorage.removeItem('isLoggedIn')\r\n localStorage.removeItem(\"pfidentifier\");\r\n window.location.reload();\r\n }\r\n setShowLogoutAlert(false);\r\n };\r\n\r\n return (\r\n <>\r\n {\r\n getOrderStatus();\r\n }}\r\n onDidDismiss={closeModalClick}\r\n cssClass='AppHeaderBurgerMenu'\r\n swipeToClose={true}\r\n id=\"MainModal\">\r\n \r\n
\r\n \r\n
\r\n
\r\n \r\n
Recent Orders
\r\n \r\n \r\n \r\n
\r\n\r\n \r\n {\r\n orders.length > 0\r\n ?\r\n <>\r\n
\r\n {\r\n orders.map(order => \r\n \r\n
{order.orderPlaced}
\r\n
{order.orderStoreLocation}
\r\n {\r\n !order.completed &&\r\n <>\r\n
Status: {order.status}
\r\n
Order Number: {order.customerOrderNumber}
\r\n \r\n }\r\n
\r\n \r\n
{currencyHelpers.formatCurrency(order.orderTotal)}
\r\n
\r\n
)\r\n }\r\n
\r\n \r\n :\r\n \r\n \r\n

We can't find any recent orders that have been placed on this device

\r\n
\r\n
\r\n }\r\n
\r\n\r\n
\r\n\r\n
Product Information
\r\n \r\n \r\n
\r\n Allergen Information\r\n
\r\n \r\n\r\n
Legal
\r\n
boundSetShowModal(\"TC\", true)}>
Terms & Conditions
\r\n
Colleague Area Access
\r\n
{ localStorage.getItem('isLoggedIn') === \"true\" ? handleLogout() : boundSetShowModal(\"LOGIN\", true) }}>
{localStorage.getItem('isLoggedIn') === \"true\" ? \"Log out\" : \"Log in\"}
\r\n\r\n
\r\n { boundSetShowModal(\"TC\", false); }}>\r\n boundSetShowModal(\"ALLERGEN\", false)}>\r\n boundSetShowModal(\"LOGIN\", false)}>\r\n\r\n
\r\n handleLogoutConfirmation(false),\r\n },\r\n {\r\n text: 'Yes',\r\n handler: () => handleLogoutConfirmation(true),\r\n },\r\n ]}\r\n />\r\n \r\n\r\n );\r\n};\r\n\r\nexport default MopHeaderMenusModal;\r\n","import React, { useEffect, useState } from 'react';\r\nimport { IonHeader, IonTitle, IonToolbar, IonIcon, IonAlert } from '@ionic/react';\r\nimport './AppHeader.scss';\r\nimport { chevronBack, menu, closeOutline } from 'ionicons/icons';\r\nimport { ApplicationState } from '../store';\r\nimport { batch, useDispatch, useSelector} from 'react-redux';\r\nimport { useHistory, useLocation } from \"react-router-dom\";\r\nimport '../theme/common.scss';\r\nimport * as headerFooterStore from '../store/HeaderFooterStore';\r\nimport MopHeaderMenusModal from '../modals/MopHeaderMenusModal'\r\nimport { bindActionCreators } from 'redux';\r\nimport { baseUrl } from '../helpers/configHelper';\r\nimport * as ColleaguesStore from '../store/ColleagueStore';\r\nimport * as BasketStore from '../store/BasketStore';\r\nimport * as DealStore from '../store/DealStore';\r\n\r\nconst allowedStartingPages = [\r\n \"/splash\",\r\n \"/faq\",\r\n \"/qr\",\r\n \"/couponz\"\r\n];\r\n\r\ninterface AppHeaderProps {\r\n\r\n}\r\n\r\nconst AppHeader: React.FC = () => {\r\n const history = useHistory();\r\n const location = useLocation();\r\n const headerFooter = useSelector((state: ApplicationState) => state.headerFooter);\r\n const boundSetShowModal = bindActionCreators(headerFooterStore.actionCreators.setShowModal, useDispatch());\r\n const boundShowDebugLabels = bindActionCreators(headerFooterStore.actionCreators.setShowDebugLabels, useDispatch());\r\n const setIsLoggedIn = bindActionCreators(ColleaguesStore.actionCreators.logout, useDispatch());\r\n const [showLogoutAlert, setShowLogoutAlert] = useState(false);\r\n const [redirect, setRedirect] = useState(\"\");\r\n const siteTitle = \"Morrisons :: Order & Pay\";\r\n const isLoading = useSelector((state: ApplicationState) => state?.basket?.isLoading);\r\n const boundSetIsKefComplete = bindActionCreators(BasketStore.actionCreators.setIsKefComplete, useDispatch());\r\n const dispatch = useDispatch();\r\n\r\n // The number of times we need to goBack to exit a deal.\r\n const [dealPageCount, setDealPageCount] = useState(0);\r\n\r\n //mtr debug, need the basket to test\r\n //document.addEventListener('keydown', function (event) {\r\n // if(window.location.hostname === 'localhost') {\r\n // if (event.keyCode === 37 && event.shiftKey === true) {\r\n // history.push(\"/payment\");\r\n // }\r\n // }\r\n //});\r\n\r\n const handleLogout = () => {\r\n setShowLogoutAlert(true);\r\n };\r\n\r\n const handleLogoutConfirmation = (confirmed: boolean) => {\r\n if (confirmed) {\r\n setIsLoggedIn(false)\r\n localStorage.removeItem('isLoggedIn');\r\n localStorage.removeItem(\"pfidentifier\");\r\n window.location.reload();\r\n }\r\n setShowLogoutAlert(false);\r\n };\r\n\r\n useEffect(() => {\r\n if(!isUserAllowedToLandHere()){\r\n setTimeout(() => {\r\n //history.push(\"/splash\"); //Setting timeout otherwise screen goes white\r\n window.location.href = baseUrl() + \"/splash\";\r\n }, 500);\r\n }\r\n\r\n var redirect: string = \"\";\r\n switch(location.pathname){\r\n case \"/payment\":{\r\n var redirect = \"/orderconfirmation\"\r\n break;\r\n }\r\n\r\n case \"/tablenumber\": {\r\n var redirect = \"/basketpage\"\r\n break;\r\n }\r\n\r\n case \"/faq\": {\r\n batch(() => {\r\n history.push(\"/splash\");\r\n setTimeout(() => {\r\n boundSetShowModal(\"FAQ\", true, true); //Sets a timeout so this *should* be called when already on the splash page, instead of being on /faq still\r\n }, 500);\r\n })\r\n break;\r\n }\r\n\r\n case '/basketpage': {\r\n boundSetIsKefComplete(false);\r\n break;\r\n }\r\n }\r\n setRedirect(redirect);\r\n\r\n if(headerFooter?.modals.selectedModal != undefined && headerFooter?.modals.selectedModal != \"\"){\r\n boundSetShowModal(\"MAIN\", false); //Closes all modals if navigating back while one is open\r\n }\r\n\r\n setTimeout(() => { //In the event that a page does not have a title, the pathname will be sent instead.\r\n const noPageTitle = headerFooter?.title == undefined || headerFooter?.title == \"No title\";\r\n if(noPageTitle){\r\n sendPageView(location.pathname);\r\n }\r\n }, 500);\r\n\r\n }, [location.pathname]);\r\n\r\n useEffect(() => {\r\n const params = new URLSearchParams(location.search.substr(1));\r\n const count = params.get('count') ?? '1';\r\n\r\n setDealPageCount(parseInt(count, 10));\r\n }, [location.search])\r\n\r\n useEffect(() => {\r\n const noPageTitle = headerFooter?.title == undefined || headerFooter?.title == \"No title\";\r\n if(!noPageTitle && headerFooter != undefined){\r\n sendPageView(headerFooter.title);\r\n document.title = `${headerFooter.title} - ${siteTitle}`\r\n }\r\n }, [headerFooter?.title])\r\n\r\n useEffect(() => {\r\n fetch(baseUrl() + '/stores/GetShowDebugLabels').then((res) => res.json())\r\n .then((data) => {\r\n console.log(data);\r\n boundShowDebugLabels(data.showLabel);\r\n })\r\n\r\n window.addEventListener(\"popstate\", (e) => { handleBrowserHistoryChange(e, headerFooter?.modals.selectedModal || \"\") }, false);\r\n\r\n return () => {\r\n window.removeEventListener(\"popstate\", (e) => { handleBrowserHistoryChange(e, headerFooter?.modals.selectedModal || \"\") }, false);\r\n }\r\n }, [])\r\n\r\n const sendPageView = (page_title: string) => {\r\n console.log(\"GOOGLE ANALYTICS - Sending Page Title:\", page_title, \"headerFooter.title:\", headerFooter?.title, \"pathname:\", location.pathname);\r\n (window as any).gtag('event', 'page_view', {//G-ZC8W1075C5\r\n 'page_title': page_title\r\n });\r\n }\r\n\r\n const isUserAllowedToLandHere = () => {\r\n const pathname = location.pathname;\r\n const isAllowed = allowedStartingPages.some((page) => pathname.includes(page)) || headerFooter?.hasStartedApp;\r\n //isAllowed = true; // THIS MUST BE UNCOMMENTED (MTR)\r\n return isAllowed;\r\n }\r\n\r\n const handleBrowserHistoryChange = (e: PopStateEvent, selectedModal: string) => {\r\n if(redirect != \"\"){\r\n goBackRecursive(redirect);\r\n }\r\n }\r\n\r\n const goBackRecursive = (to: string) => {\r\n history.goBack();\r\n setTimeout(() => {\r\n if(history.location.pathname != to){\r\n goBackRecursive(to);\r\n }else{\r\n return;\r\n }\r\n }, 100);\r\n }\r\n\r\n function goBackDeal() {\r\n history.goBack();\r\n }\r\n\r\n function cancelDeal() {\r\n for (let i = 0; i < dealPageCount; i += 1) {\r\n history.goBack();\r\n }\r\n\r\n dispatch(DealStore.actionCreators.cancelDeal());\r\n }\r\n\r\n return (\r\n <>\r\n \r\n handleLogoutConfirmation(false),\r\n },\r\n {\r\n text: 'Yes',\r\n handler: () => handleLogoutConfirmation(true),\r\n },\r\n ]}\r\n />\r\n \r\n );\r\n};\r\n\r\nexport default AppHeader;\r\n","import React, { createRef } from 'react';\r\nimport { IonLoading, IonButton, IonInput, IonLabel, IonDatetime, IonToast, IonSpinner, IonContent} from '@ionic/react';\r\nimport './CheckoutPayCard.scss';\r\nimport {\r\n Formik,\r\n FormikProps,\r\n Field,\r\n FieldProps,\r\n} from 'formik';\r\nimport moment from 'moment';\r\nimport { cardCheckoutSchema } from '../helpers/formValidationHelpers';\r\nimport { connect } from 'react-redux';\r\nimport * as BasketStore from '../store/BasketStore';\r\nimport * as HeaderFooterStore from '../store/HeaderFooterStore';\r\nimport { ApplicationState } from '../store';\r\nimport { withRouter } from \"react-router-dom\";\r\nimport { RouteComponentProps } from \"react-router\";\r\nimport { baseUrl } from '../helpers/configHelper';\r\nimport { getConfig } from '../helpers/configHelper';\r\nimport { IMopCheckoutResponse } from '../helpers/checkoutHelper';\r\nimport PayerAuthentication, { PayerAuthenticationHelpers } from '../helpers/PayerAuthentication';\r\nimport jwtDecode from 'jwt-decode';\r\nimport { on } from 'stream';\r\nimport Button from './Button';\r\n\r\ndeclare global {\r\n interface Window {\r\n Flex: any;\r\n hideStepUpScreen: any;\r\n listenToAuthentication?: (e: MessageEvent) => void;\r\n }\r\n}\r\n\r\ninterface ChecoutInitResponse { //Token returned when starting checkout process (first landing on page)\r\n jwk: string;\r\n}\r\n\r\ninterface CheckoutFormRequest {\r\n Name: string;\r\n Expiry: string;\r\n}\r\n\r\ninterface IProps {\r\n Basket: IMopBasket,\r\n Email: string,\r\n ChannelIdentifier: any,\r\n TimeSlot: TimeSlot,\r\n appState: ApplicationState\r\n}\r\n\r\ntype CheckoutMergeProps =\r\n typeof BasketStore.actionCreators\r\n & typeof HeaderFooterStore.actionCreators\r\n & RouteComponentProps\r\n & IProps\r\n\r\ninterface IState {\r\n renderIframe: boolean;\r\n isPageLoading: boolean;\r\n isPageValid: boolean;\r\n isPayLoading: boolean;\r\n isCreatingPaymentRequest: boolean;\r\n fields: {\r\n number: any,\r\n ccv: any\r\n },\r\n customerInformation: {\r\n cardExpiryDate: string\r\n },\r\n toast: {\r\n isToastOpen: boolean;\r\n toastMessage: string;\r\n },\r\n payerAuth: {\r\n deviceDataCollectionUrl: string,\r\n accessToken: string,\r\n referenceId: string\r\n },\r\n payerAuthEnrolled: {\r\n stepUpUrl: string,\r\n accessToken: string,\r\n }\r\n microform: any;\r\n token: string;\r\n errorMessage: string | undefined;\r\n disablePayButton: boolean;\r\n serverBasket: IMopBasket | undefined;\r\n cvvError:string |undefined;\r\n numberError:string | undefined;\r\n}\r\n\r\nfunction ErrorIcon () {\r\n return (\r\n \r\n \r\n \r\n );\r\n}\r\n\r\n/*\r\n Test Payment Gateway\r\n https://developer.cybersource.com/api/developer-guides/dita-flex/SAFlexibleToken/FlexMicroform/get-started/setting-up-client-side.html\r\n ^- Microform Docs\r\n*/\r\nclass CheckoutPayCard extends React.Component {\r\n private myStyles = {\r\n 'input': {\r\n 'font-size': '18px',\r\n 'font-family': 'Roboto,helvetica, tahoma, calibri, sans-serif',\r\n 'color': '#262626',\r\n 'opacity':'0.8',\r\n 'height': '55px !important'\r\n },\r\n //':focus': { 'color': 'blue' },\r\n ':disabled': { 'cursor': 'not-allowed' },\r\n 'valid': { 'color': 'rgb(38, 38, 38)' },\r\n 'invalid': { 'color': '#C80000' }\r\n };\r\n\r\n private formRef = createRef();\r\n private stepUpForm = createRef();\r\n private stepUpIframe = createRef();\r\n private deviceCollectionIframe = createRef();\r\n\r\n private payerAuthRef = createRef();\r\n\r\n private pageWrapper = createRef();\r\n\r\n controller = new AbortController();\r\n\r\n constructor(props: CheckoutMergeProps & FormikProps){\r\n super(props);\r\n\r\n this.state = {\r\n renderIframe: true,\r\n isCreatingPaymentRequest: false,\r\n isPageValid: true,\r\n isPageLoading: true,\r\n isPayLoading: false,\r\n microform: undefined,\r\n fields: {\r\n number: undefined,\r\n ccv: undefined,\r\n },\r\n customerInformation: {\r\n cardExpiryDate: \"\",\r\n },\r\n toast: {\r\n isToastOpen: false,\r\n toastMessage: \"\",\r\n },\r\n payerAuth: {\r\n deviceDataCollectionUrl: \"\",\r\n accessToken: \"\",\r\n referenceId: \"\"\r\n },\r\n payerAuthEnrolled: {\r\n stepUpUrl: \"\",\r\n accessToken: \"\"\r\n },\r\n token: \"\",\r\n errorMessage: undefined,\r\n disablePayButton: false,\r\n serverBasket: undefined,\r\n cvvError:undefined,\r\n numberError:undefined\r\n };\r\n }\r\n ;\r\n componentDidMount() {\r\n this.InitCheckout();\r\n }\r\n\r\n componentWillUnmount() {\r\n this.controller.abort();\r\n }\r\n\r\n componentDidUpdate(prevProps: IProps, prevState: IState){\r\n if(this.state.microform !== prevState.microform){\r\n //console.log(\"-----Loading microform fields\");\r\n this.state.fields.number.load('#number-container');\r\n this.state.fields.ccv.load('#securityCode-container');\r\n }\r\n }\r\n\r\n InitCheckout() {\r\n if(this.state.fields.number != undefined){\r\n this.state.fields.number.unload();\r\n this.state.fields.ccv.unload();\r\n }\r\n\r\n let that = this;\r\n\r\n fetch(baseUrl()+'/api/checkout/InitCheckout') //Get capture context of checkout as Jwk token\r\n .then(response => response.json() as Promise)\r\n .then(data => {\r\n var flex: any = new window.Flex(data.jwk); //Use Flex Microform from script in HTML, delcared at top of page, takes in captureContext string\r\n var microform = flex.microform({ styles: this.myStyles }); //only property in docs for microform options object is styles\r\n var number = microform.createField('number', { placeholder: 'XXXX-XXXX-XXXX-XXXX' }); //Create iFrames\r\n var securityCode = microform.createField('securityCode', { placeholder: 'XXX' });\r\n\r\n number.on('focus', function (data:any) {\r\n that.setState({numberError:undefined});\r\n });\r\n\r\n securityCode.on('focus', function (data:any) {\r\n that.setState({cvvError:undefined});\r\n });\r\n\r\n this.setState({\r\n isPageLoading: false,\r\n fields: {\r\n number: number,\r\n ccv: securityCode\r\n },\r\n microform: microform //Store microform so it can be used when form is submitted to create token\r\n });\r\n })\r\n }\r\n\r\n onPaymentError(error: string){\r\n this.unLockUi();\r\n this.InitCheckout();\r\n this.setState({\r\n isPayLoading: false,\r\n toast: {\r\n isToastOpen: true,\r\n toastMessage: error\r\n }\r\n //errorMessage?\r\n })\r\n }\r\n\r\n onPaymentSuccess(checkoutResponse: IMopCheckoutResponse){\r\n this.unLockUi();\r\n this.props.history.push(`/payment/success`);\r\n this.props.updateOrderNumber(checkoutResponse.checkoutRecord.orderNumber);\r\n let self = this;\r\n this.props.updateTempBasket(() => {\r\n self.props.clearBasket();\r\n })\r\n\r\n this.setState({\r\n isPayLoading: false\r\n })\r\n }\r\n\r\n onReceivedCardToken(token: string) {\r\n if(this.payerAuthRef.current){\r\n const decodedFlexObj = jwtDecode(token) as FlexTokenInformation;\r\n this.payerAuthRef.current.Authenticate({\r\n cardSummary: {\r\n cardDetails: decodedFlexObj.data,\r\n transactionType: \"Card\"\r\n },\r\n authPayInfo: {\r\n flexTokenInformation: decodedFlexObj\r\n },\r\n processingInformation: {\r\n authorizationOptions:{\r\n ignoreCsvResult: false\r\n }\r\n }\r\n });\r\n }\r\n else{\r\n console.log(\"payerAuthRef.current undefined\");\r\n }\r\n\r\n }\r\n\r\n lockUI(){\r\n this.props.setShowBack(false);\r\n this.setState({\r\n isPayLoading: true\r\n })\r\n }\r\n\r\n unLockUi(){\r\n this.props.setShowBack(true);\r\n this.setState({\r\n isPayLoading: false\r\n })\r\n }\r\n\r\n render() {\r\n const { isPageLoading, isPayLoading } = this.state;\r\n\r\n const initialValues: CheckoutFormRequest = { Name: '', Expiry: ''};\r\n\r\n // START - THIS MUST BE UNCOMMENTED (MTR)\r\n if(this.props.Basket.menuItems.length < 1 && this.props.location.pathname == \"/payment\"){\r\n window.location.href = baseUrl() +\"/splash\";\r\n }\r\n // END - THIS MUST BE UNCOMMENTED (MTR)\r\n\r\n return (\r\n \r\n\r\n \r\n\r\n
\r\n\r\n \r\n {\r\n !isPageLoading &&\r\n
\r\n\r\n {\r\n //console.log(values.Name, moment(values.Expiry).format(\"MM[/]YYYY\"));\r\n this.setState({\r\n isPayLoading: true,\r\n numberError:undefined,\r\n cvvError:undefined\r\n });\r\n let dates = moment(values.Expiry).format(\"MM[/]YYYY\").split(\"/\");\r\n let options = {\r\n expirationMonth: dates[0],\r\n expirationYear: dates[1]\r\n }\r\n //when form is submitted\r\n this.state.microform.createToken(options, (err: any, token: any) => {\r\n if(err){\r\n console.log(err);\r\n this.setState({\r\n // toast: {\r\n // toastMessage: \"Please enter your details again.\",\r\n // isToastOpen: true\r\n // },\r\n isPayLoading: false\r\n })\r\n\r\n if(err.details.find((f:any) => f.location === \"number\" )) {\r\n this.setState({numberError: \"Please enter a valid card number\"});\r\n }\r\n\r\n if(err.details.find((f:any) => f.location === \"securityCode\")) {\r\n this.setState({cvvError: \"Please enter the CVV number on the back of the card\"});\r\n }\r\n\r\n this.state.fields.ccv.load('#securityCode-container');\r\n this.state.fields.number.load('#number-container');\r\n //Display error);\r\n }else{\r\n //console.log(token);\r\n this.onReceivedCardToken(token);\r\n }\r\n });\r\n }}>\r\n {props => (\r\n
\r\n \r\n {({ field, form, meta }: FieldProps) => (\r\n
\r\n Name on card*\r\n \r\n {meta?.error &&
{meta?.error}
}\r\n
\r\n )}\r\n
\r\n
\r\n Card number*\r\n
\r\n {this.state.numberError &&
{this.state.numberError}
}\r\n
\r\n \r\n {({ field, form, meta }: FieldProps) => (\r\n
\r\n Expiry date*\r\n \r\n {meta?.error &&
{meta?.error}
}\r\n
\r\n )}\r\n
\r\n
\r\n CVV*\r\n
\r\n {this.state.cvvError &&
{this.state.cvvError}
}\r\n
\r\n\r\n
\r\n
\r\n {\r\n this.state.errorMessage\r\n ?\r\n
{this.state.errorMessage}
\r\n :\r\n
\r\n \r\n {isPayLoading ? : \"Pay\"}\r\n \r\n
\r\n }\r\n
\r\n
\r\n
\r\n )}\r\n \r\n\r\n {this.setState({\r\n toast: {\r\n isToastOpen: false,\r\n toastMessage: \"\"\r\n }\r\n })}}/>\r\n
\r\n }\r\n
\r\n
\r\n )\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state: ApplicationState, ownProps: any) =>({\r\n Basket: state.basket?.basket,\r\n Email: state.basket?.email,\r\n ChannelIdentifier: state.location?.channelIdentifier,\r\n TimeSlot: state.location?.selectedTimeSlot,\r\n appState: state\r\n});\r\n\r\nconst mapDispatchToProps = (dispatch: any) => {\r\n return {\r\n clearBasket: () => dispatch(BasketStore.actionCreators.clearBasketItems()),\r\n updateTempBasket: (callback: () => void) => dispatch(BasketStore.actionCreators.updateTempBasket(callback)),\r\n updateOrderNumber: (orderNumber: string) => dispatch(BasketStore.actionCreators.updateOrderNumber(orderNumber)),\r\n setShowBack: (showBack: boolean) => dispatch(HeaderFooterStore.actionCreators.setShowBack(showBack))\r\n };\r\n};\r\n\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(withRouter(CheckoutPayCard as any));\r\n","import React, { createRef, useState } from 'react';\r\nimport { IonPage } from '@ionic/react';\r\nimport CheckoutPayCard from '../components/CheckoutPayCard';\r\nimport './CheckoutTestPage.scss';\r\nimport { withRouter, RouteComponentProps } from 'react-router';\r\n\r\n\r\ninterface CheckoutProps {\r\n}\r\n\r\ntype CheckoutMergeProps =\r\n RouteComponentProps & CheckoutProps;\r\n\r\nclass CheckoutTestPage extends React.Component {\r\n\r\n constructor(props: CheckoutMergeProps){\r\n super(props);\r\n \r\n }\r\n render() {\r\n return (\r\n \r\n \r\n \r\n \r\n )\r\n }\r\n}\r\n\r\nexport default withRouter(CheckoutTestPage as any);","import React, { useState } from 'react';\r\nimport { IonGrid, IonRow, IonCol, IonButton, IonInput, IonIcon } from '@ionic/react';\r\nimport * as BasketStore from '../store/BasketStore';\r\nimport './MopCoupons.scss';\r\nimport { ApplicationState } from '../store';\r\nimport { connect } from 'react-redux';\r\nimport { SlideDown } from 'react-slidedown'\r\nimport { closeCircle, chevronForward, menu } from 'ionicons/icons'\r\nimport GenericInput from '../inputs/GenericInput';\r\nimport 'react-slidedown/lib/slidedown.css'\r\n\r\ninterface KeyedErrorMappings {\r\n [index: number]: string;\r\n}\r\n\r\nconst couponErrorMappings: KeyedErrorMappings = {\r\n 1: \"This coupon has expired.\",\r\n 2: \"The qualifying spend for this coupon has not been met.\",\r\n 3: \"Item required for coupon is not in basket.\",\r\n 4: \"Not enough qualifying products in basket. Coupon not valid.\",\r\n 5: \"Invalid Coupon.\",\r\n 6: \"This coupon has already been used and is no longer valid.\",\r\n 7: \"This coupon is worth more than the total spend.\",\r\n 8: \"This coupon cannot be used on this till type.\",\r\n 9: \"This coupon has already been used in this transaction.\",\r\n 10: \"The customer is not eligible for this coupon.\",\r\n 11: \"Please use More Card card.\",\r\n 12: \"Service is unavailable, coupon cannot be redeemed.\",\r\n 989: \"Digital money off coupons cannot be redeemed at this time.\",\r\n 20: \"Colleage Discount limit reached.\",\r\n 21: \"No items qualify for Colleague Discount.\",\r\n 50: \"We are really sorry some promotions and discounts are unavailable at this time.\",\r\n 1001: \"Your coupon is not supported here. Place your order at the till.\"\r\n};\r\n\r\ninterface MopCouponsProps {\r\n mopCoupons: any[];\r\n menuItems: IMopMenuItemDetail[];\r\n}\r\n\r\ntype MopCouponsPropsMergeProps =\r\n typeof BasketStore.actionCreators\r\n & MopCouponsProps;\r\n\r\nconst MopCoupons: React.FC = (props: MopCouponsPropsMergeProps) => {\r\n\r\n //const [CanAddCouponCode, SetCanAddCouponCode] = useState(false);\r\n const [CouponCode, SetCouponCode] = useState(\"\");\r\n const [showCoupons, setShowCoupons] = useState(false);\r\n const [Error, SetError] = useState(\"\");\r\n const [IsBusy, SetIsBusy] = useState(false);\r\n\r\n const getCouponDescription = (couponCode: string) => {\r\n let couponMenuItem = props.menuItems.filter((c: IMopMenuItemDetail) => c.sku.includes(couponCode));\r\n return couponMenuItem.length == 1 ? \"\" + couponCode + \" - \" + couponMenuItem[0].menuItemName : \"\" + couponCode + \"\";\r\n }\r\n\r\n return (
\r\n\r\n
0 ? \"isOpen\" : \"isClosed\"}`}>\r\n
{ setShowCoupons(show => !show) }}>I have a coupon
\r\n 0)}>\r\n
\r\n

Enter your Coupon Barcode Number

\r\n {\r\n if (s.detail.value != undefined) {\r\n SetCouponCode(s.detail.value);\r\n SetError(\"\");\r\n }\r\n }}\r\n type=\"number\" placeholder=\"Coupon Barcode Number\" min=\"0\" className=\"couponInput\" />\r\n {Error.length > 0 &&
{Error}
}\r\n\r\n
\r\n
\r\n
\r\n\r\n 0)}>\r\n\r\n {props.mopCoupons != null && props.mopCoupons.length > 0 && \r\n \r\n {props.mopCoupons != null && props.mopCoupons.filter((b: IMopCoupon) => b.rejected == false).map((c: IMopCoupon, idx: number) => (\r\n {\r\n SetIsBusy(true);\r\n props.deleteCouponCode(c.couponCode, (r: boolean) => {\r\n SetIsBusy(false);\r\n });\r\n }}>\r\n \r\n \r\n ))}\r\n \r\n }\r\n\r\n
\r\n {\r\n\r\n const canAdd = CouponCode?.length == 13 && CouponCode.substring(0, 3) == \"992\";\r\n\r\n if (canAdd == false) {\r\n SetError(\"Please enter a valid Coupon Barcode Number\");\r\n return;\r\n }\r\n\r\n SetError(\"\");\r\n\r\n let duplicatCoupon: any = [];\r\n\r\n if (props.mopCoupons != null) {\r\n duplicatCoupon = props.mopCoupons.filter((c: any) => c.couponCode == CouponCode);\r\n }\r\n\r\n if (duplicatCoupon.length == 0) {\r\n SetError(\"\");\r\n SetIsBusy(true);\r\n props.addCouponCode(CouponCode, (r: boolean, basket: any) => {\r\n if (basket) {\r\n let couponsAdded = basket.mopCoupons.filter((c: any) => c.couponCode == CouponCode);\r\n if (couponsAdded.length > 0) {\r\n const thatCoupon = couponsAdded[0] as IMopCoupon;\r\n if (thatCoupon.rejected == true) {\r\n const mappedError = couponErrorMappings[thatCoupon.errorCode];\r\n if (mappedError) {\r\n SetError(mappedError);\r\n }\r\n else {\r\n SetError(\"An unknown error has occurred\");\r\n }\r\n props.deleteCouponCode(thatCoupon.couponCode, (r: boolean) => {\r\n SetIsBusy(false);\r\n });\r\n }\r\n else {\r\n SetCouponCode(\"\");\r\n }\r\n }\r\n }\r\n SetIsBusy(false);\r\n });\r\n }\r\n else {\r\n SetError(\"This coupon has already been added\");\r\n }\r\n\r\n }}>Add coupon\r\n
\r\n\r\n\r\n\r\n
\r\n\r\n\r\n\r\n
)\r\n}\r\n\r\nconst mapStateToProps = (state: ApplicationState, ownProps: any) => ({\r\n mopCoupons: state.basket?.basket.mopCoupons,\r\n menuItems: state.basket?.basket.menuItems\r\n});\r\n\r\nconst mapDispatchToProps = (dispatch: any) => {\r\n return {\r\n addCouponCode: (couponCode: string, callback: any) => dispatch(BasketStore.actionCreators.addCouponCode(couponCode, callback)),\r\n deleteCouponCode: (couponCode: string, callback: any) => dispatch(BasketStore.actionCreators.deleteCouponCode(couponCode, callback))\r\n };\r\n};\r\n\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(MopCoupons as any)\r\n\r\n\r\n\r\n// < IonInput disabled = { IsBusy }\r\n//class=\"CouponCodeField\"\r\n//clearInput\r\n//value = { CouponCode }\r\n//onIonChange = {(s) => {\r\n// if (s.detail.value != undefined) {\r\n// SetCouponCode(s.detail.value);\r\n// SetCanAddCouponCode(s.detail.value?.length == 13 && s.detail.value.substring(0, 5) == \"99273\");\r\n// SetError(\"\");\r\n// }\r\n//}}\r\n//type = \"number\" placeholder = \"Enter coupon...\" className = \"couponInput\" />\r\n// { Error.length > 0 &&
{Error}
}\r\n//{\r\n// props.mopCoupons != null && props.mopCoupons.length > 0 && \r\n// \r\n// {props.mopCoupons != null && props.mopCoupons.map((c: IMopCoupon, idx: number) => (\r\n// {\r\n// SetIsBusy(true);\r\n// props.deleteCouponCode(c.couponCode, (r: boolean) => {\r\n// console.log(\"deleteCouponCode.success: \" + r);\r\n// SetIsBusy(false);\r\n// });\r\n// }}>\r\n// \r\n// {c.couponCode}\r\n// ))}\r\n// \r\n// \r\n//}","import React, { createRef, useState } from 'react';\r\nimport { IonPage } from '@ionic/react';\r\nimport MopCoupons from '../components/MopCoupons';\r\nimport './CouponsTestPage.scss';\r\nimport { withRouter, RouteComponentProps } from 'react-router';\r\n\r\n// MTR: Delete if you wish with its .scss\r\n\r\ninterface MopCouponsProps {\r\n}\r\n\r\ntype CouponsMergeProps =\r\n RouteComponentProps & MopCouponsProps;\r\n\r\nclass CouponsTestPage extends React.Component {\r\n\r\n constructor(props: CouponsMergeProps) {\r\n super(props);\r\n }\r\n render() {\r\n return (\r\n \r\n \r\n \r\n )\r\n }\r\n}\r\n\r\nexport default withRouter(CouponsTestPage as any);","import React, { useEffect, useState } from 'react';\r\nimport { IonRow, IonCol, IonContent, IonPage, IonImg, IonText } from '@ionic/react';\r\nimport './PaymentSuccess.scss';\r\nimport { useSelector } from 'react-redux';\r\nimport { ApplicationState } from '../store';\r\nimport * as locationStore from '../store/LocationStore';\r\nimport { baseUrl, cacheBust } from '../helpers/configHelper';\r\n\r\ninterface ICounterItem {\r\n menuItemId: number;\r\n menuItemName: string;\r\n sku: string;\r\n quantity: number;\r\n}\r\n\r\ninterface ICounterItems {\r\n number: number;\r\n menuItems: ICounterItem[];\r\n}\r\n\r\nconst PaymentSuccess: React.FC = () => {\r\n const orderNumber = useSelector((state: ApplicationState) => state.basket?.orderNumber);\r\n const basketState = useSelector((state: ApplicationState) => state.basket);\r\n const locationState = useSelector((state: ApplicationState) => state.location);\r\n\r\n const [counterItems, setCounterItems] = useState({ number: 0, menuItems: [] });\r\n const [isKitchenItemPresent, setIsKitchenItemPresent] = useState(false);\r\n\r\n useEffect(() => {\r\n if (basketState?.tmpBasket) {\r\n let _counterItems: ICounterItem[] = [];\r\n\r\n basketState.tmpBasket.menuItems.forEach((item: IMopMenuItemDetail) => {\r\n if (!item.isDealItem) {\r\n if (!item.isKitchenItem || (item.itemTags && item.itemTags.toLowerCase().includes('[cc]'))) {\r\n const counterItem: ICounterItem = {\r\n menuItemId: item.menuItemId,\r\n menuItemName: item.menuItemName,\r\n sku: item.sku,\r\n quantity: item.quantity,\r\n }\r\n\r\n _counterItems.push(counterItem);\r\n }\r\n } else {\r\n item.modifierGroups\r\n .filter((group: IMopModifierGroup) => group.selected === true)\r\n .forEach((group: IMopModifierGroup) => {\r\n group.modifierGroupItems\r\n .filter((item: IMopModifierGroupItem) => item.quantitySelected > 0)\r\n .forEach((item: IMopModifierGroupItem) => {\r\n if (!item.isKitchenItem || (item.productFlags && item.productFlags.includes('[cc]'))) {\r\n const counterItem: ICounterItem = {\r\n menuItemId: item.menuItemId,\r\n menuItemName: item.menuItemName,\r\n sku: item.sku,\r\n quantity: item.quantitySelected,\r\n }\r\n\r\n _counterItems.push(counterItem);\r\n }\r\n })\r\n })\r\n }\r\n });\r\n\r\n setCounterItems({\r\n number: _counterItems.length,\r\n menuItems: _counterItems,\r\n });\r\n\r\n let _isKitchenItemsPresent = basketState.tmpBasket.menuItems.some((item) => (\r\n item.isKitchenItem === true\r\n ));\r\n\r\n setIsKitchenItemPresent(_isKitchenItemsPresent);\r\n }\r\n console.log(orderNumber);\r\n }, [basketState?.tmpBasket]);\r\n\r\n return (\r\n \r\n \r\n
\r\n
\r\n
\r\n \r\n
We've got your order!
\r\n {\r\n (counterItems.menuItems.length > 0 && locationState?.selectedChannel?.channelType == locationStore.simpleChannelType.TableOrder)\r\n ?\r\n <>\r\n
Don't forget
\r\n
Collect {counterItems.number} {counterItems.menuItems.length > 1 ? \"items\" : \"item\"} from the counter
\r\n
    \r\n {\r\n counterItems.menuItems.map((item) => {\r\n return(\r\n
  • \r\n \r\n\r\n \r\n { console.log(e) }} className=\"MenuItemImage\" src={(`${baseUrl()}/images/ProductShots/${item.sku}_PLP.png`) + `?v=${cacheBust()}`} />\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
  • \r\n )\r\n })\r\n }\r\n
\r\n \r\n :\r\n <>\r\n
Your order reference
\r\n
\r\n \r\n }\r\n {\r\n locationState?.selectedChannel?.channelType == locationStore.simpleChannelType.TableOrder\r\n ?\r\n <>\r\n {\r\n basketState?.tableNumber &&\r\n <>\r\n
{counterItems.menuItems.length > 0 ? \"We'll bring the rest of your order to:\" : \"We'll bring your order to:\"}
\r\n
\r\n {\r\n counterItems.menuItems.length > 0 &&\r\n <>\r\n
Your order reference: {orderNumber}
\r\n \r\n }\r\n \r\n }\r\n \r\n :\r\n <>\r\n {\r\n locationState?.selectedTimeSlot.label == \"ASAP\" &&\r\n <>\r\n
Your order is being prepared and will be ready for you to collect shortly
\r\n \r\n }\r\n \r\n }\r\n {\r\n locationState?.selectedTimeSlot.label !== \"ASAP\" &&\r\n <>\r\n {\r\n locationState?.selectedTimeSlot.startTime &&\r\n <>\r\n
Your order is being prepared for
\r\n
\r\n \r\n }\r\n \r\n }\r\n
\r\n
\r\n {\r\n locationState?.selectedChannel?.channelType == locationStore.simpleChannelType.TableOrder\r\n ?\r\n <>\r\n
\r\n We'll deliver your order as soon as it's ready.
\r\n A receipt has been sent to your email.\r\n
\r\n \r\n :\r\n <>\r\n {\r\n locationState?.selectedTimeSlot.label == \"ASAP\" ?\r\n <>\r\n
\r\n Please head over to the collection point in store.
\r\n A receipt has been sent to your email.\r\n
\r\n \r\n :\r\n <>\r\n
\r\n We'll let you know when it's ready to collect.
\r\n A receipt has been sent to your email.\r\n
\r\n \r\n }\r\n \r\n }\r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default PaymentSuccess;\r\n","import React, { useEffect } from 'react';\r\nimport './AppHeader.scss';\r\nimport { ApplicationState } from '../store';\r\nimport { useSelector, useDispatch } from 'react-redux';\r\nimport { useLocation } from \"react-router-dom\";\r\nimport '../theme/common.scss';\r\nimport * as headerFooterStore from '../store/HeaderFooterStore';\r\nimport { bindActionCreators } from 'redux'\r\n\r\ninterface AppHeaderProps { }\r\n\r\nconst HistoryListener: React.FC = () => {\r\n let location = useLocation();\r\n const locationState = useSelector((state: ApplicationState) => state.location);\r\n const boundSetPage = bindActionCreators(headerFooterStore.actionCreators.setPage, useDispatch());\r\n\r\n // Set up a listener to notify the HeaderFooter store when the page changes\r\n useEffect(() => {\r\n boundSetPage(location.pathname, locationState?.selectedChannel?.channelType);\r\n console.log(\"Changing HL page to = \" + location.pathname);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [location]);\r\n return (
);\r\n};\r\n\r\nexport default HistoryListener;\r\n","import React, { useEffect, useState } from 'react';\r\nimport { IonHeader, IonTitle, IonToolbar, IonIcon, IonGrid, IonRow, IonCol, IonToast, IonicSafeString } from '@ionic/react';\r\nimport './AppHeader.scss';\r\nimport { closeCircle, chevronBack, menu } from 'ionicons/icons';\r\nimport { ApplicationState } from '../store';\r\nimport { useSelector, useDispatch } from 'react-redux';\r\nimport { useLocation } from \"react-router-dom\";\r\nimport '../theme/common.scss';\r\nimport * as headerFooterStore from '../store/HeaderFooterStore';\r\nimport { bindActionCreators } from 'redux'\r\nimport MopHeaderMenusModal from '../modals/MopHeaderMenusModal'\r\n\r\ninterface LocationListenerProps {\r\n contentRef: React.RefObject\r\n}\r\n\r\nconst LocationListener: React.FC = (props) => {\r\n\r\n const location = useLocation();\r\n const basketState = useSelector((state: ApplicationState) => state.basket);\r\n\r\n // Set up a listener to notify the HeaderFooter store when the page changes\r\n\r\n useEffect(() => {\r\n if(props.contentRef.current != null && location.pathname != undefined){\r\n if(location.pathname.includes('/menuitem') && !props.contentRef.current.classList.contains(\"negative-margin\")){\r\n props.contentRef.current.classList.add(\"negative-margin\");\r\n }else{\r\n props.contentRef.current.classList.remove(\"negative-margin\");\r\n }\r\n }\r\n }, [location.pathname]);\r\n\r\n const toastMessage: IonicSafeString = new IonicSafeString('
Added to Order
');\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nexport default LocationListener;\r\n","import React, { useEffect, useRef, useState } from 'react';\r\nimport moment from 'moment';\r\nimport { IonContent, IonRadioGroup, IonList, IonItem, IonLabel, IonRadio, IonIcon, IonAlert, IonGrid, IonRow , IonCol} from '@ionic/react';\r\nimport { ellipseSharp, stopwatchSharp, time } from 'ionicons/icons';\r\nimport './TimeSlotChooser.scss';\r\nimport { bindActionCreators } from 'redux';\r\nimport * as locationStore from '../store/LocationStore';\r\nimport * as basketStore from '../store/BasketStore';\r\nimport * as menuStore from '../store/MenuStore';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { ApplicationState } from '../store';\r\nimport { resetMessage } from '../store/ColleagueStore';\r\n\r\nimport './TimeSlotChooser.scss';\r\nimport { baseUrl } from '../helpers/configHelper';\r\nimport { useHistory } from 'react-router';\r\n\r\nconst getTimeSlotIntervals = (from: string, to: string, interval: number) => {\r\n //moment('24/12/2019 09:15:00', \"DD MM YYYY hh:mm:ss\");\r\n let mFrom = moment(from, 'hh:mm');\r\n let mTo = moment(to, 'hh:mm');\r\n let times: TimeSlot[] = [];\r\n for(let i = mFrom; i < mTo; i = moment(i).add(interval, 'm')){\r\n //|| (i <= moment() && i >= moment().subtract(3, 'h')) //Do not show time slots that have already passed\r\n if((i >= moment() && i <= moment().add(3, 'h'))){\r\n let suffix = 'pm';\r\n if(i < moment('12:00', 'hh:mm'))\r\n suffix = 'am';\r\n let slotValue = moment(i).add(interval, 'm').format('HH:mm');\r\n let slot = `${i.format('HH:mm')} - ${slotValue} ${suffix}`;\r\n\r\n let takingOrders = true;\r\n times.push({\r\n label: slot,\r\n startTime: i.format('HH:mm'),\r\n startDateTime: \"\",\r\n endDateTime: \"\",\r\n endTime: slotValue,\r\n takingOrders: Math.random() < 0.5\r\n });\r\n }\r\n }\r\n return times;\r\n}\r\n\r\nconst getTestTimeslots = () : TimeSlot[] => {\r\n return [\r\n {\r\n label: \"ASAP\", \r\n startTime: \"12:00\",\r\n startDateTime: \"\",\r\n endDateTime: \"\",\r\n endTime: \"12:15\",\r\n takingOrders: true\r\n }\r\n ]\r\n}\r\n\r\nconst TimeSlotChooser: React.FC<{ className?: string }> = ({ className }) => {\r\n\r\n const dispatch = useDispatch();\r\n const history = useHistory();\r\n const [isChanging, setIsChanging] = useState(false);\r\n const [timeSlots, setTimeSlots] = useState();\r\n const [timeRange, setTimeRange] = useState(\"\");\r\n const boundSelectTimeslot = bindActionCreators(locationStore.actionCreators.selectTimeslot, useDispatch());\r\n //const boundClearMenuStore = bindActionCreators(menuStore.actionCreators.clearMenuStore, useDispatch());\r\n const clearBasket = bindActionCreators(basketStore.actionCreators.clearBasket, useDispatch());\r\n const locationState = useSelector((state: ApplicationState) => state.location);\r\n const basketState = useSelector((state: ApplicationState) => state.basket);\r\n const pfIdentifier = localStorage.getItem(\"pfidentifier\");\r\n\r\n const formRef = useRef(null);\r\n const [showAlert, setShowAlert] = useState(false);\r\n\r\n const [asapTimeSlot, setAsapTimeSlot] = useState({ label: \"ASAP\", startTime: \"ASAP\", endTime: \"ASAP\", startDateTime: \"ASAP\", endDateTime: \"ASAP\", takingOrders: false });\r\n const [pickATimeObj, setPickATimeObj] = useState({ label: \"timeSlot\", startTime: \"timeSlot\", endTime: \"timeSlot\", startDateTime: \"timeSlot\", endDateTime: \"timeSlot\", takingOrders: true });\r\n const [prevTimeSlot, setPrevTimeSlot] = useState(asapTimeSlot);\r\n\r\n\r\n const handleHeaderRadioChange = (value: TimeSlot) => { \r\n console.log(\"handleHeaderRadioChange: \" + (pickATimeObj === value)); \r\n if(timeSlots){ \r\n let timeslot:TimeSlot;\r\n if(pickATimeObj === value) {\r\n let firstTimeslot:TimeSlot = timeSlots.find(timeslot => { return timeslot.takingOrders === true}) || asapTimeSlot;\r\n timeslot = firstTimeslot;\r\n }\r\n else {\r\n timeslot = locationState?.selectedTimeSlot || asapTimeSlot;\r\n if(value.label !== \"ASAP\"){ //If this event is not trying to switch to ASAP \r\n if(locationState?.selectedTimeSlot.label !== \"ASAP\"){ //Check if it's coming from ASAP choice or time slots\r\n timeslot = timeSlots.find(timeslot => { return timeslot.takingOrders === true}) || asapTimeSlot;\r\n }\r\n }\r\n else\r\n {\r\n timeslot = value;\r\n formRef.current?.reset(); //This will clear front-end view of whatever timeslot is selected.\r\n }\r\n }\r\n boundSelectTimeslot(timeslot); \r\n }\r\n }\r\n\r\n const handleTimeslotChange = (value: TimeSlot, isHeader: boolean) => {\r\n //boundClearMenuStore();\r\n //console.log(\"Changing slot\", value, isHeader, isChanging);\r\n if(locationState?.selectedTimeSlot !== undefined){\r\n setPrevTimeSlot(locationState.selectedTimeSlot);\r\n }\r\n if(basketState?.basket && basketState.basket.menuItems.length > 0 && value.startTime != locationState?.selectedTimeSlot.startTime && value.startTime != pickATimeObj.startTime){\r\n //console.log(e, locationState?.selectedTimeSlot);\r\n //console.log(value, locationState?.selectedTimeSlot, pickATimeObj);\r\n setShowAlert(true);\r\n }\r\n if(!isChanging && isHeader){\r\n handleHeaderRadioChange(value);\r\n } \r\n else{\r\n setIsChanging(true); \r\n boundSelectTimeslot(value, () => setIsChanging(false) )\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n //console.log(\"Running\");\r\n fetch(baseUrl() + `/stores/GetStoreTimeSlots${pfIdentifier ? \"?pfIdentifier=\" + pfIdentifier + \"&\" : \"?\"}storeNumber=` + locationState?.selectedStore?.storeNumber)\r\n .then((res) => res.json())\r\n .then((data: any) => {\r\n if (data.status === 401) {\r\n dispatch(resetMessage(\"showExpireModal\"))\r\n }\r\n else {\r\n let test = false;\r\n let res: TimeSlot[] = test ? getTestTimeslots() : data.mopTimeSlots;\r\n\r\n //console.log(res);\r\n if (res.length > 0) {\r\n let _asapTimeSlot: TimeSlot = { ...asapTimeSlot, takingOrders: res[0].takingOrders, startTime: res[0].startTime, endTime: res[0].endTime, startDateTime: res[0].startDateTime, endDateTime: res[0].endDateTime };\r\n res.splice(0, 1);\r\n if (res.length > 0) { //More timeslots are available other than ASAP\r\n setPickATimeObj({ ...pickATimeObj, takingOrders: true });\r\n setTimeSlots(res);\r\n }\r\n\r\n let firstAvailableTimeslot = [_asapTimeSlot, ...res].find(timeslot => { return timeslot.takingOrders == true });\r\n setAsapTimeSlot(_asapTimeSlot);\r\n setTimeRange(data.timeRange);\r\n\r\n let timeslotFromState = undefined;\r\n if (locationState && locationState?.selectedTimeSlot.startTime != \"ASAP\") {\r\n timeslotFromState = [_asapTimeSlot, ...res].find((ts) => ts.startTime == locationState.selectedTimeSlot.startTime) as TimeSlot; // Need to find value from array that is mapped out to create timeslots instead of just assigning the current timeslot even if they are the exact same. \r\n //console.log(\"Current slot\", locationState.selectedTimeSlot, timeslotFromState);\r\n }\r\n\r\n //When coming to the timeslot page, we check if the customer has already selected a timeslot and if that timeslot is still available, else we just select the first available one.\r\n if (timeslotFromState != undefined && timeslotFromState.takingOrders == true) {\r\n handleTimeslotChange(timeslotFromState, false);\r\n }\r\n else if (firstAvailableTimeslot != undefined) {\r\n boundSelectTimeslot(firstAvailableTimeslot);\r\n }\r\n else { //If for some reason the user was able to access this page when there are 0 available timeslots, go back \r\n history.goBack();\r\n }\r\n\r\n } else {\r\n setAsapTimeSlot({ ...asapTimeSlot, startTime: moment().format(\"HH:mm\"), endTime: moment().add(15, \"m\").format(\"HH:mm\") });\r\n //history.goBack(); \r\n }\r\n }\r\n });\r\n //let res = getTimeSlotIntervals('08:00', '20:00', 15);\r\n\r\n }, [locationState?.selectedStore]);\r\n\r\n return (\r\n <>\r\n {locationState?.selectedStore != undefined &&\r\n <>\r\n { setShowAlert(false); }}\r\n header={\"Change order time\"}\r\n buttons={[\r\n {\r\n text: \"No\",\r\n role: \"cancel\",\r\n handler: () => {\r\n boundSelectTimeslot(prevTimeSlot);\r\n //history.push(\"/categories\"); // - Instead, store old choice and switch it back upon changing.\r\n }\r\n },\r\n {\r\n text: \"Yes, clear basket\",\r\n handler: () => {\r\n clearBasket();\r\n }\r\n }\r\n ]}\r\n message={\"Changing your order time will clear your basket. Are you sure you want to do this?\"}\r\n />\r\n \r\n \r\n \r\n { handleTimeslotChange(e.detail.value, true) }}>\r\n \r\n {!asapTimeSlot.takingOrders ? Immediate collection is not available :\r\n As soon as possible}\r\n \r\n \r\n \r\n Choose a time {timeRange}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n {\r\n (timeSlots != undefined && timeSlots.length > 0) &&\r\n { handleTimeslotChange(e.detail.value, false) }}>\r\n {\r\n timeSlots.map((timeslot, i) => {\r\n return \r\n \r\n {timeslot.label}\r\n \r\n })\r\n }\r\n \r\n }\r\n
\r\n
\r\n
\r\n\r\n
\r\n \r\n }\r\n \r\n )\r\n}\r\n\r\nexport default TimeSlotChooser;\r\n\r\n/*\r\n\r\n\r\n \r\n { handleTimeslotChange(e.detail.value, true) }}>\r\n \r\n \r\n {!asapTimeSlot.takingOrders ? Immediate collection is not available :\r\n As soon as possible
(within 10-15 minutes)
}\r\n \r\n
\r\n \r\n \r\n Pick a time
{timeRange}
\r\n \r\n
\r\n
\r\n
\r\n {\r\n (timeSlots != undefined && timeSlots.length > 0) &&\r\n { handleTimeslotChange(e.detail.value, false) }}>\r\n {\r\n timeSlots.map((timeslot, i) => {\r\n return \r\n \r\n {timeslot.label}\r\n \r\n })\r\n }\r\n \r\n }\r\n
\r\n
\r\n\r\n\r\n*/","import { IonContent, IonGrid, IonItem, IonPage, IonRow,IonCol } from '@ionic/react';\r\nimport React from 'react';\r\nimport TimeSlotChooser from '../components/TimeSlotChooser';\r\nimport './TimeSlotPage.scss';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { ApplicationState } from '../store';\r\nimport { simpleChannelType } from '../store/LocationStore';\r\n\r\nconst TimeSlotPage: React.FC = () => {\r\n\r\n const LocationState = useSelector((state: ApplicationState) => state.location);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n {LocationState?.selectedStore?.storeName}\r\n \r\n \r\n {LocationState?.selectedChannel?.channelType === simpleChannelType.TableOrder ? (\r\n When would you like to order for?\r\n ) : (\r\n When would you like to collect?\r\n )} \r\n \r\n \r\n \r\n \r\n \r\n )\r\n};\r\n\r\nexport default TimeSlotPage;","import React, { useState } from 'react';\r\nimport { IonItem, IonLabel, IonRadio, IonGrid, IonCol, IonRow, IonIcon } from '@ionic/react';\r\nimport './LocationItem.scss';\r\nimport { warning } from 'ionicons/icons';\r\nimport { getConfig } from '../helpers/configHelper';\r\n\r\ninterface LocationItem {\r\n\tlocationName: string;\r\n\tlocationAddress: string;\r\n\tlocationPostcode: string;\r\n\tlocationDistance: string;\r\n\tlocationIsMarketKitchen: boolean;\r\n\tlocationIsCafe: boolean;\r\n\tlocationMessage?: string;\r\n\tstoreNumber: string;\r\n\ttakingMopOrders: boolean;\r\n\tselectedStoreNumber: string;\r\n\topeningTimes: string;\r\n\tstoreOpen: boolean;\r\n\tisFirstItem?: boolean,\r\n\tisLastItem?: boolean\r\n\tonClick?: (categoryId: number) => void;\r\n}\r\n\r\nconst LocationItemObject: React.FC = ({ storeNumber,\r\n\tlocationName,\r\n\tlocationAddress,\r\n\tlocationPostcode,\r\n\tlocationDistance,\r\n\tlocationIsMarketKitchen,\r\n\tlocationIsCafe,\r\n\tlocationMessage,\r\n\ttakingMopOrders,\r\n\tonClick,\r\n\tselectedStoreNumber,\r\n\topeningTimes,\r\n\tstoreOpen,\r\n\tisFirstItem,\r\n\tisLastItem }) => {\r\n\treturn (\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t{locationName}\r\n\t\t\t\t\t\t\t{locationAddress}
{locationPostcode}
\r\n\t\t\t\t\t\t\t{openingTimes} {/* MTR: Include closing time */}\r\n\t\t\t\t\t\t\t{(locationMessage !== '' && locationMessage !== undefined) && {locationMessage}}\r\n\t\t\t\t\t\t\t{!takingMopOrders && This {getConfig().isMarket ? \"Market Kitchen\" : \"café\"} is not taking online orders}\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t
\r\n\t\t\t\t\t{locationDistance} mi\r\n\t\t\t\t
\r\n\t\t\t
\r\n\t\t
\r\n\t);\r\n};\r\n\r\nexport default LocationItemObject;\r\n\r\n\r\n\r\n/*\r\n\r\n\r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t{locationName}\r\n\t\t\t\t\t\t
{locationAddress}
\r\n\r\n\t\t\t\t\t\t
{openingTimes}
\r\n\t\t\t\t\t\t{locationMessage !== '' &&\r\n\t\t\t\t\t\t\t
{locationMessage}
\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t!takingMopOrders &&\r\n\t\t\t\t\t\t\t
This {getConfig().isMarket ? \"Market Kitchen\" : \"café\"} is not taking online orders
\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t
{locationDistance} miles
\r\n\t\t\t\t\t
\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t{locationIsMarketKitchen &&\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t{locationIsCafe &&\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\r\n\t\t\t\t
\r\n\t\t\t
\r\n\r\n\t\t\t\r\n\r\n\t\t
\r\n\r\n\r\n\r\n*/\r\n","import './StoreSearch.scss';\r\nimport React from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { ApplicationState } from '../store';\r\nimport { RouteComponentProps } from 'react-router';\r\n\r\nimport * as LocationStore from '../store/LocationStore';\r\nimport * as BasketStore from '../store/BasketStore';\r\nimport { SimpleStore } from '../store/LocationStore';\r\n\r\nimport * as HeaderFooterStore from '../store/HeaderFooterStore';\r\nimport { locate, search } from 'ionicons/icons';\r\nimport LocationItem from '../components/LocationItem';\r\n\r\nimport {\r\n IonGrid, IonRow, IonCol, IonContent, IonPage, IonInput, IonItem, IonList,\r\n IonRadioGroup, IonIcon, IonAlert, IonSpinner\r\n} from '@ionic/react';\r\n\r\ntype StoreSearchProps =\r\n LocationStore.LocationState &\r\n BasketStore.BasketState &\r\n typeof LocationStore.actionCreators &\r\n typeof HeaderFooterStore.actionCreators &\r\n typeof BasketStore.actionCreators &\r\n RouteComponentProps\r\n\r\ntype AutocompletePrediction = HereLocation | MapBoxLocation;\r\n\r\ntype HereLocation = {\r\n api: \"HERE\",\r\n data: HereItemsEntity\r\n}\r\n\r\ntype MapBoxLocation = {\r\n api: \"MapBox\",\r\n data: FeaturesEntity\r\n}\r\n\r\ninterface IStoreSearchState {\r\n input: string,\r\n ignoreInput:boolean,\r\n selectedStore?: LocationStore.SimpleStore,\r\n localPredictions: AutocompletePrediction[],\r\n cancelOrderAlertShow: boolean,\r\n isLoading: boolean\r\n}\r\n\r\nfunction metersToMiles(metersValue:number) {\r\n return metersValue * 0.000621371;\r\n}\r\n\r\nfunction tidyPlaceDescription(title:string) {\r\n let newTitle = title.replace(\", England\", \"\");\r\n newTitle = newTitle.replace(\", Scotland\", \"\");\r\n newTitle = newTitle.replace(\", Wales\", \"\");\r\n newTitle = newTitle.replace(\", Northern Ireland\", \"\");\r\n newTitle = newTitle.replace(\", Ireland\", \"\");\r\n newTitle = newTitle.replace(\", United Kingdom\", \"\");\r\n return newTitle;\r\n}\r\n\r\nclass StoreSearch extends React.Component {\r\n\r\n constructor(props: any) {\r\n super(props);\r\n this.state = { input: \"\", selectedStore: undefined, localPredictions: [], cancelOrderAlertShow: false, ignoreInput:false, isLoading: false};\r\n this.requestStoresCallback = this.requestStoresCallback.bind(this);\r\n this.requestServerGeoAutoCompleteCallback = this.requestServerGeoAutoCompleteCallback.bind(this);\r\n this.requestServerGeoPlaceCallback = this.requestServerGeoPlaceCallback.bind(this);\r\n this.geoCallback = this.geoCallback.bind(this);\r\n }\r\n\r\n componentDidMount() {\r\n console.debug(\"StoreSearch.componentDidMount()\");\r\n if (Number.isNaN(this.props.clientLatitude) === false) {\r\n this.setState({isLoading:true});\r\n this.props.requestStores(this.props.clientLatitude, this.props.clientLongitude, Number.NaN, this.requestStoresCallback);\r\n }\r\n else {\r\n this.location();\r\n }\r\n }\r\n\r\n componentDidUpdate(prevProps: StoreSearchProps, prevState: IStoreSearchState) {\r\n if(prevProps.location.pathname !== this.props.location.pathname\r\n && this.props.location.pathname === \"/storesearch\")\r\n {\r\n if (this.props.basket.menuItems.length > 0) {\r\n this.setState({\r\n cancelOrderAlertShow: true\r\n })\r\n }\r\n }\r\n }\r\n\r\n requestStoresCallback() {\r\n this.setState({isLoading: false});\r\n }\r\n\r\n onIonRadioGroupChange(s:any) {\r\n //console.log(\"onIonRadioGroupChange: \" + JSON.stringify(s.detail.value));\r\n if(this.props.basket.menuItems.length < 1){\r\n const storeNumber = s.detail.value;\r\n this.setSelectedStore(storeNumber);\r\n }\r\n }\r\n\r\n setSelectedStore(_storeNumber: string){\r\n const storeNumber = _storeNumber;\r\n console.debug(\"storeNumber = \" + storeNumber);\r\n const selectedStore = this.props.stores.filter((p) => {\r\n return p.storeNumber === storeNumber;\r\n });\r\n if (selectedStore && selectedStore.length === 1) {\r\n const theStore = selectedStore[0];\r\n if(theStore.supportedChannels.length > 0){\r\n //const theChannel = theStore.supportedChannels.filter((c) => { return c.channelType == simpleChannelType.ClickAndCollect });\r\n const theChannel = theStore.supportedChannels[0];\r\n if (theChannel) {\r\n const theChannelIdentifier = theChannel.channelIdentifier;\r\n console.debug(\"channelIdentifier = \" + theChannelIdentifier);\r\n this.props.selectStore(theStore, theChannelIdentifier);\r\n }\r\n }\r\n }\r\n }\r\n\r\n requestServerGeoPlaceCallback() {\r\n if (this.props.place) {\r\n if (this.props.placeLatitude){\r\n this.props.requestStores(this.props.placeLatitude, this.props.placeLongitude, Number.NaN, this.requestStoresCallback);\r\n }\r\n }\r\n }\r\n\r\n // Unused - Google\r\n requestServerGeoAutoCompleteCallback() {\r\n this.clearSuggestions();\r\n if (this.props.predictions?.length > 0) {\r\n this.props.predictions.forEach((i:any) => {\r\n //console.debug(\"google description: \" + i.description);\r\n this.setState({ localPredictions: [...this.state.localPredictions,i] });\r\n });\r\n }\r\n }\r\n\r\n clearSuggestions() {\r\n this.setState({ localPredictions: [] });\r\n }\r\n\r\n onBlur(e:any) {\r\n if (e.detail?.relatedTarget?.tagName !== \"ION-ITEM\")\r\n this.clearSuggestions();\r\n }\r\n\r\n onInputChanged(evt: any) {\r\n if (this.state.ignoreInput) {\r\n this.setState({ ignoreInput: false });\r\n }\r\n else {\r\n const str: string = evt.detail.value;\r\n this.setState({ input: evt.detail.value });\r\n if (str && str.length > 0)\r\n //this.props.requestServerGeoAutoComplete(str, this.requestServerGeoAutoCompleteCallback);\r\n this.requestAutocomplete(str, (predictions) => {\r\n this.clearSuggestions();\r\n this.setState({\r\n localPredictions: predictions\r\n });\r\n });\r\n else\r\n this.clearSuggestions();\r\n }\r\n }\r\n\r\n requestAutocomplete = async (query: string, callback?: (predictions: AutocompletePrediction[]) => void) => {\r\n let useMapBox = true;\r\n if(useMapBox){\r\n //Reference - https://docs.mapbox.com/api/search/geocoding/#forward-geocoding\r\n //Demo - https://docs.mapbox.com/playground/geocoding/?search_text=Warmington&country=gb%2Cie&limit=10&types=locality%2Cpostcode%2Cneighborhood%2Cplace%2Cdistrict%2Caddress&autocomplete=true&fuzzyMatch=true&routing=false&access_token=sk.eyJ1IjoiaHdkLXdpbGxqaWNhciIsImEiOiJja3d4bXUzZzYwZjVhMm9sY2JmYnZmOTRjIn0.yyTvWe5mhXVITFXb2T8npg\r\n try{\r\n const response = await fetch(`https://api.mapbox.com/geocoding/v5/mapbox.places/${query}.json?country=gb,gi%2Cie&limit=10&types=locality%2Cpostcode%2Cneighborhood%2Cplace%2Cdistrict%2Caddress&autocomplete=true&fuzzyMatch=true&routing=false&access_token=sk.eyJ1IjoiaHdkLXdpbGxqaWNhciIsImEiOiJja3d4bXUzZzYwZjVhMm9sY2JmYnZmOTRjIn0.yyTvWe5mhXVITFXb2T8npg`);\r\n if(!response.ok){\r\n if(response.status === 429){\r\n setTimeout(() => {\r\n this.requestAutocomplete(query, callback);\r\n }, 1000);\r\n }\r\n else{\r\n console.error(response);\r\n throw new Error(response.statusText);\r\n }\r\n }\r\n else{\r\n const responseJson = await response.json() as MapBoxResponse;\r\n console.log(responseJson.features);\r\n\r\n callback && callback(responseJson.features ? responseJson.features?.map((feature) => {\r\n return {\r\n api: \"MapBox\",\r\n data: feature\r\n }\r\n }) : []);\r\n }\r\n }\r\n catch(err){\r\n console.log(err);\r\n }\r\n }\r\n }\r\n\r\n onPlaceSelect(id: any, title:any, long?: any, lat?: any) {\r\n console.debug(`onPlaceSelect: place_id = ${id}, description = ${title}`);\r\n if (id) {\r\n this.setState({ input: tidyPlaceDescription(title), ignoreInput:true, isLoading: true });\r\n this.clearSuggestions();\r\n if(long && lat){\r\n this.props.requestStores(lat, long, Number.NaN, this.requestStoresCallback);\r\n }\r\n //this.props.requestServerGeoPlace(id, this.requestServerGeoPlaceCallback);\r\n }\r\n }\r\n\r\n geoCallback(latitude: number, longitude: number, accuracy: number, isOk: boolean) {\r\n if (isOk) {\r\n //console.debug(`StoreSearch.geoCallback: latitude=${latitude}, longitude=${longitude}, accuracy=${accuracy}`);\r\n this.setState({ isLoading: true});\r\n this.props.requestStores(this.props.clientLatitude,\r\n this.props.clientLongitude,\r\n Number.NaN,\r\n this.requestStoresCallback);\r\n }\r\n else {\r\n console.error(\"StoreSearch.geoCallback: requestClientGeoLocation failed.\");\r\n }\r\n }\r\n\r\n location() {\r\n this.props.requestClientGeoLocation(this.geoCallback);\r\n this.setState({ input: \"\"});\r\n }\r\n\r\n render() {\r\n return \r\n { this.setState({ cancelOrderAlertShow: false }) }}\r\n header={\"Change Location\"}\r\n buttons={[\r\n {\r\n text: \"No\",\r\n role: \"cancel\",\r\n handler: () => {\r\n // TODO: CHECK IF SELECTED STORE HAS A EAT IN CHANNEL\r\n this.props.history.push(\"/ordertype\");\r\n }\r\n },\r\n {\r\n text: \"Yes, clear basket\",\r\n handler: () => {\r\n this.props.clearBasket()\r\n }\r\n }\r\n ]}\r\n message={\"Changing your location will clear your basket. Are you sure you want to do this?\"}\r\n />\r\n\r\n \r\n
\r\n \r\n \r\n Choose a store\r\n \r\n \r\n \r\n\r\n
\r\n \r\n this.onBlur(e)}\r\n debounce={500}\r\n value={this.state.input}\r\n placeholder=\"Enter postcode or location\"\r\n className=\"LocationSearch\"\r\n onIonChange={(e) => this.onInputChanged(e)} />\r\n this.location()} icon={locate} className={`locate-icon ${this.props.isBusy && \"disabled\"}`}/>\r\n
\r\n {this.state.input.length > 0 ? \r\n {this.state.localPredictions.map((prediction: AutocompletePrediction, i) => {\r\n if(prediction.api === \"HERE\"){\r\n let data = prediction.data;\r\n return this.onPlaceSelect(data.id, data.title, data.position.lng, data.position.lat)}>\r\n {tidyPlaceDescription(data.title)}\r\n \r\n }\r\n else{\r\n let data = prediction.data;\r\n return this.onPlaceSelect(data.id, data.place_name, data.geometry.coordinates ? data.geometry.coordinates[0] : 0, data.geometry.coordinates ? data.geometry.coordinates[1] : 0)}>\r\n {tidyPlaceDescription(data.place_name)}\r\n \r\n }\r\n })}\r\n : null}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n {this.state.isLoading && //\r\n
\r\n \r\n
\r\n }\r\n {!this.state.isLoading && //\r\n \r\n \r\n this.onIonRadioGroupChange(e)}>\r\n {this.props.stores.map((store,i) => {\r\n return \r\n })}\r\n \r\n \r\n \r\n }\r\n
\r\n
\r\n
;\r\n }\r\n}\r\n\r\nconst mapDispatchToProps = (\r\n dispatch: any) => {\r\n return {\r\n selectStore: (store: SimpleStore, channelIdentifier: string) => dispatch(LocationStore.actionCreators.selectStore(store, channelIdentifier)),\r\n setTitle: (title: string, showBack: boolean) => dispatch(HeaderFooterStore.actionCreators.setTitle(title, showBack)),\r\n requestStores: (latitude: number, longitude: number, radius: number, callback: any) => dispatch(LocationStore.actionCreators.requestStores(latitude, longitude, radius,callback)),\r\n requestServerGeoAutoComplete: (input: string, callback: any) => dispatch(LocationStore.actionCreators.requestServerGeoAutoComplete(input, callback)),\r\n requestServerGeoPlace: (place: any, callback: any) => dispatch(LocationStore.actionCreators.requestServerGeoPlace(place, callback)),\r\n requestClientGeoLocation: (callback: any) => dispatch(LocationStore.actionCreators.requestClientGeoLocation(callback)),\r\n clearBasket: () => dispatch(BasketStore.actionCreators.clearBasket())\r\n };\r\n};\r\n\r\nexport default connect(\r\n (state: ApplicationState) => { return { ...state.location, ...state.basket } }, // Selects which state properties are merged into the component's props\r\n mapDispatchToProps // Selects which action creators are merged into the component's props\r\n)(StoreSearch as any); // eslint-disable-line @typescript-eslint/no-explicit-any\r\n","import \"./WaitTimesBanner.scss\"\r\nimport {useWaitTimes} from \"../../helpers/waitTimesHelper\";\r\nimport { IonCol, IonGrid, IonRow } from \"@ionic/react\";\r\nimport { baseUrl } from '../../helpers/configHelper';\r\nimport React from \"react\";\r\n\r\nexport const WaitTimesBanner = () => {\r\n const {\r\n waitingRange,\r\n waitingLabel,\r\n displayWaitTimes\r\n } = useWaitTimes();\r\n\r\n return \r\n \r\n \r\n \r\n \r\n \r\n \r\n

Current order wait time is

\r\n
\r\n \r\n

{waitingLabel} {waitingRange} minutes

\r\n
\r\n \r\n This is an estimate based on recent orders. Times may vary.\r\n \r\n
\r\n
\r\n
\r\n}\r\n","import {\r\n IonAlert, IonCol, IonContent, IonGrid, IonicSafeString, IonPage, IonRow,\r\n IonButton, IonIcon\r\n} from '@ionic/react';\r\nimport React, { useState, ComponentProps } from 'react';\r\nimport { useDispatch, useSelector} from 'react-redux';\r\nimport useMopHooks from '../helpers/useMopHook';\r\nimport { ApplicationState } from '../store';\r\nimport { SimpleChannel, simpleChannelType } from '../store/LocationStore';\r\nimport * as BasketStore from '../store/BasketStore';\r\nimport './ChooseOrderType.scss';\r\nimport { bindActionCreators } from 'redux';\r\nimport { baseUrl } from '../helpers/configHelper';\r\nimport Button from '../components/Button';\r\nimport {WaitTimesBanner} from \"../components/wait-times/WaitTimesBanner\";\r\nimport {useWaitTimes} from \"../helpers/waitTimesHelper\";\r\n\r\n// TODO: Move to global?\r\ntype Dictionary = {\r\n [key in Key]: Value;\r\n}\r\n\r\ninterface IChannelProps {\r\n title: string\r\n icon: string\r\n}\r\n\r\nconst channelProps: Dictionary = {\r\n TableOrder: {\r\n title: \"Eat In\",\r\n icon: `${baseUrl()}/images/assets/eat_in_icon.svg`\r\n },\r\n\r\n ClickAndCollect: {\r\n title: \"Take Away\",\r\n icon: `${baseUrl()}/images/assets/take_away_icon.svg`\r\n },\r\n\r\n KerbsideOrder: null,\r\n};\r\n\r\nfunction ChannelButton(props: IChannelProps & ComponentProps) {\r\n return (\r\n \r\n )\r\n}\r\n\r\nconst ChooseOrderType: React.FC = () => {\r\n const { onChannelSelected } = useMopHooks();\r\n const [selectedChannel, setSelectedChannel] = useState() as any;\r\n const [isAlertOpen, setIsAlertOpen] = useState(false);\r\n const [isClearBasketAlertOpen, setClearBasketAlertOpen] = useState(false);\r\n const LocationState = useSelector((state: ApplicationState) => state.location);\r\n const BasketState = useSelector((state: ApplicationState) => state.basket);\r\n const boundClearBasket = bindActionCreators(BasketStore.actionCreators.clearBasket, useDispatch());\r\n const { displayWaitTimes } = useWaitTimes();\r\n\r\n const handleOrderTypeClick = (channel: SimpleChannel) => {\r\n if (channel == null) {\r\n return;\r\n }\r\n\r\n if (LocationState?.selectedChannel !== undefined && LocationState.selectedChannel.channelType !== channel.channelType && BasketState && BasketState.basket.menuItems.length > 0) {\r\n setSelectedChannel(channel);\r\n setClearBasketAlertOpen(true);\r\n return;\r\n }\r\n\r\n switch (channel.channelType) {\r\n case simpleChannelType.ClickAndCollect: {\r\n onChannelSelected(channel)\r\n break;\r\n }\r\n\r\n case simpleChannelType.TableOrder: {\r\n if (localStorage.getItem('isLoggedIn') === \"true\") {\r\n // Colleague logged in so bypass the alert dialog\r\n onChannelSelected(channel);\r\n } else {\r\n setIsAlertOpen(true);\r\n setSelectedChannel(channel);\r\n }\r\n\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return (\r\n \r\n \r\n {\r\n setIsAlertOpen(false);\r\n onChannelSelected(selectedChannel);\r\n }}\r\n header={\"Eat In\"}\r\n buttons={[\r\n {\r\n text: \"I understand\",\r\n role: \"cancel\"\r\n }\r\n ]}\r\n message='Hot food will be delivered to your table, please pick up your counter items such as sandwiches and hot drinks.'\r\n />\r\n {\r\n setClearBasketAlertOpen(false);\r\n }}\r\n header={\"Are you sure?\"}\r\n buttons={[\r\n {\r\n text: \"Cancel\",\r\n role: \"cancel\"\r\n },\r\n {\r\n text: \"Clear basket\",\r\n handler: () => {\r\n boundClearBasket();\r\n onChannelSelected(selectedChannel);\r\n }\r\n }\r\n ]}\r\n message=\"Changing your order type will clear the items in your basket, are you sure you want to continue?\"\r\n />\r\n\r\n \r\n \r\n \r\n \r\n

Welcome to

\r\n

Morrisons Café {LocationState?.selectedStore?.storeName}

\r\n
\r\n
\r\n \r\n \r\n

Tap an option to get started

\r\n
\r\n
\r\n \r\n {LocationState?.selectedStore?.supportedChannels\r\n .sort((a, b) => {\r\n const aTitle = channelProps[a.channelType]?.title ?? \"\";\r\n const bTitle = channelProps[b.channelType]?.title ?? \"\";\r\n\r\n return aTitle < bTitle ? -1 : 1;\r\n })\r\n .map((channel, i) => {\r\n console.log(channel, i);\r\n const channelType = channel.channelType;\r\n const props = channelProps[channelType];\r\n\r\n if (props === null) {\r\n return false;\r\n }\r\n\r\n return (\r\n \r\n { handleOrderTypeClick(channel) }}\r\n {...props}\r\n />\r\n \r\n )\r\n })\r\n }\r\n \r\n
\r\n {displayWaitTimes && }\r\n \r\n
\r\n )\r\n}\r\n\r\nexport default ChooseOrderType;\r\n","import { IonButton, IonContent, IonGrid, IonItem, IonLabel, IonPage, IonRow, IonSelect, IonSelectOption } from '@ionic/react';\r\nimport { Field, FieldProps, Formik } from 'formik';\r\nimport React, { useEffect, useState } from 'react';\r\nimport { bindActionCreators } from 'redux';\r\nimport AppHeaderImage from '../components/AppHeaderImage';\r\nimport { tableNumberSchema, nicknameSchema } from '../helpers/formValidationHelpers';\r\nimport GenericInput from '../inputs/GenericInput';\r\nimport './TableNumber.scss';\r\nimport * as BasketStore from '../store/BasketStore';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { ApplicationState } from '../store';\r\nimport { useHistory } from 'react-router';\r\nimport { getConfig } from '../helpers/configHelper';\r\nimport { useLocation } from \"react-router-dom\";\r\n\r\nconst TableNumber: React.FC = () => {\r\n\r\n\tconst boundSetTableNumber = bindActionCreators(BasketStore.actionCreators.setTableNumber, useDispatch());\r\n\tconst BasketState = useSelector((state: ApplicationState) => state.basket);\r\n\tconst TableFormErrors = useSelector((state: ApplicationState) => state.basket?.tableFormErrors);\r\n\tconst ContinueClicked = useSelector((state: ApplicationState) => state.basket?.continueClicked);\r\n\tconst LocationState = useSelector((state: ApplicationState) => state.location);\r\n\tconst history = useHistory();\r\n\tconst maxTables = 47;\r\n\r\n\tuseEffect(() => {\r\n\t}, [ContinueClicked])\r\n\r\n\treturn (\r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t
\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tWhere are you sitting?\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tLook for the number on the sticker on your table\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t {\r\n\t\t\t\t\t\t\t\t\t//console.log(\"Submitting table number\", values);\r\n\t\t\t\t\t\t\t\t\tboundSetTableNumber(values.TableNumber as number);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{(props) => (\r\n\t\t\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\t\t\t\t
Table number
\r\n\t\t\t\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t\t\t\t(LocationState && LocationState.selectedStore != undefined) &&\r\n\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{({ field, meta, form }: FieldProps) => {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar error = (meta.error && meta.touched) ? meta.error : false;\r\n\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn (getConfig().isMarket && LocationState.selectedStore?.auxStoreData && LocationState.selectedStore.auxStoreData.tableNumbers)\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t?\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t { form.setFieldValue(field.name, e.detail.value); props.handleSubmit(); }}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tLocationState.selectedStore.auxStoreData.tableNumbers.map((table) => {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn Table M{table}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{error &&
{error}
}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t:\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tconsole.log(e, field);\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tlet max = 3;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tlet value = e.detail.value;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (e.detail.value.length > max) {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvalue = value.slice(0, max);\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tform.setFieldValue(field.name, value);\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprops.handleSubmit();\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t{ContinueClicked && TableFormErrors &&
{TableFormErrors}
}\r\n\t\t\t\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\t\t\t{/* \r\n\r\n (() => {\r\n let tables = [];\r\n for(let i = 0; i < maxTables; i++){\r\n tables.push(Table {i});\r\n }\r\n return tables;\r\n })()\r\n\r\n {\r\n console.log(e, field);\r\n let max = 3;\r\n let value = e.detail.value;\r\n if(e.detail.value.length > max){\r\n value = value.slice(0, max);\r\n }\r\n\r\n form.setFieldValue(field.name, value);\r\n }}\r\n />\r\n */}\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t
\r\n\t\t\t\t
\r\n\t\t\t
\r\n\t\t
\r\n\t)\r\n};\r\n\r\nexport default TableNumber;","import { IonButton, IonContent, IonGrid, IonItem, IonLabel, IonPage, IonRow, IonSelect, IonSelectOption } from '@ionic/react';\r\nimport { Field, FieldProps, Formik } from 'formik';\r\nimport React, { useEffect, useState } from 'react';\r\nimport { bindActionCreators } from 'redux';\r\nimport AppHeaderImage from '../components/AppHeaderImage';\r\nimport { nicknameSchema } from '../helpers/formValidationHelpers';\r\nimport GenericInput from '../inputs/GenericInput';\r\nimport './NameOrNickname.scss';\r\nimport * as BasketStore from '../store/BasketStore';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { ApplicationState } from '../store';\r\nimport { useHistory } from 'react-router';\r\nimport { getConfig } from '../helpers/configHelper';\r\nimport { useLocation } from \"react-router-dom\";\r\n\r\nconst NameOrNickname: React.FC = () => {\r\n const boundSetNickname = bindActionCreators(BasketStore.actionCreators.setNickname, useDispatch());\r\n const BasketState = useSelector((state: ApplicationState) => state.basket);\r\n const LocationState = useSelector((state: ApplicationState) => state.location);\r\n const NicknameFormErrors = useSelector((state: ApplicationState) => state.basket?.nicknameFormErrors);\r\n const ContinueClicked = useSelector((state: ApplicationState) => state.basket?.continueClicked);\r\n const history = useHistory();\r\n const maxTables = 47;\r\n const location = useLocation();\r\n\r\n const [initialValues, setInitialValues] = useState({});\r\n\r\n useEffect(() => {\r\n setInitialValues({ Nickname: localStorage.getItem(\"nickname\") || BasketState?.nickname || \"\" });\r\n }, [location.pathname]);\r\n\r\n useEffect(() => {\r\n }, [ContinueClicked])\r\n\r\n return (\r\n \r\n \r\n \r\n
\r\n \r\n How can we find you?\r\n \r\n \r\n Provide your name or nickname so we can find you in the Cafe when your order is ready\r\n \r\n {\r\n boundSetNickname(values.Nickname ?? \"\");\r\n }}\r\n >\r\n {(props) => (\r\n
\r\n Name or nickname*\r\n {(LocationState && LocationState.selectedStore != undefined) &&\r\n \r\n {({ field, form }: FieldProps) => (\r\n {\r\n let max = 20;\r\n let value = e.detail.value;\r\n if (value.length > max) {\r\n value = value.slice(0, max);\r\n }\r\n\r\n form.setFieldValue(field.name, value);\r\n\r\n if (value.trim() === '') {\r\n localStorage.removeItem('nickname');\r\n } else {\r\n localStorage.setItem('nickname', value);\r\n }\r\n\r\n props.handleSubmit();\r\n }}\r\n />\r\n )}\r\n \r\n }\r\n {ContinueClicked && NicknameFormErrors &&
{NicknameFormErrors}
}\r\n
\r\n )}\r\n \r\n
\r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default NameOrNickname;","import React from \"react\";\r\nimport { IonPage, IonContent, IonList, IonItem, IonGrid, IonRow, IonCol } from '@ionic/react'\r\nimport { baseUrl, cacheBust } from \"../helpers/configHelper\";\r\nimport \"./TempDealsPage.scss\";\r\nimport { formatCurrency } from \"../helpers/currencyHelpers\";\r\nimport { useSelector, useDispatch } from \"react-redux\";\r\nimport { ApplicationState } from \"../store\";\r\nimport { DealItem } from \"../store/MenuStoreTypes\";\r\nimport * as MenuItemStore from '../store/MenuItemStore';\r\nimport { useHistory } from \"react-router\";\r\n\r\ninterface IAppDealItemProps {\r\n dealSku: string;\r\n dealName: string;\r\n dealDescription?: string;\r\n dealImage: string;\r\n dealPrice: number;\r\n backgroundColour?: string;\r\n}\r\n\r\nfunction getImageSrc(imageUrl: string, size: number) {\r\n return `${baseUrl()}/images/Deals/${size}/${imageUrl}?v=${cacheBust()}`\r\n}\r\n\r\nfunction AppDealItem(props: IAppDealItemProps) {\r\n const dispatch = useDispatch();\r\n const history = useHistory();\r\n\r\n function handleClick() {\r\n dispatch(MenuItemStore.actionCreators.requestMenuItemBySku(props.dealSku, \"\", \"\", (menuItemId: number) => {\r\n const params = new URLSearchParams();\r\n params.set('page', '1');\r\n\r\n history.push(`/deal/${menuItemId}?${params.toString()}`);\r\n }));\r\n }\r\n return (\r\n \r\n \r\n
\r\n

\r\n {formatCurrency(props.dealPrice)}\r\n

\r\n
\r\n \r\n )\r\n}\r\n\r\nfunction TempDealsPage() {\r\n const deals = useSelector((state: ApplicationState) => {\r\n if (!state.deal?.deals) {\r\n console.error(\"Deals: No deals found.\");\r\n return;\r\n }\r\n\r\n return state.deal.deals;\r\n })\r\n\r\n return (\r\n \r\n \r\n \r\n {deals && deals.map((d: DealItem) => {\r\n return (\r\n \r\n );\r\n })}\r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport default TempDealsPage;\r\n","import React from \"react\";\r\nimport { IonContent, IonRow, IonCol, IonPage } from '@ionic/react';\r\nimport './UpgradePage.scss';\r\nimport { baseUrl, cacheBust } from \"../helpers/configHelper\";\r\nimport { formatCurrency } from \"../helpers/currencyHelpers\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { ApplicationState } from \"../store\";\r\nimport { DealItem } from \"../store/MenuStoreTypes\";\r\nimport { inlineBrandImage } from \"../helpers/menuHelpers\";\r\n\r\ninterface IMenuItemRowProps {\r\n itemSku: string;\r\n itemName: string;\r\n itemPrice: number;\r\n hasBrandImage: boolean;\r\n}\r\n\r\nfunction MenuItemRow(props: IMenuItemRowProps) {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n

\r\n

{formatCurrency(props.itemPrice)}

\r\n
\r\n
\r\n )\r\n}\r\n\r\nfunction getImageSrc(imageUrl: string, size: number) {\r\n return `${baseUrl()}/images/Deals/${size}/${imageUrl.replace('deal', 'upgrade')}?v=${cacheBust()}`\r\n}\r\n\r\nfunction UpgradePage() {\r\n const deal = useSelector((state: ApplicationState) => {\r\n if (!state.deal?.deals) {\r\n console.error(\"Upgrade: No deals found\");\r\n return;\r\n }\r\n\r\n const deals = state.deal.deals;\r\n\r\n if (!state.deal?.currentDealSku) {\r\n console.error(\"Upgrade: No current deal sku\");\r\n return;\r\n }\r\n\r\n const currentDealSku = state.deal.currentDealSku;\r\n\r\n return deals.find((v: DealItem) => {\r\n return v.dealSku === currentDealSku\r\n });\r\n });\r\n\r\n const menuItem = useSelector((state: ApplicationState) => {\r\n if (!state.menuItemData?.menuItem) {\r\n console.error(\"Deals: No menu item data\");\r\n return;\r\n }\r\n\r\n const menuItem = state.menuItemData.menuItem;\r\n\r\n if (!state.deal?.upgradedFromSku) {\r\n console.error(\"Deals: No current menu item sku.\");\r\n return;\r\n }\r\n\r\n return menuItem;\r\n });\r\n\r\n return (\r\n \r\n \r\n
\r\n {deal?.dealSku === '0DEAL202414'\r\n ?

Make me a deal?

\r\n :

Want to upgrade?

\r\n }\r\n
\r\n
\r\n {menuItem &&\r\n \r\n\r\n }\r\n {deal &&\r\n \r\n }\r\n
\r\n
\r\n
\r\n );\r\n}\r\n\r\nexport default UpgradePage;\r\n","import React, { useEffect, useState } from 'react';\r\nimport { IonContent, IonPage } from '@ionic/react';\r\nimport { useHistory, useLocation } from \"react-router-dom\";\r\nimport './Splash.scss';\r\nimport { baseUrl } from '../helpers/configHelper';\r\nimport { bindActionCreators } from 'redux';\r\nimport { useDispatch } from 'react-redux';\r\nimport * as headerFooterStore from '../store/HeaderFooterStore';\r\nimport { continueFromInitialPage } from '../helpers/configHelper';\r\nimport * as ColleaguesStore from '../store/ColleagueStore';\r\nimport { Base64 } from 'js-base64';\r\nimport Button from '../components/Button';\r\n\r\nconst grantCookiePermissions = () => {\r\n (window as any).gtag('consent', 'update', {\r\n 'ad_storage': 'granted',\r\n 'analytics_storage': 'granted'\r\n });\r\n}\r\n\r\ninterface ICookieConsentProps {\r\n onExit: () => void;\r\n}\r\n\r\nconst CookieConsent = (props: ICookieConsentProps) => {\r\n const boundSetShowModal = bindActionCreators(headerFooterStore.actionCreators.setShowModal, useDispatch());\r\n\r\n const showTermsAndConditions = () => {\r\n boundSetShowModal(\"TC\", true, true);\r\n }\r\n\r\n const handleDecline = () => {\r\n localStorage.setItem('cookieConsent', 'denied');\r\n props.onExit();\r\n }\r\n\r\n const handleAccept = () => {\r\n localStorage.setItem('cookieConsent', 'granted');\r\n grantCookiePermissions();\r\n props.onExit();\r\n }\r\n\r\n return (\r\n
\r\n
\r\n
\r\n
Giving you the best ordering experience
\r\n
We’d like your consent to let us use cookies to gather and analyse information about how you use this app to help us improve our service. These cookies won’t identify or track you outside of this app.
\r\n
By continuing, you agree to our Terms & Conditions Policy
\r\n
\r\n \r\n Decline cookies\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n )\r\n}\r\n\r\nconst SplashPage: React.FC = () => {\r\n const history = useHistory();\r\n const dispatch = useDispatch();\r\n const location = useLocation();\r\n\r\n const [showCookieConsent, setShowCookieConsent] = useState(false);\r\n\r\n const boundSetHasStartedApp = bindActionCreators(\r\n headerFooterStore.actionCreators.setHasStartedApp, dispatch);\r\n\r\n useEffect(() => {\r\n const cookieConsent = localStorage.getItem('cookieConsent');\r\n const searchParams = new URLSearchParams(location.search);\r\n\r\n if (cookieConsent == null) {\r\n setShowCookieConsent(true);\r\n }\r\n\r\n const pd = searchParams.get('pd');\r\n if (pd) {\r\n const decodeEmailAndMoreCard = Base64.decode(JSON.stringify(pd));\r\n const splitDecodeByComma = decodeEmailAndMoreCard.split(',');\r\n\r\n localStorage.setItem('email', splitDecodeByComma[0]);\r\n localStorage.setItem('staffCardNumber', splitDecodeByComma[1]);\r\n }\r\n\r\n const isNewOrder = searchParams.get('newOrder');\r\n const isLoggedIn = localStorage.getItem('isLoggedIn');\r\n if (isNewOrder && isLoggedIn) {\r\n localStorage.removeItem('isLoggedIn')\r\n localStorage.removeItem(\"pfidentifier\");\r\n\r\n dispatch(ColleaguesStore.loggedIn(false))\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [])\r\n\r\n const startOrder = () => {\r\n continueFromInitialPage(history, boundSetHasStartedApp, \"/storesearch\")\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n
\r\n \"Morrisions\r\n
\r\n\r\n
\r\n

ORDER ONLINE

\r\n

TO EAT IN OR TAKEAWAY

\r\n
\r\n\r\n
\r\n \r\n Start Your Order\r\n \r\n\r\n
b7913
\r\n
\r\n\r\n {showCookieConsent &&\r\n setShowCookieConsent(false)} />\r\n }\r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default SplashPage;\r\n","import React, { useEffect, useMemo } from \"react\";\r\nimport { IonPage, IonContent, IonImg, IonRow } from \"@ionic/react\";\r\nimport DealHeader from \"../components/DealHeader\";\r\nimport { useSelector, useDispatch } from \"react-redux\";\r\nimport { ApplicationState } from \"../store\";\r\nimport { bindActionCreators } from \"redux\";\r\nimport * as HeaderFooterStore from '../store/HeaderFooterStore';\r\nimport './DealSummaryPage.scss';\r\nimport { formatCurrency } from \"../helpers/currencyHelpers\";\r\nimport { useHistory } from \"react-router\";\r\nimport { showDealHeader, shouldShowModifierGroup, getSelectedSkus, inlineBrandImage } from \"../helpers/menuHelpers\";\r\nimport { baseUrl, cacheBust } from \"../helpers/configHelper\";\r\n\r\nfunction DealSummaryPage() {\r\n const dispatch = useDispatch();\r\n const history = useHistory();\r\n\r\n const menuItem = useSelector((state: ApplicationState) => state.menuItemData?.menuItem);\r\n const isColleague = useSelector((state: ApplicationState) => state.colleague?.isLoggedIn);\r\n\r\n const setTitle = bindActionCreators(HeaderFooterStore.actionCreators.setTitle, dispatch);\r\n\r\n const selectedSkus = useMemo(() => {\r\n if (!menuItem?.modifierGroups) {\r\n return [];\r\n }\r\n\r\n return getSelectedSkus(menuItem.modifierGroups);\r\n }, [menuItem?.modifierGroups])\r\n\r\n useEffect(() => {\r\n if (!menuItem) {\r\n return;\r\n }\r\n\r\n const title = menuItem.menuItemName.replace(/\\[\\[.*\\]\\]/, '')\r\n setTitle(title, true);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [menuItem])\r\n\r\n return (\r\n \r\n \r\n {menuItem &&\r\n <>\r\n {showDealHeader(menuItem, isColleague)\r\n ?\r\n \r\n :\r\n \r\n \r\n \r\n }\r\n
\r\n

{showDealHeader(menuItem, isColleague) ? 'Your deal' : 'Your summary'}

\r\n history.goBack()}\r\n >\r\n Press Back to make changes\r\n \r\n\r\n

\r\n \r\n {formatCurrency(menuItem.menuItemBasePrice)}\r\n

\r\n\r\n {menuItem.modifierGroups\r\n .filter((group: IMopModifierGroup) => {\r\n return shouldShowModifierGroup(group, selectedSkus, menuItem.sku)\r\n })\r\n .map((group: IMopModifierGroup) => {\r\n const isChargeable = group.itemsAreChargeable;\r\n return (\r\n <>\r\n {group.modifierGroupItems.map((item: IMopModifierGroupItem) => {\r\n return [...Array(item.quantitySelected)].map((e, i) => {\r\n return (\r\n

\r\n \r\n {isChargeable &&\r\n + \r\n }\r\n \r\n \r\n {isChargeable &&\r\n {formatCurrency(item.price)}\r\n }\r\n

\r\n )\r\n })\r\n })}\r\n \r\n )\r\n })}\r\n\r\n

\r\n Total\r\n {formatCurrency(menuItem.menuItemTotalPrice)}\r\n

\r\n
\r\n \r\n }\r\n
\r\n
\r\n );\r\n}\r\n\r\nexport default DealSummaryPage;\r\n","import React, { useEffect, useRef, useState } from 'react';\r\nimport { Redirect, Route } from 'react-router-dom';\r\nimport {\r\n IonApp,\r\n IonRouterOutlet,\r\n IonContent,\r\n IonAlert,\r\n} from '@ionic/react';\r\n\r\nimport { IonReactRouter } from '@ionic/react-router';\r\nimport Categories from './pages/Categories';\r\nimport EnterEmail from './pages/EnterEmail';\r\nimport OrderConfirmation from './pages/OrderConfirmation';\r\nimport MenuItem from './pages/MenuItem';\r\nimport BasketPage from './pages/BasketPage';\r\nimport UpsellPage from './pages/UpsellPage';\r\nimport MopFooter from './components/MopFooter';\r\nimport AppHeader from './components/AppHeader';\r\nimport CheckoutTestPage from './pages/CheckoutTestPage';\r\nimport CouponsTestPage from './pages/CouponsTestPage';\r\nimport PaymentSuccess from './pages/PaymentSuccess';\r\nimport HistoryListener from './components/HistoryListener';\r\nimport LocationListener from './components/LocationListener';\r\nimport TimeSlotPage from './pages/TimeSlotPage';\r\nimport StoreSearch from './pages/StoreSearch';\r\nimport ChooseOrderType from './pages/ChooseOrderType';\r\nimport TableNumber from './pages/TableNumber';\r\nimport NameOrNickname from './pages/NameOrNickname';\r\nimport TempDealsPage from './pages/TempDealsPage';\r\nimport UpgradePage from './pages/UpgradePage';\r\nimport { baseUrl } from './helpers/configHelper';\r\nimport { useSelector } from 'react-redux';\r\n\r\nimport Splash from './pages/Splash';\r\n\r\nimport { ApplicationState } from './store';\r\n\r\n/* Core CSS required for Ionic components to work properly */\r\nimport '@ionic/react/css/core.css';\r\n\r\n/* Basic CSS for apps built with Ionic */\r\nimport '@ionic/react/css/normalize.css';\r\nimport '@ionic/react/css/structure.css';\r\nimport '@ionic/react/css/typography.css';\r\n\r\n/* Optional CSS utils that can be commented out */\r\nimport '@ionic/react/css/padding.css';\r\nimport '@ionic/react/css/float-elements.css';\r\nimport '@ionic/react/css/text-alignment.css';\r\nimport '@ionic/react/css/text-transformation.css';\r\nimport '@ionic/react/css/flex-utils.css';\r\nimport '@ionic/react/css/display.css';\r\n\r\n/* Theme variables */\r\nimport './theme/variables.css';\r\nimport './theme/common.scss';\r\nimport DealSummaryPage from './pages/DealSummaryPage';\r\n\r\nconst loadGooglePlaces = () => {\r\n var tag = document.createElement('script') as any;\r\n tag.async = true;\r\n tag.type = \"text/javascript\";\r\n tag.onload = () => {\r\n console.log(\"GOOGLE PLACES LOADED\");\r\n };\r\n\r\n tag.src = \"https://maps.googleapis.com/maps/api/js?key=\" + process.env.REACT_APP_GOOGLE_LOCATE_KEY + \"&libraries=places\";\r\n var body = document.getElementsByTagName('body')[0];\r\n body.appendChild(tag);\r\n}\r\n\r\nconst loadHeadTags = () => {\r\n const favicon = document.createElement('link');\r\n favicon.rel = \"icon\";\r\n favicon.type = \"image/png\";\r\n favicon.href = baseUrl() + \"/images/icon/cafe/favicon.png\";\r\n\r\n const icon = document.createElement('link');\r\n icon.rel = \"apple-touch-icon\";\r\n icon.href = baseUrl() + \"/images/icon/cafe/icon.png\";\r\n\r\n const head = document.getElementsByTagName('head')[0];\r\n\r\n head.appendChild(favicon);\r\n head.appendChild(icon);\r\n}\r\n\r\nconst createManifest = () => {\r\n let manifest = {\r\n \"name\": \"Morrisons Cafe Order & Pay\",\r\n \"short_name\": \"Morrisons Cafe\",\r\n \"icons\": [\r\n {\r\n \"src\": \"images/icon/cafe/favicon.png\",\r\n \"sizes\": \"64x64 32x32 24x24 16x16\",\r\n \"type\": \"image/png\",\r\n },\r\n {\r\n \"src\": \"images/icon/cafe/icon.png\",\r\n \"sizes\": \"512x512\",\r\n \"type\": \"image/png\",\r\n \"purpose\": \"maskable\",\r\n },\r\n ],\r\n \"start_url\": \".\",\r\n \"theme_color\": \"#ffffff\",\r\n \"background_color\": \"#ffffff\",\r\n \"display\": \"standalone\",\r\n };\r\n\r\n const stringManifest = JSON.stringify(manifest);\r\n const blob = new Blob([stringManifest], { type: \"application/json\" });\r\n const manifestUrl = URL.createObjectURL(blob);\r\n\r\n document.querySelector('#manifest-placeholder')?.setAttribute('href', manifestUrl);\r\n}\r\n\r\nconst App: React.FC = () => {\r\n useEffect(() => {\r\n loadGooglePlaces();\r\n loadHeadTags();\r\n createManifest();\r\n }, []);\r\n\r\n const [showExpireModal, setShowExpireModal] = useState(false)\r\n\r\n const contentRef = useRef(null);\r\n\r\n const expired = useSelector((state: ApplicationState) => state.colleague?.expired);\r\n\r\n useEffect(() => {\r\n expired !== null && setShowExpireModal(true)\r\n }, [expired])\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n\r\n \r\n\r\n {showExpireModal && { setShowExpireModal(false); }}\r\n header={\"You are leaving the colleague area\"}\r\n buttons={[\r\n {\r\n text: \"Ok\",\r\n handler: () => {\r\n localStorage.removeItem('isLoggedIn');\r\n localStorage.removeItem(\"pfidentifier\");\r\n window.location.reload();\r\n }\r\n }\r\n ]}\r\n message={\"\"}\r\n />}\r\n\r\n \r\n } exact={true} />\r\n } exact={true} />\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {\r\n return ;\r\n }}\r\n />\r\n {\r\n return ;\r\n }}\r\n />\r\n \r\n\r\n \r\n\r\n \r\n \r\n\r\n \r\n \r\n )\r\n};\r\n\r\nexport default App;\r\n","// This optional code is used to register a service worker.\r\n// register() is not called by default.\r\n\r\n// This lets the app load faster on subsequent visits in production, and gives\r\n// it offline capabilities. However, it also means that developers (and users)\r\n// will only see deployed updates on subsequent visits to a page, after all the\r\n// existing tabs open on the page have been closed, since previously cached\r\n// resources are updated in the background.\r\n\r\n// To learn more about the benefits of this model and instructions on how to\r\n// opt-in, read https://bit.ly/CRA-PWA\r\n\r\nconst isLocalhost = Boolean(\r\n window.location.hostname === 'localhost' ||\r\n // [::1] is the IPv6 localhost address.\r\n window.location.hostname === '[::1]' ||\r\n // 127.0.0.0/8 are considered localhost for IPv4.\r\n window.location.hostname.match(\r\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\r\n )\r\n);\r\n\r\ntype Config = {\r\n onSuccess?: (registration: ServiceWorkerRegistration) => void;\r\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\r\n};\r\n\r\nexport function register(config?: Config) {\r\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\r\n // The URL constructor is available in all browsers that support SW.\r\n const publicUrl = new URL(\r\n process.env.PUBLIC_URL,\r\n window.location.href\r\n );\r\n if (publicUrl.origin !== window.location.origin) {\r\n // Our service worker won't work if PUBLIC_URL is on a different origin\r\n // from what our page is served on. This might happen if a CDN is used to\r\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\r\n return;\r\n }\r\n\r\n window.addEventListener('load', () => {\r\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\r\n\r\n if (isLocalhost) {\r\n // This is running on localhost. Let's check if a service worker still exists or not.\r\n checkValidServiceWorker(swUrl, config);\r\n\r\n // Add some additional logging to localhost, pointing developers to the\r\n // service worker/PWA documentation.\r\n navigator.serviceWorker.ready.then(() => {\r\n console.log(\r\n 'This web app is being served cache-first by a service ' +\r\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\r\n );\r\n });\r\n } else {\r\n // Is not localhost. Just register service worker\r\n registerValidSW(swUrl, config);\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction registerValidSW(swUrl: string, config?: Config) {\r\n navigator.serviceWorker\r\n .register(swUrl)\r\n .then(registration => {\r\n registration.onupdatefound = () => {\r\n const installingWorker = registration.installing;\r\n if (installingWorker == null) {\r\n return;\r\n }\r\n installingWorker.onstatechange = () => {\r\n if (installingWorker.state === 'installed') {\r\n if (navigator.serviceWorker.controller) {\r\n // At this point, the updated precached content has been fetched,\r\n // but the previous service worker will still serve the older\r\n // content until all client tabs are closed.\r\n console.log(\r\n 'New content is available and will be used when all ' +\r\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\r\n );\r\n\r\n // Execute callback\r\n if (config && config.onUpdate) {\r\n config.onUpdate(registration);\r\n }\r\n } else {\r\n // At this point, everything has been precached.\r\n // It's the perfect time to display a\r\n // \"Content is cached for offline use.\" message.\r\n console.log('Content is cached for offline use.');\r\n\r\n // Execute callback\r\n if (config && config.onSuccess) {\r\n config.onSuccess(registration);\r\n }\r\n }\r\n }\r\n };\r\n };\r\n })\r\n .catch(error => {\r\n console.error('Error during service worker registration:', error);\r\n });\r\n}\r\n\r\nfunction checkValidServiceWorker(swUrl: string, config?: Config) {\r\n // Check if the service worker can be found. If it can't reload the page.\r\n fetch(swUrl, {\r\n headers: { 'Service-Worker': 'script' }\r\n })\r\n .then(response => {\r\n // Ensure service worker exists, and that we really are getting a JS file.\r\n const contentType = response.headers.get('content-type');\r\n if (\r\n response.status === 404 ||\r\n (contentType != null && contentType.indexOf('javascript') === -1)\r\n ) {\r\n // No service worker found. Probably a different app. Reload the page.\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister().then(() => {\r\n window.location.reload();\r\n });\r\n });\r\n } else {\r\n // Service worker found. Proceed as normal.\r\n registerValidSW(swUrl, config);\r\n }\r\n })\r\n .catch(() => {\r\n console.log(\r\n 'No internet connection found. App is running in offline mode.'\r\n );\r\n });\r\n}\r\n\r\nexport function unregister() {\r\n if ('serviceWorker' in navigator) {\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister();\r\n });\r\n }\r\n}\r\n","import { Action, Reducer } from 'redux';\r\n\r\n// -----------------\r\n// STATE - This defines the type of data maintained in the Redux store.\r\n\r\nexport interface CounterState {\r\n count: number;\r\n}\r\n\r\n// -----------------\r\n// ACTIONS - These are serializable (hence replayable) descriptions of state transitions.\r\n// They do not themselves have any side-effects; they just describe something that is going to happen.\r\n// Use @typeName and isActionType for type detection that works even after serialization/deserialization.\r\n\r\nexport interface IncrementCountAction { type: 'INCREMENT_COUNT' }\r\nexport interface DecrementCountAction { type: 'DECREMENT_COUNT' }\r\n\r\n// Declare a 'discriminated union' type. This guarantees that all references to 'type' properties contain one of the\r\n// declared type strings (and not any other arbitrary string).\r\nexport type KnownAction = IncrementCountAction | DecrementCountAction;\r\n\r\n// ----------------\r\n// ACTION CREATORS - These are functions exposed to UI components that will trigger a state transition.\r\n// They don't directly mutate state, but they can have external side-effects (such as loading data).\r\n\r\nexport const actionCreators = {\r\n increment: () => ({ type: 'INCREMENT_COUNT' } as IncrementCountAction),\r\n decrement: () => ({ type: 'DECREMENT_COUNT' } as DecrementCountAction)\r\n};\r\n\r\n// ----------------\r\n// REDUCER - For a given state and action, returns the new state. To support time travel, this must not mutate the old state.\r\n\r\nexport const reducer: Reducer = (state: CounterState | undefined, incomingAction: Action): CounterState => {\r\n if (state === undefined) {\r\n return { count: 0 };\r\n }\r\n\r\n const action = incomingAction as KnownAction;\r\n switch (action.type) {\r\n case 'INCREMENT_COUNT':\r\n return { count: state.count + 1 };\r\n case 'DECREMENT_COUNT':\r\n return { count: state.count - 1 };\r\n default:\r\n return state;\r\n }\r\n};\r\n","import * as MenuItemData from './MenuItemStore';\r\nimport * as MenuData from './MenuStore';\r\nimport * as Counter from './Counter';\r\nimport * as HeaderFooter from './HeaderFooterStore';\r\nimport * as Location from './LocationStore';\r\nimport * as Basket from './BasketStore';\r\nimport * as Colleague from './ColleagueStore';\r\nimport * as Deal from './DealStore';\r\n\r\nimport { MenuDataState } from './MenuStoreTypes';\r\n\r\n// The top-level state object\r\nexport interface ApplicationState {\r\n counter: Counter.CounterState | undefined;\r\n menuData: MenuDataState | undefined;\r\n menuItemData: MenuItemData.MenuItemDataState | undefined;\r\n headerFooter: HeaderFooter.HeaderFooterState | undefined;\r\n location: Location.LocationState | undefined;\r\n basket: Basket.BasketState | undefined;\r\n colleague: Colleague.PinState | undefined;\r\n deal: Deal.DealState | undefined;\r\n}\r\n\r\n// Whenever an action is dispatched, Redux will update each top-level application state property using\r\n// the reducer with the matching name. It's important that the names match exactly, and that the reducer\r\n// acts on the corresponding ApplicationState property type.\r\nexport const reducers = {\r\n counter: Counter.reducer,\r\n menuData: MenuData.reducer,\r\n menuItemData: MenuItemData.reducer,\r\n location: Location.reducer,\r\n headerFooter: HeaderFooter.reducer,\r\n basket: Basket.reducer,\r\n colleague: Colleague.reducer,\r\n deal: Deal.reducer,\r\n};\r\n\r\n// This type can be used as a hint on action creators so that its 'dispatch' and 'getState' params are\r\n// correctly typed to match your store.\r\nexport interface AppThunkAction {\r\n (dispatch: (action: TAction) => void, getState: () => ApplicationState): void;\r\n}\r\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport App from './App';\r\nimport { Provider } from 'react-redux';\r\nimport * as serviceWorker from './serviceWorker';\r\nimport { defineCustomElements } from '@ionic/pwa-elements/loader';\r\nimport { createBrowserHistory } from 'history';\r\nimport configureStore from './store/configureStore';\r\nimport { BrowserRouter } from 'react-router-dom';\r\n\r\n// Create browser history to use in the Redux store\r\nconst baseUrl = document.getElementsByTagName('base')[0].getAttribute('href') as string;\r\nconst history = createBrowserHistory({ basename: baseUrl });\r\n\r\n// Get the application-wide store instance, prepopulating with state from the server where available.\r\nconst store = configureStore(history);\r\n\r\nReactDOM.render(, document.getElementById('root'));\r\n\r\ndefineCustomElements(window);\r\n\r\n// If you want your app to work offline and load faster, you can change\r\n// unregister() to register() below. Note this comes with some pitfalls.\r\n// Learn more about service workers: https://bit.ly/CRA-PWA\r\nserviceWorker.unregister();\r\n","import { applyMiddleware, combineReducers, compose, createStore } from 'redux';\r\nimport thunk from 'redux-thunk';\r\nimport { connectRouter, routerMiddleware } from 'connected-react-router';\r\nimport { History } from 'history';\r\nimport { ApplicationState, reducers } from './';\r\n\r\nexport default function configureStore(history: History, initialState?: ApplicationState) {\r\n const middleware = [\r\n thunk,\r\n routerMiddleware(history)\r\n ];\r\n\r\n const rootReducer = combineReducers({\r\n ...reducers,\r\n router: connectRouter(history)\r\n });\r\n\r\n const enhancers = [];\r\n const windowIfDefined = typeof window === 'undefined' ? null : window as any;\r\n if (windowIfDefined && windowIfDefined.__REDUX_DEVTOOLS_EXTENSION__) {\r\n enhancers.push(windowIfDefined.__REDUX_DEVTOOLS_EXTENSION__());\r\n }\r\n\r\n return createStore(\r\n rootReducer,\r\n initialState,\r\n compose(applyMiddleware(...middleware), ...enhancers)\r\n );\r\n}\r\n"],"sourceRoot":""}