{"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/CategoryRow.tsx","components/CategoryGrid.tsx","helpers/currencyHelpers.ts","components/MenuItemRow.tsx","store/LocationStore.ts","components/AppHeaderImage.tsx","store/MenuStoreTypes.ts","modals/AllergenInfoModal.tsx","components/HeaderDescription.tsx","components/MenuItemTile.tsx","components/CategoryFilters.tsx","components/CategoryMenuItemLister.tsx","helpers/apiHelpers.ts","store/ColleagueStore.ts","store/HeaderFooterStore.ts","store/MenuStore.ts","helpers/menuHelpers.ts","store/BasketStore.ts","store/MenuItemStore.ts","pages/Categories.tsx","helpers/googleHelpers.ts","helpers/formValidationHelpers.ts","inputs/GenericInput.tsx","pages/EnterEmail.tsx","components/GooglePay.tsx","components/ApplePay.tsx","helpers/checkoutHelper.ts","helpers/PayerAuthentication.tsx","pages/OrderConfirmation.tsx","components/ProductSingleSelect.tsx","components/QuantityInput.tsx","components/ProductMultiSelect.tsx","components/AltQuantityInput.tsx","components/ModifierGroup.tsx","components/AuxJsonFilterModifierGroups.tsx","pages/MenuItem.tsx","pages/Location.tsx","components/BasketItemRow.tsx","pages/BasketPage.tsx","modals/AllergenPopup.tsx","pages/UpsellPage.tsx","pages/Tab2.tsx","pages/Tab3.tsx","components/MopFooterList.tsx","components/MopFooterMenuItem.tsx","components/MopFooterBasketPage.tsx","helpers/useMopHook.ts","components/MopFooterConfirmStore.tsx","components/MopFooterUpsellPage.tsx","components/MopFooterTablePage.tsx","components/BasketTotalsAndCoupons.tsx","components/MopFooterPaymentSuccessPage.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","pages/ScanQrCode.tsx","pages/QRLanding.tsx","pages/TCPage.tsx","pages/Splash.tsx","components/ThemeManager.tsx","pages/ChooseOrderType.tsx","pages/TableNumber.tsx","pages/NameOrNickname.tsx","App.tsx","serviceWorker.ts","store/index.ts","store/Counter.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","marketConfiguration","isMarket","imageThemeID","baseUrl","window","location","href","startsWith","getConfig","continueFromInitialPage","history","boundSetHasStartedApp","pathname","push","CategoryRow","_ref","categoryId","categoryImage","categoryName","onClick","React","createElement","IonRow","key","class","IonCol","size","className","style","backgroundImage","concat","src","IonText","CategoryGrid","fullWidth","isFavourites","headerState","useSelector","state","headerFooter","alt","showDebugLabel","formatCurrency","amount","toFixed","split","Math","abs","autocompleteService","placesService","simpleChannelType","MenuItemRow","menuItemId","menuItemName","menuItemImage","menuItemBasePrice","sku","itemTags","inStock","menuItemFromPrice","Fragment","IonImg","onIonError","console","log","includes","dangerouslySetInnerHTML","__html","unloadedState","isBusy","isGeoLocationSupported","clientLatitude","Number","NaN","clientLongitude","clientAccuracy","clientTimeStamp","predictions","place","undefined","placeLatitude","placeLongitude","stores","channelIdentifier","selectedStore","selectedChannel","selectedTimeSlot","label","startTime","endTime","startDateTime","endDateTime","takingOrders","LogoTitles","actionCreators","requestClientGeoLocation","callback","dispatch","getState","navigator","geolocation","getCurrentPosition","p","geolocationPosition","type","latitude","coords","longitude","accuracy","timeStamp","timestamp","requestServerGeoAutoComplete","input","google","maps","places","AutocompleteService","getPlacePredictions","componentRestrictions","country","requestServerGeoPlace","place_id","PlacesService","document","getDetails","placeId","status","PlacesServiceStatus","OVER_QUERY_LIMIT","setTimeout","_place$geometry","geometry","_place$geometry2","noidea","JSON","parse","stringify","lat","lng","requestStores","radius","pfIdentifier","localStorage","getItem","url","isNaN","fetch","response","json","data","catch","error","selectStore","selectedChannelIdentifier","store","clearStores","clearSelectedStore","requestStore","storeReference","errorCallback","selectTimeslot","timeslot","timeSlot","setChannel","value","ButtonLinkTypeEnum","MenuDisplayType","AppHeaderImage","_ref$headerTitle","headerTitle","_useState","useState","_useState2","_slicedToArray","showLogo","setShowLogo","_useState3","_useState4","logoTitle","setLogoTitle","locationState","useLocation","useEffect","_locationState$select","_logoTitle","Default","channelType","ClickAndCollect","Takeaway","TableOrder","ListerHeader","styled","div","_templateObject","_taggedTemplateLiteral","ListerLogo","_templateObject2","AllergenInfoModal","isModalOpen","closeModalClick","allergenHtml","IonModal","isOpen","cssClass","onDidDismiss","swipeToClose","IonHeader","IonIcon","color","icon","closeCircle","IonContent","HeaderDescription","headerImage","allergenInfo","description","minHeight","hideText","identifier","displayType","altTitle","fontColour","kcal","price","pdpRoundels","allergenInfoOpen","setAllergenInfoOpen","productPromos","setProductPromos","IonGrid","size-xs","length","size-sm","IonTitle","currencyHelpers","width","MenuItemTile","name","fromPrice","onAddClick","priceLocation","plpRoundels","CategoryFilters","menuItems","_ref$selectedFilter","selectedFilter","onFilterSelected","uniqueFilters","filter","a","categoryLevelFilter","item","index","self","indexOf","CategoryMenuItemLister","_categoryList$auxCate6","_categoryList$auxCate7","_categoryList$auxCate8","_categoryList$auxCate9","_categoryList$auxCate10","_categoryList$auxCate11","_categoryList$auxCate12","_categoryList$auxCate13","_categoryList$auxCate14","_categoryList$auxCate15","categoryList","onNavigateToCategory","isLoading","onNavigateToMenuItem","isColleague","priceTitle","setPriceTitle","setSelectedFilter","basePrice","every","m","RenderMenuTemplate","_categoryList$auxCate","auxCategoryData","BasicList","categories","onClickCategory","BasicGrid","auxData","incoming","_categoryList$auxCate2","_categoryList$auxCate3","_categoryList$auxCate4","_categoryList$auxCate5","fullWidthSkus","hiddenPriceSkus","ProductGrid","category","menuItemIds","subCategoryIds","fullscreen","categoryImageName","categoryTitle","categoryBackgroundColour","categoryFontColour","String","promotionalButtons","promo","buttonImage","buttonLinkType","Category","parseInt","buttonLinkId","menuDisplayType","newSelectedFilter","categoryFooter","imageName","loginHasExpired","HeaderMode","FooterMode","validatePinFailure","payload","loggedIn","isLoggedIn","setItem","resetMessage","message","pin","currentPin","validatePinRequest","validatedOk","validatePinSuccess","_appState$colleague","appState","method","headers","body","colleague","_","removeItem","loading","expired","container","_appState$location","_appState$location2","_appState$menuData","timeSlotStart","menuData","isFirstAccess","categoryCurrent","categoryListA","categoryListB","title","showBack","path","_appState$location$se","_appState$menuData$ca","menuTitle","singleInstance","_state$headerFooter","_singleInstance","_selectedModal","modals","selectedModal","_state$headerFooter2","_state$headerFooter3","show","calculateMenuItemTotalPrice","calcQuantity","arguments","mods","modifierGroups","_price","i","mod","itemsAreChargeable","j","modifierGroupItems","quantitySelected","quantity","PaymentStatus","requestMenuItem","referrer","menuItem","requestBasketMenuItem","basketMenuItemId","_appState$basket","basketItem","basket","find","batch","updateMenuItemTotalPrice","updateModifierGroupItem","_appState$menuItemDat","_appState$menuItemDat2","_appState$menuItemDat3","_appState$menuItemDat4","idx","menuItemData","flatMap","findIndex","categoryIndex","menuItemIndex","updateMenuItemQuantity","updateAuxFilterItemQuantity","modifierGroupIndex","filterGroupIndex","filterSelectorIndex","_appState$menuItemDat5","totalPrice","calculateAuxFilterItems","_appState$menuItemDat6","debug","_targetModifierGroup$","_targetModifierGroup$2","_targetModifierGroup$3","targetModifierGroup","selectedFilters","auxMenuItemData","auxJsonFilters","groups","reduce","filterSelection","group","selection","selectors","groupFilters","selector","_toConsumableArray","tag","_loop","selectedFilterInGroup","_loop2","_availableOutcomes","_selectedFilters","selectorTag","filterInGroupTag","selectedFilterIndex","filterSelected","outcomes","outcome","q","filters","availableModifierItems","some","sort","b","_a$price","_b$price","samePrice","from","_availableModifierIte","currentPrice","_group","groupPrice","_selector","groupTitle","enabled","outcomeMatches","isEqual","prevSelectedModifier","modifierMatches","forEach","modifier","modIndex","isBasket","Categories","_React$Component","_inherits","_super","_createSuper","props","_this","_classCallCheck","call","_createClass","_this$props$pfIdentif","_this2","requiredId","this","match","params","categoryIdentifier","setState","requestCategoryList","useStoreA","listen","action","breakUrl","currentCatgegoryId","setCurrentCategory","_this$props$pfIdentif2","_this$props$pfIdentif3","_this3","onReceiveCategoryList","_this$props$pfIdentif4","_this4","goBack","_this$props$menuData","IonPage","IonSpinner","navigateToCategory","bind","navigateToMenuItem","Component","connect","ownProps","MenuDataStore","setTitle","HeaderFooterStore","referer","MenuItemDataStore","pushToGoogleEcommerce","event","ecommerce","dataLayer","addItemToGtagBasket","currentMenuItem","affiliation","getGtagBasketObject","addPurchaseToGtag","transactionId","orderType","collectionTime","gtagPurchaseObject","_objectSpread","transaction_id","collection_time","order_type","addCoupon","_menuItems","_discounts","_googleItems","isDiscount","totalPricePreDiscount","prev","curr","menuItemSinglePrice","discount","coupon","totalDiscount","percentage","parseFloat","itemDiscount","formatMopMenuItemToGoogleMenuItem","currency","items","item_id","item_name","item_category","upsellDone","showAllergenPopup","staffCardNumber","moreCardNumber","mopUpsells","mopCoupons","calculateExternalDiscounts","isColleagueDiscountBasket","externalPromotionsApplied","calculateExternalDiscountsFailed","externalCalculationMessages","tmpBasket","_ref2","upsells","email","orderNumber","totalQuantity","shouldOfferUpsellToCustomer","continueClicked","tableFormErrors","tableNumber","nicknameFormErrors","nickname","paymentStatus","UNSET","toastNotificationOpen","updateBasketItem","currentBasketItem","menuItemTotalPrice","basketItemIndex","basketItems","calculateBasket","addMenuItemToBasket","_appState$basket2","_appState$basket3","newBasket","_appState$basket4","basketId","floor","random","conflictIndex","_appState$location2$s","storeName","storeNumber","updateBasketDetails","values","consent","saveValues","getUpsells","_appState$location3","addCouponCode","couponCode","deleteCouponCode","updateBasketItemQuantity","basketItemId","_appState$location4","_appState$location4$s","_appState$location5","_appState$location5$s","removeItemFromGtagBasket","_appState$location6","_appState$basket5","x","clearBasket","updateOrderNumber","setShouldOfferUpsell","setContinueClicked","setTableFormErrors","setTableNumber","setNicknameFormErrors","setNickname","updateTempBasket","clearBasketItems","dispatchEvent","updatePaymentStatus","enterEmailSchema","Yup","shape","test","_value$split","required","nullable","createError","substring","cardCheckoutSchema","Name","Expiry","tableNumberSchema","TableNumber","max","nicknameSchema","Nickname","GenericInput","IonInputProps","onError","onIonChange","Field","field","meta","form","touched","IonInput","assign","onChange","_state$basket","_state$basket2","BasketStore","useHistory","setShowStaffDiscount","initialValues","setInitialValues","Formik","validationSchema","enableReinitialize","onSubmit","actions","handleSubmit","IonLabel","autofocus","placeholder","IonItem","lines","IonCheckbox","slot","checked","setFieldValue","hidden","IonButton","expand","GooglePay","_useSelector","useRef","toString","baseRequest","apiVersion","apiVersionMinor","tokenizationSpecification","parameters","LivePayments","merchantInfo","merchantName","merchantId","baseCardPaymentMethod","allowedCardNetworks","allowedAuthMethods","assuranceDetailsRequired","cardPaymentMethod","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","removeChild","clearElements","GooglePayButtonContainer","appendChild","TotalPrice","ApplePay","MerchantIdentifier","StoreName","merchantDetails","setMerchantDetails","basketStore","request","supportedNetworks","merchantCapabilities","total","showApplePayButton","addToStatus","ApplePayButton","SetShowButton","onClickApplePayButton","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","beginPayment","addEventListener","_props$ApplePayButton","removeEventListener","merchantIdentifier","canMakePaymentsWithActiveCard","canMakePayments","reason","checkForApplePay","s","Debug","zIndex","_regeneratorRuntime","Op","prototype","hasOwn","hasOwnProperty","defineProperty","obj","desc","$Symbol","Symbol","iteratorSymbol","iterator","asyncIteratorSymbol","asyncIterator","toStringTagSymbol","toStringTag","define","enumerable","configurable","writable","wrap","innerFn","outerFn","tryLocsList","protoGenerator","Generator","generator","create","context","Context","makeInvokeMethod","tryCatch","fn","arg","ContinueSentinel","GeneratorFunction","GeneratorFunctionPrototype","IteratorPrototype","getProto","getPrototypeOf","NativeIteratorPrototype","Gp","defineIteratorMethods","_invoke","AsyncIterator","PromiseImpl","previousPromise","callInvokeWithMethodAndArg","reject","invoke","record","__await","unwrapped","doneResult","delegate","delegateResult","maybeInvokeDelegate","sent","_sent","dispatchException","abrupt","done","methodName","return","TypeError","info","resultName","next","nextLoc","pushTryEntry","locs","entry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","resetTryEntry","completion","reset","iterable","iteratorMethod","isGeneratorFunction","genFun","ctor","constructor","mark","setPrototypeOf","__proto__","awrap","async","iter","val","object","reverse","pop","skipTempReset","charAt","slice","stop","rootRecord","rval","exception","handle","loc","caught","hasCatch","hasFinally","finallyEntry","complete","finish","thrown","delegateYield","AuthenticatePaymentRequest","_asyncToGenerator","_callee","_context","_x","apply","GetRewardDetails","_callee2","base","_context2","_x2","CreatePaymentRequest","_ref3","_callee3","_orderType","_context3","t0","ok","text","responseData","checkoutRecord","orderUid","previousOrders","_x3","_x4","_x5","_x6","TransactionType","PayerAuthentication","forwardRef","ref","onPaymentSuccess","initialTransactionInformation","setInitialTransactionInformation","payerAuthSetupResponse","setPayerAuthSetupResponse","_useState5","_useState6","checkoutResponse","setCheckoutResponse","paymentResponse","paymentResult","payerAuthSetupFormRef","stepupFormRef","handleError","_result","Authenticate","_initialTransactionInformation","authPayInfo","processingInformation","tokenInformation","flexTokenInformation","paymentInformation","transientToken","jti","consumerAuthenticationInformation","t1","CreatePayment","cardSummary","_appState$basket$tabl","_appState$basket$nick","_appState$location3$s","_result2","transactionType","createPaymentRequest","cardInformation","cardDetails","_checkoutResponse","hideStepUpScreen","display","actionList","authenticationTransactionId","listenToAuthentication","origin","Status","referenceId","returnUrl","submit","_paymentResponse$cons","errorInformation","payerAuthForm","useMemo","deviceDataCollectionUrl","height","target","accessToken","stepUpForm","_paymentResponse$cons2","stepUpUrl","useImperativeHandle","OrderConfirmation","bindActionCreators","basketActions","useDispatch","setError","showAppleButton","setShowAppleButton","googlePayButtonRef","applePayButtonRef","paymentOptions","setPaymentOptions","_useState7","_useState8","setTotalPrice","_useState9","_useState10","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","assuranceDetails","cardHolderAuthenticated","COMPLETE","option","opacity","ProductExtra","productSingleSelectName","disabled","isFromPrice","debugLabel","IonList","item-right","detail","item-left","IonRadio","QuantityInput","subtractButtonColour","addButtonColour","disableAddQuantityButton","disableDecreaseQuantityButton","valueColour","productMultiSelectName","isSelected","showQuantityComponent","disableCheckbox","AltQuantityInput","viewBox","fill","xmlns","d","ModifierGroup","_menuItem$auxData","modifierGroup","isDropdownOpen","onToggleDropdown","localId","onSelectedSingle","canSelectMultiple","maxDifferentItems","maxPoints","minDifferentItems","groupType","_state$menuItemData","boundUpdateItem","menuItemStore","selected","setSelected","totalQuantitySelected","setTotalQuantitySelected","chosenItems","setChosenItems","setUpdated","getModifierComponent","singleLine","nodes","mgi","defaultQuantitySelected","no-lines","IonRadioGroup","data-text","ProductSingleSelect","ProductMultiSelect","maxQuantity","handleChange","startSelected","out","menuSingleItemSelected","prevItem","chosen","detailsPageSettings","hideDefaultTitle","hideDropdown","backgroundColor","dropdownBackgroundColour","dropdownFontColour","prefix","preSelectedTitle","chevronUpOutline","chevronDownOutline","SlideDown","closed","showCustomTitle","AuxJsonModifierFilters","auxFilterGroup","modifierIndex","auxFilterIndex","_state$menuItemData2","calculateAuxFilters","_modGroup$auxMenuItem","_modGroup$auxMenuItem2","modGroup","selectedModItem","_modGroup$auxMenuItem3","_modGroup$auxMenuItem4","_modGroup$auxMenuItem5","_modGroup$auxMenuItem6","_selectedModItem","_selected","_s$tag","onSelected","targetSelector","selectedItem","ignoreSelectedEvent","selectorIndex","_item$tag","MenuItem","dropdowns","showModifierGroupItemCalories","dropdownCofigs","_group$auxMenuItemDat","_group$auxMenuItemDat2","open","setBasketShowModal","prevOpen","thisDropdown","_m$auxMenuItemData","_m$auxMenuItemData$au","_m$auxMenuItemData2","_m$auxMenuItemData2$a","selectedModifierGroupItem","mg","_mg$auxMenuItemData","_mg$auxMenuItemData$a","_this2$props$menuItem","_this2$props$menuItem2","dropdownConfig","_state$colleague","Location","geoCallback","_assertThisInitialized","isOk","findAStore","locationSharp","ScanAQRCode","qrCode","LocationStore","BasketItemRow","readOnly","boundRequestBasketItem","boundUpdateBasketItemQuantity","removeAlertIsOpen","setRemoveAlertIsOpen","setBasePrice","isCoupon","IonAlert","header","buttons","role","handler","optionsText","replace","el","trim","editable","proceed","InfoPage","showAlert","setShowAlert","boundClearBasket","boundGetUpsells","AllergenPopup","_props$show","close","accept","locationStore","boundUpsellDone","boundRequestMenuItem","MenuItemStore","setShowAllergenPopup","_locationStore$select","Tab2","collapse","IonToolbar","Tab3","MopFooterList","setShowModal","headerFooterStore","basketEnabled","fromCharCode","showBasketModal","takingMopOrders","MopFooterMenuItem","_menuItemData$menuIte2","_menuItemData$menuIte7","_objectDestructuringEmpty","boundAddToBasket","boundUpdateBasket","setPrice","enableButton","setEnableButton","_menuItemData$menuIte","_menuItemData$menuIte3","_menuItemData$menuIte4","_menuItemData$menuIte5","_menuItemData$menuIte6","canAddOrUpdate","hasPriceSet","MopFooterBasketPage","_locationState$select2","useMopHooks","boundSelectTimeslot","boundSetChannel","setAsapTimeSlot","serverTime","remainder","moment","minute","subtract","format","add","onChannelSelected","channel","enableTimeSlots","MopFooterConfirmStore","showButton","setShowButton","supportedChannels","MopFooterTablePage","BasketTableNumber","BasketNickname","_state$basket3","_state$basket4","boundSetContinueClicked","boundSetTableFormError","boundSetNicknameFormError","boundSetTableNumber","boundSetNickname","couponErrorMappings","1","2","3","4","5","6","7","8","9","10","11","12","989","20","21","50","1001","CouponCheckMarkSvg","fillRule","clipRule","ErrorSvg","CouponCode","SetCouponCode","showCouponEntry","setShowCouponEntry","SetError","IsBusy","SetIsBusy","basketStoreEx","couponsTotal","c","rejected","couponMenuItem","calculateCouponsTotal","subTotal","duplicatCoupon","r","couponsAdded","thatCoupon","mappedError","errorCode","MopFooterPaymentSuccessPage","MopFooter","footerMode","BasketPage","BasketTotalAndCoupons","IonFooter","Hidden","Basket","PDP","UpsellPage","MopFooterUpsellPage","TablePage","ConfirmStore","PaymentSuccessPage","TermsCondModal","boundSetShowModal","closeOutline","paddingBottom","AllergenModal","_state$colleague2","_state$colleague3","_state$colleague$isLo","_state$colleague4","parentModalClick","validatePin","ColleagueStore","setPin","errorMessage","setErrorMessage","pinConfirmed","setPinConfirmed","confirmPinErrorMessage","setConfirmPinErrorMessage","mode","chevronBack","inputmode","maxlength","minlength","inputValue","checkbox","MopHeaderMenusModal","orders","setOrders","logout","showLogoutAlert","setShowLogoutAlert","getOrderStatus","orderGUIDs","order","orderPlaced","finally","handleLogout","handleLogoutConfirmation","confirmed","reload","onWillPresent","IonRefresher","onIonRefresh","IonRefresherContent","mopOrderUid","orderStoreLocation","completed","customerOrderNumber","orderTotal","warningOutline","documentTextOutline","personCircle","LoginModal","allowedStartingPages","AppHeader","boundShowDebugLabels","redirect","setRedirect","isUserAllowedToLandHere","sendPageView","showLabel","handleBrowserHistoryChange","page_title","gtag","page","hasStartedApp","goBackRecursive","to","headerMode","Normal","menu","ErrorIcon","CheckoutPayCard","myStyles","formRef","createRef","stepUpIframe","deviceCollectionIframe","pageWrapper","controller","AbortController","renderIframe","isCreatingPaymentRequest","isPageValid","isPageLoading","isPayLoading","microform","fields","ccv","customerInformation","cardExpiryDate","toast","isToastOpen","toastMessage","payerAuth","payerAuthEnrolled","disablePayButton","serverBasket","cvvError","numberError","InitCheckout","abort","prevProps","prevState","load","unload","that","Flex","jwk","styles","createField","securityCode","on","unLockUi","decodedFlexObj","jwtDecode","setShowBack","_this$state","onPaymentError","IonLoading","dates","expirationMonth","expirationYear","createToken","details","f","onReceivedCardToken","enterkeyhint","autoCapitalize","inputMode","IonDatetime","min","displayFormat","IonToast","duration","_state$location","_state$location2","Email","ChannelIdentifier","TimeSlot","withRouter","CheckoutTestPage","_props$mopCoupons","_props$mopCoupons2","_props$mopCoupons3","showCoupons","setShowCoupons","getCouponDescription","clearInput","fixed","CouponsTestPage","MopCoupons","PaymentSuccess","_basketState$tmpBaske2","basketState","setCounterItems","setIsKitchenItemPresent","rewardDetails","setRewardDetails","_basketState$tmpBaske","sessionId","count","acc","cur","isKitchenItem","_isKitchenItemsPresent","showMorePoints","morePointsRewarded","HistoryListener","boundSetPage","LocationListener","contentRef","classList","contains","remove","TimeSlotChooser","isChanging","setIsChanging","timeSlots","setTimeSlots","timeRange","setTimeRange","asapTimeSlot","_useState11","_useState12","pickATimeObj","setPickATimeObj","_useState13","_useState14","prevTimeSlot","setPrevTimeSlot","handleTimeslotChange","isHeader","_formRef$current","handleHeaderRadioChange","mopTimeSlots","_asapTimeSlot","firstAvailableTimeslot","timeslotFromState","ts","offset","TimeSlotPage","_LocationState$select","_LocationState$select2","LocationState","LocationItemObject","locationName","locationAddress","locationPostcode","locationDistance","locationMessage","locationIsMarketKitchen","locationIsCafe","selectedStoreNumber","openingTimes","isFirstItem","storeOpen","isLastItem","warning","tidyPlaceDescription","newTitle","StoreSearch","requestAutocomplete","query","_responseJson$feature","responseJson","statusText","features","feature","localPredictions","cancelOrderAlertShow","ignoreInput","requestStoresCallback","requestServerGeoAutoCompleteCallback","requestServerGeoPlaceCallback","setSelectedStore","_storeNumber","theStore","theChannel","theChannelIdentifier","_this$props$predictio","clearSuggestions","_e$detail","_e$detail$relatedTarg","relatedTarget","tagName","evt","str","long","_this$props$selectedS","search","onIonBlur","onBlur","debounce","onInputChanged","locate","prediction","onMouseDown","onPlaceSelect","position","place_name","coordinates","onIonRadioGroupChange","_this4$props$selected","metersValue","LocationItem","firstLineAddress","postcode","distance","ScanQrCode","QRLanding","hasFailed","requestStoreCallback","requestStoreErrorCallback","setFailedState","setPage","setHasStartedApp","_this$props$selectedS2","changeStore","getStarted","TCPage","grantCookiePermissions","img","SplashPage","setShowConsentAlert","shouldShowCookieConsent","setShouldShowCookieConsent","pd","URLSearchParams","get","cookieConsent","newOrder","splitDecodeByComma","decode","CafeTheme","lazy","MarketTheme","LoadingFallback","ThemeManager","children","Suspense","fallback","ChannelProps","subTitle","ChooseOrderType","_LocationState$select3","setSelectedChannel","isAlertOpen","setIsAlertOpen","isClearBasketAlertOpen","setClearBasketAlertOpen","BasketState","backdropDismiss","IonicSafeString","handleOrderTypeClick","_ChannelProps$find$ti","_ChannelProps$find","_ChannelProps$find$ti2","_ChannelProps$find2","ch","thisChannel","TableFormErrors","ContinueClicked","auxStoreData","tableNumbers","IonSelect","interface","table","IonSelectOption","NameOrNickname","NicknameFormErrors","_values$Nickname","createBrowserHistory","App","onload","getElementsByTagName","loadGooglePlaces","faviconHref","iconHref","favicon","rel","head","loadHeadTags","_document$querySelect","manifest","stringManifest","blob","Blob","manifestUrl","URL","createObjectURL","querySelector","setAttribute","createManifest","showExpireModal","setShowExpireModal","IonApp","IonReactRouter","basename","IonRouterOutlet","animated","Route","render","exact","component","EnterEmail","Splash","Redirect","Boolean","hostname","reducers","counter","incomingAction","_state$categoryListA","_state$categoryListB","_state$menuItem","update","_defineProperty","$merge","newShowBack","newFooterMode","newHeaderMode","_unloadedState","$set","_coupons","mi","_calculateExternalDiscounts","getAttribute","initialState","middleware","thunk","routerMiddleware","rootReducer","combineReducers","router","connectRouter","enhancers","windowIfDefined","__REDUX_DEVTOOLS_EXTENSION__","createStore","compose","applyMiddleware","configureStore","ReactDOM","Provider","getElementById","defineCustomElements","serviceWorker","ready","registration","unregister"],"mappings":";2NAAA,IAAIA,EAAM,CACT,8BAA+B,CAC9B,IACA,GAED,uBAAwB,CACvB,IACA,GAED,uBAAwB,CACvB,IACA,IAED,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,KAIR,IAAIG,EAAMX,EAAIE,GAAMU,EAAKD,EAAI,GAC7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","file":"static/js/main.ab1f89d2.chunk.js","sourcesContent":["var map = {\n\t\"./ion-action-sheet.entry.js\": [\n\t\t311,\n\t\t7\n\t],\n\t\"./ion-alert.entry.js\": [\n\t\t312,\n\t\t8\n\t],\n\t\"./ion-app_8.entry.js\": [\n\t\t313,\n\t\t11\n\t],\n\t\"./ion-avatar_3.entry.js\": [\n\t\t314,\n\t\t21\n\t],\n\t\"./ion-back-button.entry.js\": [\n\t\t315,\n\t\t22\n\t],\n\t\"./ion-backdrop.entry.js\": [\n\t\t316,\n\t\t47\n\t],\n\t\"./ion-button_2.entry.js\": [\n\t\t317,\n\t\t23\n\t],\n\t\"./ion-card_5.entry.js\": [\n\t\t318,\n\t\t24\n\t],\n\t\"./ion-checkbox.entry.js\": [\n\t\t319,\n\t\t25\n\t],\n\t\"./ion-chip.entry.js\": [\n\t\t320,\n\t\t26\n\t],\n\t\"./ion-col_3.entry.js\": [\n\t\t321,\n\t\t48\n\t],\n\t\"./ion-datetime_3.entry.js\": [\n\t\t322,\n\t\t14\n\t],\n\t\"./ion-fab_3.entry.js\": [\n\t\t323,\n\t\t27\n\t],\n\t\"./ion-img.entry.js\": [\n\t\t324,\n\t\t49\n\t],\n\t\"./ion-infinite-scroll_2.entry.js\": [\n\t\t325,\n\t\t50\n\t],\n\t\"./ion-input.entry.js\": [\n\t\t326,\n\t\t28\n\t],\n\t\"./ion-item-option_3.entry.js\": [\n\t\t327,\n\t\t29\n\t],\n\t\"./ion-item_8.entry.js\": [\n\t\t328,\n\t\t30\n\t],\n\t\"./ion-loading.entry.js\": [\n\t\t329,\n\t\t31\n\t],\n\t\"./ion-menu_3.entry.js\": [\n\t\t330,\n\t\t32\n\t],\n\t\"./ion-modal.entry.js\": [\n\t\t331,\n\t\t12\n\t],\n\t\"./ion-nav_2.entry.js\": [\n\t\t332,\n\t\t18\n\t],\n\t\"./ion-popover.entry.js\": [\n\t\t333,\n\t\t13\n\t],\n\t\"./ion-progress-bar.entry.js\": [\n\t\t334,\n\t\t33\n\t],\n\t\"./ion-radio_2.entry.js\": [\n\t\t335,\n\t\t34\n\t],\n\t\"./ion-range.entry.js\": [\n\t\t336,\n\t\t35\n\t],\n\t\"./ion-refresher_2.entry.js\": [\n\t\t337,\n\t\t15\n\t],\n\t\"./ion-reorder_2.entry.js\": [\n\t\t338,\n\t\t20\n\t],\n\t\"./ion-ripple-effect.entry.js\": [\n\t\t339,\n\t\t51\n\t],\n\t\"./ion-route_4.entry.js\": [\n\t\t340,\n\t\t36\n\t],\n\t\"./ion-searchbar.entry.js\": [\n\t\t341,\n\t\t37\n\t],\n\t\"./ion-segment_2.entry.js\": [\n\t\t342,\n\t\t38\n\t],\n\t\"./ion-select_3.entry.js\": [\n\t\t343,\n\t\t39\n\t],\n\t\"./ion-slide_2.entry.js\": [\n\t\t344,\n\t\t52\n\t],\n\t\"./ion-spinner.entry.js\": [\n\t\t345,\n\t\t17\n\t],\n\t\"./ion-split-pane.entry.js\": [\n\t\t346,\n\t\t53\n\t],\n\t\"./ion-tab-bar_2.entry.js\": [\n\t\t347,\n\t\t40\n\t],\n\t\"./ion-tab_2.entry.js\": [\n\t\t348,\n\t\t19\n\t],\n\t\"./ion-text.entry.js\": [\n\t\t349,\n\t\t41\n\t],\n\t\"./ion-textarea.entry.js\": [\n\t\t350,\n\t\t42\n\t],\n\t\"./ion-toast.entry.js\": [\n\t\t351,\n\t\t43\n\t],\n\t\"./ion-toggle.entry.js\": [\n\t\t352,\n\t\t16\n\t],\n\t\"./ion-virtual-scroll.entry.js\": [\n\t\t353,\n\t\t54\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 = 150;\nmodule.exports = webpackAsyncContext;","var map = {\n\t\"./ion-icon.entry.js\": [\n\t\t354,\n\t\t69\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 = 152;\nmodule.exports = webpackAsyncContext;","var map = {\n\t\"./pwa-action-sheet.entry.js\": [\n\t\t358,\n\t\t61\n\t],\n\t\"./pwa-camera-modal-instance.entry.js\": [\n\t\t359,\n\t\t62\n\t],\n\t\"./pwa-camera-modal.entry.js\": [\n\t\t360,\n\t\t63\n\t],\n\t\"./pwa-camera.entry.js\": [\n\t\t361,\n\t\t64\n\t],\n\t\"./pwa-toast.entry.js\": [\n\t\t362,\n\t\t65\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 = 308;\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 return \"\";\r\n return \"/cafe\"; \r\n}\r\n\r\nexport const getConfig = () => {\r\n\r\n return marketConfiguration;\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 1922\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, { useState } from 'react';\r\nimport { IonRow, IonCol, IonText, IonImg } from '@ionic/react';\r\nimport './CategoryRow.scss';\r\nimport { baseUrl } from '../helpers/configHelper';\r\nimport { getConfig } from '../helpers/configHelper';\r\n\r\n\r\ninterface CategoryRowProps {\r\n categoryId: number;\r\n categoryImage: string;\r\n categoryName: string;\r\n onClick?: (categoryId: number) => void;\r\n}\r\n\r\nconst CategoryRow: React.FC = ({ categoryId, categoryImage, categoryName, onClick }) => {\r\n\r\n return (\r\n onClick && onClick(categoryId)}>\r\n \r\n \r\n \r\n \r\n {categoryName}\r\n \r\n \r\n );\r\n};\r\n\r\nexport default CategoryRow;\r\n","import React, { useState } from 'react';\r\nimport { IonRow, IonCol, IonText, IonImg } from '@ionic/react';\r\nimport './CategoryGrid.scss';\r\nimport { baseUrl, cacheBust } from '../helpers/configHelper';\r\nimport { getConfig } from '../helpers/configHelper';\r\nimport { useSelector } from 'react-redux';\r\nimport { ApplicationState } from '../store';\r\n\r\n\r\ninterface CategoryGridProps {\r\n\tcategoryId: number;\r\n\tcategoryImage: string;\r\n\tcategoryName: string;\r\n\tfullWidth: boolean;\r\n\tonClick?: (categoryId: number) => void;\r\n\tisFavourites?: boolean;\r\n}\r\n\r\nconst CategoryGrid: React.FC = ({ categoryId, categoryImage, categoryName, fullWidth, onClick, isFavourites }) => {\r\n\r\n\tconst headerState = useSelector((state: ApplicationState) => state.headerFooter);\r\n\r\n\treturn (\r\n\t\t onClick && onClick(categoryId)} size={fullWidth ? \"12\" : \"6\"}>\r\n\t\t\t
\r\n\t\t\t\t
\r\n\r\n\t\t\t\t\t{/* */}\r\n\t\t\t\t\t{`category_image_${categoryId}`}\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\t{isFavourites ? \"More Card\" : categoryName}\r\n\t\t\t\t\t\t{isFavourites && Quick access to Market Kitchen, favourites you've ordered before}\r\n\t\t\t\t\t
\r\n\t\t\t\t
\r\n\t\t\t
\r\n\t\t\t{\r\n\t\t\t\theaderState?.showDebugLabel &&\r\n\t\t\t\t
\r\n\t\t\t\t\t{categoryId} {categoryName}\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 CategoryGrid;","\r\n\r\n\r\nexport function formatCurrency(amount: number | null | undefined) {\r\n if (!amount) return \"£ --\";\r\n\r\n // check if amount is positive or negative and return the appropriate symbole\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] + \"p\";\r\n }\r\n\r\n return \"£\" + amount.toFixed(2);\r\n}","import React, { useState } from 'react';\r\nimport { IonRow, IonCol, IonText, IonImg,IonTitle } from '@ionic/react';\r\nimport './MenuItemRow.scss';\r\nimport { formatCurrency } from '../helpers/currencyHelpers';\r\nimport { baseUrl, cacheBust, getConfig } from '../helpers/configHelper';\r\nimport { MenuDisplayType } from '../store/MenuStoreTypes';\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 itemTags: string;\r\n inStock: boolean;\r\n onClick?: (menuItemId: number) => void;\r\n}\r\n\r\nconst MenuItemRow: React.FC = ({ menuItemId,menuItemImage,menuItemName,menuItemBasePrice,onClick,sku,itemTags,inStock, menuItemFromPrice}) => {\r\n return (\r\n <>\r\n
\r\n inStock && onClick && onClick(menuItemId)}>\r\n {false && { console.log(e) } } className=\"MenuItemImage\" src={(!menuItemImage || menuItemImage == 'null' ? `${baseUrl()}/images/ProductShots/null.jpg` : `${baseUrl()}/images/ProductShots/` + menuItemImage + '.jpg') + `?v=${cacheBust()}`} />}\r\n { console.log(e) } } className=\"MenuItemImage\" src={(`${baseUrl()}/images/ProductShots/${sku}_PLP.jpg`) + `?v=${cacheBust()}`} />\r\n\r\n \r\n \r\n {itemTags?.includes(\"[VG]\") && }\r\n {itemTags?.includes(\"[VE]\") && }\r\n {itemTags?.includes(\"[U400]\") && }\r\n {itemTags?.includes(\"[U600]\") && }\r\n {itemTags?.includes(\"[MMI]\") && }\r\n {itemTags?.includes(\"[MF]\") && }\r\n {itemTags?.includes(\"[NEW]\") && }\r\n \r\n
\r\n \r\n \r\n {\r\n menuItemFromPrice \r\n ?\r\n <>\r\n {\"From \"}{formatCurrency(menuItemFromPrice)}\r\n \r\n :\r\n formatCurrency(menuItemBasePrice)\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\nexport default MenuItemRow;\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}\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 const pfIdentifier = localStorage.getItem('pfIdentifier');\r\n let url = `${baseUrl()}/stores/getstoresatlocation?latitude=${latitude}&longitude=${longitude}&limit=${maxRequestStoresLimit}${pfIdentifier ? \"&pfIdentifier=\" + pfIdentifier : \"\"}`;\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};","import React, { useEffect, useState } from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { useLocation } from 'react-router';\r\nimport styled from 'styled-components';\r\nimport { baseUrl, getConfig } from '../helpers/configHelper';\r\nimport { ApplicationState } from '../store';\r\nimport { simpleChannelType } from '../store/LocationStore';\r\n\r\ninterface IProps {\r\n\theaderTitle?: string //If undefined, use the default header defined below.\r\n}\r\n\r\n/*\r\n\tDefault Logos\r\n\t\tGeneric\r\n\t\tEatIn\r\n\t\tTakeaway\r\n*/\r\n\r\nexport enum LogoTitles {\r\n\tDefault = \"Default\",\r\n\tTakeaway = \"Takeaway\",\r\n\tEatIn = \"EatIn\"\r\n};\r\n\r\nconst AppHeaderImage: React.FC = ({ headerTitle = \"Menu\" }) => { //Menu is current Default header \r\n\r\n\tconst [showLogo, setShowLogo] = useState(true);\r\n\tconst [logoTitle, setLogoTitle] = useState(\"default\");\r\n\tconst locationState = useSelector((state: ApplicationState) => state.location);\r\n\tconst location = useLocation();\r\n\r\n\tuseEffect(() => {\r\n\t\tif (headerTitle == \"Menu\" && !getConfig().isMarket) {\r\n\t\t\tsetShowLogo(true);\r\n\t\t}\r\n\t\telse {\r\n\t\t\tsetShowLogo(false);\r\n\t\t}\r\n\t}, [headerTitle]);\r\n\r\n\tuseEffect(() => {\r\n\t\tlet _logoTitle = LogoTitles.Default;\r\n\t\tswitch (locationState?.selectedChannel?.channelType) {\r\n\t\t\tcase simpleChannelType.ClickAndCollect:\r\n\t\t\t\t_logoTitle = LogoTitles.Takeaway;\r\n\t\t\t\tbreak;\r\n\t\t\tcase simpleChannelType.TableOrder:\r\n\t\t\t\t//_logoTitle = \"eatin\";\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\tswitch (location.pathname) {\r\n\t\t\tcase '/ordertype':\r\n\t\t\t\t_logoTitle = LogoTitles.Default;\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\tsetLogoTitle(_logoTitle);\r\n\t}, [locationState?.selectedChannel, location.pathname]);\r\n\r\n\tconst ListerHeader = styled.div`\r\n display:block;\r\n background-color: var(--ion-color-secondary);\r\n background-size: contain;\r\n\t\tbackground-repeat: no-repeat;\r\n\t\twidth: 100%;\r\n\t\theight: 0;\r\n\t\tpadding-top: 25%;\r\n background-image:url('${baseUrl()}/images/assets/category_header_${headerTitle}_${getConfig().imageThemeID}.png');\r\n `;\r\n\r\n\r\n\tconst ListerLogo = styled.div`\r\n margin:0 auto 0 10%;\r\n width:30%;\r\n height:100%;\r\n background-position:center center;\r\n background-size: contain;\r\n transform: scale(0.8);\r\n background-repeat:no-repeat;\r\n background-image:url('${baseUrl}/images/assets/Logo_${getConfig().imageThemeID}_${logoTitle}.png');\r\n `;\r\n\r\n\treturn (\r\n localStorage.getItem('isLoggedIn') !== \"true\" ? \r\n\t\t\t{showLogo && }\r\n\t\t\r\n :\r\n <>\r\n\t)\r\n}\r\n\r\nexport default AppHeaderImage;\r\n","// MTR: GET RID OF THIS BEFORE FINAL BITS\r\n\r\nexport interface MenuDataState {\r\n isLoading: boolean;\r\n categoryId: number | null;\r\n title: string;\r\n categoryListA: CategoryList | null;\r\n categoryListB: CategoryList | null;\r\n categoryCurrent: CategoryList | null;\r\n isFirstAccess: boolean;\r\n}\r\n\r\nexport interface CategoryList {\r\n categoryId: number;\r\n categories: MopCategory[];\r\n menuItems: MopMenuItem[];\r\n categoryTitle: string;\r\n menuDisplayType: number;\r\n auxCategoryData?: AuxCategoryData;\r\n isFavourites?: boolean;\r\n}\r\n\r\nexport interface AuxCategoryData {\r\n categoryBackgroundColour?: string,\r\n categoryFontColour?: string,\r\n hideCategoryHeader?: boolean,\r\n priceLocation?: PriceLocations,\r\n categoryFooter?: FooterImage,\r\n categoryImageName?: string;\r\n fullWidthSkus?: string[];\r\n description?: string,\r\n displayType?: MenuDisplayType\r\n promotionalButtons?: HeaderPromoImage[];\r\n}\r\n\r\nexport interface HeaderPromoImage {\r\n buttonImage: string;\r\n buttonLinkType: ButtonLinkTypeEnum;\r\n buttonLinkId: string;\r\n buttonLinkName: string;\r\n}\r\n\r\nexport enum ButtonLinkTypeEnum {\r\n Category,\r\n MenuItem\r\n}\r\n\r\nexport interface PriceLocations {\r\n top?: string,\r\n left?: string,\r\n right?: string,\r\n backgroundColour?: string,\r\n hiddenPriceSkus: string[]\r\n}\r\n\r\ninterface FooterImage {\r\n imageName: string,\r\n imageLink: string\r\n}\r\n\r\nexport enum MenuDisplayType {\r\n BasicList = 0,\r\n BasicGrid,\r\n ProductGrid\r\n}\r\n\r\nexport interface MopCategory {\r\n categoryId: number;\r\n categoryName: string;\r\n categoryImage: string;\r\n auxData: MopCategorySettings | null;\r\n menuItemIds?: number[];\r\n subCategoryIds?: number[];\r\n isFavourites?: boolean;\r\n}\r\n\r\nexport interface MopCategorySettings {\r\n fullWidth: boolean;\r\n}\r\n\r\nexport interface MopMenuItem {\r\n menuItemId: number;\r\n description: string;\r\n menuItemName: string;\r\n menuItemImage: string;\r\n sku: string;\r\n itemTags: string;\r\n menuItemBasePrice: number;\r\n menuItemFromPrice: number | null;\r\n inStock: boolean;\r\n kcal?: number;\r\n categoryLevelFilter: string;\r\n\tplpRoundels: string[];\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 } 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

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, IonTitle } from '@ionic/react';\r\nimport React, { useState, useEffect } from 'react';\r\nimport { baseUrl, cacheBust, getConfig } 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\n\r\ninterface IHeaderDescription {\r\n headerImage: string | null;\r\n headerTitle?: string;\r\n itemTags?: string;\r\n allergenInfo?: string;\r\n description?: string;\r\n minHeight: string;\r\n hideText: boolean;\r\n fontColour?: string\r\n identifier: string | undefined;\r\n displayType: string;\r\n kcal?: number;\r\n altTitle?: string;\r\n price?:number\r\n //Appears to the aligned right of the main title\r\n\tpdpRoundels?: string[]\r\n}\r\n\r\nconst HeaderDescription: React.FC = ({headerImage, headerTitle, itemTags, allergenInfo, description, minHeight, hideText, identifier,altTitle,displayType, fontColour, kcal, price, pdpRoundels }) => {\r\n\r\n const [allergenInfoOpen, setAllergenInfoOpen] = useState(false);\r\n const headerState = useSelector((state: ApplicationState) => state.headerFooter);\r\n const [productPromos, setProductPromos] = useState()\r\n\r\n useEffect(() => {\r\n setProductPromos(pdpRoundels)\r\n }, [pdpRoundels])\r\n\r\n return (\r\n <>\r\n \r\n \r\n {\r\n headerState?.showDebugLabel &&\r\n
\r\n {identifier} img:{headerImage} {displayType}\r\n
\r\n }\r\n \r\n\t\t\t\t\t{!hideText && headerImage && { console.log(e) }} className=\"MenuItemTopImage\" src={headerImage +`?v=${cacheBust()}`} /> }\r\n {productPromos && productPromos?.length > 0 && }\r\n {productPromos && productPromos?.length > 1 && }\r\n \r\n { \r\n !hideText &&\r\n \r\n
\r\n \r\n
\r\n
\r\n { (price !== undefined && price > 0 ) &&
{currencyHelpers.formatCurrency(price)}
}\r\n
\r\n
\r\n { description &&
}\r\n
\r\n { kcal &&
{kcal}kcal
}\r\n { (allergenInfo !== null && allergenInfo !== undefined && allergenInfo.length !== 0) &&
{ setAllergenInfoOpen(true) }}>View allergens
}\r\n
\r\n { (itemTags !== null && itemTags !== undefined && itemTags.length !== 0) &&
\r\n {itemTags?.includes(\"[VG]\") && }\r\n {itemTags?.includes(\"[VE]\") && }\r\n {itemTags?.includes(\"[U400]\") && }\r\n {itemTags?.includes(\"[U600]\") && }\r\n {itemTags?.includes(\"[MMI]\") && }\r\n {itemTags?.includes(\"[MF]\") && }\r\n {itemTags?.includes(\"[NEW]\") && }\r\n
}\r\n
\r\n
\r\n }\r\n
\r\n
\r\n { setAllergenInfoOpen(false) }} allergenHtml={allergenInfo}>\r\n \r\n )\r\n}\r\n\r\nexport default HeaderDescription;","import React, { useState, useEffect } from 'react';\r\nimport { IonRow, IonCol, IonText, IonImg,IonTitle, IonIcon } from '@ionic/react';\r\nimport './MenuItemRow.scss';\r\nimport { formatCurrency } from '../helpers/currencyHelpers';\r\nimport { baseUrl, cacheBust, getConfig } from '../helpers/configHelper';\r\nimport { MenuDisplayType, PriceLocations } from '../store/MenuStoreTypes';\r\nimport { useSelector } from 'react-redux';\r\nimport { ApplicationState } from '../store';\r\nimport { FormikProvider } from 'formik';\r\n\r\ninterface MenuItemTileProps {\r\n menuItemId: number;\r\n sku: string;\r\n price?: string;\r\n fromPrice?: boolean;\r\n itemTags: string;\r\n inStock: boolean;\r\n name: string;\r\n priceLocation?: PriceLocations,\r\n fullWidth?: boolean\r\n onClick?: (menuItemId: number) => void;\r\n kcal?: number\r\n onAddClick?: (menuItemId: number) => void;\r\n\tplpRoundels?: string[];\r\n}\r\n\r\nconst MenuItemTile: React.FC = ({name, menuItemId, fromPrice,price,onClick,onAddClick,sku,itemTags,inStock, priceLocation, fullWidth, kcal, plpRoundels}) => {\r\n const headerState = useSelector((state: ApplicationState) => state.headerFooter);\r\n const [productPromos, setProductPromos] = useState()\r\n\r\n useEffect(() => {\r\n setProductPromos(plpRoundels)\r\n }, [plpRoundels])\r\n\r\n return (\r\n <>\r\n inStock && onClick && onClick(menuItemId)}>\r\n
\r\n
\r\n {\r\n (itemTags && itemTags.length > 0) &&\r\n
\r\n {itemTags?.includes(\"[VG]\") && }\r\n {itemTags?.includes(\"[VE]\") && }\r\n {itemTags?.includes(\"[U400]\") && }\r\n {itemTags?.includes(\"[U600]\") && }\r\n {itemTags?.includes(\"[MMI]\") && }\r\n {itemTags?.includes(\"[MF]\") && }\r\n {itemTags?.includes(\"[NEW]\") && }\r\n
\r\n }\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{productPromos && productPromos?.length > 0 && }\r\n\t\t\t\t\t\t\t{productPromos && productPromos?.length > 1 && }\r\n\t\t\t\t\t\t\r\n
\r\n
\r\n
{name}
\r\n\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t{kcal!=null &&
{kcal}kcal
}\r\n\t\t\t\t\t\t\t
{ fromPrice &&
from
}
{price}
\r\n\t\t\t\t\t\t
\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 { IonCol, IonGrid, IonItem, IonButton,IonLabel, IonList, IonRadio, IonRadioGroup, IonRow } from \"@ionic/react\";\r\nimport React from \"react\";\r\n\r\nimport { MopMenuItem } from '../store/MenuStoreTypes';\r\nimport './CategoryFilters.scss';\r\n\r\n\r\nconst CategoryFilters: React.FC<{ menuItems: MopMenuItem[],selectedFilter: string|undefined | null,onFilterSelected:(selectedFilter:string)=>void }> = ({menuItems,selectedFilter = \"\",onFilterSelected }) => {\r\n\r\n\r\n\r\n const matchingMenuItems = menuItems.filter(a => a.categoryLevelFilter);\r\n\r\n const uniqueFilters = matchingMenuItems.map(item => item.categoryLevelFilter)\r\n .filter((value, index, self) => self.indexOf(value) === index);\r\n console.log(uniqueFilters);\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;","import React, { useEffect, useState } from 'react';\r\nimport { refreshOutline } from 'ionicons/icons';\r\nimport './CategoryMenuItemLister.scss';\r\nimport * as MenuDataStore from '../store/MenuStore';\r\nimport { IonGrid, IonContent, IonIcon, IonButton, IonList, IonRow, IonImg } from '@ionic/react';\r\nimport CategoryRow from '../components/CategoryRow';\r\nimport CategoryGrid from '../components/CategoryGrid';\r\nimport MenuItemRow from '../components/MenuItemRow';\r\nimport styled from 'styled-components';\r\nimport { baseUrl, cacheBust, getConfig } from '../helpers/configHelper';\r\nimport AppHeaderImage from './AppHeaderImage';\r\nimport HeaderDescription from './HeaderDescription';\r\nimport MenuItemTile from './MenuItemTile';\r\nimport { formatCurrency } from '../helpers/currencyHelpers';\r\nimport CategoryFilters from './CategoryFilters';\r\nimport { useHistory, useLocation } from \"react-router-dom\";\r\nimport { CategoryList, MenuDisplayType, MopCategory, MopMenuItem, ButtonLinkTypeEnum } from '../store/MenuStoreTypes';\r\n\r\ninterface CategoryMenuItemListerProps {\r\n categoryList: CategoryList | null,\r\n isLoading: boolean;\r\n onNavigateToCategory?: (categoryId: number) => void;\r\n onNavigateToMenuItem?: (menuItemId: number) => void;\r\n isColleague: boolean | null;\r\n}\r\n\r\nconst CategoryMenuItemLister: React.FC = ({\r\n categoryList,\r\n isLoading,\r\n onNavigateToCategory,\r\n onNavigateToMenuItem,\r\n isColleague,\r\n}) => {\r\n\r\n const [priceTitle, setPriceTitle] = useState();\r\n const [selectedFilter, setSelectedFilter] = useState();\r\n const location = useLocation()\r\n\r\n useEffect(() => {\r\n console.log(\"Category Info:\", categoryList);\r\n\r\n if (categoryList?.menuItems && categoryList.menuItems.length > 0) {\r\n let basePrice = categoryList.menuItems[0].menuItemBasePrice;\r\n setPriceTitle(categoryList.menuItems.every((m) => m.menuItemBasePrice == basePrice) ? formatCurrency(basePrice) : undefined);\r\n }\r\n\r\n }, [categoryList]);\r\n\r\n const applyFilter = (incoming: MopMenuItem[]) => {\r\n return incoming.filter(a => a.categoryLevelFilter == selectedFilter || !selectedFilter);\r\n }\r\n\r\n const RenderMenuTemplate = () => {\r\n\r\n if (categoryList) {\r\n let displayType = categoryList.auxCategoryData?.displayType;\r\n console.log(\"Display type\", displayType);\r\n console.log(\"Store value\", MenuDisplayType.BasicList);\r\n\r\n if (displayType === undefined || displayType === MenuDisplayType.BasicList) {\r\n return <>\r\n {\r\n categoryList.categories.map((a: MopCategory) => (\r\n onClickCategory(a)} />\r\n ))\r\n }\r\n {\r\n categoryList.menuItems.map((a: MopMenuItem) => (\r\n onNavigateToMenuItem && onNavigateToMenuItem(a.menuItemId)} sku={a.sku} itemTags={a.itemTags} />\r\n ))\r\n }\r\n \r\n }\r\n else if (displayType === MenuDisplayType.BasicGrid) {\r\n return
\r\n \r\n {/*category needs to be in the same ion row so that if the category list contains an odd amount of items there isn't a large gap between the categories and items*/}\r\n {\r\n categoryList.categories.map((a: MopCategory) => (\r\n onClickCategory(a)} />\r\n ))\r\n }\r\n {\r\n applyFilter(categoryList.menuItems).map((a: MopMenuItem) => (\r\n onNavigateToMenuItem && onNavigateToMenuItem(a.menuItemId)} sku={a.sku} itemTags={a.itemTags} plpRoundels={a.plpRoundels} />\r\n ))\r\n }\r\n \r\n
\r\n }\r\n else if (displayType === MenuDisplayType.ProductGrid) {\r\n return
Not Available
\r\n }\r\n else {\r\n return
Unknown Menu Display Type
\r\n }\r\n }\r\n else {\r\n return
categoryList null
\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\r\n if (newSelectedFilter == selectedFilter) {\r\n setSelectedFilter(null);\r\n return;\r\n }\r\n setSelectedFilter(newSelectedFilter);\r\n return;\r\n }\r\n\r\n return (\r\n \r\n {categoryList && categoryList.categories.length > 1 && categoryList?.auxCategoryData?.categoryImageName == null && //categoryList?.categoryTitle != undefined // <-- for market kitchen headers\r\n \r\n }\r\n\r\n {\r\n categoryList?.isFavourites &&\r\n
\r\n
\r\n {/* */}\r\n {`category_image_favourites`}\r\n
\r\n
\r\n
\r\n More Card\r\n Quick access to Market Kitchen, favourites you've ordered before\r\n
\r\n
\r\n
\r\n }\r\n\r\n \r\n {categoryList && getConfig().isMarket &&\r\n <>\r\n \r\n {\r\n categoryList?.auxCategoryData?.promotionalButtons &&\r\n
\r\n \r\n {\r\n categoryList.auxCategoryData.promotionalButtons.map((promo) => {\r\n return {\r\n promo.buttonLinkType == ButtonLinkTypeEnum.Category ? onNavigateToCategory && onNavigateToCategory(Number.parseInt(promo.buttonLinkId)) : onNavigateToMenuItem && onNavigateToMenuItem(Number.parseInt(promo.buttonLinkId))\r\n }} />\r\n })\r\n }\r\n \r\n
\r\n }\r\n \r\n }\r\n {categoryList && categoryList.categories && (!categoryList.menuItems || !getConfig().isMarket) &&\r\n <>\r\n {\r\n categoryList.menuDisplayType === 1 &&\r\n <>\r\n \r\n {\r\n categoryList.categories.map((a: MopCategory) => (\r\n onClickCategory(a)} />\r\n ))\r\n }\r\n \r\n \r\n }\r\n {\r\n categoryList.menuDisplayType === 0 &&\r\n <>\r\n {\r\n categoryList.categories.map((a: MopCategory) => (\r\n onClickCategory(a)} />\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\r\n <>\r\n \r\n\r\n \r\n \r\n\r\n }\r\n \r\n }\r\n {\r\n (categoryList?.auxCategoryData?.categoryFooter?.imageName && categoryList.auxCategoryData.categoryFooter.imageName.length > 0)\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","export interface ILoginError {\r\n status: number;\r\n}\r\n\r\nexport function loginHasExpired(data: any): data is ILoginError {\r\n return (data as ILoginError).status !== undefined;\r\n}\r\n","import { AppThunkAction } from \".\";\r\nimport { Dispatch } from \"react\";\r\nimport { baseUrl } from \"../helpers/configHelper\";\r\nimport { Action, Reducer } from \"redux\";\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\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\n\r\nexport interface LoggedInAction {\r\n type: typeof LOGGED_IN;\r\n isLoggedIn: boolean;\r\n}\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 = (\r\n isLoggedIn: boolean\r\n): LoggedInAction => {\r\n localStorage.setItem('isLoggedIn', String(isLoggedIn));\r\n\r\n return {\r\n type: LOGGED_IN,\r\n isLoggedIn: isLoggedIn,\r\n };\r\n};\r\n\r\nexport const resetMessage = (\r\n message: string\r\n): 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\n// What do all of these do?\r\nexport const actionCreators = {\r\n validatePin: (pin: string): AppThunkAction => {\r\n return (dispatch: Dispatch) => {\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(validatePinFailure('Invalid code. Try again'));\r\n return;\r\n }\r\n\r\n dispatch(validatePinSuccess(data));\r\n localStorage.setItem('pfIdentifier', data?.pfIdentifier);\r\n dispatch(loggedIn(true));\r\n })\r\n .catch((error) => {\r\n dispatch(validatePinFailure(error.message));\r\n });\r\n };\r\n },\r\n logout: (): AppThunkAction => {\r\n return (dispatch: Dispatch, getState) => {\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((_) => {\r\n localStorage.removeItem('pfIdentifier');\r\n dispatch(loggedIn(false));\r\n });\r\n };\r\n }\r\n};\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: localStorage.getItem('isLoggedIn') === 'true',\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 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\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\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\r\n case LOGGED_IN:\r\n return {\r\n ...state,\r\n isLoggedIn: action.isLoggedIn,\r\n };\r\n\r\n case RESET_MESSAGE:\r\n return {\r\n ...state,\r\n expired: action.payload,\r\n };\r\n\r\n default:\r\n return state;\r\n }\r\n}\r\n","import { ActionSheetOptionStyle } from '@capacitor/core/dist/esm/core-plugin-definitions';\r\nimport { State } from 'ionicons/dist/types/stencil-public-runtime';\r\nimport { fastFood } from 'ionicons/icons';\r\nimport { Dispatch } from 'react';\r\nimport { act } from 'react-dom/test-utils';\r\nimport { Action, Reducer } from 'redux';\r\nimport { AppThunkAction } from './';\r\nimport { simpleChannelType } from './LocationStore';\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\r\n PDP\r\n\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}\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 { type: 'SET_PAGE', path: string,menuTitle:string | undefined,channelType:simpleChannelType | undefined }\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 dispatch({ type: 'SET_PAGE', path: path, menuTitle: menuTitle, channelType:appState.location?.selectedChannel?.channelType });\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\r\n if (action.path.includes('location')) {\r\n newTitle = \"Order & Collect\";\r\n newHeaderMode = HeaderMode.Normal;\r\n newFooterMode = FooterMode.Hidden;\r\n newShowBack = false;\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 switch (action.channelType) {\r\n case simpleChannelType.ClickAndCollect:\r\n newTitle = \"Collection Time\";\r\n break;\r\n\r\n case simpleChannelType.TableOrder:\r\n newTitle = \"Order Time\";\r\n break;\r\n }\r\n newHeaderMode = HeaderMode.Normal;\r\n newFooterMode = FooterMode.ConfirmStore;\r\n newShowBack = true;\r\n }\r\n if (action.path.includes('qr')) {\r\n newTitle = \"Order & Collect\";\r\n newHeaderMode = HeaderMode.Normal;\r\n newFooterMode = FooterMode.Hidden;\r\n newShowBack = false;\r\n }\r\n\r\n if (action.path.includes('enteremail')) {\r\n\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('qrlanding')) {\r\n newTitle = \"Morrisons - Order & Collect\";\r\n newHeaderMode = HeaderMode.Normal;\r\n newFooterMode = FooterMode.Hidden;\r\n newShowBack = false;\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.ConfirmStore;\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 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 { AppThunkAction } from './';\r\nimport { baseUrl } from '../helpers/configHelper';\r\nimport { CategoryList, MenuDataState } from './MenuStoreTypes';\r\nimport { ILoginError, loginHasExpired } from '../helpers/apiHelpers';\r\nimport { resetMessage, ResetMessageAction } from './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// 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 resetFirstCall: (): AppThunkAction => (dispatch, getState) => {\r\n dispatch({ type: 'RESET_FIRST_CALL' });\r\n },\r\n\r\n requestCategoryList: (\r\n categoryId: number,\r\n container: string,\r\n pfIdentifier: string,\r\n callback: any,\r\n ): 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 list\", 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: CategoryList | ILoginError) => {\r\n if (loginHasExpired(data)) {\r\n dispatch(resetMessage(\"showExpireModal\"))\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\r\n dispatch({\r\n type: 'REQUEST_CATEGORYLIST',\r\n categoryId: categoryId,\r\n container: container,\r\n pfIdentifier: pfIdentifier,\r\n });\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 break;\r\n }\r\n\r\n return state;\r\n};\r\n","import { getConfig } from \"./configHelper\";\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) {\r\n if(item){\r\n let mods = item.modifierGroups;\r\n let _price = item.menuItemBasePrice != undefined ? item.menuItemBasePrice : 0;\r\n\r\n if(mods){\r\n for(let i = 0; i < mods.length; i++){ //Foreach modifier in groupModifiers\r\n\r\n let mod: IMopModifierGroup = mods[i]; \r\n if(mod.itemsAreChargeable){ //If chargeable\r\n\r\n for(let j = 0; j < mod.modifierGroupItems.length; j++){ //Foreach item in modifier\r\n\r\n let item: IMopModifierGroupItem = mod.modifierGroupItems[j]; \r\n if(item.quantitySelected > 0){ //If selected\r\n\r\n if(item.price){ //If price not null | undefined\r\n _price += item.quantitySelected * item.price; \r\n } \r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n _price = calcQuantity ? _price * item.quantity : _price; \r\n\r\n return _price;\r\n }\r\n else{\r\n return 0;\r\n }\r\n \r\n}","import { Action, Reducer } from 'redux';\r\nimport { AppThunkAction } from './';\r\nimport { baseUrl } from '../helpers/configHelper';\r\nimport update from 'immutability-helper';\r\nimport { Dispatch } from 'react';\r\nimport { calculateMenuItemTotalPrice } from '../helpers/menuHelpers';\r\nimport { addItemToGtagBasket, removeItemFromGtagBasket } from '../helpers/googleHelpers';\r\nimport { resetMessage, ResetMessageAction } from './ColleagueStore';\r\nimport { ILoginError, loginHasExpired } from '../helpers/apiHelpers';\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 showAllergenPopup: boolean;\r\n toastNotificationOpen: 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\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 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 ShowAllergenPopup {\r\n type: \"SHOW_ALLERGEN_POPUP\"\r\n value: 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\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 | RemovebasketItem |\r\n UpdateOrderNumber | ClearBasket | SetShouldOfferUpsellToCustomer | SetTableNumber |\r\n UpdateTempBasket | ClearBasketItems | UpdatePaymentStatus |\r\n AddCouponCodeAction | DeleteCouponCodeAction | SetUpsells | UpsellDone | OpenToast | CloseToast |\r\n setTableFormErrors | setNicknameFormErrors | SetNickname |\r\n SetContinueClicked | ResetMessageAction | ShowAllergenPopup;\r\n\r\nconst unloadedState: BasketState = {\r\n isLoading: false,\r\n upsellDone: false,\r\n showAllergenPopup: 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 },\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 },\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};\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 updateBasketItem: (): AppThunkAction => (dispatch: Dispatch, getState) => {\r\n const appState = getState();\r\n\r\n let currentBasketItem = appState.menuItemData?.menuItem; //get current menu item\r\n\r\n console.log(\"Current Basket item: \", currentBasketItem, \"Basket: \", appState.basket); \r\n if(currentBasketItem) {\r\n\r\n currentBasketItem.menuItemTotalPrice = currentBasketItem.menuItemSinglePrice; //Setting total price to single price for basket view\r\n\r\n let basketItemIndex = appState.basket?.basket.menuItems.findIndex(item => item.basketMenuItemId === currentBasketItem?.basketMenuItemId); //Find index of menu item in basket\r\n if(basketItemIndex != undefined && basketItemIndex > -1) {\r\n\r\n if(appState.basket){\r\n let basket: IMopBasket = { ...appState.basket.basket, menuItems: [] } //create new basket to map updated items to\r\n\r\n console.log(\"Menu Items: \", appState.basket.basket.menuItems);\r\n if(appState.basket.basket.menuItems){\r\n let basketItems: IMopMenuItemDetail[] = appState.basket.basket.menuItems.map((item, index) => { //map over basket items\r\n if(index == basketItemIndex){ //if we're on the basket item to update, return updated item\r\n return currentBasketItem;\r\n }\r\n return item;\r\n }) as IMopMenuItemDetail[];\r\n \r\n basket.menuItems = basketItems;\r\n console.log(basketItems, basket);\r\n\r\n dispatch(actionCreators.calculateBasket(basket));\r\n }\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 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 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, () => {\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 // 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: IMopBasket | ILoginError) => {\r\n if (loginHasExpired(data)) {\r\n dispatch(resetMessage(\"showExpireModal\"))\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 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, (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, (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 \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 calculateBasket: (basket?: IMopBasket, callback?: any) : AppThunkAction => (dispatch, getState) => {\r\n\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 basket = basket != undefined ? basket : appState.basket?.basket; //If parameter undefined, just update current basket.\r\n\r\n fetch(`${baseUrl()}/basket/${channelIdentifier}/calculatebasket${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(basket)\r\n })\r\n .then(response => response.json() as Promise)\r\n .then((data: IMopBasket | ILoginError) => {\r\n if (loginHasExpired(data)) {\r\n dispatch(resetMessage(\"showExpireModal\"))\r\n }\r\n else {\r\n console.log(\"Setting basket\", data);\r\n let actualItems = data.menuItems.filter((x) => x.isDiscount == null || x.isDiscount == false);\r\n let totalQuantity = actualItems.reduce((prev, curr) => {\r\n return prev + (curr.quantity || 0);\r\n }, 0);\r\n dispatch({ type: 'BASKET_UPDATE', basket: data, totalQuantity: totalQuantity });\r\n callback && callback(data);\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 showAllergenPopup: (value: boolean): AppThunkAction => (dispatch) => {\r\n dispatch({ type: \"SHOW_ALLERGEN_POPUP\", 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 console.log(\"Action Type: \", action.type);\r\n switch (action.type) {\r\n case 'BASKET_UPDATE':\r\n return {\r\n ...state,\r\n totalQuantity: action.totalQuantity,\r\n basket: action.basket\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(\"Loading default basket state\", _unloadedState.basket);\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 }\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 '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_POPUP\":\r\n return {\r\n ...state,\r\n showAllergenPopup: 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 default:\r\n return state;\r\n }\r\n return state;\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 { ILoginError, loginHasExpired } from '../helpers/apiHelpers';\r\nimport { resetMessage, ResetMessageAction } from './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 menuItem: IMopMenuItemDetail | null;\r\n}\r\n\r\nconst auxMenuDatatemp: AuxMenuItemData = {\r\n \"detailsPageSettings\": {\r\n \"dropdownBackgroundColour\": \"#172a2e\",\r\n \"dropdownFontColour\": \"#fff\"\r\n },\r\n \"mustSelectTagOverrides\": [\r\n {\r\n \"mustSelectTagValue\": 1,\r\n \"auxJsonFilters\": {\r\n \"groups\": [\r\n {\r\n \"groupTitle\": \"Base\",\r\n \"selectors\": [\r\n {\r\n \"name\": \"Hot Whole Chicken\",\r\n \"enabled\": true,\r\n \"price\": 0,\r\n \"quantitySelected\": 0\r\n },\r\n {\r\n \"name\": \"Cold Whole Chicken\",\r\n \"price\": 0,\r\n \"enabled\": true,\r\n \"quantitySelected\": 0\r\n },\r\n {\r\n \"name\": \"Half Chicken\",\r\n \"price\": 0,\r\n \"enabled\": true,\r\n \"quantitySelected\": 0\r\n },\r\n {\r\n \"name\": \"Chicken Leg\",\r\n \"price\": 0,\r\n \"enabled\": true,\r\n \"quantitySelected\": 0\r\n },\r\n {\r\n \"name\": \"Chicken Drum\",\r\n \"price\": 0,\r\n \"enabled\": true,\r\n \"quantitySelected\": 0\r\n }\r\n ]\r\n },\r\n {\r\n \"groupTitle\": \"Flavour\",\r\n \"selectors\": [\r\n {\r\n \"name\": \"Peri Peri\",\r\n \"price\": 0,\r\n \"enabled\": true,\r\n \"quantitySelected\": 0\r\n },\r\n {\r\n \"name\": \"Plain\",\r\n \"price\": 0,\r\n \"enabled\": true,\r\n \"quantitySelected\": 0\r\n },\r\n {\r\n \"name\": \"Thai\",\r\n \"price\": 0,\r\n \"enabled\": true,\r\n \"quantitySelected\": 0\r\n },\r\n {\r\n \"name\": \"BBQ\",\r\n \"price\": 0,\r\n \"enabled\": true,\r\n \"quantitySelected\": 0\r\n },\r\n {\r\n \"name\": \"Jerk\",\r\n \"price\": 0,\r\n \"enabled\": true,\r\n \"quantitySelected\": 0\r\n },\r\n {\r\n \"name\": \"Garlic, Lemon and Herb\",\r\n \"price\": 0,\r\n \"enabled\": true,\r\n \"quantitySelected\": 0\r\n },\r\n {\r\n \"name\": \"Masala\",\r\n \"price\": 0,\r\n \"enabled\": true,\r\n \"quantitySelected\": 0\r\n }\r\n ]\r\n }\r\n ],\r\n \"outcomes\": [\r\n {\r\n \"filters\": [\r\n \"Whole Chicken\",\r\n \"Plain\"\r\n ],\r\n \"sku\": \"111551622\"\r\n },\r\n {\r\n \"filters\": [\r\n \"Whole Chicken\",\r\n \"BBQ\"\r\n ],\r\n \"sku\": \"111551649\"\r\n },\r\n {\r\n \"filters\": [\r\n \"Whole Chicken\",\r\n \"Thai\"\r\n ],\r\n \"sku\": \"111551665\"\r\n },\r\n {\r\n \"filters\": [\r\n \"Whole Chicken\",\r\n \"Peri Peri\"\r\n ],\r\n \"sku\": \"111551681\"\r\n },\r\n {\r\n \"filters\": [\r\n \"Whole Chicken\",\r\n \"Garlic, Lemon and Herb\"\r\n ],\r\n \"sku\": \"111551702\"\r\n },\r\n {\r\n \"filters\": [\r\n \"Whole Chicken\",\r\n \"Masala\"\r\n ],\r\n \"sku\": \"111551729\"\r\n },\r\n {\r\n \"filters\": [\r\n \"Whole Chicken\",\r\n \"Jerk\"\r\n ],\r\n \"sku\": \"112044585\"\r\n },\r\n {\r\n \"filters\": [\r\n \"Half Chicken\",\r\n \"Plain\"\r\n ],\r\n \"sku\": \"111551446\"\r\n },\r\n {\r\n \"filters\": [\r\n \"Half Chicken\",\r\n \"BBQ\"\r\n ],\r\n \"sku\": \"111551462\"\r\n },\r\n {\r\n \"filters\": [\r\n \"Half Chicken\",\r\n \"Thai\"\r\n ],\r\n \"sku\": \"111551489\"\r\n },\r\n {\r\n \"filters\": [\r\n \"Half Chicken\",\r\n \"Peri Peri\"\r\n ],\r\n \"sku\": \"111551500\"\r\n },\r\n {\r\n \"filters\": [\r\n \"Half Chicken\",\r\n \"Garlic, Lemon and Herb\"\r\n ],\r\n \"sku\": \"111551526\"\r\n },\r\n {\r\n \"filters\": [\r\n \"Half Chicken\",\r\n \"Masala\"\r\n ],\r\n \"sku\": \"111551542\"\r\n },\r\n {\r\n \"filters\": [\r\n \"Half Chicken\",\r\n \"Jerk\"\r\n ],\r\n \"sku\": \"112044489\"\r\n },\r\n {\r\n \"filters\": [\r\n \"Chicken Leg\",\r\n \"Plain\"\r\n ],\r\n \"sku\": \"111550700\"\r\n },\r\n {\r\n \"filters\": [\r\n \"Chicken Leg\",\r\n \"BBQ\"\r\n ],\r\n \"sku\": \"111550726\"\r\n },\r\n {\r\n \"filters\": [\r\n \"Chicken Leg\",\r\n \"Thai\"\r\n ],\r\n \"sku\": \"111550742\"\r\n },\r\n {\r\n \"filters\": [\r\n \"Chicken Leg\",\r\n \"Peri Peri\"\r\n ],\r\n \"sku\": \"111550769\"\r\n },\r\n {\r\n \"filters\": [\r\n \"Chicken Leg\",\r\n \"Garlic, Lemon and Herb\"\r\n ],\r\n \"sku\": \"111550785\"\r\n },\r\n {\r\n \"filters\": [\r\n \"Chicken Leg\",\r\n \"Masala\"\r\n ],\r\n \"sku\": \"111550806\"\r\n },\r\n {\r\n \"filters\": [\r\n \"Chicken Leg\",\r\n \"Jerk\"\r\n ],\r\n \"sku\": \"112044420\"\r\n },\r\n {\r\n \"filters\": [\r\n \"Chicken Drum\",\r\n \"Plain\"\r\n ],\r\n \"sku\": \"111550822\"\r\n },\r\n {\r\n \"filters\": [\r\n \"Chicken Drum\",\r\n \"BBQ\"\r\n ],\r\n \"sku\": \"111550849\"\r\n },\r\n {\r\n \"filters\": [\r\n \"Chicken Drum\",\r\n \"Thai\"\r\n ],\r\n \"sku\": \"111550865\"\r\n },\r\n {\r\n \"filters\": [\r\n \"Chicken Drum\",\r\n \"Peri Peri\"\r\n ],\r\n \"sku\": \"111555738\"\r\n },\r\n {\r\n \"filters\": [\r\n \"Chicken Drum\",\r\n \"Garlic, Lemon and Herb\"\r\n ],\r\n \"sku\": \"111550881\"\r\n },\r\n {\r\n \"filters\": [\r\n \"Chicken Drum\",\r\n \"Masala\"\r\n ],\r\n \"sku\": \"111550902\"\r\n },\r\n {\r\n \"filters\": [\r\n \"Chicken Drum\",\r\n \"Jerk\"\r\n ],\r\n \"sku\": \"112044340\"\r\n },\r\n {\r\n \"filters\": [\r\n \"Cold Whole Chicken\",\r\n \"Plain\"\r\n ],\r\n \"sku\": \"111597452\"\r\n },\r\n {\r\n \"filters\": [\r\n \"Cold Whole Chicken\",\r\n \"BBQ\"\r\n ],\r\n \"sku\": \"111597479\"\r\n },\r\n {\r\n \"filters\": [\r\n \"Cold Whole Chicken\",\r\n \"Thai\"\r\n ],\r\n \"sku\": \"111597495\"\r\n },\r\n {\r\n \"filters\": [\r\n \"Cold Whole Chicken\",\r\n \"Peri Peri\"\r\n ],\r\n \"sku\": \"111597516\"\r\n },\r\n {\r\n \"filters\": [\r\n \"Cold Whole Chicken\",\r\n \"Garlic, Lemon and Herb\"\r\n ],\r\n \"sku\": \"111597532\"\r\n },\r\n {\r\n \"filters\": [\r\n \"Cold Whole Chicken\",\r\n \"Masala\"\r\n ],\r\n \"sku\": \"111597559\"\r\n },\r\n {\r\n \"filters\": [\r\n \"Cold Whole Chicken\",\r\n \"Jerk\"\r\n ],\r\n \"sku\": \"112063145\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"mustSelectTagValue\": 0,\r\n \"name\": \"Sauces\"\r\n },\r\n {\r\n \"mustSelectTagValue\": -1,\r\n \"name\": \"Sides\"\r\n }\r\n ]\r\n }\r\n\r\nconst friesJson: MustSelectTagOverride = {\r\n mustSelectTagValue: 0,\r\n name: \"Sides\"\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 ReceiveProductAction {\r\n type: 'RECEIVE_PRODUCT';\r\n menuItemId: number;\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;\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 requestMenuItem: (\r\n menuItemId: number,\r\n pfIdentifier: string,\r\n referrer: string | null,\r\n callback: any,\r\n ): 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: IMopMenuItemDetail | ILoginError) => {\r\n if (loginHasExpired(data)) {\r\n dispatch(resetMessage(\"showExpireModal\"))\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 callback && callback();\r\n }\r\n });\r\n dispatch({\r\n type: 'REQUEST_PRODUCT',\r\n menuItemId: menuItemId,\r\n pfIdentifier: pfIdentifier,\r\n });\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);\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 //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// ----------------\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, 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_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.menuItemBasePrice,\r\n menuItemTotalPrice: action.menuItem.menuItemBasePrice\r\n },\r\n isLoading: false\r\n };\r\n }\r\n break;\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, { useState } from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { RouteComponentProps } from 'react-router';\r\nimport { IonItem, IonLabel, IonPage, IonSpinner } from '@ionic/react';\r\nimport AppHeader from '../components/AppHeader';\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\nimport { refreshOutline } from 'ionicons/icons';\r\n\r\nimport { MenuDataState } from '../store/MenuStoreTypes';\r\n\r\ninterface CategoryProps {\r\n useStoreA: boolean\r\n menuData: MenuDataState\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 & RouteComponentProps<{ categoryIdentifier: string }>\r\n & CategoryProps; // ... plus incoming routing parameters\r\n\r\n\r\nclass Categories extends React.Component {\r\n\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(\r\n +this.props.match.params.categoryIdentifier,\r\n this.props.useStoreA ? \"a\" : \"b\",\r\n this.props.pfIdentifier ?? \"\",\r\n () => {\r\n this.setState({\r\n isLoading: false\r\n }, () => {\r\n console.log(\"Setting state to false\", this.state.isLoading);\r\n });\r\n },\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\r\n let breakUrl = location.pathname.split(\"/\");\r\n let currentCatgegoryId: number = 0;\r\n if (breakUrl.length == 3) {\r\n currentCatgegoryId = +breakUrl[2];\r\n }\r\n this.props.setCurrentCategory(currentCatgegoryId);\r\n }\r\n console.debug(action, location.pathname, location.state)\r\n });\r\n\r\n //this.props.setTitle(\"Menu\",false);\r\n console.debug(\"Mount\");\r\n }\r\n\r\n componentWillUnmount() {\r\n console.debug(\"Unmount\");\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 }\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(\r\n categoryId, \"b\", this.props.pfIdentifier ?? \"\",\r\n () => { this.onReceiveCategoryList(categoryId) }\r\n );\r\n } else {\r\n this.props.requestCategoryList(\r\n categoryId, \"a\", this.props.pfIdentifier ?? \"\",\r\n () => { this.onReceiveCategoryList(categoryId) }\r\n );\r\n }\r\n }\r\n\r\n navigateToMenuItem(menuItemId: number) {\r\n console.debug(\"Navigating to \", menuItemId);\r\n this.props.requestMenuItem(menuItemId, this.props.pfIdentifier ?? \"\", \"\", () => {\r\n this.props.history.push(`/menuitem/${menuItemId}`);\r\n });\r\n }\r\n\r\n goBack() {\r\n this.props.history.goBack();\r\n }\r\n\r\n render() {\r\n\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 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\n}\r\n\r\nconst mapStateToProps = (state: ApplicationState, ownProps: any) => ({\r\n menuData: state.menuData,\r\n useStoreA: ownProps.useStoreA,\r\n pfIdentifier: localStorage.getItem(\"pfIdentifier\"),\r\n});\r\n\r\nconst mapDispatchToProps = (\r\n 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 };\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 * 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 })\r\n .required(\"Email is required.\"),\r\n\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({\r\n path: path,\r\n message: genericCardErrorMessage\r\n });\r\n }\r\n\r\n if (typeof value !== 'string' || !/^[0-9]+$/.test(value)) {\r\n return this.createError({\r\n path: path,\r\n message: genericCardErrorMessage\r\n });\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({\r\n path: path,\r\n message: genericCardErrorMessage\r\n });\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});\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 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\nconst GenericInput = ({ name, 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, { useEffect, useState } from 'react';\r\nimport { IonRow, IonCol, IonContent, IonButton, IonPage, IonItem, IonLabel, IonCheckbox, IonText, IonImg } from '@ionic/react';\r\n\r\nimport './EnterEmail.scss';\r\nimport { useHistory, useLocation } from \"react-router-dom\";\r\n\r\nimport {\r\n\tFormik,\r\n\tFormikProps,\r\n\tField,\r\n\tFieldProps,\r\n} from 'formik';\r\n\r\n\r\nimport { connect } from 'react-redux';\r\nimport * as BasketStore from '../store/BasketStore';\r\nimport { ApplicationState } from '../store';\r\n\r\nimport { enterEmailSchema } from '../helpers/formValidationHelpers';\r\nimport GenericInput from '../inputs/GenericInput';\r\nimport 'react-slidedown/lib/slidedown.css'\r\n\r\ninterface EmailProps {\r\n\temail: string\r\n\tstaffCardNumber: string;\r\n\tconsent: boolean;\r\n}\r\n\r\ntype EmailMergeProps =\r\n\ttypeof BasketStore.actionCreators\r\n\t& EmailProps\r\n\r\nconst EnterEmail: React.FC = (props: EmailMergeProps) => {\r\n\r\n\tlet history = useHistory();\r\n\tconst location = useLocation();\r\n\r\n\tconst [showStaffDiscount, setShowStaffDiscount] = useState(false); //localStorage.getItem(\"staffCardNumber\") != null - To show it when we find a staffCardNumber in localStorage \r\n\r\n\tconst [initialValues, setInitialValues] = useState({});\r\n\r\n\tuseEffect(() => {\r\n\t\t//console.log( \"Local storage: \", localStorage.getItem(\"email\"));\r\n\t\tsetInitialValues({ email: localStorage.getItem(\"email\") || props.email, staffCardNumber: localStorage.getItem(\"staffCardNumber\") || props.staffCardNumber, consent: localStorage.getItem(\"consent\") == \"true\" });\r\n\t}, [location.pathname])\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
Where should we send your receipt?
\r\n\t\t\t\t\t {\r\n\t\t\t\t\t\t\t//console.log(\"Submitting\");\r\n\t\t\t\t\t\t\tprops.updateBasketDetails(values, () => {\r\n\t\t\t\t\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\t\t\t\t\t//console.log(\"Pushing to order\");\r\n\t\t\t\t\t\t\t\t\thistory.push({\r\n\t\t\t\t\t\t\t\t\t\tpathname: `/orderconfirmation` //Pushes to confirmation only when basket has been fully updated.\r\n\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t}, 500);\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\t\t\t\t\t\t{props => (\r\n\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\t{localStorage.getItem(\"isLoggedIn\") === \"true\" ? \"Your Morrisons email address\" : \"Your email address\"}*\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\tYour More Card number\r\n\t\t\t\t\t\t\t\t { setShowStaffDiscount(true) }}\r\n\t\t\t\t\t\t\t\t/>\r\n\r\n\t\t\t\t\t\t\t\tEarn exclusive offers when you order from Morrisons Market Kitchen. You'll find your number in your app or on the front of your card.\r\n\t\t\t\t\t\t\t\t{localStorage.getItem('isLoggedIn') !== \"true\" && }\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t{({ field, meta }: FieldProps) => {\r\n\t\t\t\t\t\t\t\t\t\treturn
\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\tRemember my details on this device\r\n\t\t\t\t\t\t\t\t\t\t\t\t { props.setFieldValue(field.name, !field.value) }} />\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
\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 {/* Pressing Enter will not submit form without this hidden input */}\r\n\t\t\t\t\t\t\t\t
\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\r\n\t\t\t\t\t\t\t\t\t\t\t\tPay\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\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\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
\r\n\r\n\t\t
\r\n\t);\r\n};\r\n\r\nconst mapStateToProps = (state: ApplicationState, ownProps: any) => ({\r\n\temail: state.basket?.email,\r\n\tstaffCardNumber: state.basket?.basket.staffCardNumber\r\n});\r\n\r\nconst mapDispatchToProps = (dispatch: any) => {\r\n\treturn {\r\n\t\tupdateBasketDetails: (values: any, callback: any) => dispatch(BasketStore.actionCreators.updateBasketDetails(values, callback))\r\n\t};\r\n};\r\n\r\n\r\nexport default connect(\r\n\tmapStateToProps,\r\n\tmapDispatchToProps\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 \r\n createPaymentRequest?: Ptsv2CreatePaymentRequest\r\n cardInformation?: Ptsv2PaymentInformationCard\r\n}\r\n\r\nexport interface IGetRewardDetailsResponse {\r\n showMorePoints: boolean\r\n morePointsRewarded?: number\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 GetRewardDetails = async (basketId?: string) => {\r\n\r\n console.log(\"Get rewards call with\", basketId);\r\n let params: RequestInit = {\r\n method: \"GET\",\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n }\r\n // Ensure baseUrl is correct and doesn't include any backslashes\r\n const base = baseUrl();\r\n const url = `${base}/api/checkout/GetRewardDetails?basketId=${basketId}`;\r\n\r\n const response = await fetch(url, params);\r\n const data = await response.json() as IGetRewardDetailsResponse;\r\n\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: string | null, checkoutResponse: IMopCheckoutResponse | null) => void) => {\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};\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 } from \"react-redux\";\r\nimport { ApplicationState } from \"../store\";\r\nimport { AuthenticatePaymentRequest, CreatePaymentRequest, IAuthenticatePaymentRequest, IMopCheckoutRequest, IMopCheckoutResponse } from \"./checkoutHelper\";\r\nimport { baseUrl } from \"./configHelper\";\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 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 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 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 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, { useState } from 'react';\r\nimport { IonCheckbox, IonItem, IonLabel, IonList, IonRadio } from '@ionic/react';\r\nimport './ProductSingleSelect.scss';\r\nimport { formatCurrency } from '../helpers/currencyHelpers';\r\nimport { useSelector } from 'react-redux';\r\nimport { ApplicationState } from '../store';\r\n\r\ninterface ProductSingleSelect {\r\n productSingleSelectName: string;\r\n disabled?: boolean\r\n onClick?: (categoryId: number) => void;\r\n price?: number | null\r\n isFromPrice?: boolean\r\n checked?: boolean\r\n debugLabel?: string\r\n onChange?: (v: any) => void\r\n kcal?: number\r\n}\r\n\r\nconst ProductExtra: React.FC = ({ productSingleSelectName, onClick, disabled, price, isFromPrice, checked, debugLabel, onChange, kcal}) => {\r\n\r\n const headerState = useSelector((state: ApplicationState) => state.headerFooter);\r\n //kcal = 1234;\r\n\r\n return (\r\n \r\n \r\n {\r\n price\r\n ?\r\n \r\n
\r\n \r\n {\r\n (kcal != undefined && kcal >= 0) &&\r\n \r\n ({kcal}kcal)\r\n \r\n }\r\n
\r\n
{isFromPrice && \"From \"}{formatCurrency(price)}
\r\n
\r\n :\r\n \r\n
\r\n \r\n {\r\n (kcal != undefined && kcal >= 0) &&\r\n \r\n ({kcal}kcal)\r\n \r\n }\r\n
\r\n
\r\n }\r\n {\r\n checked != undefined \r\n ?\r\n onChange && onChange(e.detail.value)} disabled={disabled} item-left slot=\"start\" value={productSingleSelectName} checked={checked}>\r\n :\r\n \r\n }\r\n {\r\n headerState?.showDebugLabel &&\r\n
\r\n {debugLabel}\r\n
\r\n }\r\n\r\n
\r\n );\r\n};\r\n\r\nexport default ProductExtra;\r\n","import React, { useEffect, useState } from 'react';\r\nimport {IonRow, IonCol, IonItem } from '@ionic/react';\r\nimport './QuantityInput.scss'; //Styling for plus minus buttons used in MopFooterMenuItem.tsx\r\n\r\ninterface IQuantityInput {\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\nconst QuantityInput: React.FC = ({value, onChange, subtractButtonColour, addButtonColour, disableAddQuantityButton, disableDecreaseQuantityButton, valueColour, className}) => {\r\n\r\n return (\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\nexport default QuantityInput;","import React, { useState } from 'react';\r\nimport { IonItem, IonLabel, IonCheckbox, IonCol, IonGrid, IonRow, IonItemGroup, } from '@ionic/react';\r\nimport './ProductMultiSelect.scss';\r\nimport QuantityInput from './QuantityInput';\r\n\r\ninterface ProductMultiSelect {\r\n productMultiSelectName: string;\r\n isSelected: boolean;\r\n showQuantityComponent: boolean;\r\n menuItem: IMopModifierGroupItem;\r\n disableCheckbox?: boolean;\r\n disableAddQuantityButton?: boolean;\r\n onClick: (menuItem: IMopModifierGroupItem, quantity: number) => void;\r\n}\r\n//menuItem.max\r\nconst ProductExtra: React.FC = ({ productMultiSelectName, onClick, isSelected, menuItem, showQuantityComponent, disableCheckbox, disableAddQuantityButton}) => {\r\n //menuItem.kcal = 1234;\r\n return (\r\n \r\n \r\n \r\n \r\n {productMultiSelectName}{(menuItem.kcal != undefined && menuItem.kcal >= 0) && ({menuItem.kcal}kcal)}\r\n { onClick(menuItem, isSelected ? 0 : 1); } }/>\r\n \r\n \r\n {\r\n showQuantityComponent &&\r\n \r\n { onClick(menuItem, quantity ); } }\r\n />\r\n \r\n } \r\n \r\n \r\n );\r\n};\r\n\r\nexport default ProductExtra;\r\n","import React, { useEffect, useState } from 'react';\r\nimport './AltQuantityInput.scss'; //Styling for plus minus buttons used in MopFooterMenuItem.tsx\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, { useState, useEffect, ReactNode } from 'react';\r\nimport { IonItem, IonLabel, IonRadio, IonGrid,IonList,IonRadioGroup, IonCol, IonRow, IonIcon } from '@ionic/react';\r\nimport * as MenuItemDataStore from '../store/MenuItemStore';\r\nimport './ModifierGroup.scss';\r\nimport ProductSingleSelect from '../components/ProductSingleSelect';\r\nimport ProductMultiSelect from '../components/ProductMultiSelect';\r\nimport { menuSingleItemSelected } from '../helpers/menuHelpers';\r\nimport { getConfig } from '../helpers/configHelper';\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\nimport { formatCurrency } from '../helpers/currencyHelpers';\r\nimport QuantityInput from './QuantityInput';\r\n\r\nimport AltQuantityInput from './AltQuantityInput';\r\n\r\nimport {SlideDown} from 'react-slidedown'\r\nimport 'react-slidedown/lib/slidedown.css'\r\nimport { chevronDownOutline, chevronUpOutline, menu } from 'ionicons/icons';\r\nimport HorizontalRadioGroup from './HorizontalRadioGroup';\r\n\r\n\r\ninterface IModifierGroup {\r\n \r\n modifierGroup: IMopModifierGroup;\r\n menuItem: IMopMenuItemDetail | null;\r\n onClick?: (categoryId: number) => void;\r\n isDropdownOpen: boolean;\r\n onToggleDropdown: (v: boolean, id: string) => void;\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, onClick, menuItem, isDropdownOpen, onToggleDropdown, localId, onSelectedSingle, isColleague }) => {\r\n\r\n let { groupTitle, canSelectMultiple, itemsAreChargeable, maxDifferentItems, maxPoints, minDifferentItems, modifierGroupItems, groupType, auxMenuItemData: auxData } = modifierGroup;\r\n\r\n const headerState = useSelector((state: ApplicationState) => state.headerFooter);\r\n const isBasket = useSelector((state: ApplicationState) => state.menuItemData?.isBasket);\r\n const boundUpdateItem = bindActionCreators(menuItemStore.actionCreators.updateModifierGroupItem, useDispatch());\r\n \r\n\r\n const [selected, setSelected] = useState();\r\n const [totalQuantitySelected, setTotalQuantitySelected] = useState(0);\r\n const [chosenItems, setChosenItems] = useState([]);\r\n const [updated, setUpdated] = useState(false);\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 const getModifierComponent = (singleLine?: boolean): JSX.Element[] => {\r\n let nodes: JSX.Element[] = [];\r\n if(groupType == 10 || groupType == 60){ \r\n \r\n //if(auxData && auxData.controlOrientationHorizontal){\r\n // nodes = [ setSelected(e.detail.value)} GroupItems={modifierGroupItems}/>]\r\n console.log(nodes, modifierGroupItems);\r\n //}\r\n //else{\r\n\r\n nodes = modifierGroupItems?.map((mgi: IMopModifierGroupItem, index: number) => {\r\n let { menuItemId, menuItemName, sku, defaultQuantitySelected, price, quantitySelected } = mgi;\r\n\r\n return ( //onIonChange - update quantitySelected property?\r\n \r\n setSelected(e.detail.value)}> \r\n
\r\n \r\n
\r\n
\r\n
\r\n )\r\n })\r\n \r\n //}\r\n }\r\n if(groupType == 30 || groupType == 40){ \r\n nodes = modifierGroupItems?.map((mgi: IMopModifierGroupItem, index: number) => {\r\n let { menuItemId, menuItemName, sku, defaultQuantitySelected, price, quantitySelected } = mgi;\r\n return (\r\n \r\n 0} \r\n productMultiSelectName={menuItemName} \r\n isSelected={quantitySelected > 0} \r\n disableCheckbox={totalQuantitySelected >= maxDifferentItems && quantitySelected < 1 && maxDifferentItems > 0}\r\n disableAddQuantityButton={(totalQuantitySelected >= maxDifferentItems && maxDifferentItems > 0) || (mgi.maxQuantity != null && quantitySelected >= mgi.maxQuantity)}\r\n menuItem={mgi} \r\n onClick={handleChange} \r\n >\r\n {\r\n headerState?.showDebugLabel &&\r\n
\r\n {sku} {menuItemId}\r\n
\r\n }\r\n
\r\n )\r\n \r\n })\r\n }\r\n if(groupType == 20 || groupType == 50){\r\n nodes = modifierGroupItems?.map((mgi: IMopModifierGroupItem, index: number) => {\r\n //mgi.kcal = 1234;\r\n //console.log(\"Returning \", mgi.menuItemName);\r\n return (\r\n \r\n \r\n \r\n
\r\n ({mgi.kcal}kcal)\r\n
\r\n
\r\n \r\n
+{formatCurrency(mgi.price)}
\r\n
\r\n \r\n { handleChange(mgi, quantity ); } }/>\r\n \r\n
\r\n
)\r\n })\r\n }\r\n return nodes;\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 }, []);\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 \r\n let menuItem: IMopModifierGroupItem = modifierGroupItems.find((item: IMopModifierGroupItem) => item.menuItemName == selected);\r\n let prevItem: IMopModifierGroupItem = modifierGroupItems.find((item: IMopModifierGroupItem) => item.quantitySelected == 1 && item.defaultQuantitySelected != 1);\r\n console.log(\"Selected\", selected, menuItem, prevItem, \"isBasket\", isBasket, \"isColleague\", isColleague);\r\n if(menuItem){\r\n handleChange(menuItem, 1);\r\n if(prevItem && prevItem.menuItemId != menuItem.menuItemId){\r\n setUpdated(true);\r\n handleChange(prevItem, 0);\r\n //console.log(menuItem, prevItem);\r\n 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(localId);\r\n }\r\n }\r\n } \r\n } \r\n }, [selected])\r\n\r\n //Max Quantity Handler\r\n useEffect(() => {\r\n let total = 0;\r\n let chosen = [];\r\n for(let i = 0; i < modifierGroupItems.length; i++){\r\n let item: IMopModifierGroupItem = modifierGroupItems[i];\r\n total += item.quantitySelected;\r\n if(item.quantitySelected > 0){\r\n chosen.push(item.menuItemName);\r\n }\r\n }\r\n\r\n setChosenItems(chosen);\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 const detailsPageSettings = menuItem?.auxData?.detailsPageSettings;\r\n\r\n return (\r\n \r\n {getConfig().isMarket \r\n ?\r\n <>\r\n {\r\n (!auxData || !auxData.hideDefaultTitle) \r\n ?\r\n <>\r\n {\r\n
\r\n
\r\n
These will be added to your order
\r\n
\r\n }\r\n {\r\n getModifierComponent()\r\n }\r\n \r\n :\r\n (modifierGroupItems.length > 1 && !auxData.hideDropdown) \r\n ?\r\n <>\r\n { onToggleDropdown(!isDropdownOpen, localId); }}>\r\n
0 ? \"selected\" : \"\"}`}>\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 : \"Choose your \" + 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
\r\n \r\n {getModifierComponent(modifierGroupItems.length == 1)}\r\n \r\n \r\n :\r\n <>\r\n {\r\n (auxData.showCustomTitle && auxData.name) \r\n &&\r\n
\r\n
{auxData.name}
\r\n {\r\n auxData.description &&\r\n
{auxData.description}
\r\n }\r\n
\r\n }\r\n {\r\n getModifierComponent()\r\n }\r\n \r\n\r\n }\r\n \r\n \r\n :\r\n <>\r\n
\r\n
\r\n
These will be added to your order
\r\n
\r\n <>\r\n {getModifierComponent()} \r\n \r\n \r\n }\r\n
\r\n );\r\n};\r\n\r\nexport default ModifierGroup;\r\n","import { IonGrid, IonIcon, IonItem, IonList, IonRadioGroup } from \"@ionic/react\";\r\nimport { chevronDownOutline, chevronUpOutline, menu } from \"ionicons/icons\";\r\nimport React, { useEffect, useRef, useState } from \"react\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport SlideDown from \"react-slidedown\";\r\nimport { bindActionCreators } from \"redux\";\r\nimport { ApplicationState } from \"../store\";\r\nimport ProductSingleSelect from \"./ProductSingleSelect\";\r\nimport * as menuItemStore from \"../store/MenuItemStore\";\r\n\r\ninterface AuxJsonModifierFiltersProps {\r\n auxFilterGroup: AuxJsonFilterGroup\r\n detailsPageSettings?: DetailsPageSettings\r\n modifierIndex: number\r\n auxFilterIndex: number\r\n isDropdownOpen: boolean;\r\n onToggleDropdown: (v: boolean, id: string) => void;\r\n onSelectedSingle: (id: string) => void;\r\n localId: string;\r\n}\r\n\r\nconst AuxJsonModifierFilters: React.FC = ({ auxFilterGroup, modifierIndex, detailsPageSettings, auxFilterIndex, isDropdownOpen, onToggleDropdown, onSelectedSingle, localId }) => {\r\n\r\n /*\r\n\r\n\r\n */\r\n\r\n const isBasket = useSelector((state: ApplicationState) => state.menuItemData?.isBasket);\r\n const menuItem = useSelector((state: ApplicationState) => state.menuItemData?.menuItem);\r\n const updateAuxFilterItemQuantity = bindActionCreators(menuItemStore.actionCreators.updateAuxFilterItemQuantity, useDispatch());\r\n const calculateAuxFilters = bindActionCreators(menuItemStore.actionCreators.calculateAuxFilterItems, useDispatch());\r\n const [totalQuantitySelected, setTotalQuantitySelected] = useState(0);\r\n const [chosenItems, setChosenItems] = useState(\"\");\r\n const [selected, setSelected] = useState(\"\");\r\n\r\n useEffect(() => {\r\n calculateAuxFilters(modifierIndex);\r\n if(auxFilterGroup && menuItem){\r\n //console.log(\"Modifier Groups:\", menuItem.modifierGroups);\r\n let modGroup: IMopModifierGroup = menuItem.modifierGroups[modifierIndex];\r\n let selectedModItem: IMopModifierGroupItem | undefined = modGroup.modifierGroupItems.find((mod: IMopModifierGroupItem) => mod.quantitySelected > 0);\r\n\r\n //If no mod item selected, select the first one by default.\r\n if(!selectedModItem && modGroup.modifierGroupItems.length > 0 && modGroup.auxMenuItemData?.auxJsonFilters?.outcomes && modGroup.auxMenuItemData.auxJsonFilters.outcomes.length > 0){\r\n selectedModItem = modGroup.modifierGroupItems.find((m: IMopModifierGroupItem) => m.sku == modGroup.auxMenuItemData?.auxJsonFilters?.outcomes[0].sku);\r\n }\r\n else{\r\n console.log(\"No modifier group items OR No outcomes in this group.\");\r\n }\r\n\r\n if(selectedModItem){ \r\n let outcome = modGroup.auxMenuItemData?.auxJsonFilters?.outcomes.find((o) => o.sku == selectedModItem?.sku);\r\n if(outcome){\r\n let _selected = auxFilterGroup.selectors.find((s) => outcome?.filters.includes(s.tag ?? s.name));\r\n if(_selected){\r\n onSelected(_selected.name, true);\r\n }\r\n else{\r\n console.log(\"Could not find a selector associated with the outcome\");\r\n }\r\n }\r\n else{\r\n console.log(\"Could not find an outcome for the selected modifier item\");\r\n }\r\n }\r\n else{\r\n console.log(\"Cannot select default modifier group item using first available outcome or group item\");\r\n }\r\n }\r\n }, []);\r\n \r\n useEffect(() => {\r\n let total = 0;\r\n let chosen = \"\";\r\n for(let i = 0; i < auxFilterGroup.selectors.length; i++){\r\n let selector = auxFilterGroup.selectors[i];\r\n total += selector.quantitySelected;\r\n if(selector.quantitySelected > 0){\r\n if(!selector.enabled && selector.name == selected){\r\n //If selected but disabled, it needs updating to the nearest available\r\n //This occurs when a modifier group item is selected in different group which has no outcomes that match this selected item.\r\n let targetSelector = auxFilterGroup.selectors.find((s) => s.enabled);\r\n if(targetSelector){\r\n setSelected(targetSelector.name);\r\n } \r\n }\r\n else{\r\n chosen += chosen == \"\" ? \"\" : \", \";\r\n chosen += `${selector.quantitySelected > 1 ? selector.quantitySelected + \" x \" : \"\"}${selector.name}`;\r\n }\r\n \r\n }\r\n }\r\n\r\n setChosenItems(chosen);\r\n setTotalQuantitySelected(total);\r\n }, [auxFilterGroup])\r\n\r\n useEffect(() => {\r\n let selectedItem: AuxJsonFilterMenuItem | undefined = auxFilterGroup.selectors.find((item) => item.name == selected);\r\n let prevItem: AuxJsonFilterMenuItem | undefined = auxFilterGroup.selectors.find((item) => item.quantitySelected == 1);\r\n if(selectedItem && selectedItem.quantitySelected != 1){\r\n handleChange(selectedItem, 1);\r\n }\r\n if(prevItem){\r\n handleChange(prevItem, 0);\r\n }\r\n calculateAuxFilters(modifierIndex);\r\n }, [selected]);\r\n\r\n const onSelected = (name: string, ignoreSelectedEvent?: boolean) => {\r\n //onSelectedSingle will cause the next dropdown to open, We ignore when setting defaults.\r\n if(!ignoreSelectedEvent){\r\n onSelectedSingle(localId);\r\n }\r\n setSelected(name);\r\n }\r\n\r\n const handleChange = (item: AuxJsonFilterMenuItem, quantity: number) => {\r\n let selectorIndex = auxFilterGroup.selectors.findIndex((s) => s.name == item.name);\r\n\r\n console.log(\"Updated\", item.name, \"quantity to\", quantity);\r\n updateAuxFilterItemQuantity(quantity, modifierIndex, auxFilterIndex, selectorIndex);\r\n }\r\n\r\n return(\r\n \r\n { onToggleDropdown(!isDropdownOpen, localId); }}>\r\n
0 ? \"selected\" : \"\"}`}>\r\n
\r\n {\r\n totalQuantitySelected > 0\r\n ?\r\n
\r\n
{auxFilterGroup.groupTitle}: Click to change
\r\n
{chosenItems}
\r\n
\r\n :\r\n
Choose your {auxFilterGroup.groupTitle}
\r\n }\r\n
\r\n {\r\n isDropdownOpen \r\n ?\r\n \r\n :\r\n \r\n }\r\n
\r\n
\r\n \r\n \r\n { console.log(\"Selected ionChange\"); onSelected(e.detail.value) }}>\r\n {\r\n auxFilterGroup.selectors.map((item) => {\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\nexport default AuxJsonModifierFilters;","import React, { useState } from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { IonGrid, IonRow, IonCol, IonContent, IonHeader, IonFooter, IonRouterLink, IonPage, IonTitle, IonToolbar, IonInput, IonItem, IonLabel, IonList, IonItemDivider, IonThumbnail, IonImg, IonRadioGroup, IonRadio, IonCheckbox } from '@ionic/react';\r\nimport AppHeader from '../components/AppHeader';\r\nimport { ApplicationState } from '../store';\r\nimport * as HeaderFooterStore from '../store/HeaderFooterStore';\r\nimport * as MenuDataStore from '../store/MenuStore';\r\nimport * as MenuItemDataStore from '../store/MenuItemStore';\r\nimport { RouteComponentProps } from 'react-router';\r\nimport './MenuItem.scss';\r\nimport ProductExtra from '../components/ProductExtra';\r\nimport ProductSingleSelect from '../components/ProductSingleSelect';\r\nimport ProductMultiSelect from '../components/ProductMultiSelect';\r\nimport ModifierGroup from '../components/ModifierGroup';\r\nimport AllergenInfoModal from '../modals/AllergenInfoModal';\r\nimport { baseUrl } from '../helpers/configHelper';\r\nimport { getConfig } from '../helpers/configHelper';\r\nimport HeaderDescription from '../components/HeaderDescription';\r\nimport AuxJsonModifierFilters from '../components/AuxJsonFilterModifierGroups';\r\n\r\ninterface MenuItemOwnProps {\r\n menuItemData: MenuItemDataStore.MenuItemDataState\r\n isBasket: boolean\r\n isColleague: boolean\r\n}\r\n\r\ninterface MenuItemState {\r\n allergenInfoOpen: boolean;\r\n dropdowns: DropdownConfig[];\r\n showModifierGroupItemCalories: boolean;\r\n}\r\n\r\ninterface DropdownConfig {\r\n id: string,\r\n open: boolean;\r\n}\r\n\r\n// At runtime, Redux will merge together...\r\ntype MenuItemProps =\r\n typeof MenuItemDataStore.actionCreators // ... plus action creators we've requested\r\n & typeof HeaderFooterStore.actionCreators\r\n & RouteComponentProps<{ categoryIdentifier: string }>\r\n & MenuItemOwnProps;\r\n\r\n\r\nclass MenuItem extends React.Component {\r\n\r\n\r\n constructor(props: any) {\r\n super(props);\r\n this.state = { \r\n allergenInfoOpen: false, \r\n dropdowns: [],\r\n showModifierGroupItemCalories: false\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n if (this.props.menuItemData.menuItem) {\r\n this.props.setTitle(this.props.menuItemData.menuItem.menuItemName, true);\r\n\r\n let menuItem = this.props.menuItemData.menuItem;\r\n\r\n /*\r\n This keeps track of all dropdown menus from both sources (menuItem.modifierGroup and modifierGroup.auxMenuItemData groups)\r\n into a standard array to help control which dropdowns are open. \r\n */\r\n let dropdownCofigs: DropdownConfig[] = [];\r\n for(let i = 0; i < menuItem.modifierGroups.length; i++){\r\n let group: IMopModifierGroup = menuItem.modifierGroups[i];\r\n if(group.auxMenuItemData?.auxJsonFilters?.groups){ \r\n //This menuItem has auxJson Modifier Groups, so we show the calorie information of the seleceted modifier group item. \r\n this.setState({ showModifierGroupItemCalories: true });\r\n for(let j = 0; j < group.auxMenuItemData.auxJsonFilters.groups.length; j++){\r\n dropdownCofigs.push({\r\n id: i + \"_\" + j,\r\n open: dropdownCofigs.length == 0 ? true : false\r\n });\r\n }\r\n }\r\n else{\r\n dropdownCofigs.push({\r\n id: i.toString(),\r\n open: dropdownCofigs.length == 0 ? true : false\r\n });\r\n }\r\n }\r\n\r\n this.setState({ dropdowns: dropdownCofigs});\r\n }\r\n }\r\n\r\n componentWillUnmount() {\r\n //Check if it's basket update, if so then dispatch SHOW_BASKET_MODAL\r\n if (this.props.isBasket) {\r\n this.props.setBasketShowModal(true);\r\n }\r\n }\r\n\r\n goBack() {\r\n this.props.history.goBack();\r\n }\r\n\r\n openAllergenInfo() {\r\n this.setState({ allergenInfoOpen: true });\r\n }\r\n closeAllergenInfo() {\r\n this.setState({ allergenInfoOpen: false });\r\n }\r\n\r\n onToggleDropdown(value: boolean, id: string) {\r\n\r\n let prevOpen = this.state.dropdowns.find((d) => d.open);\r\n this.setState({\r\n dropdowns: this.state.dropdowns.map((d) => {\r\n if(d.id == id){\r\n return { ...d, open: value}\r\n }\r\n else if(prevOpen && d.id == prevOpen.id){\r\n return {...d, open: false}\r\n }\r\n else{\r\n return d;\r\n }\r\n })\r\n })\r\n }\r\n\r\n onSelectedSingle(id: string) {\r\n /*\r\n When selected, call this method with the ID of the group,\r\n find the index of the Id in the group and then if there is a NEXT group, call onToggleDropdown\r\n */\r\n\r\n let thisDropdown = this.state.dropdowns.findIndex((d) => d.id == id);\r\n\r\n if(thisDropdown > -1){\r\n if(thisDropdown + 1 < this.state.dropdowns.length){\r\n console.log(\"Changing dropdown...\", thisDropdown, this.state.dropdowns);\r\n this.onToggleDropdown(true, this.state.dropdowns[thisDropdown + 1].id);\r\n }\r\n else{\r\n console.log(\"End of array\", thisDropdown, this.state.dropdowns);\r\n }\r\n }\r\n else{\r\n console.log(\"Unable to find dropdown ID\", id);\r\n }\r\n }\r\n\r\n render() {\r\n\r\n const { menuItemName, menuItemImage, description, modifierGroups, allergenInfo, sku, itemTags, kcal,menuItemBasePrice, pdpRoundels } = this.props.menuItemData.menuItem || {};\r\n\r\n return (\r\n\r\n \r\n \r\n \r\n {\r\n (() => {\r\n /*\r\n If this menu item contains modifier groups with AuxJson modifier groups, then we show the calorie information above the modifier groups. \r\n */\r\n\r\n if(this.state.showModifierGroupItemCalories && modifierGroups && modifierGroups.length > 0){\r\n let targetModifierGroup = modifierGroups.find((m: IMopModifierGroup) => m.auxMenuItemData?.auxJsonFilters?.outcomes && m.auxMenuItemData?.auxJsonFilters?.groups);\r\n if(targetModifierGroup){\r\n let selectedModifierGroupItem: IMopModifierGroupItem = targetModifierGroup.modifierGroupItems.find((item: IMopModifierGroupItem) => item.quantitySelected > 0);\r\n if(selectedModifierGroupItem){\r\n return(\r\n
\r\n
Currently selected:
\r\n
{selectedModifierGroupItem.menuItemName}
\r\n {\r\n selectedModifierGroupItem.kcal &&\r\n
({selectedModifierGroupItem.kcal}kcal)
\r\n }\r\n
\r\n )\r\n } \r\n else{\r\n console.log(\"No modifier group item selected.\")\r\n }\r\n }\r\n else{\r\n console.log(\"Can't find auxJsonFilters for any modifier group in this menu item\");\r\n }\r\n }\r\n })() \r\n }\r\n\r\n {modifierGroups?.map((mg: IMopModifierGroup, index: number) => {\r\n if(mg.auxMenuItemData?.auxJsonFilters?.groups && mg.auxMenuItemData.auxJsonFilters.outcomes){\r\n return <>\r\n {\r\n mg.auxMenuItemData.auxJsonFilters.groups.map((group, j) => {\r\n let localId = index + \"_\" + j;\r\n let dropdownConfig = this.state.dropdowns.find((d) => d.id == localId);\r\n return \r\n })\r\n }\r\n \r\n }else{\r\n let dropdownConfig = this.state.dropdowns.find((d) => d.id == index.toString());\r\n return \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 './Location.scss';\r\nimport React, { useState } from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { RouteComponentProps } from 'react-router';\r\nimport { ApplicationState } from '../store';\r\nimport * as LocationStore from '../store/LocationStore';\r\nimport { locationSharp, qrCode } from 'ionicons/icons';\r\nimport { IonContent ,IonPage, IonButton, IonIcon} from '@ionic/react';\r\nimport { getConfig } from '../helpers/configHelper';\r\n//import AppHeader from '../components/AppHeader';\r\n\r\ntype LocationProps =\r\n LocationStore.LocationState &\r\n typeof LocationStore.actionCreators &\r\n RouteComponentProps;\r\n\r\nclass Location extends React.Component {\r\n\r\n constructor(props: any) {\r\n super(props);\r\n this.geoCallback = this.geoCallback.bind(this);\r\n }\r\n\r\n componentDidMount() {\r\n //this.props.requestClientGeoLocation(this.geoCallback);\r\n }\r\n\r\n geoCallback(latitude: number, longitude: number, accuracy: number, isOk: boolean) {\r\n if (isOk) {\r\n console.debug(`Location.geoCallback: latitude=${latitude}, longitude=${longitude}, accuracy=${accuracy}`);\r\n }\r\n else {\r\n console.error(\"Location.geoCallback: requestClientGeoLocation failed.\");\r\n }\r\n this.props.history.push(`/storesearch`);\r\n }\r\n\r\n findAStore() {\r\n if (Number.isNaN(this.props.clientLatitude))\r\n this.props.requestClientGeoLocation(this.geoCallback);\r\n else\r\n this.props.history.push(`/storesearch`);\r\n }\r\n\r\n ScanAQRCode() {\r\n this.props.history.push(`/scanqrcode`);\r\n }\r\n\r\n render() {\r\n return \r\n \r\n
\r\n
\r\n
Your location
\r\n
Use the options below to find your nearest {getConfig().isMarket ? \"Market Kitchen\" : \"Morrisons Café\"}
\r\n
If you're currently in a store, use your phone's camera to scan the Cafés QR code to place an order to take away. Alternatively, find your nearest store using the location button and place an order for Click and Collect.
\r\n
\r\n
\r\n\r\n this.findAStore()}>\r\n
\r\n \r\n
\r\n
Find a store near you
\r\n
For Click & Collect when you're not in a store
\r\n
\r\n
\r\n
\r\n this.ScanAQRCode()}>\r\n
\r\n \r\n
\r\n
Scan a QR Code
\r\n
If you're in a store, see our posters near the cafés
\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 connect(\r\n (state: ApplicationState) => state.location, // Selects which state properties are merged into the component's props\r\n LocationStore.actionCreators // Selects which action creators are merged into the component's props\r\n)(Location as any); // eslint-disable-line @typescript-eslint/no-explicit-any","import React, { useEffect, useState } 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 { useHistory } from \"react-router-dom\";\r\nimport { bindActionCreators } from 'redux';\r\nimport { useDispatch } from 'react-redux';\r\nimport AltQuantityInput from './AltQuantityInput';\r\n\r\ninterface BasketItemRowProps {\r\n basketItem: IMopMenuItemDetail;\r\n readOnly: boolean;\r\n //onClick?: (basketItemId: number) => void;\r\n}\r\n\r\ntype BasketItemRowMergeProps =\r\n typeof MenuItemDataStore.actionCreators\r\n & BasketItemRowProps;\r\n\r\nconst BasketItemRow: React.FC = ({ basketItem, readOnly }) => {\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 [removeAlertIsOpen, setRemoveAlertIsOpen] = useState(false);\r\n const [basePrice, setBasePrice] = 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 useEffect(() => {\r\n setBasePrice(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 {isCoupon && {getCouponCode()} - }\r\n \r\n \r\n {`${formatCurrency(basePrice * basketItem.quantity)}${basketItem.quantity > 1 ? ` (${formatCurrency(basePrice)} each)` : \"\"}`}\r\n \r\n \r\n \r\n \r\n
    \r\n <>\r\n {\r\n basketItem.optionsText && basketItem.optionsText.replace(/\\./g, ',').split(/[,]/).map((el, i, { length }) => {\r\n if (length - 1 === i) {\r\n return\r\n }\r\n return
  • {el.trim()}
  • \r\n })\r\n }\r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n {(!readOnly && basketItem.editable) &&
{\r\n boundRequestBasketItem(basketItem.basketMenuItemId, () => {\r\n history.push(`/menuitem/${basketItem.menuItemId}`);\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*/","import React, { useEffect, useState } from 'react';\r\nimport { IonContent, IonAlert, IonHeader, IonButton, IonPage, IonTitle, IonToolbar, IonImg } from '@ionic/react';\r\nimport { useHistory, useLocation } from \"react-router-dom\";\r\nimport './BasketPage.scss';\r\n\r\n\r\nimport { closeCircle } from 'ionicons/icons';\r\nimport AppHeader from '../components/AppHeader';\r\nimport { formatCurrency } from '../helpers/currencyHelpers';\r\nimport BasketItemRow from '../components/BasketItemRow';\r\nimport * as headerFooterStore from '../store/HeaderFooterStore';\r\nimport { ApplicationState } from '../store';\r\nimport { useSelector } from 'react-redux';\r\nimport * as currencyHelpers from '../helpers/currencyHelpers';\r\nimport { getConfig } from '../helpers/configHelper';\r\nimport MopFooterCheckout from '../components/MopFooterCheckout';\r\n\r\nimport { bindActionCreators } from 'redux';\r\nimport { useDispatch } from 'react-redux';\r\nimport * as BasketStore from '../store/BasketStore';\r\n\r\n\r\nconst InfoPage: React.FC = () => {\r\n let history = useHistory();\r\n let location = useLocation();\r\n\r\n const locationState = useSelector((state: ApplicationState) => state.location);\r\n const basketStore = useSelector((state: ApplicationState) => state.basket);\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 let price: string = currencyHelpers.formatCurrency(basketStore?.basket.totalPrice);\r\n\r\n useEffect(() => {\r\n !basketStore?.upsellDone && boundGetUpsells();\r\n }, []);\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 {\r\n basketStore && basketStore.basket.isColleagueDiscountBasket && basketStore.basket.externalPromotionsApplied &&\r\n
\r\n
Note: Your colleague discount will be recalculated at checkout
\r\n
\r\n }\r\n {basketStore &&\r\n basketStore.basket.menuItems.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 InfoPage;\r\n","import React from \"react\";\r\nimport { IonModal, IonButton } from \"@ionic/react\";\r\nimport './AllergenPopup.scss';\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

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 InfoPage: React.FC = () => {\r\n let history = useHistory();\r\n\r\n const pfIdentifier = localStorage.getItem(\"pfIdentifier\");\r\n const isLoggedIn = localStorage.getItem('isLoggedIn') === \"true\";\r\n\r\n const basketStore = useSelector((state: ApplicationState) => state.basket);\r\n const locationStore = useSelector((state: ApplicationState) => state.location);\r\n\r\n const boundUpsellDone = bindActionCreators(BasketStore.actionCreators.upsellDone, useDispatch());\r\n const boundRequestMenuItem = bindActionCreators(MenuItemStore.actionCreators.requestMenuItem, useDispatch());\r\n\r\n const showAllergenPopup = useSelector((state: ApplicationState) => state.basket?.showAllergenPopup);\r\n const setShowAllergenPopup = bindActionCreators(BasketStore.actionCreators.showAllergenPopup, useDispatch());\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 if (isLoggedIn) {\r\n history.push(\"/name-or-nickname\");\r\n } else {\r\n history.push(\"/enteremail\");\r\n }\r\n break;\r\n case simpleChannelType.TableOrder:\r\n if (isLoggedIn) {\r\n history.push(\"/name-or-nickname\");\r\n } else {\r\n history.push(\"/tablenumber\");\r\n }\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\r\n \r\n {basketStore && basketStore.upsells && basketStore.upsells.map((a: IMopMenuItemDetail, i) => {\r\n\r\n return (\r\n\r\n navigateToMenuItem(a.menuItemId, a.referrer)} sku={a.sku} itemTags={a.itemTags}\r\n plpRoundels={a.plpRoundels}\r\n />\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 InfoPage;\r\n","import React from 'react';\r\nimport { IonContent, IonHeader, IonPage, IonTitle, IonToolbar } from '@ionic/react';\r\n\r\nimport './Tab2.css';\r\nimport AppHeader from '../components/AppHeader';\r\n\r\nconst Tab2: React.FC = () => {\r\n return (\r\n \r\n \r\n \r\n \r\n Tab 2\r\n \r\n \r\n\r\n \r\n \r\n );\r\n};\r\n\r\nexport default Tab2;\r\n","import React from 'react';\r\nimport { IonContent, IonHeader, IonPage, IonTitle, IonToolbar } from '@ionic/react';\r\n\r\nimport './Tab3.css';\r\nimport AppHeader from '../components/AppHeader';\r\n\r\nconst Tab3: React.FC = () => {\r\n return (\r\n \r\n \r\n \r\n \r\n Tab 3\r\n \r\n \r\n\r\n \r\n \r\n );\r\n};\r\n\r\nexport default Tab3;\r\n","import React, { useEffect, useState } from 'react';\r\nimport { IonGrid, IonFooter, IonRow, IonModal, IonCol, IonButton, IonContent, IonHeader, IonPage, IonTitle, IonToolbar, IonIcon, IonText, IonImg } from '@ionic/react';\r\nimport './MopFooter.scss';\r\nimport { closeCircle } from 'ionicons/icons';\r\nimport AppHeader from './AppHeader';\r\nimport { formatCurrency } from '../helpers/currencyHelpers';\r\nimport BasketItemRow from './BasketItemRow';\r\nimport * as HeaderFooterStore from '../store/HeaderFooterStore';\r\nimport { ApplicationState } from '../store';\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 styled from 'styled-components';\r\nimport { useHistory, useLocation } from 'react-router';\r\nimport { simpleChannelType } from '../store/LocationStore';\r\nimport { getConfig } from '../helpers/configHelper';\r\n\r\n\r\n\r\nconst MopFooterList: React.FC = () => {\r\n\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 boundSetShowBasketModal = bindActionCreators(HeaderFooterStore.actionCreators.setBasketShowModal, 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 let basketCount = 0;\r\n\r\n const history = useHistory();\r\n const location = useLocation();\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 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 ? - Order ahead not available : null}\r\n
\r\n
\r\n \r\n { goToBasket() }} disabled={!basketEnabled}>View Order -   {price}\r\n
{basketStore?.totalQuantity}
\r\n
\r\n
\r\n\r\n
\r\n );\r\n};\r\n\r\nexport default MopFooterList;\r\n","import React, { useState, useEffect } from 'react';\r\nimport { IonGrid, IonFooter, IonRow, IonModal, IonCol, IonButton, IonContent, IonHeader, IonPage, IonTitle, IonToolbar, IonIcon, IonText, IonImg } from '@ionic/react';\r\nimport './MopFooterMenuItem.scss';\r\nimport { closeCircle } from 'ionicons/icons';\r\nimport AppHeader from '../components/AppHeader';\r\nimport { formatCurrency } from '../helpers/currencyHelpers';\r\nimport BasketItemRow from '../components/BasketItemRow';\r\nimport * as headerFooterStore from '../store/HeaderFooterStore';\r\nimport { ApplicationState } from '../store';\r\nimport * as currencyHelpers from '../helpers/currencyHelpers';\r\nimport { useHistory, useLocation } from \"react-router-dom\";\r\nimport QuantityInput from './QuantityInput';\r\n\r\nimport { useSelector, useDispatch } from 'react-redux';\r\nimport * as basketStore from '../store/BasketStore';\r\nimport * as MenuItemStore from '../store/MenuItemStore';\r\nimport { bindActionCreators } from 'redux';\r\n\r\nimport { simpleChannelType } from '../store/LocationStore';\r\n\r\n\r\nconst MopFooterMenuItem: React.FC = ({}) => {\r\n\r\n const location = useLocation();\r\n const locationState = useSelector((state: ApplicationState) => state.location);\r\n const menuItemData = useSelector((state: ApplicationState) => state.menuItemData);\r\n const boundAddToBasket = bindActionCreators(basketStore.actionCreators.addMenuItemToBasket, useDispatch());\r\n const boundUpdateBasket = bindActionCreators(basketStore.actionCreators.updateBasketItem, useDispatch());\r\n const boundUpdateMenuItemQuantity = bindActionCreators(MenuItemStore.actionCreators.updateMenuItemQuantity, useDispatch());\r\n\r\n let history = useHistory();\r\n //let price: string = currencyHelpers.formatCurrency(menuItemData?.itemPrice);\r\n const [price, setPrice] = useState(\"\");\r\n const [enableButton, setEnableButton] = useState(false);\r\n\r\n useEffect(() => {\r\n //console.log(\"MenuItem Modifiers updated state to: \", menuItemData?.menuItem?.modifierGroups);\r\n setPrice(currencyHelpers.formatCurrency(menuItemData?.menuItem?.menuItemTotalPrice));\r\n }, [menuItemData?.menuItem?.menuItemTotalPrice]);\r\n\r\n useEffect(() => {\r\n let canAddOrUpdate = menuItemData?.menuItem?.modifierGroups.every((mod: IMopModifierGroup) => mod.groupType == 10 ? mod.modifierGroupItems.some((item: IMopModifierGroupItem) => item.quantitySelected > 0) : true) ?? false; \r\n let hasPriceSet = (menuItemData?.menuItem?.menuItemTotalPrice ?? 0) > 0;\r\n setEnableButton(canAddOrUpdate && hasPriceSet);\r\n //setEnableButton(canAddOrUpdate ?? false);\r\n }, [menuItemData?.menuItem?.modifierGroups]);\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 { if(!menuItemData?.isBasket){ boundAddToBasket();} else { boundUpdateBasket(); } history.goBack() }}>\r\n {menuItemData?.isBasket ? \"Update Item\" : \"Add to Order\"} -  {price} \r\n \r\n \r\n
\r\n }\r\n
\r\n );\r\n};\r\n\r\nexport default MopFooterMenuItem;","import React, { useState } from 'react';\r\nimport { IonRow, IonCol, IonButton } from '@ionic/react';\r\nimport './MopFooterBasketPage.scss';\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 AllergenPopup from '../modals/AllergenPopup';\r\n\r\nconst MopFooterBasketPage: React.FC = () => {\r\n const history = useHistory();\r\n\r\n const locationState = useSelector((state: ApplicationState) => state.location);\r\n const menuItemData = useSelector((state: ApplicationState) => state.menuItemData);\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 isLoggedIn = localStorage.getItem('isLoggedIn') === \"true\";\r\n\r\n const [showAllergenPopup, setShowAllergenPopup] = useState(false);\r\n\r\n function showUpsellPage() {\r\n return upsells && upsells.length > 0 && !upsellDone\r\n }\r\n\r\n function handleCheckout() {\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 if (isLoggedIn) {\r\n history.push(\"/name-or-nickname\");\r\n } else {\r\n history.push(\"/enteremail\");\r\n }\r\n break;\r\n case simpleChannelType.TableOrder:\r\n if (isLoggedIn) {\r\n history.push(\"/name-or-nickname\");\r\n } else {\r\n history.push(\"/tablenumber\");\r\n }\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
\r\n \r\n Checkout\r\n \r\n
\r\n }\r\n setShowAllergenPopup(false)}\r\n accept={handleCloseAllergen}\r\n />\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\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 if (localStorage.getItem('isLoggedIn') === 'true') {\r\n if (locationState?.selectedStore) {\r\n if (locationState.selectedStore.enableTimeSlots) {\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;\r\n","import React, { useEffect, useState } from 'react';\r\nimport { IonGrid, IonFooter, IonRow, IonModal, IonCol, IonButton, IonContent, IonHeader, IonPage, IonTitle, IonToolbar, IonIcon, IonText, IonImg } from '@ionic/react';\r\nimport * as headerFooterStore from '../store/HeaderFooterStore';\r\nimport * as LocationStore from '../store/LocationStore';\r\nimport { ApplicationState } from '../store';\r\nimport { useSelector, useDispatch } from 'react-redux';\r\nimport { bindActionCreators } from 'redux'\r\nimport { useHistory, useLocation } from \"react-router-dom\";\r\nimport styled from 'styled-components';\r\nimport moment from 'moment';\r\nimport useMopHooks from '../helpers/useMopHook';\r\nimport { simpleChannelType } from '../store/LocationStore';\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 boundSelectTimeslot = bindActionCreators(LocationStore.actionCreators.selectTimeslot, useDispatch());\r\n const { onChannelSelected } = useMopHooks();\r\n const [showButton, setShowButton] = useState(true);\r\n\r\n useEffect(() => {\r\n if(location.pathname == \"/ordertype\"){\r\n setShowButton(false);\r\n }\r\n else{\r\n setShowButton(true);\r\n }\r\n }, [location.pathname]);\r\n\r\n return (\r\n
\r\n \r\n \r\n
\r\n {locationState?.selectedChannel === undefined ? \"Store\" : locationState.selectedChannel.channelType === simpleChannelType.ClickAndCollect ? \"Collect from\" : \"Store\" }
\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 { \r\n /*\r\n Use selected store channel instead of having extra state for order type?\r\n */\r\n if (location.pathname.includes('/storesearch')) {\r\n if(locationState?.selectedStore){\r\n if(locationState?.selectedStore?.supportedChannels.length > 0) { //if selectedStore supports both eat in and takeaway, then orderType, else onEatInSelected();\r\n history.push('/ordertype');\r\n }\r\n else{\r\n onChannelSelected(locationState.selectedStore.supportedChannels[0]);\r\n }\r\n }\r\n } \r\n else { //From choosetimeslot\r\n history.push(`/categories`); \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;","import React from 'react';\r\nimport { IonRow, IonCol, IonButton } from '@ionic/react';\r\nimport './MopFooterUpsellPage.scss';\r\n\r\nimport { ApplicationState } from '../store';\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\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\r\n const setShowAllergenPopup = bindActionCreators(BasketStore.actionCreators.showAllergenPopup, useDispatch());\r\n\r\n const goToNextPage = () => {\r\n setShowAllergenPopup(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 { goToNextPage(); }}>\r\n Continue\r\n \r\n \r\n
\r\n }\r\n
\r\n );\r\n};\r\n\r\nexport default MopFooterBasketPage;\r\n","import React, { useState, useEffect } from 'react';\r\nimport { IonGrid, IonFooter, IonRow, IonModal, IonCol, IonButton, IonContent, IonHeader, IonPage, IonTitle, IonToolbar, IonIcon, IonText, IonImg } from '@ionic/react';\r\nimport './MopFooterTablePage.scss';\r\n\r\nimport { ApplicationState } from '../store';\r\nimport * as currencyHelpers from '../helpers/currencyHelpers';\r\nimport { useHistory, useLocation } from \"react-router-dom\";\r\nimport QuantityInput from './QuantityInput';\r\n\r\nimport { useSelector, useDispatch } from 'react-redux';\r\nimport * as basketStore from '../store/BasketStore';\r\nimport * as MenuItemStore from '../store/MenuItemStore';\r\nimport { bindActionCreators } from 'redux';\r\nimport * as BasketStore from '../store/BasketStore';\r\n\r\nimport { simpleChannelType } from '../store/LocationStore';\r\n\r\n\r\n\r\nconst MopFooterTablePage: React.FC = ({ }) => {\r\n\r\n\tconst locationState = useSelector((state: ApplicationState) => state.location);\r\n\tconst 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\tconst boundSetTableNumber = bindActionCreators(BasketStore.actionCreators.setTableNumber, useDispatch());\r\n const boundSetNickname = bindActionCreators(BasketStore.actionCreators.setNickname, useDispatch());\r\n\tconst history = useHistory();\r\n\r\n useEffect(() => {\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 } 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 }, [BasketNickname, BasketTableNumber])\r\n\r\n\tconst 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\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{locationState?.selectedChannel === undefined ? \"Store\" : locationState.selectedChannel.channelType === simpleChannelType.ClickAndCollect ? \"Take away\" : \"Eat in\"}
\r\n\t\t\t\t\t{locationState?.selectedStore === undefined ? \"Select a store\" : locationState?.selectedStore.storeName}\r\n\t\t\t\t\t{locationState?.selectedStore?.takingMopOrders === false ? - Order ahead not available : null}\r\n\t\t\t\t
\r\n\t\t\t\t\r\n\t\t\t\t\t { submitTableNumber() }}>\r\n\t\t\t\t\t\tContinue\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 MopFooterTablePage;\r\n","import React, { useState } from 'react';\r\nimport { IonGrid, IonCol, IonButton, IonRow, IonInput, IonIcon} from '@ionic/react';\r\nimport './BasketTotalAndCoupons.scss';\r\n\r\nimport { ApplicationState } from '../store';\r\nimport { useSelector } 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 { connect } from 'react-redux';\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\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\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 let 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 if (s.detail.value != undefined) {\r\n SetCouponCode(s.detail.value);\r\n SetError(\"\");\r\n }\r\n }}\r\n type=\"number\" />
\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 recorgnised\");\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 >Apply
\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 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)(BasketTotalAndCoupons as any)\r\n\r\n// 9928220872006\r\n","import React, { useState, useEffect } from 'react';\r\nimport { IonGrid, IonFooter, IonRow, IonModal, IonCol, IonButton, IonContent, IonHeader, IonPage, IonTitle, IonToolbar, IonIcon, IonText, IonImg } from '@ionic/react';\r\nimport './MopFooterPaymentSuccessPage.scss';\r\n\r\nimport { baseUrl } from '../helpers/configHelper';\r\n\r\nconst MopFooterPaymentSuccessPage: React.FC = ({ }) => {\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 { window.location.href = baseUrl() + \"/splash\"; }}>Start another order\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 MopFooterPaymentSuccessPage;","import React from 'react';\r\nimport { IonFooter, IonGrid, IonCol, IonButton} 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\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, { useEffect, useState } from 'react';\r\nimport { IonHeader, IonTitle, IonToolbar, IonIcon, IonGrid, IonRow, IonCol, IonModal, IonContent } from '@ionic/react';\r\nimport './MopHeaderMenusModal.scss';\r\nimport { closeOutline } 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\nimport { bindActionCreators } from 'redux';\r\nimport { getConfig } from '../helpers/configHelper';\r\n\r\n\r\ninterface TermsCondModalProps {\r\n\r\n} \r\n\r\nconst TermsCondModal: React.FC<{ isModalOpen: boolean, closeModalClick: any }> = ({ isModalOpen, closeModalClick }) => {\r\n\r\n let history = useHistory();\r\n const boundSetShowModal = bindActionCreators(headerFooterStore.actionCreators.setShowModal, useDispatch());\r\n\r\n return (\r\n \r\n \r\n \r\n Close\r\n \r\n \r\n {true &&\r\n
\r\n

{`${getConfig().isMarket ? \"Market Kitchen\" : 'Caf\\u00E9'}`} Click and Collect terms and conditions of sale

\r\n

Welcome to {getConfig().isMarket ? \"Market Kitchen\" : \"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 { boundSetShowModal(\"FAQ\", true, false) } }>Privacy Policy apply to any products that you may purchase from our website {getConfig().isMarket ? marketkitchen.menu : 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
    {getConfig().isMarket ? \"Market Kitchen\" : \"Morrisons Café\"} Click and Collect Service
    \r\n
      \r\n
    1. {getConfig().isMarket ? \"Market Kitchen\" : \"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 {getConfig().isMarket ? \"Market Kitchen\" : \"Morrisons\"} stores (\"eat in\") subject to any local store restrictions.

    2. \r\n
    3. {getConfig().isMarket ? \"Market Kitchen\" : \"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 {getConfig().isMarket ? \"Market Kitchen\" : \"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 {getConfig().isMarket ? \"Market Kitchen\" : \"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 {getConfig().isMarket ? \"Market Kitchen\" : \"Café\"} click and collect service with or without notice;

      • \r\n
      • change or withdraw the Website and/or the {getConfig().isMarket ? \"Market Kitchen\" : \"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 {getConfig().isMarket ? \"Market Kitchen\" : \"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 {getConfig().isMarket ? \"Market Kitchen\" : \"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 {getConfig().isMarket ? \"Market Kitchen\" : \"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 {getConfig().isMarket ? \"Market Kitchen\" : \"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 {getConfig().isMarket ? \"Market Kitchen\" : \"Café\"} 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 {getConfig().isMarket ? \"Market Kitchen\" : \"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 {getConfig().isMarket ? \"Market Kitchen\" : \"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 {getConfig().isMarket ? \"Market Kitchen\" : \"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\n\r\nexport default TermsCondModal;\r\n","import React from 'react';\r\nimport { IonHeader, IonTitle, IonIcon, IonModal, IonContent } from '@ionic/react';\r\nimport './MopHeaderMenusModal.scss';\r\nimport { closeOutline } from 'ionicons/icons';\r\nimport { useHistory } from \"react-router-dom\";\r\nimport '../theme/common.scss';\r\n\r\ninterface AllergenModalProps {\r\n}\r\nconst AllergenModal: React.FC<{ isModalOpen: boolean, closeModalClick: any }> = ({ isModalOpen, closeModalClick }) => {\r\n return (\r\n \r\n \r\n \r\n Close\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\n\r\nexport default AllergenModal;\r\n","import React, { useEffect, useState } from 'react';\r\nimport { ApplicationState } from \"../store\";\r\nimport { connect, useDispatch } from \"react-redux\";\r\nimport { bindActionCreators } from \"redux\";\r\nimport * as ColleagueStore from '../store/ColleagueStore';\r\nimport * as BasketStore from '../store/BasketStore';\r\nimport { useHistory } from \"react-router-dom\";\r\nimport { IonModal, IonIcon, IonHeader, IonContent, IonText, IonItem, IonInput, IonRow, IonCheckbox, IonFooter, IonButton } from \"@ionic/react\";\r\nimport { chevronBack } from 'ionicons/icons';\r\nimport './MopHeaderMenusModal.scss';\r\nimport '../theme/common.scss';\r\nimport { InputChangeEventDetail } from '@ionic/core';\r\n\r\ninterface LoginModalProps {\r\n isModalOpen: boolean;\r\n parentModalClick: () => void;\r\n closeModalClick: () => void;\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 history = useHistory();\r\n\r\n const validatePin = bindActionCreators(ColleagueStore.actionCreators.validatePin, useDispatch());\r\n const clearBasket = bindActionCreators(BasketStore.actionCreators.clearBasketItems, useDispatch());\r\n\r\n const [pin, setPin] = useState('');\r\n const [errorMessage, setErrorMessage] = useState('');\r\n const [pinConfirmed, setPinConfirmed] = useState(false);\r\n const [confirmPinErrorMessage, setConfirmPinErrorMessage] = useState('');\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\r\n setPinConfirmed(checkbox.checked);\r\n };\r\n\r\n const handleTextClick = () => {\r\n setPinConfirmed(!pinConfirmed);\r\n };\r\n\r\n const handleSubmit = () => {\r\n if (pin.length === 0) {\r\n setErrorMessage(\"Enter a valid code.\");\r\n return;\r\n }\r\n\r\n if (pin.length < 4) {\r\n setErrorMessage(\"Please enter at least a 4 digit code.\");\r\n return;\r\n }\r\n\r\n setErrorMessage(\"\");\r\n\r\n if (!pinConfirmed) {\r\n setConfirmPinErrorMessage(\"Please confirm that you agree with the statement above.\");\r\n return;\r\n }\r\n\r\n setConfirmPinErrorMessage(\"\");\r\n validatePin(pin);\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('/')\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\r\n \r\n \r\n

Log in to Colleague Area Access

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

Colleague Area Access code*

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

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

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

\r\n I confirm that I am a Morrisons employee and currently working a shift in store\r\n\t\t\t\t\t\t\t

\r\n
\r\n
\r\n\r\n {confirmPinErrorMessage && !pinConfirmed &&\r\n \r\n

\r\n {confirmPinErrorMessage}\r\n

\r\n
\r\n }\r\n
\r\n\r\n \r\n \r\n Confirm\r\n\t\t\t\t\t\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, IonTitle, IonIcon, IonGrid, IonRow, IonCol, IonModal, IonContent, IonRefresher, IonRefresherContent, IonAlert } from '@ionic/react';\r\nimport './MopHeaderMenusModal.scss';\r\nimport { closeOutline, 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 ColleagueStore from '../store/ColleagueStore';\r\n\r\ninterface AppHeaderMenuProps { }\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 logout = bindActionCreators(ColleagueStore.actionCreators.logout, useDispatch());\r\n const [showLogoutAlert, setShowLogoutAlert] = useState(false);\r\n\r\n const getOrderStatus = (event?: CustomEvent) => {\r\n let test = false;\r\n let 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 const handleLoginModalClicked = () => {\r\n if (localStorage.getItem('isLoggedIn') === 'true') {\r\n handleLogout();\r\n } else {\r\n boundSetShowModal(\"LOGIN\", true);\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 logout();\r\n localStorage.removeItem('isLoggedIn');\r\n localStorage.removeItem('pfIdentifier');\r\n window.location.reload();\r\n }\r\n\r\n setShowLogoutAlert(false);\r\n };\r\n\r\n useEffect(() => {\r\n getOrderStatus();\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 return \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 \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
boundSetShowModal(\"ALLERGEN\", true)}>\r\n \r\n
Allergen Information
\r\n
\r\n\r\n
Legal
\r\n
boundSetShowModal(\"TC\", true)}>\r\n \r\n
Terms & Conditions
\r\n
\r\n\r\n
Colleague Area Access
\r\n
\r\n \r\n
\r\n {localStorage.getItem('isLoggedIn') === \"true\" ? \"Log out\" : \"Log in\"}\r\n
\r\n
\r\n\r\n
\r\n\r\n { boundSetShowModal(\"TC\", false); }} />\r\n\r\n boundSetShowModal(\"ALLERGEN\", false)} />\r\n\r\n boundSetShowModal(\"LOGIN\", false)} />\r\n\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 MopHeaderMenusModal;\r\n","import React, { useEffect, useState } from 'react';\r\nimport { IonHeader, IonTitle, IonToolbar, IonIcon, IonGrid, IonRow, IonCol, IonAlert } from '@ionic/react';\r\nimport './AppHeader.scss';\r\nimport { closeCircle, chevronBack, menu } 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 { getConfig } from '../helpers/configHelper';\r\nimport MopHeaderMenusModal from '../modals/MopHeaderMenusModal'\r\nimport { bindActionCreators } from 'redux';\r\nimport { baseUrl } from '../helpers/configHelper';\r\nimport * as ColleagueStore from '../store/ColleagueStore';\r\n\r\nconst allowedStartingPages = [\r\n\t\"/splash\",\r\n\t\"/faq\",\r\n\t\"/qr\",\r\n\t\"/couponz\"\r\n];\r\n\r\ninterface AppHeaderProps {\r\n\r\n}\r\n\r\nconst AppHeader: React.FC = ({ }) => {\r\n\r\n\tlet history = useHistory();\r\n\tconst location = useLocation();\r\n\tconst headerFooter = useSelector((state: ApplicationState) => state.headerFooter);\r\n\r\n\tconst boundSetShowModal = bindActionCreators(headerFooterStore.actionCreators.setShowModal, useDispatch());\r\n\tconst boundShowDebugLabels = bindActionCreators(headerFooterStore.actionCreators.setShowDebugLabels, useDispatch());\r\n\tconst logout = bindActionCreators(ColleagueStore.actionCreators.logout, useDispatch());\r\n\r\n\tconst [showModal, _setShowModal] = useState(\"\");\r\n\tconst [showLogoutAlert, setShowLogoutAlert] = useState(false);\r\n\tconst [redirect, setRedirect] = useState(\"\");\r\n\tconst siteTitle = \"Morrisons :: Order & Pay\";\r\n\r\n\t//mtr debug, need the basket to test\r\n\t//document.addEventListener('keydown', function (event) {\r\n\t// if(window.location.hostname === 'localhost') {\r\n\t// if (event.keyCode === 37 && event.shiftKey === true) {\r\n\t// history.push(\"/payment\");\r\n\t// }\r\n\t// }\r\n\t//});\r\n\t//\r\n\r\n\tconst handleLogout = () => {\r\n\t\tsetShowLogoutAlert(true);\r\n\t};\r\n\r\n\tconst handleLogoutConfirmation = (confirmed: boolean) => {\r\n\t\tif (confirmed) {\r\n\t\t\tlogout();\r\n\t\t\tlocalStorage.removeItem(\"isLoggedIn\");\r\n\t\t\tlocalStorage.removeItem(\"pfIdentifier\");\r\n\t\t\twindow.location.reload();\r\n\t\t}\r\n\t\tsetShowLogoutAlert(false);\r\n\t};\r\n\r\n\tuseEffect(() => {\r\n\t\tif (!isUserAllowedToLandHere()) {\r\n\t\t\tsetTimeout(() => {\r\n\t\t\t\t//history.push(\"/splash\"); //Setting timeout otherwise screen goes white\r\n\t\t\t\twindow.location.href = baseUrl() + \"/splash\";\r\n\t\t\t}, 500);\r\n\t\t}\r\n\r\n\t\tvar redirect: string = \"\";\r\n\t\tswitch (location.pathname) {\r\n\t\t\tcase \"/payment\": {\r\n\t\t\t\tvar redirect = \"/orderconfirmation\"\r\n\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase \"/tablenumber\": {\r\n\t\t\t\tvar redirect = \"/basketpage\"\r\n\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase \"/faq\": {\r\n\t\t\t\tbatch(() => {\r\n\t\t\t\t\thistory.push(\"/splash\");\r\n\t\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\t\tboundSetShowModal(\"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\t\t\t\t\t}, 500);\r\n\t\t\t\t})\r\n\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t\tsetRedirect(redirect);\r\n\r\n\t\tif (headerFooter?.modals.selectedModal != undefined && headerFooter?.modals.selectedModal != \"\") {\r\n\t\t\tboundSetShowModal(\"MAIN\", false); //Closes all modals if navigating back while one is open\r\n\t\t}\r\n\r\n\t\tsetTimeout(() => { //In the event that a page does not have a title, the pathname will be sent instead.\r\n\t\t\tlet noPageTitle = headerFooter?.title == undefined || headerFooter?.title == \"No title\";\r\n\t\t\tif (noPageTitle) {\r\n\t\t\t\tsendPageView(location.pathname);\r\n\t\t\t}\r\n\t\t}, 500);\r\n\r\n\t}, [location.pathname]);\r\n\r\n\tuseEffect(() => {\r\n\r\n\t\tlet noPageTitle = headerFooter?.title == undefined || headerFooter?.title == \"No title\";\r\n\t\tif (!noPageTitle && headerFooter != undefined) {\r\n\t\t\tsendPageView(headerFooter.title);\r\n\t\t\tdocument.title = `${headerFooter.title} - ${siteTitle}`\r\n\t\t}\r\n\r\n\t}, [headerFooter?.title])\r\n\r\n\tuseEffect(() => {\r\n\r\n\t\tfetch(baseUrl() + '/stores/GetShowDebugLabels').then((res) => res.json())\r\n\t\t\t.then((data) => {\r\n\t\t\t\tconsole.log(data);\r\n\t\t\t\tboundShowDebugLabels(data.showLabel);\r\n\t\t\t})\r\n\r\n\t\twindow.addEventListener(\"popstate\", (e) => { handleBrowserHistoryChange(e, headerFooter?.modals.selectedModal || \"\") }, false);\r\n\r\n\t\treturn () => {\r\n\t\t\twindow.removeEventListener(\"popstate\", (e) => { handleBrowserHistoryChange(e, headerFooter?.modals.selectedModal || \"\") }, false);\r\n\t\t}\r\n\t}, [])\r\n\r\n\tconst sendPageView = (page_title: string) => {\r\n\t\tconsole.log(\"GOOGLE ANALYTICS - Sending Page Title:\", page_title, \"headerFooter.title:\", headerFooter?.title, \"pathname:\", location.pathname);\r\n\t\t(window as any).gtag('event', 'page_view', {//G-ZC8W1075C5\r\n\t\t\t'page_title': page_title\r\n\t\t});\r\n\t}\r\n\r\n\tconst isUserAllowedToLandHere = () => {\r\n\t\tlet pathname = location.pathname;\r\n\t\tlet isAllowed = allowedStartingPages.some((page) => pathname.includes(page)) || headerFooter?.hasStartedApp;\r\n\t\t//isAllowed = true; // THIS MUST BE UNCOMMENTED (MTR)\r\n\t\treturn isAllowed;\r\n\t}\r\n\r\n\tconst handleBrowserHistoryChange = (e: PopStateEvent, selectedModal: string) => {\r\n\t\tif (redirect != \"\") {\r\n\t\t\tgoBackRecursive(redirect);\r\n\t\t}\r\n\t}\r\n\r\n\tconst goBackRecursive = (to: string) => {\r\n\t\thistory.goBack();\r\n\t\tsetTimeout(() => {\r\n\t\t\tif (history.location.pathname != to) {\r\n\t\t\t\tgoBackRecursive(to);\r\n\t\t\t} else {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}, 100);\r\n\t}\r\n\r\n\tconst basketStore = useSelector((state: ApplicationState) => state.basket);\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t\r\n\r\n\t\t\t\t{headerFooter?.headerMode == headerFooterStore.HeaderMode.Normal &&\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t\t{headerFooter?.showBack &&\r\n\t\t\t\t\t\t\t
{\r\n\t\t\t\t\t\t\t\tif (redirect != \"\") {\r\n\t\t\t\t\t\t\t\t\tgoBackRecursive(redirect);\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\thistory.goBack();\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\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\t
\r\n\t\t\t\t\t\t\t{headerFooter?.title}\r\n\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t boundSetShowModal(\"MAIN\", true)} />\r\n\r\n\t\t\t\t\t
\r\n\t\t\t\t}\r\n\r\n\t\t\t\t{headerFooter?.headerMode === headerFooterStore.HeaderMode.PDP &&\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t\t history.goBack()} />\r\n\r\n\t\t\t\t\t\r\n\t\t\t\t}\r\n\r\n\t\t\t\t boundSetShowModal(\"MAIN\", false)} />\r\n\r\n\t\t\t\t{localStorage.getItem('isLoggedIn') === \"true\" && !location.pathname.includes(\"/menuitem\") &&\r\n\t\t\t\t\t
\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

You are logged in to Colleague Area Access

\r\n\t\t\t\t\t\t
\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\r\n\r\n\t\t\t handleLogoutConfirmation(false),\r\n\t\t\t\t\t},\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\ttext: 'Yes',\r\n\t\t\t\t\t\thandler: () => handleLogoutConfirmation(true),\r\n\t\t\t\t\t},\r\n\t\t\t\t]} />\r\n\t\t\r\n\t);\r\n};\r\n\r\nexport default AppHeader;\r\n","import React, { createRef, FormEvent, SyntheticEvent, useState } from 'react';\r\nimport { IonPage, IonLoading, IonButton, IonInput, IonItem, IonLabel, IonDatetime, IonToast, IonSpinner, IonContent} from '@ionic/react';\r\nimport AppHeader from './AppHeader';\r\nimport './CheckoutPayCard.scss';\r\nimport {\r\n Formik,\r\n FormikProps,\r\n Field,\r\n FieldProps,\r\n } from 'formik';\r\n\r\nimport moment from 'moment';\r\n\r\nimport { cardCheckoutSchema } from '../helpers/formValidationHelpers';\r\n\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 { Redirect, RouteComponentProps } from \"react-router\";\r\nimport { baseUrl } from '../helpers/configHelper';\r\nimport { getConfig } from '../helpers/configHelper';\r\nimport { CreatePaymentRequest, IMopCheckoutRequest, ICardRequest, IMopCheckoutResponse } from '../helpers/checkoutHelper';\r\nimport PayerAuthentication, { PayerAuthenticationHelpers } from '../helpers/PayerAuthentication';\r\nimport jwtDecode from 'jwt-decode';\r\nimport { on } from 'stream';\r\n\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\n\r\nfunction ErrorIcon () {\r\n return (\r\n\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\r\n //font-family: 'MorrisonsAgenda', this won't work in iFrame\r\n private myStyles = {\r\n\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\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 {\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
{this.state.errorMessage}
\r\n :\r\n {isPayLoading ? : \"Pay\"}\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));","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\" 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 { IonGrid, IonRow, IonCol, IonContent, IonText,IonHeader, IonButton, IonFooter, IonPage, IonTitle, IonToolbar, IonInput, IonItem, IonLabel, IonList, IonItemDivider, IonThumbnail, IonImg } from '@ionic/react';\r\nimport { useHistory, useLocation } from 'react-router';\r\nimport './PaymentSuccess.scss';\r\nimport { useSelector, useDispatch } from 'react-redux';\r\nimport { ApplicationState } from '../store';\r\nimport { formatOrderNumber } from '../helpers/checkoutHelpers';\r\nimport * as headerFooterStore from '../store/HeaderFooterStore';\r\nimport * as basketStore from '../store/BasketStore';\r\nimport * as locationStore from '../store/LocationStore';\r\nimport { bindActionCreators } from 'redux';\r\nimport { getConfig, baseUrl } from '../helpers/configHelper';\r\nimport { GetRewardDetails, IGetRewardDetailsResponse } from '../helpers/checkoutHelper';\r\n\r\n\r\ninterface ICounterItems {\r\n\tnumber: number;\r\n\tmenuItems: IMopMenuItemDetail[];\r\n}\r\n\r\nconst PaymentSuccess: React.FC = () => {\r\n\tlet history = useHistory();\r\n\tconst orderNumber = useSelector((state: ApplicationState) => state.basket?.orderNumber);\r\n\tconst basketState = useSelector((state: ApplicationState) => state.basket);\r\n\tconst locationState = useSelector((state: ApplicationState) => state.location);\r\n\tconst boundSetShowModal = bindActionCreators(headerFooterStore.actionCreators.setShowModal, useDispatch());\r\n\r\n\tconst boundClearBasket = bindActionCreators(basketStore.actionCreators.clearBasket, useDispatch());\r\n\tconst boundClearLocation = bindActionCreators(locationStore.actionCreators.clearSelectedStore, useDispatch());\r\n\r\n\tconst resetState = () => {\r\n\t\tboundClearLocation();\r\n\t\tboundClearBasket();\r\n\t}\r\n\r\n\tconst [counterItems, setCounterItems] = useState({ number: 0, menuItems: [] });\r\n\tconst [isKitchenItemPresent, setIsKitchenItemPresent] = useState(false);\r\n\tconst [rewardDetails, setRewardDetails] = useState();\r\n\r\n\tuseEffect(() => {\r\n\t\tGetRewardDetails(basketState?.tmpBasket?.sessionId).then((data) => {\r\n\t\t\tsetRewardDetails(data);\r\n\t\t});\r\n\t}, [basketState?.tmpBasket?.sessionId]);\r\n\r\n\tuseEffect(() => {\r\n\t\tif (basketState?.tmpBasket) {\r\n\t\t\tlet count = basketState.tmpBasket.menuItems.reduce((acc, cur) => !cur.isKitchenItem ? acc + cur.quantity : acc, 0);\r\n\t\t\tlet _menuItems = basketState.tmpBasket.menuItems.filter((m) => !m.isKitchenItem);\r\n\r\n\t\t\tsetCounterItems({\r\n\t\t\t\tnumber: count,\r\n\t\t\t\tmenuItems: _menuItems\r\n\t\t\t});\r\n\r\n\t\t\tlet _isKitchenItemsPresent = basketState.tmpBasket.menuItems.some((item) => item.isKitchenItem == true);\r\n\t\t\tsetIsKitchenItemPresent(_isKitchenItemsPresent);\r\n\t\t}\r\n\t\tconsole.log(orderNumber);\r\n\t}, [basketState?.tmpBasket]);\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\t\r\n\t\t\t\t\t\t\t
We've got your order!
\r\n\t\t\t\t\t\t\t
Your order reference
\r\n\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\tlocationState?.selectedChannel?.channelType == locationStore.simpleChannelType.TableOrder\r\n\t\t\t\t\t\t\t\t\t?\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\tbasketState?.tableNumber &&\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
We'll bring your order to:
\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}\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t:\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\tlocationState?.selectedTimeSlot.label == \"ASAP\" ?\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
Your order is being prepared and will be ready for you to collect shortly
\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:\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{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tlocationState?.selectedTimeSlot.startTime &&\r\n\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
Your order is being prepared for
\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\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}\r\n\t\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
\r\n\t\t\t\t\t
\r\n\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\trewardDetails?.showMorePoints &&\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\"More\r\n\t\t\t\t\t\t\t{rewardDetails.morePointsRewarded} More points earned this shop\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\tlocationState?.selectedChannel?.channelType == locationStore.simpleChannelType.TableOrder\r\n\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
\r\n\t\t\t\t\t\t\t\t\tWe'll deliver your order as soon as it's ready.
\r\n\t\t\t\t\t\t\t\t\tA receipt has been sent to your email.\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:\r\n\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\tlocationState?.selectedTimeSlot.label == \"ASAP\" ?\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
\r\n\t\t\t\t\t\t\t\t\t\t\t\tPlease head over to the collection point in store.
\r\n\t\t\t\t\t\t\t\t\t\t\t\tA receipt has been sent to your email.\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\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\t\t\t\t\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\t\t\t\t\tWe'll let you know when it's ready to collect.
\r\n\t\t\t\t\t\t\t\t\t\t\t\tA receipt has been sent to your email.\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\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\r\n\t\t\t\t\t
boundSetShowModal(\"MAIN\", true, true)}>View my order
\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 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 { useHistory } 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 history = useHistory();\r\n const boundSetPage = bindActionCreators(headerFooterStore.actionCreators.setPage, useDispatch());\r\n\tconst locationState = useSelector((state: ApplicationState) => state.location);\r\n // Set up a listener to notify the HeaderFooter store when the page changes\r\n useEffect(() => history.listen((location, action) => {\r\n boundSetPage(location.pathname, locationState?.selectedChannel?.channelType);\r\n console.log(\"Changing HL page to=\" + location.pathname);\r\n }), []);\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 } 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\n\r\nconst LocationListener: React.FC = (props) => {\r\n\r\n const location = useLocation(); \r\n\r\n // Set up a listener to notify the HeaderFooter store when the page changes\r\n\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\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\n\r\nimport './TimeSlotChooser.scss';\r\nimport { baseUrl } from '../helpers/configHelper';\r\nimport { useHistory } from 'react-router';\r\nimport { loginHasExpired } from '../helpers/apiHelpers';\r\nimport { resetMessage } from '../store/ColleagueStore';\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 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 (loginHasExpired(data)) {\r\n dispatch(resetMessage(\"showExpireModal\"))\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 }, [pfIdentifier, 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 { 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 \r\n When would you like to order for?\r\n \r\n ) : (\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\n\r\nexport default TimeSlotPage;\r\n","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, { useState } 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 { simpleChannelType, SimpleStore } from '../store/LocationStore';\r\n\r\nimport * as HeaderFooterStore from '../store/HeaderFooterStore';\r\nimport { locationSharp, qrCode, locate, search } from 'ionicons/icons';\r\nimport LocationItem from '../components/LocationItem';\r\nimport { getConfig } from '../helpers/configHelper';\r\nimport TimeSlotChooser from '../components/TimeSlotChooser';\r\n\r\nimport {\r\n IonGrid, IonRow, IonCol, IonContent, IonHeader, IonFooter, IonPage, IonTitle, IonToolbar, IonInput, IonItem, IonLabel, IonList, IonItemDivider, IonButton,\r\n IonThumbnail, IonImg, IonRadioGroup, IonRadio, IonCheckbox, IonSearchbar, IonLoading, IonIcon, IonAlert, IonSpinner\r\n} from '@ionic/react';\r\n\r\nimport { updateNamespaceExportDeclaration } from 'typescript';\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\n//type AutocompletePrediction = google.maps.places.AutocompletePrediction;\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 //Google - return str.replace(', UK', '');\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 //console.log(\"componentDidMount: setting isLoading = true\");\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 && 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 //console.log(\"Setting isLoading to false\");\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) => { return p.storeNumber == storeNumber});\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 //console.log(\"Scrolling\");\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: [] }); // some spaff\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%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 //console.log(\"onPlaceSelect: Setting isLoading to true\");\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 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 /*\r\n Google API\r\n return this.onPlaceSelect(i.place_id, i.description)}>\r\n {tidyPlaceDescription(i.description)}\r\n \r\n */\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\n {/* \r\n STEALING FOCUS\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","import React from 'react';\r\nimport { IonContent, IonHeader, IonButton, IonPage, IonTitle, IonToolbar, IonImg } from '@ionic/react';\r\nimport { useHistory } from \"react-router-dom\";\r\nimport './ScanQrCode.scss';\r\nimport { baseUrl, getConfig } from '../helpers/configHelper';\r\n\r\nconst ScanQrCode: React.FC = () => {\r\n let history = useHistory();\r\n return (\r\n \r\n \r\n
\r\n
{getConfig().isMarket ? \"Market Kitchen\" : \"Café\"} Order & Pay
\r\n
Use your phone's camera to scan the QR code in store to start your order
\r\n \r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default ScanQrCode;\r\n","import React from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { ApplicationState } from '../store';\r\nimport { IonContent, IonButton, IonPage, IonLoading } from '@ionic/react';\r\nimport { useHistory } from \"react-router-dom\";\r\nimport { RouteComponentProps } from 'react-router';\r\n\r\nimport * as LocationStore from '../store/LocationStore';\r\nimport * as HeaderFooterStore from '../store/HeaderFooterStore';\r\n\r\nimport { simpleChannelType, SimpleStore } from '../store/LocationStore';\r\nimport { continueFromInitialPage } from '../helpers/configHelper';\r\n\r\nimport './QRLanding.scss';\r\nimport { call } from 'ionicons/icons';\r\n\r\ninterface IQRLandingProps {\r\n storeReference: string;\r\n}\r\n\r\ninterface IQRLandingState {\r\n hasFailed: boolean;\r\n}\r\n\r\ntype QRLandingProps =\r\n LocationStore.LocationState &\r\n typeof HeaderFooterStore.actionCreators &\r\n typeof LocationStore.actionCreators &\r\n RouteComponentProps\r\n\r\nclass QRLanding extends React.Component {\r\n\r\n constructor(props: any) {\r\n super(props);\r\n this.state = { hasFailed: false };\r\n this.requestStoreCallback = this.requestStoreCallback.bind(this);\r\n this.requestStoreErrorCallback = this.requestStoreErrorCallback.bind(this);\r\n }\r\n\r\n requestStoreCallback() {\r\n if (this.props.stores.length == 1) {\r\n const theStore = this.props.stores[0];\r\n const theChannel = theStore.supportedChannels.filter((c) => { return c.channelType == simpleChannelType.ClickAndCollect });\r\n if (theChannel && theChannel.length == 1) {\r\n const theChannelIdentifier = theChannel[0].channelIdentifier;\r\n console.debug(\"channelIdentifier = \" + theChannelIdentifier);\r\n this.props.selectStore(theStore, theChannelIdentifier);\r\n }\r\n }\r\n else {\r\n this.setFailedState();\r\n }\r\n }\r\n\r\n requestStoreErrorCallback() {\r\n this.setFailedState();\r\n }\r\n\r\n setFailedState() {\r\n this.setState({ hasFailed: true });\r\n }\r\n\r\n componentDidMount() {\r\n this.props.setPage(\"qrlanding\");\r\n console.debug(\"storeReference = \" + this.props.match.params.storeReference);\r\n if (this.props.match.params.storeReference)\r\n this.props.requestStore(this.props.match.params.storeReference, this.requestStoreCallback, this.requestStoreErrorCallback);\r\n else\r\n this.setFailedState();\r\n }\r\n\r\n changeStore() {\r\n this.props.clearStores();\r\n this.props.clearSelectedStore();\r\n continueFromInitialPage(this.props.history, this.props.setHasStartedApp, \"/storesearch\");\r\n }\r\n\r\n getStarted() {\r\n continueFromInitialPage(this.props.history, this.props.setHasStartedApp, \"/choosetimeslot\");\r\n }\r\n\r\n render() {\r\n return \r\n \r\n {this.props.selectedStore == undefined ? null :
\r\n
\r\n
Your location
\r\n
Hi, looks like you're in our {this.props.selectedStore?.storeName} store.
\r\n
Ready to start?
\r\n
\r\n
\r\n this.changeStore()}>Change store\r\n this.getStarted()}>Get started\r\n
\r\n
}\r\n {this.state.hasFailed == true ?\r\n\r\n
\r\n
\r\n
Your location
\r\n
Please press 'Find store' and let us know which store you wish to collect your order from.
\r\n
\r\n
\r\n this.changeStore()}>Find store\r\n
\r\n
\r\n : null}\r\n
\r\n \r\n
\r\n }\r\n}\r\n\r\nconst mapDispatchToProps = (\r\n dispatch: any) => {\r\n return {\r\n setPage: (path: string) => dispatch(HeaderFooterStore.actionCreators.setPage(path)),\r\n selectStore: (store: SimpleStore, channelIdentifier: string) => dispatch(LocationStore.actionCreators.selectStore(store, channelIdentifier)),\r\n requestStore: (storeReference: string, callback: any, errorCallback:any) => dispatch(LocationStore.actionCreators.requestStore(storeReference, callback,errorCallback)),\r\n clearStores: () => dispatch(LocationStore.actionCreators.clearStores()),\r\n clearSelectedStore: () => dispatch(LocationStore.actionCreators.clearSelectedStore()),\r\n setHasStartedApp: (callback: () => void) => dispatch(HeaderFooterStore.actionCreators.setHasStartedApp(callback)),\r\n };\r\n};\r\n\r\nexport default connect(\r\n (state: ApplicationState) => state.location, // 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)(QRLanding as any); // eslint-disable-line @typescript-eslint/no-explicit-any","import React from 'react';\r\nimport { IonContent, IonHeader, IonButton, IonPage, IonTitle, IonToolbar, IonImg } from '@ionic/react';\r\nimport { useHistory } from \"react-router-dom\";\r\nimport './TCPage.scss';\r\nimport './InfoPage.scss';\r\n\r\nconst TCPage: React.FC = () => {\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 TCPage;\r\n","import React, { useEffect, useState } from 'react';\r\nimport { IonContent, IonHeader, IonButton, IonPage, IonTitle, IonToolbar, IonImg, IonAlert } from '@ionic/react';\r\nimport { useHistory, useLocation } from \"react-router-dom\";\r\nimport './Splash.scss';\r\nimport { baseUrl } from '../helpers/configHelper';\r\nimport styled from 'styled-components';\r\nimport { bindActionCreators } from 'redux';\r\nimport { useDispatch } from 'react-redux';\r\nimport * as headerFooterStore from '../store/HeaderFooterStore';\r\nimport { continueFromInitialPage, getConfig } from '../helpers/configHelper';\r\nimport { Base64 } from 'js-base64';\r\nimport * as ColleagueStore from '../store/ColleagueStore';\r\n\r\nconst SplashBack = styled.div`\r\n background-position: center top;\r\n background-size:cover;\r\n background-repeat: no-repeat;\r\n text-align: center;\r\n position: absolute;\r\n left: 0;\r\n right: 0;\r\n top: 50%;\r\n height: 100%;\r\n transform: translateY(-50%);\r\n color: #FFF;\r\n background-image: url(${baseUrl()}/images/assets/SplashMain_${getConfig().imageThemeID}.jpg);\r\n`;\r\n\r\nconst SplashBanner = styled.img`\r\n position: absolute;\r\n width: 100%;\r\n object-fit: scale-down;\r\n bottom: 0;\r\n left: 0;\r\n`;\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\nconst SplashPage: React.FC = () => {\r\n let history = useHistory();\r\n\r\n const dispatch = useDispatch();\r\n const [showPrivacyPolicy, setShowPrivacyPolicy] = useState(false);\r\n const [showConsentAlert, setShowConsentAlert] = useState(false);\r\n const [shouldShowCookieConsent, setShouldShowCookieConsent] = useState(false);\r\n const boundSetShowModal = bindActionCreators(headerFooterStore.actionCreators.setShowModal, useDispatch());\r\n const boundSetHasStartedApp = bindActionCreators(headerFooterStore.actionCreators.setHasStartedApp, useDispatch());\r\n const [message, setMessage] = useState(\"\");\r\n const search = useLocation().search;\r\n const pd = new URLSearchParams(search).get('pd');\r\n\r\n useEffect(() => {\r\n let cookieConsent = localStorage.getItem('cookieConsent');\r\n let newOrder = new URLSearchParams(search).get('newOrder');\r\n\r\n if(cookieConsent == null){\r\n setShouldShowCookieConsent(true);\r\n }\r\n else if(cookieConsent === \"granted\"){\r\n grantCookiePermissions();\r\n }\r\n\r\n if (pd) {\r\n let decodeEmailAndMoreCard = Base64.decode(JSON.stringify(pd));\r\n let 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 if (newOrder && localStorage.getItem('isLoggedIn')) {\r\n localStorage.removeItem('isLoggedIn');\r\n localStorage.removeItem('pfIdentifier');\r\n dispatch(ColleagueStore.loggedIn(false));\r\n }\r\n\r\n //fetch(baseUrl() + '/stores/GetSplashScreenMessage').then((res) => res.text()).then((data) => {\r\n // setMessage(data);\r\n //}) \r\n }, [])\r\n\r\n return (\r\n \r\n {/* \r\n { setShowPrivacyPolicy(false) }}\r\n header={\"Terms and Conditions Policy\"}\r\n message={\"By clicking continue, you agree to our Terms and Conditions Policy.\"}\r\n buttons={[\r\n {\r\n text: \"Terms & Conditions\",\r\n handler: () => {\r\n boundSetShowModal(\"TC\", true, true);\r\n }\r\n },\r\n {\r\n text: \"Continue\",\r\n handler: () => {\r\n localStorage.setItem(\"policyAccepted\", \"true\");\r\n continueFromInitialPage(history, boundSetHasStartedApp, \"/storesearch\");\r\n }\r\n }\r\n ]}\r\n />*/}\r\n\r\n {/* \r\n { setShowConsentAlert(false); setShowPrivacyPolicy(true); setShouldShowCookieConsent(false); }}\r\n message={\"To help us improve this service, we use analytics cookies. These cookies won't identify or track you outside this web app.\"}\r\n buttons={[\r\n {\r\n text: \"Decline\",\r\n handler: () => {\r\n localStorage.setItem('cookieConsent', 'denied');\r\n }\r\n },\r\n {\r\n text: \"Accept\",\r\n handler: () => {\r\n localStorage.setItem('cookieConsent', 'granted');\r\n grantCookiePermissions();\r\n }\r\n }\r\n ]}/>*/ }\r\n \r\n
\r\n
\r\n \"Morrisions\r\n
\r\n
\r\n
\r\n { continueFromInitialPage(history, boundSetHasStartedApp, \"/storesearch\") }}>Start Your Order\r\n
b1922
\r\n
\r\n
\r\n {shouldShowCookieConsent &&
\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 { boundSetShowModal(\"TC\", true, true); }}>Terms & Conditions Policy
\r\n
{\r\n setShowConsentAlert(false); \r\n setShouldShowCookieConsent(false);\r\n localStorage.setItem('cookieConsent', 'denied');\r\n //continueFromInitialPage(history, boundSetHasStartedApp, \"/storesearch\");\r\n }}>Decline cookies
\r\n
{ \r\n setShowConsentAlert(false); \r\n setShouldShowCookieConsent(false);\r\n localStorage.setItem('cookieConsent', 'granted');\r\n grantCookiePermissions();\r\n //continueFromInitialPage(history, boundSetHasStartedApp, \"/storesearch\");\r\n }}>Accept all cookies
\r\n
\r\n
\r\n
}\r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default SplashPage;\r\n","import { IonLoading } from '@ionic/react';\r\nimport React, { useEffect } from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { bindActionCreators } from 'redux';\r\nimport { baseUrl, getConfig } from '../helpers/configHelper';\r\nimport { ApplicationState } from '../store';\r\nimport * as headerStore from '../store/HeaderFooterStore';\r\n\r\nconst CafeTheme = React.lazy(() => import('../theme/CafeTheme'));\r\nconst MarketTheme = React.lazy(() => import('../theme/MarketTheme'));\r\n\r\nconst LoadingFallback: React.FC = () => \r\n
\r\n \r\n
\r\n\r\nconst ThemeManager: React.FC = ({ children }) => {\r\n \r\n const headerFooter = useSelector((state: ApplicationState) => state.headerFooter);\r\n //const boundSetConfiguration = bindActionCreators(headerStore.actionCreators.setAppConfiguration, useDispatch());\r\n\r\n const getConfigurationFromApi = () => {\r\n fetch(baseUrl() + \"/stores/GetAppConfiguration\")\r\n .then(res => res.json() as Promise)\r\n .then(res => {\r\n //console.log(\"GOT CONFIGURATION\", res.isMarket);\r\n //res.isMarket = true;\r\n //boundSetConfiguration(res);\r\n })\r\n .catch((err) => {\r\n console.log(err);\r\n }); \r\n }\r\n\r\n \r\n\r\n useEffect(() => {\r\n //boundSetConfiguration(getConfig());\r\n }, [])\r\n \r\n return(\r\n <>\r\n }>\r\n {\r\n getConfig().isMarket\r\n ?\r\n \r\n :\r\n \r\n }\r\n \r\n { children }\r\n \r\n )\r\n}\r\n\r\nexport default ThemeManager;","import { IonAlert, IonCol, IonContent, IonGrid, IonicSafeString, IonItem, IonPage, IonRow, IonRadioGroup, IonLabel, IonRadio } from '@ionic/react';\r\nimport React, { useState, useEffect } 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 { useHistory, useLocation } from \"react-router-dom\";\r\nimport './ChooseOrderType.scss';\r\nimport { bindActionCreators } from 'redux';\r\nimport { baseUrl } from '../helpers/configHelper';\r\n\r\ninterface IChannelProps {\r\n type: simpleChannelType,\r\n title: string,\r\n subTitle: string\r\n}\r\n\r\nconst ChannelProps: IChannelProps[] = [\r\n {\r\n type: simpleChannelType.TableOrder,\r\n title: \"Eat in\",\r\n subTitle: \"We’ll bring your order to your table\"\r\n },\r\n {\r\n type: simpleChannelType.ClickAndCollect,\r\n title: \"Take away\",\r\n subTitle: \"Collect right away or choose a time\"\r\n }\r\n];\r\n\r\nconst ChooseOrderType: React.FC = () => {\r\n const history = useHistory();\r\n const location = useLocation();\r\n\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\r\n const handleOrderTypeClick = (channel: SimpleChannel) => {\r\n if(channel == null) {\r\n return;\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 switch(channel.channelType){\r\n case simpleChannelType.ClickAndCollect:\r\n onChannelSelected(channel)\r\n break;\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 break;\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n setSelectedChannel(null)\r\n }, [location.pathname])\r\n\r\n return (\r\n \r\n \r\n { \r\n setIsAlertOpen(false); \r\n onChannelSelected(selectedChannel); }}\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={new IonicSafeString('
We\\'ll collect your table number later.
Your order will be delivered to your table in a few minutes.
')}\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 {LocationState?.selectedStore?.storeName}\r\n \r\n \r\n How would you like to order?\r\n \r\n \r\n \r\n { handleOrderTypeClick(e.detail.value) }}>\r\n {\r\n LocationState?.selectedStore?.supportedChannels\r\n .sort((a,b) => (ChannelProps.find((ch) => ch.type === a.channelType)?.title ?? \"\") < (ChannelProps.find((ch) => ch.type === b.channelType)?.title ?? \"\") ? -1 : 1)\r\n .map((channel, i) => { \r\n let thisChannel = ChannelProps.find((ch) => ch.type === channel.channelType);\r\n return \r\n \r\n \r\n
\r\n
\r\n {thisChannel?.title}\r\n
\r\n
\r\n {thisChannel?.subTitle}\r\n
\r\n
\r\n
\r\n
\r\n })\r\n } \r\n
\r\n
\r\n
\r\n {(LocationState?.selectedStore?.supportedChannels.length === 1) && \r\n \r\n {ChannelProps.find((ch) => ch.type === simpleChannelType.ClickAndCollect) ? \"Table service is not\" : \"Take away are not\"} currently available at this store.\r\n
history.goBack() }>Change store
\r\n
\r\n
}\r\n {/* \r\n
\r\n By selecting 'Eat in' you are confirming that you have completed the Test & Trace requirements for this venue.\r\n
\r\n */}\r\n
\r\n {localStorage.getItem('isLoggedIn') !== 'true' &&\r\n morrisons-save-card\r\n }\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 } 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\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 const TableFormErrors = useSelector((state: ApplicationState) => state.basket?.tableFormErrors);\r\n const 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 useEffect(() => {\r\n }, [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 {\r\n\t\t\t\t\t\t\t\t//console.log(\"Submitting table number\", values);\r\n\t\t\t\t\t\t\t\tboundSetTableNumber(values.TableNumber as number);\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\t{(props) => (\r\n\t\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\t\t\t
Table number
\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(LocationState && LocationState.selectedStore != undefined) &&\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{({ field, meta, form }: FieldProps) => {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tvar error = (meta.error && meta.touched) ? meta.error : false;\r\n\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?\r\n\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 { 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{\r\n\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\treturn Table M{table}\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\r\n\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\r\n\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<>\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\tconsole.log(e, field);\r\n\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\tlet value = e.detail.value;\r\n\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\tvalue = value.slice(0, max);\r\n\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\tform.setFieldValue(field.name, value);\r\n\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}}\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\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}\r\n {ContinueClicked && TableFormErrors &&\r\n
{TableFormErrors}
\r\n }\r\n\t\t\t\t\t\t\t\t\t
\r\n\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\r\n\t\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\t\t\t\t
\r\n\t\t\t
\r\n\t\t
\r\n\t)\r\n};\r\n\r\nexport default TableNumber;\r\n","import { IonContent, IonGrid, IonLabel, IonPage, IonRow } from '@ionic/react';\r\nimport { Field, FieldProps, Formik } from 'formik';\r\nimport React, { useEffect, useState } from 'react';\r\nimport { bindActionCreators } from 'redux';\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 { useLocation } from \"react-router-dom\";\r\n\r\nconst NameOrNickname: React.FC = () => {\r\n const boundSetNickname = bindActionCreators(BasketStore.actionCreators.setNickname, useDispatch());\r\n\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\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;\r\n","import React, { MutableRefObject, useEffect, useRef, useState } from 'react';\r\nimport { Redirect, Route, useLocation } from 'react-router-dom';\r\nimport {\r\n IonApp,\r\n IonIcon,\r\n IonLabel,\r\n IonFooter,\r\n IonToolbar,\r\n IonTitle,\r\n IonToast,\r\n IonRouterOutlet,\r\n IonContent,\r\n IonTabBar,\r\n IonHeader,\r\n IonTabButton,\r\n IonTabs,\r\n IonAlert\r\n} from '@ionic/react';\r\n\r\nimport { checkmarkCircleOutline } from \"ionicons/icons\";\r\nimport { IonReactRouter } from '@ionic/react-router';\r\nimport { ellipse, square, triangle, home } from 'ionicons/icons';\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 Location from './pages/Location';\r\nimport BasketPage from './pages/BasketPage';\r\nimport UpsellPage from './pages/UpsellPage';\r\nimport Tab2 from './pages/Tab2';\r\nimport Tab3 from './pages/Tab3';\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 { createBrowserHistory } from 'history';\r\nimport StoreSearch from './pages/StoreSearch';\r\nimport { baseUrl, getConfig } from './helpers/configHelper';\r\nimport ScanQrCode from './pages/ScanQrCode';\r\nimport QRLanding from './pages/QRLanding';\r\nimport { useSelector } from 'react-redux';\r\n/* Static Pages*/\r\nimport TCPage from './pages/TCPage';\r\n//import FAQModal from './pages/FAQPage';\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\n//import './theme/variables.css';\r\nimport './theme/common.scss';\r\nimport ThemeManager from './components/ThemeManager';\r\nimport ChooseOrderType from './pages/ChooseOrderType';\r\nimport TableNumber from './pages/TableNumber';\r\nimport NameOrNickname from './pages/NameOrNickname';\r\n\r\nlet history = createBrowserHistory();\r\n\r\n\r\n\r\nfunction 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 = (s: any) => {\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\r\n let faviconHref = baseUrl() + \"/images/icon/cafe/favicon.png\";\r\n let iconHref = baseUrl() + \"/images/icon/cafe/icon.png\";\r\n\r\n if(getConfig().isMarket){\r\n faviconHref = baseUrl() + \"/images/icon/mk/favicon.png\";\r\n iconHref = baseUrl() + \"/images/icon/mk/icon.png\";\r\n }\r\n\r\n\r\n const favicon = document.createElement('link');\r\n favicon.rel = \"shortcut icon\";\r\n favicon.type = \"image/png\";\r\n favicon.href = faviconHref;\r\n\r\n const icon = document.createElement('link');\r\n icon.rel = \"apple-touch-icon\";\r\n icon.href = iconHref;\r\n\r\n const head = document.getElementsByTagName('head')[0];\r\n head.appendChild(favicon);\r\n head.appendChild(icon);\r\n\r\n}\r\n\r\nconst createManifest = () => {\r\n let isMarket = getConfig().isMarket;\r\n let manifest = {\r\n \"short_name\": isMarket ? \"Market Kitchen\" : \"Morrisons Cafe\",\r\n \"name\": isMarket ? \"Market Kitchen Order & Pay\" : \"Morrisons Cafe Order & Pay\",\r\n \"icons\": [\r\n {\r\n \"src\": `images/icon/${isMarket ? \"mk\" : \"cafe\"}/favicon.png`,\r\n \"sizes\": \"64x64 32x32 24x24 16x16\",\r\n \"type\": \"image/x-icon\"\r\n },\r\n {\r\n \"src\": `images/icon/${isMarket ? \"mk\" : \"cafe\"}/icon.png`,\r\n \"type\": \"image/png\",\r\n \"sizes\": \"512x512\",\r\n \"purpose\": \"maskable\"\r\n }\r\n ],\r\n \"start_url\": \".\",\r\n \"display\": \"standalone\",\r\n \"theme_color\": \"#ffffff\",\r\n \"background_color\": \"#ffffff\"\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 document.querySelector('#manifest-placeholder')?.setAttribute('href', manifestUrl);\r\n}\r\n\r\n\r\n\r\n\r\nconst App: React.FC = () => {\r\n //const location = useLocation();\r\n \r\n\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 expired = useSelector((state: ApplicationState) => state.colleague?.expired);\r\n\r\n useEffect(() => {\r\n if (expired != null) {\r\n setShowExpireModal(true);\r\n }\r\n }, [expired])\r\n\r\n const contentRef = useRef(null);\r\n const basketState = useSelector((state: ApplicationState) => state.basket);\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 {showExpireModal &&\r\n { 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 \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 \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\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 * 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\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}\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};\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 { 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 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\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":""}