{"version":3,"file":"productsApp.js","mappings":"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","sources":["webpack://pizza-hut/webpack/runtime/chunk loaded","webpack://pizza-hut/./src/shared/components/loader.component.tsx","webpack://pizza-hut/./src/shared/utils.ts","webpack://pizza-hut/./src/shared/helpers/routing-helpers.ts","webpack://pizza-hut/./src/hooks/useShowDelay.ts","webpack://pizza-hut/./src/shared/helpers/index.ts","webpack://pizza-hut/./src/hooks/useKeyPress.ts","webpack://pizza-hut/./src/shared/components/modal.compontent.tsx","webpack://pizza-hut/./src/shared/components/info-modal.component.tsx","webpack://pizza-hut/./src/shared/api/axios.ts","webpack://pizza-hut/./src/shared/types.ts","webpack://pizza-hut/./src/shared/tools/api-response-wrapper.ts","webpack://pizza-hut/./src/shared/store/global/global.actions.ts","webpack://pizza-hut/./src/apps/ProductsApp/store/static-content/products-static-content.actions.ts","webpack://pizza-hut/./src/apps/ProductsApp/types/dto.types.ts","webpack://pizza-hut/./src/shared/validators/index.ts","webpack://pizza-hut/./src/shared/helpers/coupons-helpers.ts","webpack://pizza-hut/./src/apps/NavigationApp/store/address-wizzard/address-wizzard.actions.ts","webpack://pizza-hut/./src/apps/NavigationApp/store/static-content/static-content.actions.ts","webpack://pizza-hut/./src/apps/NavigationApp/navigation.types.ts","webpack://pizza-hut/./src/apps/NavigationApp/store/actions.ts","webpack://pizza-hut/./src/apps/ProductsApp/store/offers/offers.actions.ts","webpack://pizza-hut/./src/apps/ProductsApp/store/metadata/metadata.actions.ts","webpack://pizza-hut/./src/apps/ProductsApp/store/products/products.actions.ts","webpack://pizza-hut/./src/apps/ProductsApp/store/basket/basket.actions.ts","webpack://pizza-hut/./src/apps/ProductsApp/helpers/customize-product.helper.ts","webpack://pizza-hut/./src/apps/ProductsApp/store/customize-product/customize-product.actions.ts","webpack://pizza-hut/./src/typings/web-bridge.types.ts","webpack://pizza-hut/./src/apps/LocalizationApp/types/localization.types.ts","webpack://pizza-hut/./src/apps/LocalizationApp/Store/actions.ts","webpack://pizza-hut/./src/apps/LocalizationApp/helpers/store-status.ts","webpack://pizza-hut/./src/apps/ProductsApp/store/checkout/checkout.reducer.ts","webpack://pizza-hut/./src/apps/ProductsApp/store/static-content/checkout-static-content.actions.ts","webpack://pizza-hut/./src/apps/ProductsApp/store/static-content/checkout-static-content-reducer.ts","webpack://pizza-hut/./src/apps/ProductsApp/store/checkout/checkout.actions.ts","webpack://pizza-hut/./src/apps/ProductsApp/store/customize-product/customize-product.reducer.ts","webpack://pizza-hut/./src/apps/ProductsApp/components/customize/pizza-slice.component.tsx","webpack://pizza-hut/./src/apps/ProductsApp/components/customize/pizza-part-switch.component.tsx","webpack://pizza-hut/./src/shared/components/radio.component.tsx","webpack://pizza-hut/./src/apps/ProductsApp/components/customize/receipt-option.component.tsx","webpack://pizza-hut/./src/apps/ProductsApp/components/customize/receipt-selection.component.tsx","webpack://pizza-hut/./src/apps/ProductsApp/containers/recipe-selection.container.tsx","webpack://pizza-hut/./src/apps/ProductsApp/components/customize/special-option.component.tsx","webpack://pizza-hut/./src/apps/ProductsApp/components/customize/special-option-selector.component.tsx","webpack://pizza-hut/./src/apps/ProductsApp/containers/starter-option.container.tsx","webpack://pizza-hut/./src/apps/ProductsApp/components/customize/crust-option.component.tsx","webpack://pizza-hut/./src/apps/ProductsApp/containers/crust-selection.container.tsx","webpack://pizza-hut/./src/apps/ProductsApp/components/customize/topping-option.component.tsx","webpack://pizza-hut/./src/apps/ProductsApp/components/customize/special-topping-selector.component.tsx","webpack://pizza-hut/./src/apps/ProductsApp/containers/topping-selection.container.tsx","webpack://pizza-hut/./src/apps/ProductsApp/components/customize/toppings-overview.component.tsx","webpack://pizza-hut/./src/apps/ProductsApp/containers/customize-product.container.tsx","webpack://pizza-hut/./src/shared/components/single-action-modal.component.tsx","webpack://pizza-hut/./src/apps/ProductsApp/containers/product-not-available-modal.container.tsx","webpack://pizza-hut/./src/apps/ProductsApp/containers/no-of-vouchers-exceeded-modal.conatiner.tsx","webpack://pizza-hut/./src/apps/ProductsApp/containers/coupon-code-invalid-modal.container.tsx","webpack://pizza-hut/./src/shared/helpers/mobile-app-helper.ts","webpack://pizza-hut/./src/shared/store/static-content/static-content.actions.ts","webpack://pizza-hut/./src/shared/store/global/global.reducer.ts","webpack://pizza-hut/./src/shared/store/static-content/static-content.reducer.ts","webpack://pizza-hut/./src/apps/LocalizationApp/Store/reducers.ts","webpack://pizza-hut/./src/apps/LocalizationApp/Store/static-content/localization-static-content.actions.ts","webpack://pizza-hut/./src/apps/LocalizationApp/Store/static-content/localization-static-content.reducer.ts","webpack://pizza-hut/./src/apps/LocalizationApp/Store/index.ts","webpack://pizza-hut/./src/apps/NavigationApp/store/navigation/navigation.reducer.ts","webpack://pizza-hut/./src/apps/NavigationApp/store/address-wizzard/address-wizzard.reducer.ts","webpack://pizza-hut/./src/apps/NavigationApp/store/static-content/static-content.reducer.ts","webpack://pizza-hut/./src/apps/NavigationApp/store/index.ts","webpack://pizza-hut/./src/apps/ProductsApp/store/products/products.reducer.ts","webpack://pizza-hut/./src/apps/ProductsApp/store/metadata/metadata.reducer.ts","webpack://pizza-hut/./src/apps/ProductsApp/store/static-content/products-static-content.reducer.ts","webpack://pizza-hut/./src/shared/tools/uuid-generator.ts","webpack://pizza-hut/./src/apps/ProductsApp/store/basket/basket.reducer.ts","webpack://pizza-hut/./src/apps/ProductsApp/store/offers/offers.reducer.ts","webpack://pizza-hut/./src/apps/ProductsApp/store/index.ts","webpack://pizza-hut/./src/hooks/useEventListener.ts","webpack://pizza-hut/./src/hooks/useOutsideClick.ts","webpack://pizza-hut/./src/apps/NavigationApp/components/language-switch.component.tsx","webpack://pizza-hut/./src/apps/NavigationApp/components/account-dropdown.tsx","webpack://pizza-hut/./src/apps/NavigationApp/components/selected-address.component.tsx","webpack://pizza-hut/./src/shared/components/toast.component.tsx","webpack://pizza-hut/./src/apps/LocalizationApp/Components/stores-list.component.tsx","webpack://pizza-hut/./src/shared/components/suggestions.component.tsx","webpack://pizza-hut/./src/apps/LocalizationApp/Components/address-input.component.tsx","webpack://pizza-hut/./src/apps/LocalizationApp/Containers/info-panel.container.tsx","webpack://pizza-hut/./src/apps/LocalizationApp/Components/localization-addition.component.tsx","webpack://pizza-hut/./src/apps/LocalizationApp/Components/last-used-addresses.component.tsx","webpack://pizza-hut/./src/apps/LocalizationApp/Validators/address.validator.ts","webpack://pizza-hut/./src/apps/LocalizationApp/Containers/localization-search.container.tsx","webpack://pizza-hut/./src/hooks/useVisible.ts","webpack://pizza-hut/./src/shared/components/select-time.component.tsx","webpack://pizza-hut/./src/apps/LocalizationApp/Components/store-unavailable.component.tsx","webpack://pizza-hut/./src/apps/LocalizationApp/Containers/choose-time.container.tsx","webpack://pizza-hut/./src/apps/LocalizationApp/Components/order-type-switch.component.tsx","webpack://pizza-hut/./src/shared/components/change-address-alert.component.tsx","webpack://pizza-hut/./src/apps/LocalizationApp/Components/change-store.component.tsx","webpack://pizza-hut/./src/apps/LocalizationApp/Containers/store-status-info.container.tsx","webpack://pizza-hut/./src/apps/LocalizationApp/Containers/search-window.container.tsx","webpack://pizza-hut/./src/apps/NavigationApp/containers/address-wizzard.container.tsx","webpack://pizza-hut/./src/apps/NavigationApp/components/logout-modal.component.tsx","webpack://pizza-hut/./src/apps/NavigationApp/containers/main-header.container.tsx","webpack://pizza-hut/./src/apps/ProductsApp/components/allergens-info.component.tsx","webpack://pizza-hut/./src/apps/ProductsApp/components/categories.component.tsx","webpack://pizza-hut/./src/apps/ProductsApp/components/upsell-product.component.tsx","webpack://pizza-hut/./src/apps/ProductsApp/helpers/basket-items.helper.tsx","webpack://pizza-hut/./src/apps/ProductsApp/components/basket-item.component.tsx","webpack://pizza-hut/./src/apps/ProductsApp/components/offer-discount-tag.component.tsx","webpack://pizza-hut/./src/shared/components/form-input.component.tsx","webpack://pizza-hut/./src/apps/ProductsApp/containers/voucher-modal.container.tsx","webpack://pizza-hut/./src/apps/ProductsApp/components/basket-offer.component.tsx","webpack://pizza-hut/./src/apps/ProductsApp/containers/basket.container.tsx","webpack://pizza-hut/./src/apps/ProductsApp/containers/catalog-wrapper.container.tsx","webpack://pizza-hut/./src/apps/ProductsApp/containers/last-order.container.tsx","webpack://pizza-hut/./src/apps/ProductsApp/components/offer-card.component.tsx","webpack://pizza-hut/./src/apps/ProductsApp/components/popular-offer-card.component.tsx","webpack://pizza-hut/./src/apps/ProductsApp/pages/offers.page.tsx","webpack://pizza-hut/./src/apps/ProductsApp/components/product-card.component.tsx","webpack://pizza-hut/./src/apps/ProductsApp/components/banner.component.tsx","webpack://pizza-hut/./src/apps/ProductsApp/pages/catalog.page.tsx","webpack://pizza-hut/./src/apps/ProductsApp/containers/checkout/checkout-basket.container.tsx","webpack://pizza-hut/./src/apps/NavigationApp/components/center-navbar.component.tsx","webpack://pizza-hut/./src/apps/ProductsApp/components/checkout/checkout-section.component.tsx","webpack://pizza-hut/./src/apps/ProductsApp/validators/checkout.validators.ts","webpack://pizza-hut/./src/shared/helpers/formControl-helpers.ts","webpack://pizza-hut/./src/apps/ProductsApp/containers/checkout/checkout-remarks.container.tsx","webpack://pizza-hut/./src/apps/ProductsApp/containers/checkout/checkout-delivery-data.container.tsx","webpack://pizza-hut/./src/shared/components/checkbox-input.component.tsx","webpack://pizza-hut/./src/apps/ProductsApp/containers/checkout/checkout-contact-data.container.tsx","webpack://pizza-hut/./src/apps/ProductsApp/types/checkout.types.ts","webpack://pizza-hut/./src/apps/ProductsApp/containers/checkout/checkout-finalize.container.tsx","webpack://pizza-hut/./src/shared/components/toggle-input.component.tsx","webpack://pizza-hut/./src/apps/ProductsApp/containers/checkout/checkout-payment-data.container.tsx","webpack://pizza-hut/./src/apps/ProductsApp/containers/checkout/checkout-back.container.tsx","webpack://pizza-hut/./src/apps/ProductsApp/components/checkout/applicable-offers.component.tsx","webpack://pizza-hut/./src/apps/ProductsApp/containers/checkout/checkout-offers.container.tsx","webpack://pizza-hut/./src/apps/ProductsApp/containers/checkout/checkout-validation.modal.container.tsx","webpack://pizza-hut/./src/apps/ProductsApp/containers/checkout/checkout-info-modal.container.tsx","webpack://pizza-hut/./src/apps/ProductsApp/pages/checkout.page.tsx","webpack://pizza-hut/./src/apps/ProductsApp/components/combo-card.component.tsx","webpack://pizza-hut/./src/apps/ProductsApp/containers/offer-choices.container.tsx","webpack://pizza-hut/./src/apps/ProductsApp/components/offer-compilation/offer-compilation-header.component.tsx","webpack://pizza-hut/./src/apps/ProductsApp/components/offer-compilation/offer-compilation-go-back.component.tsx","webpack://pizza-hut/./src/apps/ProductsApp/components/offer-compilation/offer-compilation-details.component.tsx","webpack://pizza-hut/./src/apps/ProductsApp/components/offer-compilation/offer-compilation-submit.component.tsx","webpack://pizza-hut/./src/apps/ProductsApp/pages/offer-compilation.page.tsx","webpack://pizza-hut/./src/apps/ProductsApp/index.tsx","webpack://pizza-hut/./src/apps/ProductsApp/App.tsx","webpack://pizza-hut/./src/apps/ProductsApp/router.tsx","webpack://pizza-hut/webpack/bootstrap","webpack://pizza-hut/webpack/runtime/compat get default export","webpack://pizza-hut/webpack/runtime/define property getters","webpack://pizza-hut/webpack/runtime/global","webpack://pizza-hut/webpack/runtime/hasOwnProperty shorthand","webpack://pizza-hut/webpack/runtime/make namespace object","webpack://pizza-hut/webpack/runtime/runtimeId","webpack://pizza-hut/webpack/runtime/jsonp chunk loading","webpack://pizza-hut/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","import React, { useEffect, useState } from 'react';\r\n\r\nexport interface LoaderProps {\r\n text?: string;\r\n fullScreen?: boolean;\r\n}\r\n\r\nconst Loader: React.FC = ({ text, fullScreen }) => {\r\n const mobile = window.S4DWebBridge();\r\n const delay = 1000;\r\n const [show, setShowLoader] = useState(false);\r\n\r\n useEffect(() => {\r\n setShowLoader(false);\r\n mobile && mobile?.hideLoader();\r\n const delayedLoader = setTimeout(() => {\r\n mobile && mobile?.showLoader();\r\n setShowLoader(true);\r\n }, delay);\r\n return () => {\r\n clearTimeout(delayedLoader);\r\n mobile && mobile?.hideLoader();\r\n setShowLoader(false);\r\n };\r\n }, []);\r\n\r\n if (!show) return null;\r\n return (\r\n \r\n \r\n {text && (\r\n \r\n {text}\r\n \r\n )}\r\n \r\n );\r\n};\r\nexport default Loader;\r\n","import { compose } from 'redux';\r\n\r\nconst composeEnhancers = (process.env.NODE_ENV === 'development' && window && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__) || compose;\r\n\r\nexport default composeEnhancers;\r\n\r\nexport interface LoadReduxFromLocalStorageParams {\r\n state: TState;\r\n key: string;\r\n}\r\nexport function LoadReduxFromLocalStorage({ state, key }: LoadReduxFromLocalStorageParams): TState {\r\n try {\r\n const sessionItem = localStorage.getItem(key);\r\n\r\n if (!sessionItem) {\r\n return state;\r\n }\r\n\r\n return {\r\n ...state,\r\n ...JSON.parse(sessionItem),\r\n };\r\n } catch (ex) {\r\n console.debug(`Problem with loading state from session storage for key ${key}`);\r\n console.log(ex);\r\n }\r\n\r\n return state;\r\n}\r\n\r\nexport function LoadReduxItemFromLocalStorage(defaultValue: T, key: string): T {\r\n try {\r\n const sessionItem = localStorage.getItem(key);\r\n\r\n if (!sessionItem) {\r\n return defaultValue;\r\n }\r\n\r\n return JSON.parse(sessionItem);\r\n } catch (ex) {\r\n console.debug(`Problem with loading redux state item from session storage for key ${key}`);\r\n console.log(ex);\r\n }\r\n\r\n return defaultValue;\r\n}\r\n\r\nexport function storeDataInCookie(key: string, value: T, expirationDate?: Date): void {\r\n const cookieValue = `${encodeURIComponent(String(value))}; path=/${\r\n expirationDate ? `; expires=${expirationDate.toUTCString()}` : ''\r\n }`;\r\n document.cookie = `${key}=${cookieValue}`;\r\n}\r\n\r\nexport function removeDataFromCookie(key: string) {\r\n document.cookie = `${encodeURIComponent(key)}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/`;\r\n}\r\n\r\nexport function LoadReduxFromCookie({ state, key }: LoadReduxFromLocalStorageParams): TState {\r\n try {\r\n const cookieState = document.cookie.split('; ')?.find((row) => row.startsWith(`${key}=`));\r\n\r\n if (!cookieState) {\r\n return state;\r\n }\r\n\r\n const decodedCookieState = decodeURIComponent(cookieState).split('=')[1].split('; ')[0];\r\n\r\n return {\r\n ...state,\r\n ...JSON.parse(decodedCookieState),\r\n };\r\n } catch (ex) {\r\n console.debug(`Problem with loading state from session storage for key ${key}`);\r\n console.log(ex);\r\n }\r\n\r\n return state;\r\n}\r\n\r\nexport function cookieExists(key: string) {\r\n const cookieData = document.cookie.split('; ')?.find((row) => row.startsWith(`${key}=`));\r\n if (!cookieData) return false;\r\n return true;\r\n}\r\nexport function removeBasketFromLocalStorage() {\r\n localStorage.removeItem('basket');\r\n localStorage.removeItem('addressWizzard');\r\n}\r\n\r\nexport function capitalizeFirstLetter(value?: string): string {\r\n if (!value) return '';\r\n return value.charAt(0).toUpperCase() + value.slice(1);\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n\r\nimport { removeDataFromCookie } from 'shared/utils';\r\n\r\nexport const redirectToHomePage = (): void => {\r\n window.location.href = hostURL();\r\n};\r\n\r\nexport const logout = (): void => {\r\n removeDataFromCookie('pizza-hut-access-token');\r\n window.location.href = `${hostURL()}account/sign-out`;\r\n};\r\n\r\nexport const hostURL = (): string => {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const url = (document.getElementById('baseUrl') as any).value;\r\n return `${url}/`;\r\n};\r\nexport const appCulture = (): string => {\r\n const culture = (document.getElementById('requestedCulture') as any).value;\r\n return culture;\r\n};\r\n\r\nconst getClientURL = (): string => {\r\n const host = hostURL();\r\n const href = document.getElementsByTagName('base')[0].getAttribute('href');\r\n return host + href;\r\n};\r\n\r\nexport const getRedirectURL = (href: string): string => {\r\n const url = `${getClientURL()}/${href}`;\r\n return url;\r\n};\r\n\r\nexport const getOtherAppRedirectURL = (href: string): string => {\r\n const url = hostURL() + href;\r\n return url;\r\n};\r\n\r\nexport const redirectToOtherAppURL = (href: string): void => {\r\n const url = hostURL() + href;\r\n window.location.href = url;\r\n};\r\n\r\nexport const redirectToExternalURL = (href: string): void => {\r\n window.location.href = href;\r\n};\r\n\r\nexport const redirectToURL = (href: string): void => {\r\n const url = hostURL() + href;\r\n window.location.href = url;\r\n};\r\n\r\nexport const redirectToNotFound = (): void => {\r\n const url = `${hostURL()}not-found`;\r\n window.location.href = url;\r\n};\r\n\r\nexport const backToHistory = (): void => {\r\n // eslint-disable-next-line no-restricted-globals\r\n history.back();\r\n};\r\nexport const redirectToMainPage = (): void => {\r\n window.location.href = hostURL();\r\n};\r\n\r\nexport const parametersToObject = (args: string): any => {\r\n const value = args.substring(1, args.length);\r\n const obj: any = {};\r\n\r\n if (value == null || value === undefined) return obj;\r\n\r\n const splitOperator = '&';\r\n const equalOperator = '=';\r\n const parameters = value.split(splitOperator);\r\n\r\n for (let index = 0; index < parameters.length; index++) {\r\n const element = parameters[index];\r\n const keyAndValueArray = element.split(equalOperator);\r\n // eslint-disable-next-line prefer-destructuring\r\n obj[keyAndValueArray[0]] = keyAndValueArray[1];\r\n }\r\n\r\n return obj;\r\n};\r\n\r\nexport const openNewWindow = (href: string): void => {\r\n const url = hostURL() + href;\r\n window.open(url);\r\n};\r\n","import { useEffect, useState } from 'react';\r\n\r\ninterface ShowDelay {\r\n show: ShowOptions;\r\n}\r\n\r\nenum ShowOptions {\r\n show = 'show',\r\n hide = 'd-none',\r\n none = '',\r\n}\r\n\r\nexport default function useShowDelay(isVisible: boolean): ShowDelay {\r\n const [show, setShow] = useState(ShowOptions.none);\r\n\r\n useEffect(() => {\r\n setShow(ShowOptions.none);\r\n setTimeout(() => {\r\n setShow(isVisible ? ShowOptions.show : ShowOptions.hide);\r\n }, 100);\r\n }, [isVisible]);\r\n\r\n return { show };\r\n}\r\n","/* eslint-disable no-restricted-globals */\r\nimport * as _routingHelpers from './routing-helpers';\r\n\r\n// exports\r\nexport const RoutingHelpers = _routingHelpers;\r\n\r\nexport const DateTime = {\r\n now: (): string => {\r\n const date = new Date();\r\n const timestamp = `${date.getFullYear()}-${\r\n date.getMonth() + 1\r\n }-${date.getDate()} ${date.getHours()}:${date.getMinutes()}:${date.getSeconds()}`;\r\n return timestamp;\r\n },\r\n formatTimeHHMM: (date: Date): string => {\r\n const hour = date.getHours().toString().length === 1 ? `0${date.getHours()}` : date.getHours().toString();\r\n const minutes = date.getMinutes().toString().length === 1 ? `0${date.getMinutes()}` : date.getMinutes().toString();\r\n\r\n return `${hour}:${minutes}`;\r\n },\r\n // method to format DD/MM/YYYY to Date object\r\n formatToDateObject: (date: string): Date | undefined => {\r\n if (!date || date.length === 0) return undefined;\r\n const year = date.slice(6);\r\n const month = date.slice(3, 5);\r\n const day = date.slice(0, 2);\r\n\r\n return new Date(`${year}-${month}-${day}`);\r\n },\r\n};\r\n\r\nexport const StringHelper = {\r\n GetFirstNWords: (sourceString: string, n: number): string => {\r\n return sourceString && typeof n === 'number' ? sourceString.split(' ').slice(0, n).join(' ') : '';\r\n },\r\n OmitFirstNWords: (sourceString: string, n: number): string => {\r\n if (sourceString && typeof n === 'number') {\r\n const words = sourceString.split(' ');\r\n return words.slice(n, words.length).join(' ');\r\n }\r\n return '';\r\n },\r\n};\r\n\r\nexport const PaymentHelper = {\r\n getCurrencyISOCode(): string {\r\n const currency = (document.getElementById('defaultCurrency') as any).value;\r\n return currency;\r\n },\r\n getDefaultCulture(): string {\r\n const culture = (document.getElementById('defaultCulture') as any).value;\r\n return culture;\r\n },\r\n formatToDisplay(value: number): string {\r\n return new Intl.NumberFormat(this.getDefaultCulture(), { style: 'currency', currency: this.getCurrencyISOCode() }).format(\r\n value,\r\n );\r\n },\r\n formatStringToDisplay(value: string): string {\r\n const valAsNumber = parseFloat(value.replace(',', '.'));\r\n if (isNaN(valAsNumber)) return '';\r\n return this.formatToDisplay(valAsNumber);\r\n },\r\n};\r\n\r\n// eslint-disable-next-line\r\nexport const FieldsToBooleanCondition = (obj: any): boolean => {\r\n const keys = Object.keys(obj);\r\n let result = false;\r\n keys.forEach((key) => {\r\n if (obj[key] !== false) result = obj[key] !== false;\r\n });\r\n return result;\r\n};\r\n","import { useEffect } from 'react';\r\n\r\nexport default function useKeyPress(keyCode: KeyboardEvent['code'], callback: () => void, deps?: React.DependencyList): void {\r\n const keyPressHandler = (event: KeyboardEvent) => {\r\n if (event.key?.toUpperCase() === keyCode.toUpperCase()) {\r\n event.preventDefault();\r\n callback();\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n window.addEventListener('keydown', keyPressHandler);\r\n return () => {\r\n window.removeEventListener('keydown', keyPressHandler);\r\n };\r\n }, deps);\r\n}\r\n","import React, { ReactNode, useEffect } from 'react';\r\nimport useShowDelay from 'hooks/useShowDelay';\r\nimport { ModalProps as _modalProps } from '../types';\r\n\r\ninterface BackdropComponentProps {\r\n children: ReactNode;\r\n isVisible: boolean;\r\n transparent?: boolean;\r\n onClose?(): void;\r\n closeButton?(): void;\r\n closeButtonTestId?: string;\r\n fullWidth?: boolean;\r\n backdropButton?: { visible: boolean; fixedPosition?: boolean };\r\n}\r\n\r\nconst BackdropComponent: React.FC = ({\r\n children,\r\n isVisible,\r\n onClose,\r\n transparent,\r\n closeButton,\r\n closeButtonTestId,\r\n fullWidth,\r\n backdropButton,\r\n}) => {\r\n const { show } = useShowDelay(isVisible);\r\n\r\n useEffect(() => {\r\n const body: HTMLBodyElement = document.getElementsByTagName('body')[0];\r\n if (isVisible) {\r\n body.style.overflowY = 'hidden';\r\n } else {\r\n body.style.overflowY = 'auto';\r\n }\r\n // eslint-disable-next-line no-unused-expressions\r\n return (): void => {\r\n body.style.overflowY = 'auto';\r\n };\r\n }, [isVisible]);\r\n\r\n const showCloseButton = !!closeButton && !backdropButton?.visible;\r\n\r\n return (\r\n
\r\n
\r\n {backdropButton?.visible && (\r\n \r\n )}\r\n
\r\n
\r\n {\r\n e.stopPropagation();\r\n }}\r\n style={\r\n fullWidth\r\n ? {\r\n maxWidth: 'unset',\r\n }\r\n : {}\r\n }\r\n >\r\n \r\n {showCloseButton && (\r\n
\r\n \r\n
\r\n )}\r\n {backdropButton?.visible && !backdropButton.fixedPosition && (\r\n \r\n )}\r\n {children}\r\n
\r\n
\r\n
\r\n
\r\n \r\n );\r\n};\r\n\r\nexport default BackdropComponent;\r\n\r\nexport type ModalProps = _modalProps;\r\n","import useKeyPress from 'hooks/useKeyPress';\r\nimport React from 'react';\r\n\r\n// shared\r\nimport Modal, { ModalProps } from 'shared/components/modal.compontent';\r\n\r\ninterface Props extends ModalProps {\r\n labels: {\r\n title: string;\r\n description: string;\r\n };\r\n testId: string;\r\n}\r\n\r\nconst InfoModal = ({ cancelCallbackFn, labels, testId }: Props) => {\r\n cancelCallbackFn && useKeyPress('ENTER', cancelCallbackFn);\r\n\r\n return (\r\n \r\n
\r\n
\r\n

\r\n {labels.title}\r\n

\r\n

\r\n {labels.description}\r\n

\r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default InfoModal;\r\n","import axios, { AxiosInstance } from 'axios';\r\n\r\nconst baseURL = (document.getElementById('baseUrl') as any).value;\r\n\r\nconst instance: AxiosInstance = axios.create({\r\n baseURL,\r\n});\r\n\r\nexport default instance;\r\n","import { openNewWindow } from './helpers/routing-helpers';\r\n/* eslint-disable @typescript-eslint/no-explicit-any */\r\n/* eslint-disable no-extend-native */\r\n/* eslint-disable func-names */\r\ndeclare global {\r\n interface Array {\r\n orderByDesc(propertyName: string): void;\r\n orderByAsc(propertyName: string): void;\r\n removeDuplicates(): any[];\r\n }\r\n}\r\n\r\nArray.prototype.orderByAsc = function (propertyName: string): void {\r\n this.sort((a, b) => {\r\n return a[propertyName] - b[propertyName];\r\n });\r\n};\r\nArray.prototype.orderByDesc = function (propertyName: string): void {\r\n this.sort((a, b) => {\r\n return b[propertyName] - a[propertyName];\r\n });\r\n};\r\nArray.prototype.removeDuplicates = function (): any[] {\r\n const removedDuplicates = new Set(this);\r\n const arrayWithoutDuplicates = Array.from(removedDuplicates);\r\n return arrayWithoutDuplicates;\r\n};\r\n\r\nexport interface StaticContent {\r\n messages: {\r\n tooltipsGeoDisabled: string;\r\n tooltipsFillAddress: string;\r\n tooltipsFillStreetNumber: string;\r\n tooltipsAdressConfirmation: string;\r\n errorMessagesWrongAddress: string;\r\n errorMessagesWrongStreetNumber: string;\r\n errorMessagesImpossibleToLocateDelivery: string;\r\n errorMessagesImpossibleToLocatePickup: string;\r\n errorMessagesNoStores: string;\r\n errorModalTitle: string;\r\n errorModalDescription: string;\r\n\r\n // TODO update to return not as a part of messages\r\n apiKey: string;\r\n };\r\n simplifiedFooter: {\r\n Name: string;\r\n Url: string;\r\n OpenInNewWindow?: { Value: boolean };\r\n }[];\r\n configuration: {\r\n hideCouponsScratchedPrices: boolean;\r\n }\r\n}\r\n\r\nexport interface PropertyChangedPayload {\r\n name: string;\r\n value: string;\r\n}\r\n\r\nexport interface PropertyChangedEventArgs {\r\n target: {\r\n name: string;\r\n value: T;\r\n };\r\n}\r\n\r\nexport interface ServerSideValidationPayload {\r\n fieldName: string;\r\n message: string;\r\n status: number;\r\n errorCode: string;\r\n}\r\n\r\nexport interface GeneralServerError {\r\n succeeded: boolean;\r\n status: number;\r\n errorCode: string;\r\n contentMessageForErrorFound: boolean;\r\n contextDescription: string;\r\n errorDescription: string;\r\n errorTranslations: {\r\n title: string;\r\n description: string;\r\n },\r\n detail: string;\r\n}\r\n\r\nexport interface PlaceOrderError extends GeneralServerError {\r\n entitiesErrors: {\r\n entityIdentifier: string;\r\n entityType: string;\r\n errorCode: string;\r\n }[];\r\n}\r\n\r\nexport interface LoaderPayload {\r\n value: boolean;\r\n}\r\n\r\nexport enum UserMessageType {\r\n INFO,\r\n WARNING,\r\n ERROR,\r\n}\r\nexport interface UserMessage {\r\n type: UserMessageType;\r\n message: string;\r\n status?: number;\r\n}\r\n\r\nexport enum OrderDistributionType {\r\n Delivery = 'DELIVERY',\r\n Pickup = 'PICKUP',\r\n}\r\n\r\nexport interface ValidatorItem {\r\n fn(value: string): boolean;\r\n message: string;\r\n messageType: UserMessageType;\r\n}\r\n\r\nexport interface ValidationResult {\r\n messages: UserMessage[];\r\n success: boolean;\r\n}\r\n\r\nexport interface AppCookies {\r\n 'pizza-hut-access-token': {\r\n email: string;\r\n phone: string;\r\n };\r\n}\r\n\r\nexport interface SupportedCulture {\r\n isDefault: boolean;\r\n id: string;\r\n fullName: string;\r\n shortName: string;\r\n}\r\n\r\nexport interface ModalProps {\r\n submitCallbackFn?(): void;\r\n cancelCallbackFn(): void;\r\n}\r\n\r\nexport enum OrderStatusEnum {\r\n CreatingOrder = 0,\r\n AwaitingExternalPayment = 1,\r\n PaymentSettledButNotYetSuppliedToStore = 2,\r\n ReceivedByStore = 3,\r\n InOven = 4,\r\n ReadyForDispatch = 5,\r\n OutForDelivery = 6,\r\n Completed = 7,\r\n Cancelled = 8,\r\n ReceivedButFutureOrder = 9,\r\n ExternalPaymentFailed = 10,\r\n AwaitingExternalValidation = 11,\r\n ExternalValidationFailed = 12,\r\n AwaitingExternalCreation = 13,\r\n ExternalCreationFailed = 14,\r\n ExternalCreationTimedOut = 15,\r\n}\r\n\r\nexport enum AppReviewTarget {\r\n NATIVE_STORE = 'NATIVE_STORE',\r\n DB = 'DB'\r\n}\r\n\r\nexport interface AppConfiguration {\r\n maxChangeableToppingsForEditPizza: number;\r\n maxExtraToppingsForEditPizza: number;\r\n maxToppingsForCustomPizza: number;\r\n appReviewsEnabled: boolean;\r\n positiveReviewsTarget: AppReviewTarget;\r\n negativeReviewsTarget: AppReviewTarget;\r\n}\r\n\r\nexport enum ApplicationType {\r\n MOBILE = 'Mobile',\r\n WEBSITE = 'Website'\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { Dispatch } from 'redux';\r\nimport { UserMessage, UserMessageType } from 'shared/types';\r\nimport { GlobalActionTypes } from '../store/global/global.actions';\r\n\r\ninterface ResponseWrapperArgs {\r\n action(): Promise;\r\n dispatch: Dispatch;\r\n errMessage?: UserMessage;\r\n allowedErr?: {\r\n statusArr?: number[];\r\n errorCodes?: string[];\r\n action?(err: any): void;\r\n };\r\n errorCallback?(err: any): Promise;\r\n withoutGlobalNotification?: boolean;\r\n}\r\n\r\nasync function ResponseWrapper({\r\n action,\r\n dispatch,\r\n errMessage,\r\n allowedErr,\r\n errorCallback,\r\n withoutGlobalNotification = false,\r\n}: ResponseWrapperArgs): Promise {\r\n let message = errMessage;\r\n try {\r\n dispatch({\r\n type: GlobalActionTypes.CLEAR_MESSAGES,\r\n });\r\n return await action();\r\n } catch (error: any) {\r\n if (allowedErr?.statusArr?.includes(error.response.status)) {\r\n allowedErr.action && allowedErr.action(error);\r\n return undefined;\r\n }\r\n if (allowedErr?.errorCodes?.includes(error.response.data.errorCode)) {\r\n allowedErr.action && allowedErr.action(error);\r\n return undefined;\r\n }\r\n if (errMessage == null || errMessage === undefined) {\r\n const { errorCode, status } = error.response.data;\r\n\r\n message = {\r\n message: errorCode || 'Server error.',\r\n type: UserMessageType.ERROR,\r\n status,\r\n };\r\n }\r\n\r\n if (!withoutGlobalNotification) {\r\n dispatch({ type: GlobalActionTypes.SET_MESSAGES, payload: [message] });\r\n }\r\n\r\n console.error(error);\r\n\r\n if (errorCallback) {\r\n return errorCallback(error);\r\n }\r\n dispatch({ type: GlobalActionTypes.SET_LOADER_STATE, payload: false });\r\n dispatch({ type: GlobalActionTypes.SHOW_UNHANDLED_ERROR_MODAL, payload: true });\r\n }\r\n}\r\n\r\nexport default ResponseWrapper;\r\n","/* eslint-disable no-use-before-define */\r\nimport { ApplicationState } from 'apps/LocalizationApp/Store';\r\nimport { Action, Dispatch } from 'redux';\r\nimport { ThunkAction } from 'redux-thunk';\r\nimport { FormValidatorHandler } from 'shared/validators';\r\nimport { logout } from 'shared/helpers/routing-helpers';\r\nimport axios from 'shared/api/axios';\r\nimport { PushNotificationsProvider } from 'typings/web-bridge.types';\r\nimport ResponseWrapper from 'shared/tools/api-response-wrapper';\r\nimport { AxiosResponse } from 'axios';\r\nimport { UserMessage, UserMessageType, LoaderPayload, SupportedCulture, AppConfiguration } from '../../types';\r\n\r\nexport enum GlobalActionTypes {\r\n SET_MESSAGES = '[Shared.Global] SET_MESSAGES',\r\n CLEAR_MESSAGES = '[Shared.Global] CLEAR_MESSAGES',\r\n SET_USER_STATUS = '[Shared.Global] SET_USER_STATUS',\r\n SET_LOADER_STATE = '[Shared.Global] SET_LOADER_STATE',\r\n SHOW_UNHANDLED_ERROR_MODAL = '[Shared.Global] SHOW_UNHANDLED_ERROR_MODAL',\r\n SET_SUPPORTED_CULTURES = '[Shared.Global] SET_SUPPORTED_CULTURES',\r\n SET_APP_CONFIGURATION = '[Shared.Global] SET_APP_CONFIGURATION',\r\n}\r\n\r\nexport interface SetMessages {\r\n type: GlobalActionTypes.SET_MESSAGES;\r\n payload: UserMessage[];\r\n}\r\n\r\nexport interface ClearMessages {\r\n type: GlobalActionTypes.CLEAR_MESSAGES;\r\n}\r\n\r\nexport interface SetSupportedCultures {\r\n type: GlobalActionTypes.SET_SUPPORTED_CULTURES;\r\n payload: SupportedCulture[];\r\n}\r\nexport interface SetLoaderState {\r\n type: GlobalActionTypes.SET_LOADER_STATE;\r\n payload: LoaderPayload;\r\n}\r\n\r\nexport interface SetShowUnhandledError {\r\n type: GlobalActionTypes.SHOW_UNHANDLED_ERROR_MODAL;\r\n payload: boolean;\r\n}\r\n\r\ninterface SetUserStatusPayload {\r\n signedin: boolean;\r\n}\r\n\r\ninterface SetUserStatus extends Action {\r\n type: GlobalActionTypes.SET_USER_STATUS;\r\n payload: SetUserStatusPayload;\r\n}\r\n\r\ninterface SetMessageWithExpirationTimeArgs {\r\n type: UserMessageType;\r\n message: string;\r\n expirationTime?: number;\r\n}\r\n\r\nexport interface SetAppConfiguration {\r\n type: GlobalActionTypes.SET_APP_CONFIGURATION;\r\n payload: AppConfiguration;\r\n}\r\n\r\nexport const setMessageWithExpirationTime =\r\n ({\r\n message,\r\n type,\r\n expirationTime = 5000,\r\n }: SetMessageWithExpirationTimeArgs): ThunkAction =>\r\n async (dispatch): Promise => {\r\n const action: SetMessages = {\r\n payload: [\r\n {\r\n message,\r\n type,\r\n },\r\n ],\r\n type: GlobalActionTypes.SET_MESSAGES,\r\n };\r\n dispatch(action);\r\n const tooltipTimer = setTimeout(() => {\r\n dispatch({\r\n type: GlobalActionTypes.CLEAR_MESSAGES,\r\n });\r\n clearTimeout(tooltipTimer);\r\n }, expirationTime);\r\n };\r\n\r\ninterface ValidateAndNotifyArgs {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n dispatch: Dispatch;\r\n validator: FormValidatorHandler;\r\n}\r\n\r\nexport function ValidateAndNotify({ dispatch, validator }: ValidateAndNotifyArgs): boolean {\r\n const result = validator.validate();\r\n if (result.success) {\r\n return true;\r\n }\r\n\r\n dispatch(\r\n setMessageWithExpirationTime({\r\n message: result.messages[0].message,\r\n type: result.messages[0].type,\r\n }),\r\n );\r\n\r\n return false;\r\n}\r\n\r\nexport const SetLoader =\r\n (value: boolean): ThunkAction =>\r\n async (dispatch): Promise => {\r\n dispatch({\r\n type: GlobalActionTypes.SET_LOADER_STATE,\r\n payload: {\r\n value,\r\n },\r\n });\r\n };\r\n\r\nconst mobileLogout = (): void => {\r\n const mobile = window.S4DWebBridge();\r\n if (mobile == null) {\r\n return;\r\n }\r\n mobile.userLoggedOut();\r\n};\r\n\r\nexport const logoutHandler =\r\n (): ThunkAction =>\r\n async (dispatch): Promise => {\r\n const deviceTokens: string | null = localStorage.getItem('deviceTokens');\r\n\r\n if (deviceTokens) {\r\n const parsedDeviceTokens: { deviceId: string; installationId: string; provider: PushNotificationsProvider } =\r\n JSON.parse(deviceTokens);\r\n const { deviceId, installationId, provider } = parsedDeviceTokens;\r\n\r\n ResponseWrapper({\r\n action: () => {\r\n return axios.post('api/accounts/remove-tokens', { deviceId, installationId, provider });\r\n },\r\n dispatch,\r\n });\r\n }\r\n\r\n mobileLogout();\r\n logout();\r\n };\r\n\r\nexport const getLanguages =\r\n (): ThunkAction =>\r\n async (dispatch): Promise => {\r\n ResponseWrapper({\r\n action: async () => {\r\n const cultures: AxiosResponse = await axios.get('api/culture');\r\n dispatch({\r\n type: GlobalActionTypes.SET_SUPPORTED_CULTURES,\r\n payload: cultures.data,\r\n });\r\n },\r\n dispatch,\r\n });\r\n };\r\n\r\nexport const getAppConfiguration =\r\n (): ThunkAction =>\r\n async (dispatch): Promise => {\r\n ResponseWrapper({\r\n action: async () => {\r\n const value: AxiosResponse = await axios.get('api/configuration');\r\n dispatch({\r\n type: GlobalActionTypes.SET_APP_CONFIGURATION,\r\n payload: value.data,\r\n });\r\n },\r\n dispatch,\r\n });\r\n };\r\n\r\n\r\nexport type GlobalActions =\r\n | SetSupportedCultures\r\n | SetMessages\r\n | ClearMessages\r\n | SetUserStatus\r\n | SetLoaderState\r\n | SetShowUnhandledError\r\n | SetAppConfiguration;\r\n","import { AxiosResponse } from 'axios';\r\nimport Axios from 'shared/api/axios';\r\nimport { Action } from 'redux';\r\nimport { ThunkAction } from 'redux-thunk';\r\nimport ResponseWrapper from 'shared/tools/api-response-wrapper';\r\nimport { ApplicationState } from '../index';\r\nimport { InlineBannerStaticContent, ProductsStaticContent } from './products-static-content.reducer';\r\n\r\nexport enum ProductsStaticContentActionTypes {\r\n SET_STATIC_CONTENT = '[Products.StaticContent] SET_STATIC_CONTENT',\r\n SET_INLINE_BANNER = '[Products.StaticContent] SET_INLINE_BANNER',\r\n}\r\n\r\ninterface SetStaticContent {\r\n type: ProductsStaticContentActionTypes.SET_STATIC_CONTENT;\r\n payload: ProductsStaticContent;\r\n}\r\ninterface SetInlineBanner {\r\n type: ProductsStaticContentActionTypes.SET_INLINE_BANNER;\r\n payload: InlineBannerStaticContent;\r\n}\r\n\r\nexport const getStaticContent =\r\n (): ThunkAction =>\r\n async (dispatch): Promise => {\r\n ResponseWrapper({\r\n action: async () => {\r\n const value: AxiosResponse = await Axios.get('api/static-content/products');\r\n dispatch({\r\n type: ProductsStaticContentActionTypes.SET_STATIC_CONTENT,\r\n payload: value.data,\r\n });\r\n },\r\n dispatch,\r\n });\r\n };\r\nexport const getInlineBanner =\r\n (category: string): ThunkAction =>\r\n async (dispatch): Promise => {\r\n ResponseWrapper({\r\n action: async () => {\r\n const value: AxiosResponse = await Axios.get(`api/static-content/inline-banner`, {\r\n params: {\r\n category,\r\n },\r\n validateStatus: (status: number) => status >= 200 && status < 300 && status !== 204,\r\n });\r\n dispatch({\r\n type: ProductsStaticContentActionTypes.SET_INLINE_BANNER,\r\n payload: value.data,\r\n });\r\n },\r\n dispatch,\r\n allowedErr: {\r\n statusArr: [204],\r\n action: (): void => {\r\n dispatch({\r\n type: ProductsStaticContentActionTypes.SET_INLINE_BANNER,\r\n payload: {\r\n inlineBannerVisibility: false,\r\n inlineBannerImage: '',\r\n inlineBannerRow: 0,\r\n inlineBannerUrl: '',\r\n } as InlineBannerStaticContent,\r\n });\r\n },\r\n },\r\n errorCallback: async () => {\r\n dispatch({\r\n type: ProductsStaticContentActionTypes.SET_INLINE_BANNER,\r\n payload: {\r\n inlineBannerVisibility: false,\r\n inlineBannerImage: '',\r\n inlineBannerRow: 0,\r\n inlineBannerUrl: '',\r\n } as InlineBannerStaticContent,\r\n });\r\n },\r\n });\r\n };\r\n\r\nexport type StaticContentActions = SetStaticContent | SetInlineBanner;\r\n","import { BasketItem, SKU } from 'apps/ProductsApp/types/basket.types';\r\n\r\nexport interface Option {\r\n sku: SKU;\r\n title: string;\r\n name: string;\r\n deliveryPrice: number;\r\n pickupPrice: number;\r\n type: string;\r\n subType: string;\r\n sortOrder: number;\r\n extraCharge?: number;\r\n default: boolean;\r\n}\r\n\r\nexport interface OptionDetails extends Option {\r\n additionalToppings?: ToppingBase[];\r\n defaultToppings?: ToppingBase[];\r\n description: string;\r\n id: number;\r\n image: string;\r\n xTastyProducts: number[];\r\n}\r\n\r\nexport interface Tag {\r\n id: string;\r\n title: string;\r\n iconUrl: string;\r\n}\r\n\r\nexport enum StoreStockStatus {\r\n Unknown = 0,\r\n IsInStock = 1,\r\n OutOfStock = 2,\r\n}\r\n\r\nexport interface Product {\r\n id: string;\r\n title: string;\r\n route: string;\r\n categoryId: string;\r\n description: string;\r\n isCustomizable: boolean;\r\n isCreateCustomPizza: boolean;\r\n isRestrictedForDeliveryTime: boolean;\r\n isXTasty: boolean;\r\n menuImage: {\r\n label: string;\r\n url: string;\r\n toolTip: string;\r\n };\r\n options: Option[];\r\n tags: Tag[];\r\n stockStatus: StoreStockStatus;\r\n}\r\n\r\nexport interface ProductDetails extends Product {\r\n productPage: {\r\n productDetailDescription: string;\r\n productDetailMetaDescription: string;\r\n productDetailMetaKeywords: string;\r\n productDetailSubTitle: string;\r\n productDetailTitle: string;\r\n productDetailImage: {\r\n label: string;\r\n url: string;\r\n toolTip: string;\r\n };\r\n };\r\n additionalInfo: string;\r\n}\r\n\r\nexport interface Category {\r\n id: string;\r\n title: string;\r\n route: string;\r\n}\r\n\r\nexport interface CategoryDto {\r\n id: string;\r\n title: string;\r\n route: string;\r\n products: Product[];\r\n}\r\n\r\nexport interface ProductDetails extends Product {\r\n options: OptionDetails[];\r\n customProductImage: string;\r\n customProductImageSmall: string;\r\n xTastyImage: string;\r\n xTastySlicesCount?: number;\r\n xTastyProducts?: XTastyProduct[]\r\n}\r\n\r\nexport interface XTastyProduct {\r\n id: string,\r\n title: string\r\n}\r\n\r\nexport interface ToppingBase {\r\n id: number;\r\n price: number;\r\n}\r\n\r\nexport interface Topping extends ToppingBase {\r\n title: string;\r\n description?: string;\r\n imageUrl?: string;\r\n imageThumbnailUrl: string;\r\n categoryId: string;\r\n}\r\n\r\nexport interface Offer {\r\n altText: string;\r\n title: string;\r\n code: string;\r\n description: string;\r\n shortDescription: string;\r\n price?: number;\r\n imagePath: string;\r\n mobileImagePath: string;\r\n forDelivery: boolean;\r\n forPickup: boolean;\r\n isPopular: boolean;\r\n defaultCouponPrice?: number;\r\n}\r\n\r\nexport interface OfferDetails extends Offer {\r\n allowRepetition: boolean;\r\n choiceSlots: OfferChoice[];\r\n type: OfferTypes;\r\n}\r\n\r\nexport interface OfferCustomizationDetails extends OfferDetails {\r\n isComplete: boolean;\r\n calculatedOfferPrice?: number; // please always calculate on backend side.\r\n appliedDealId?: string;\r\n position: number | string;\r\n}\r\n\r\nexport enum OfferTypes {\r\n EURO_DEAL_PLUS = 'EURO_DEAL_PLUS',\r\n PERC_DIS = 'PERC_DIS',\r\n OTHER = 'OTHER',\r\n FXD_DIS = 'FXD_DIS',\r\n XTH_PIZ_FRE = 'XTH_PIZ_FRE',\r\n XTH_PIZ_FRE_PLS = 'XTH_PIZ_FRE_PLS',\r\n FXD_ORD_DSC = 'FXD_ORD_DSC',\r\n PERC_ORD_DSC = 'PERC_ORD_DSC'\r\n}\r\nexport interface SelectedChoice\r\n extends Pick<\r\n BasketItem,\r\n | 'sku'\r\n | 'price'\r\n | 'basePrice'\r\n | 'xTastyChoices'\r\n | 'removedToppings'\r\n | 'addedToppings'\r\n | 'extraCharge'\r\n | 'specificationToppingsPrices'\r\n > {\r\n isFree?: boolean;\r\n appliedDealIndex?: number;\r\n}\r\n\r\nexport interface OfferChoice {\r\n selectedChoice?: SelectedChoice;\r\n choices: Product[];\r\n}\r\n\r\nexport interface AppConfiguration {\r\n maxChangeableToppingsForEditPizza: number;\r\n maxExtraToppingsForEditPizza: number;\r\n maxToppingsForCustomPizza: number;\r\n}\r\n\r\nexport interface OrderDetailsResponse {\r\n orderId: number;\r\n orderDate: string;\r\n isAsap: boolean;\r\n firstName: string;\r\n lastName: string;\r\n emailAddress: string;\r\n phoneNumber: string;\r\n street: string;\r\n streetNumber: string;\r\n city: string;\r\n district: string;\r\n country: string;\r\n addressAddition: string;\r\n addressRemark: string;\r\n receiptCompanyData: {\r\n isCompanyCustomer: boolean;\r\n companyName: string;\r\n companyAddress: string;\r\n vatId: string;\r\n };\r\n orderRemark: string;\r\n}\r\n\r\nexport interface OffersComboDto {\r\n couponId: string;\r\n isPossible: boolean;\r\n remarks: string;\r\n}\r\n\r\nexport interface ProductSEO {\r\n html: string;\r\n header: string;\r\n title: string;\r\n}\r\n","import { UserMessage, UserMessageType, ValidatorItem, ValidationResult } from '../types';\r\n\r\nexport interface FormValidatorHandlerArgs {\r\n value: string;\r\n validators: ValidatorItem[];\r\n name?: string;\r\n}\r\nexport class FormValidatorHandler {\r\n value: string;\r\n\r\n name?: string;\r\n\r\n validators: ValidatorItem[];\r\n\r\n constructor({ value, validators = [], name }: FormValidatorHandlerArgs) {\r\n this.value = value;\r\n this.validators = validators;\r\n this.name = name;\r\n this.validate = this.validate.bind(this);\r\n }\r\n\r\n validate(): ValidationResult {\r\n const messages: UserMessage[] = [];\r\n\r\n for (let index = 0; index < this.validators.length; index++) {\r\n const validator = this.validators[index];\r\n const result = validator.fn(this.value);\r\n\r\n if (result !== true) {\r\n messages.push({\r\n message: validator.message,\r\n type: validator.messageType,\r\n });\r\n break;\r\n }\r\n }\r\n\r\n return {\r\n success: messages.length === 0,\r\n messages,\r\n };\r\n }\r\n}\r\ninterface ValidatorArgs {\r\n message: string;\r\n messageType: UserMessageType;\r\n}\r\n\r\ninterface LengthValidatorArgs extends ValidatorArgs {\r\n length: number;\r\n}\r\ninterface MaxValueArgs extends ValidatorArgs {\r\n maxValue: number;\r\n}\r\ninterface MinValueArgs extends ValidatorArgs {\r\n minValue: number;\r\n}\r\ninterface RegexArgs extends ValidatorArgs {\r\n pattern: string;\r\n}\r\n\r\nexport const CommonValidators = {\r\n required: ({ message = 'Required field.', messageType }: ValidatorArgs): ValidatorItem => ({\r\n fn: (value): boolean => {\r\n return value !== undefined && value != null && value.length > 0;\r\n },\r\n message,\r\n messageType,\r\n }),\r\n maxValue: ({ message = 'Required field.', messageType, maxValue }: MaxValueArgs): ValidatorItem => ({\r\n fn: (value): boolean => {\r\n if (!value && value.length < 1) return false;\r\n const valAsNumber = parseFloat(value.replace(',', '.'));\r\n if (valAsNumber === undefined || valAsNumber == null || Number.isNaN(valAsNumber)) {\r\n return false;\r\n }\r\n\r\n if (valAsNumber > maxValue) {\r\n return false;\r\n }\r\n\r\n return true;\r\n },\r\n message,\r\n messageType,\r\n }),\r\n minValue: ({ message = 'Required field.', messageType, minValue }: MinValueArgs): ValidatorItem => ({\r\n fn: (value): boolean => {\r\n if (!value && value.length < 1) return false;\r\n const valAsNumber = parseFloat(value.replace(',', '.'));\r\n if (valAsNumber === undefined || valAsNumber == null || Number.isNaN(valAsNumber)) {\r\n return false;\r\n }\r\n\r\n if (valAsNumber < minValue) {\r\n return false;\r\n }\r\n\r\n return true;\r\n },\r\n message,\r\n messageType,\r\n }),\r\n minLength: ({ message = 'Required field.', messageType, length }: LengthValidatorArgs): ValidatorItem => ({\r\n fn: (value): boolean => {\r\n if (value === undefined || value == null || value.length === 0) {\r\n return true;\r\n }\r\n\r\n return value.length >= length;\r\n },\r\n message,\r\n messageType,\r\n }),\r\n maxLength: ({ message = 'Required field.', messageType, length }: LengthValidatorArgs): ValidatorItem => ({\r\n fn: (value): boolean => {\r\n if (value === undefined || value == null || value.length === 0) {\r\n return true;\r\n }\r\n\r\n return value.length <= length;\r\n },\r\n message,\r\n messageType,\r\n }),\r\n email: ({ message = 'Incorrect e-mail.', messageType }: ValidatorArgs): ValidatorItem => ({\r\n fn: (value): boolean => {\r\n if (value === undefined || value == null || value.length === 0) {\r\n return false;\r\n }\r\n\r\n const mainTest = (v: string): boolean =>\r\n // eslint-disable-next-line no-control-regex\r\n /(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])/i.test(\r\n v,\r\n );\r\n\r\n const arr = [mainTest];\r\n\r\n for (let i = 0; i < arr.length; i++) {\r\n const testFn = arr[i];\r\n const isValid = testFn(value);\r\n\r\n if (!isValid) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n },\r\n message,\r\n messageType,\r\n }),\r\n regex: ({ message = 'Value does not match pattern.', messageType, pattern }: RegexArgs): ValidatorItem => ({\r\n fn: (value): boolean => {\r\n const regex = new RegExp(pattern);\r\n if (!regex.test(value)) return false;\r\n return true;\r\n },\r\n message,\r\n messageType,\r\n }),\r\n phoneNumber: ({ message = 'Phone number invalid.', messageType }: ValidatorArgs): ValidatorItem => ({\r\n fn: (value): boolean => {\r\n if (!value) return true;\r\n const regex = new RegExp(`^\\\\d{9,11}$`);\r\n if (!regex.test(value)) return false;\r\n return true;\r\n },\r\n message,\r\n messageType,\r\n }),\r\n date: ({ message = 'Invalid date', messageType }: ValidatorArgs): ValidatorItem => ({\r\n fn: (value): boolean => {\r\n if (!value) return true;\r\n // eslint-disable-next-line no-useless-escape\r\n const regex = new RegExp(`^([0-2][0-9]|(3)[0-1])(\\/)(((0)[0-9])|((1)[0-2]))(\\/)\\\\d{4}$`);\r\n if (!regex.test(value)) return false;\r\n return true;\r\n },\r\n message,\r\n messageType,\r\n }),\r\n};\r\n","import { OfferChoice, OfferTypes } from 'apps/ProductsApp/types/dto.types';\r\n\r\nexport const isOfferComplexType = (couponType: OfferTypes): boolean => {\r\n if (isTwoForOneOffer(couponType)) return true;\r\n switch (couponType) {\r\n case OfferTypes.EURO_DEAL_PLUS:\r\n return true;\r\n default:\r\n return false;\r\n }\r\n};\r\n\r\nexport const isTwoForOneOffer = (type?: OfferTypes): boolean => {\r\n if (type === OfferTypes.XTH_PIZ_FRE || type === OfferTypes.XTH_PIZ_FRE_PLS) return true;\r\n return false;\r\n};\r\n\r\nexport const getCheapestSelectedItemIndex = (choiceSlots: OfferChoice[]): number => {\r\n const productBasePrices = choiceSlots\r\n .map((choice) => {\r\n if (choice.selectedChoice) return choice.selectedChoice.basePrice;\r\n })\r\n .filter((basePrice) => basePrice !== undefined) as number[];\r\n const lowestPrice = Math.min(...productBasePrices);\r\n\r\n // Si Senior, there can be couple of items with same , lowest price\r\n const lowestPricedItems = choiceSlots.filter((el) => el.selectedChoice?.basePrice === lowestPrice);\r\n if (lowestPricedItems) {\r\n lowestPricedItems.sort((a, b) => {\r\n const totalLowerPriceA =\r\n (a.selectedChoice?.basePrice ?? 0) + (a.selectedChoice?.specificationToppingsPrices?.totalToppingsPrice ?? 0);\r\n const totalLowerPriceB =\r\n (b.selectedChoice?.basePrice ?? 0) + (b.selectedChoice?.specificationToppingsPrices?.totalToppingsPrice ?? 0);\r\n return totalLowerPriceA - totalLowerPriceB;\r\n });\r\n }\r\n return choiceSlots.findIndex((el) => el === lowestPricedItems[0]);\r\n};\r\n","import { Action } from 'redux';\r\nimport { ThunkAction } from 'redux-thunk';\r\n\r\n// types\r\nimport { ApplicationState } from '../index';\r\nimport { AddressWizzardSteps } from '../../navigation.types';\r\n\r\n// action types\r\nexport enum AddressWizzardActionsTypes {\r\n SET_WIZZARD_STEP = '[NAVIGATION_APP] SET_WIZZARD_STEP',\r\n}\r\n\r\n// payloads\r\ninterface SetWizzardStepPayload {\r\n step: AddressWizzardSteps;\r\n}\r\n\r\ninterface SetWizzardStep extends Action {\r\n type: AddressWizzardActionsTypes.SET_WIZZARD_STEP;\r\n payload: SetWizzardStepPayload;\r\n}\r\n\r\n// methods\r\n\r\nexport const changeWizzardStep =\r\n (step: AddressWizzardSteps): ThunkAction =>\r\n async (dispatch): Promise => {\r\n dispatch({\r\n type: AddressWizzardActionsTypes.SET_WIZZARD_STEP,\r\n payload: {\r\n step,\r\n },\r\n });\r\n };\r\n\r\nexport type AddressActions = SetWizzardStep;\r\n","import { AxiosResponse } from 'axios';\r\nimport { Action } from 'redux';\r\nimport { ThunkAction } from 'redux-thunk';\r\nimport ResponseWrapper from 'shared/tools/api-response-wrapper';\r\nimport Axios from 'shared/api/axios';\r\nimport { ApplicationState } from '..';\r\nimport { NavigationStaticContent } from './static-content.reducer';\r\n\r\nexport enum NavigationStaticContentActionTypes {\r\n SET_STATIC_CONTENT = '[ORDER STATUS] SET_STATIC_CONTENT',\r\n}\r\n\r\ninterface SetStaticContent extends Action {\r\n type: NavigationStaticContentActionTypes.SET_STATIC_CONTENT;\r\n payload: NavigationStaticContent;\r\n}\r\n\r\nexport const getStaticContent =\r\n (): ThunkAction =>\r\n async (dispatch): Promise => {\r\n ResponseWrapper({\r\n action: async () => {\r\n const result: AxiosResponse = await Axios.get('api/static-content/navigation');\r\n\r\n dispatch({ type: NavigationStaticContentActionTypes.SET_STATIC_CONTENT, payload: result.data });\r\n },\r\n dispatch,\r\n });\r\n };\r\n\r\nexport type NavigationStaticContentActions = SetStaticContent;\r\n","export enum HeaderType {\r\n Other = 1,\r\n PLPorOLP = 2,\r\n}\r\n\r\nexport enum AddressWizzardSteps {\r\n None = 1,\r\n ChangeAddressModal = 2,\r\n LocalizationModal = 3,\r\n}\r\n\r\nexport interface SimplifiedAddress {\r\n street: string;\r\n streetNumber: string;\r\n city: string;\r\n}\r\n","import * as _addressWizzardActions from './address-wizzard/address-wizzard.actions';\r\nimport * as _staticContentActions from './static-content/static-content.actions';\r\n\r\nexport const AddressWizzardActions = _addressWizzardActions;\r\nexport const StaticContentActions = _staticContentActions;\r\n","import { Action } from 'redux';\r\nimport { ThunkAction } from 'redux-thunk';\r\nimport { AxiosResponse } from 'axios';\r\nimport { OrderDistributionType } from 'shared/types';\r\nimport Axios from 'shared/api/axios';\r\nimport ResponseWrapper from 'shared/tools/api-response-wrapper';\r\nimport { getCheapestSelectedItemIndex, isOfferComplexType, isTwoForOneOffer } from 'shared/helpers/coupons-helpers';\r\nimport { BasketActionTypes } from 'apps/ProductsApp/store/basket/basket.actions';\r\n\r\nimport { ApplicationState, OffersState } from '..';\r\nimport { BasketActions, ProductsActions } from '../actions';\r\nimport { Offer, OfferCustomizationDetails, OfferDetails, OffersComboDto, SelectedChoice } from '../../types/dto.types';\r\nimport { BasketOffer } from '../../types/basket.types';\r\n\r\nexport enum OffersActionTypes {\r\n SET_OFFERS = '[OFFERS] SET_OFFERS',\r\n SET_CUSTOMIZATION_OFFER = '[OFFERS] SET_CUSTOMIZATION_OFFER',\r\n SET_OPEN_DEAL_CONFIGURATION = '[OFFERS] SET_OPEN_DEAL_CONFIGURATION',\r\n SET_OFFERS_COMBINATION = '[OFFERS] SET_INVALID_COMBINATION',\r\n SET_INVALID_COMBINATION_MODAL = '[OFFERS] SET_INVALID_COMBINATION_MODAL',\r\n SET_INVALID_PRODUCT_COMPOSITION_MODAL = '[OFFERS] SET_INVALID_PRODUCT_COMPOSITION_MODAL',\r\n}\r\n\r\nconst OFFERS_LOADER = 'offersLoader';\r\n\r\ninterface SetOffers extends Action {\r\n type: OffersActionTypes.SET_OFFERS;\r\n payload: Offer[];\r\n}\r\ninterface SetCustomizationOffer extends Action {\r\n type: OffersActionTypes.SET_CUSTOMIZATION_OFFER;\r\n payload?: OfferCustomizationDetails;\r\n}\r\ninterface SetOpenDealConfiguration extends Action {\r\n type: OffersActionTypes.SET_OPEN_DEAL_CONFIGURATION;\r\n payload?: boolean;\r\n}\r\ninterface SetInvalidCombination extends Action {\r\n type: OffersActionTypes.SET_OFFERS_COMBINATION;\r\n payload?: OffersComboDto[];\r\n}\r\ninterface SetInvalidCombinationModal extends Action {\r\n type: OffersActionTypes.SET_INVALID_COMBINATION_MODAL;\r\n payload?: OffersState['invalidComboModal'];\r\n}\r\ninterface SetInvalidProductCompositionModal extends Action {\r\n type: OffersActionTypes.SET_INVALID_PRODUCT_COMPOSITION_MODAL;\r\n payload?: OffersState['invalidProductCompositionModal'];\r\n}\r\n\r\nexport const getOffers =\r\n (): ThunkAction =>\r\n async (dispatch, getState): Promise => {\r\n const { localization } = getState();\r\n dispatch(ProductsActions.SetProductsLoader(OFFERS_LOADER, true));\r\n ResponseWrapper({\r\n action: async () => {\r\n const value: AxiosResponse = await Axios.get('api/offers', {\r\n params: {\r\n deliveryType: localization.distributionType,\r\n storeId: localization.currentStore.id,\r\n deliveryDateTime: localization.selectedOrderTime?.dateTimeFrame,\r\n },\r\n });\r\n dispatch({\r\n type: OffersActionTypes.SET_OFFERS,\r\n payload: value.data,\r\n });\r\n dispatch(ProductsActions.SetProductsLoader(OFFERS_LOADER, false));\r\n gtm.productsModule.dealsLoad(value.data);\r\n },\r\n dispatch,\r\n errorCallback: async () => {\r\n dispatch(ProductsActions.SetProductsLoader(OFFERS_LOADER, false));\r\n },\r\n });\r\n };\r\n\r\nexport const updateCustomizationOffer =\r\n (choiceIndex: number, item?: SelectedChoice): ThunkAction =>\r\n async (dispatch, getState): Promise => {\r\n const updatedCustomizationOffer: OfferCustomizationDetails = {\r\n ...(getState().offers.customizationOffer as OfferCustomizationDetails),\r\n };\r\n\r\n const updatedItem = item;\r\n\r\n updatedCustomizationOffer.choiceSlots[choiceIndex].selectedChoice = updatedItem;\r\n\r\n updatedCustomizationOffer.isComplete =\r\n updatedCustomizationOffer.choiceSlots.filter((slot) => !slot.selectedChoice).length === 0;\r\n\r\n if (isTwoForOneOffer(updatedCustomizationOffer.type)) {\r\n if (updatedCustomizationOffer.isComplete) {\r\n const cheapestChoiceIndex = getCheapestSelectedItemIndex(updatedCustomizationOffer.choiceSlots);\r\n\r\n if (updatedCustomizationOffer.choiceSlots[cheapestChoiceIndex].selectedChoice) {\r\n (updatedCustomizationOffer.choiceSlots[cheapestChoiceIndex].selectedChoice as SelectedChoice).isFree = true;\r\n }\r\n } else {\r\n updatedCustomizationOffer.choiceSlots.forEach((choice) => {\r\n const { selectedChoice } = choice;\r\n if (selectedChoice) {\r\n selectedChoice.isFree = false;\r\n }\r\n return { ...choice, selectedChoice };\r\n });\r\n }\r\n }\r\n\r\n dispatch({ type: OffersActionTypes.SET_CUSTOMIZATION_OFFER, payload: updatedCustomizationOffer });\r\n\r\n if (updatedCustomizationOffer.isComplete) {\r\n dispatch(calculateOfferPrice(updatedCustomizationOffer.code));\r\n }\r\n\r\n dispatch({ type: OffersActionTypes.SET_OPEN_DEAL_CONFIGURATION, payload: true });\r\n };\r\n\r\nexport const editCustomizationOffer =\r\n (appliedDealId: string): ThunkAction =>\r\n async (dispatch, getState): Promise => {\r\n const state = getState();\r\n const basketCompiledOffer = {\r\n ...(state.basket.basket.compiledOffers.find((offer) => offer.appliedDealIdentifier === appliedDealId) as BasketOffer),\r\n };\r\n const details: AxiosResponse = await Axios.get(`api/offers/${basketCompiledOffer.code}`, {\r\n params: {\r\n deliveryType: state.localization.distributionType,\r\n storeId: state.localization.currentStore.id,\r\n },\r\n });\r\n\r\n const updatedCustomizationOffer = {\r\n ...details.data,\r\n appliedDealId,\r\n choiceSlots: details.data.choiceSlots.map((slot, index) => {\r\n return { ...slot, selectedChoice: basketCompiledOffer.choices[index] };\r\n }),\r\n isComplete: true,\r\n calculatedOfferPrice: basketCompiledOffer.price,\r\n };\r\n if (isTwoForOneOffer(updatedCustomizationOffer.type) && updatedCustomizationOffer.isComplete) {\r\n const cheapestChoiceIndex = getCheapestSelectedItemIndex(updatedCustomizationOffer.choiceSlots);\r\n\r\n if (updatedCustomizationOffer.choiceSlots[cheapestChoiceIndex].selectedChoice) {\r\n (updatedCustomizationOffer.choiceSlots[cheapestChoiceIndex].selectedChoice as SelectedChoice).isFree = true;\r\n }\r\n }\r\n\r\n dispatch({ type: OffersActionTypes.SET_CUSTOMIZATION_OFFER, payload: updatedCustomizationOffer });\r\n dispatch({ type: OffersActionTypes.SET_OPEN_DEAL_CONFIGURATION, payload: true });\r\n };\r\n\r\ninterface GetOffersDetailsProps {\r\n couponCode: string;\r\n redirectCallback?: () => void;\r\n position: number | string;\r\n}\r\n\r\nexport const getOfferDetails =\r\n ({ couponCode, redirectCallback, position }: GetOffersDetailsProps): ThunkAction =>\r\n async (dispatch, getState): Promise => {\r\n dispatch(ProductsActions.SetProductsLoader(OFFERS_LOADER, true));\r\n\r\n const { localization } = getState();\r\n ResponseWrapper({\r\n action: async () => {\r\n const details: AxiosResponse = await Axios.get(`api/offers/${couponCode}`, {\r\n params: {\r\n deliveryType: localization.distributionType,\r\n storeId: localization.currentStore.id,\r\n deliveryDateTime: localization.selectedOrderTime?.dateTimeFrame,\r\n },\r\n });\r\n\r\n if (isOfferComplexType(details.data.type)) {\r\n dispatch(ProductsActions.SetProductsLoader(OFFERS_LOADER, false));\r\n dispatch({\r\n type: OffersActionTypes.SET_CUSTOMIZATION_OFFER,\r\n payload: { ...details.data, isComplete: false, position },\r\n });\r\n dispatch({ type: OffersActionTypes.SET_OPEN_DEAL_CONFIGURATION, payload: true });\r\n\r\n redirectCallback && redirectCallback();\r\n return;\r\n }\r\n\r\n gtm.productsModule.addDealToBasket(details.data, position);\r\n dispatch(BasketActions.addCoupon(couponCode));\r\n dispatch(ProductsActions.SetProductsLoader(OFFERS_LOADER, false));\r\n },\r\n dispatch,\r\n allowedErr: {\r\n errorCodes: ['CouponNotAvailableAtRequstedTime'],\r\n action: (): void => {\r\n dispatch({ type: BasketActionTypes.SET_OFFER_NOT_AVAILABLE_MODAL, payload: true });\r\n dispatch(ProductsActions.SetProductsLoader(OFFERS_LOADER, false));\r\n },\r\n },\r\n errorCallback: async () => {\r\n dispatch(ProductsActions.SetProductsLoader(OFFERS_LOADER, false));\r\n },\r\n });\r\n };\r\n\r\nexport const pauseAddingOffer = (couponCode: string, position: number | string): void => {\r\n const pausedOffer = JSON.stringify({ couponCode, position });\r\n sessionStorage.setItem('pausedOffer', pausedOffer);\r\n};\r\n\r\nexport const resumeAddingOffer =\r\n (couponCode: string, redirectCallback: () => void, position: number): ThunkAction =>\r\n async (dispatch, getState): Promise => {\r\n const { currentStore, distributionType, selectedOrderTime } = getState().localization;\r\n const { offers } = getState().offers;\r\n\r\n if (offers.length <= 0) {\r\n const value: AxiosResponse = await Axios.get('api/offers', {\r\n params: {\r\n storeId: currentStore.id,\r\n deliveryType: distributionType,\r\n deliveryDateTime: selectedOrderTime?.dateTimeFrame,\r\n },\r\n });\r\n dispatch({\r\n type: OffersActionTypes.SET_OFFERS,\r\n payload: value.data,\r\n });\r\n if (\r\n value.data.findIndex((offer) => {\r\n if (offer.code === couponCode) {\r\n return distributionType === OrderDistributionType.Delivery ? offer.forDelivery : offer.forPickup;\r\n }\r\n return false;\r\n }) >= 0\r\n ) {\r\n dispatch(getOfferDetails({ couponCode, redirectCallback, position }));\r\n return;\r\n }\r\n }\r\n if (\r\n offers.findIndex((offer) => {\r\n return offer.code === couponCode && distributionType === OrderDistributionType.Delivery\r\n ? offer.forDelivery\r\n : offer.forPickup;\r\n }) >= 0\r\n ) {\r\n dispatch(getOfferDetails({ couponCode, redirectCallback, position }));\r\n return;\r\n }\r\n\r\n dispatch({ type: BasketActions.BasketActionTypes.SET_PRODUCT_NOT_AVAILABLE_MODAL, payload: true });\r\n dispatch(() => sessionStorage.removeItem('pausedOffer'));\r\n };\r\n\r\nexport const checkOfferCombinationValidity =\r\n (\r\n couponCode: string,\r\n redirectCallback: () => void,\r\n position: number | string,\r\n ): ThunkAction =>\r\n async (dispatch, getState): Promise => {\r\n dispatch(ProductsActions.SetProductsLoader(OFFERS_LOADER, true));\r\n const { basket } = getState();\r\n const { currentStore } = getState().localization;\r\n\r\n ResponseWrapper({\r\n action: async () => {\r\n const codes = basket.basket.coupons.map((coupon) => coupon.code);\r\n const response: AxiosResponse = await Axios.get(`api/offers/${couponCode}/combinations`, {\r\n params: {\r\n codes,\r\n storeId: currentStore.id,\r\n },\r\n });\r\n\r\n dispatch({ type: OffersActionTypes.SET_OFFERS_COMBINATION, payload: response.data });\r\n dispatch(ProductsActions.SetProductsLoader(OFFERS_LOADER, false));\r\n\r\n if (basket.basket.coupons.length < 1 || response.data.every((item) => item.isPossible)) {\r\n dispatch(getOfferDetails({ couponCode, redirectCallback, position }));\r\n\r\n return;\r\n }\r\n\r\n dispatch({\r\n type: OffersActionTypes.SET_INVALID_COMBINATION_MODAL,\r\n payload: {\r\n show: true,\r\n couponCode,\r\n addedOfferPosition: position,\r\n },\r\n });\r\n },\r\n dispatch,\r\n errorCallback: async () => {\r\n dispatch(ProductsActions.SetProductsLoader(OFFERS_LOADER, false));\r\n },\r\n });\r\n };\r\n\r\nexport const calculateOfferPrice =\r\n (couponCode: string): ThunkAction =>\r\n async (dispatch, getState): Promise => {\r\n dispatch(ProductsActions.SetProductsLoader(OFFERS_LOADER, true));\r\n\r\n const { offers, localization } = getState();\r\n\r\n ResponseWrapper({\r\n action: async () => {\r\n const selProds = (offers.customizationOffer?.choiceSlots.map((cs) => cs.selectedChoice) as SelectedChoice[]) ?? [];\r\n const request = {\r\n couponCode,\r\n storeId: localization.currentStore.id,\r\n deliverOrder: localization.distributionType === OrderDistributionType.Delivery,\r\n deliveryTimestamp: localization.selectedOrderTime?.dateTimeFrame,\r\n selectedProducts: selProds.map((sp) => {\r\n return {\r\n productId: sp.sku.productId,\r\n optionId: sp.sku.optionId,\r\n productSpecifications: extractProductSpecifiactionFromOfferChoice(sp),\r\n };\r\n }),\r\n };\r\n const response: AxiosResponse<{ price: number }> = await Axios.post(`api/offers/calculate`, request);\r\n\r\n if (response.status === 200 && response.data.price) {\r\n dispatch({\r\n type: OffersActionTypes.SET_CUSTOMIZATION_OFFER,\r\n payload: { ...offers.customizationOffer, calculatedOfferPrice: response.data.price },\r\n });\r\n }\r\n dispatch(ProductsActions.SetProductsLoader(OFFERS_LOADER, false));\r\n },\r\n dispatch,\r\n errorCallback: async () => {\r\n dispatch(ProductsActions.SetProductsLoader(OFFERS_LOADER, false));\r\n },\r\n });\r\n };\r\n\r\nconst extractProductSpecifiactionFromOfferChoice = (selectedProduct: SelectedChoice) => {\r\n if (selectedProduct.xTastyChoices?.length > 0) {\r\n return selectedProduct.xTastyChoices?.map((xtc) => {\r\n return {\r\n productId: xtc.productId,\r\n addToppings: xtc.addedToppings?.map((at) => at.id),\r\n removeToppings: xtc.removedToppings?.map((rt) => rt.id),\r\n };\r\n });\r\n }\r\n\r\n return [\r\n {\r\n productId: selectedProduct.sku.productId,\r\n addToppings: selectedProduct.addedToppings?.map((at) => at.id),\r\n removeToppings: selectedProduct.removedToppings?.map((rt) => rt.id),\r\n },\r\n ];\r\n};\r\n\r\nexport type OffersActions =\r\n | SetOffers\r\n | SetCustomizationOffer\r\n | SetOpenDealConfiguration\r\n | SetInvalidCombination\r\n | SetInvalidCombinationModal\r\n | SetInvalidProductCompositionModal;\r\n","import { Action } from 'redux';\r\n\r\nexport enum MetadataActionTypes {\r\n SET_TITLE = '[PRODUCTS_APP] SET_TITLE',\r\n}\r\n\r\ninterface SetProductHeader extends Action {\r\n type: MetadataActionTypes.SET_TITLE;\r\n payload: string;\r\n}\r\n\r\nexport type MetadataActions = SetProductHeader;\r\n","import { Action } from 'redux';\r\nimport { ThunkAction, ThunkDispatch } from 'redux-thunk';\r\nimport ResponseWrapper from 'shared/tools/api-response-wrapper';\r\nimport { AxiosResponse } from 'axios';\r\nimport Axios from 'shared/api/axios';\r\nimport { redirectToNotFound } from 'shared/helpers/routing-helpers';\r\nimport { OrderDistributionType } from 'shared/types';\r\nimport { ApplicationState } from '..';\r\nimport { Category, CategoryDto, Topping, AppConfiguration, ProductSEO } from '../../types/dto.types';\r\nimport { ProductsActions } from '../actions';\r\nimport { MetadataActionTypes } from '../metadata/metadata.actions';\r\n\r\nexport enum ProductActionTypes {\r\n SET_CATEGORIES = '[PRODUCTS_APP] SET_CATEGORIES',\r\n SET_CONFIGURATION = '[PRODUCTS_APP] SET_CONFIGURATION',\r\n SET_ACTIVE_CATEGORY = '[PRODUCTS_APP] SET_ACTIVE_CATEGORY',\r\n SET_PRODUCTS = '[PRODUCTS_APP] SET_PRODUCTS',\r\n SET_TOPPINGS = '[PRODUCTS_APP] SET_TOPPINGS',\r\n SET_LOADER = '[PRODUCTS_APP] SET_LOADER',\r\n SET_CUSTOMIZATION_PRODUCT = '[PRODUCTS_APP] SET_CUSTOMIZATION_PRODUCT',\r\n SET_UPSELL_PRODUCTS = '[PRODUCTS_APP] SET_UPSELL_PRODUCTS',\r\n SET_PRODUCT_HEADER = '[PRODUCTS_APP] SET_PRODUCT_HEADER',\r\n}\r\n\r\ninterface SetProductHeader extends Action {\r\n type: ProductActionTypes.SET_PRODUCT_HEADER;\r\n payload: string;\r\n}\r\n\r\ninterface SetCategories extends Action {\r\n type: ProductActionTypes.SET_CATEGORIES;\r\n payload: Category[];\r\n}\r\ninterface SetConfiguration extends Action {\r\n type: ProductActionTypes.SET_CONFIGURATION;\r\n payload: AppConfiguration;\r\n}\r\ninterface SetActiveCategory extends Action {\r\n type: ProductActionTypes.SET_ACTIVE_CATEGORY;\r\n payload: string;\r\n}\r\ninterface SetProducts extends Action {\r\n type: ProductActionTypes.SET_PRODUCTS;\r\n payload: CategoryDto[];\r\n}\r\ninterface SetToppings extends Action {\r\n type: ProductActionTypes.SET_TOPPINGS;\r\n payload: Topping[];\r\n}\r\ninterface SetLoader extends Action {\r\n type: ProductActionTypes.SET_LOADER;\r\n payload: {\r\n name: string;\r\n on: boolean;\r\n };\r\n}\r\n\r\nexport const getProducts =\r\n (category: string | null = null): ThunkAction =>\r\n async (dispatch, getState): Promise => {\r\n const LOADER_NAME = 'getProducts';\r\n dispatch({\r\n type: ProductsActions.ProductActionTypes.SET_LOADER,\r\n payload: {\r\n name: LOADER_NAME,\r\n on: true,\r\n },\r\n });\r\n const localizationState = getState().localization;\r\n const state = getState();\r\n\r\n let {\r\n products: { categories },\r\n } = state;\r\n\r\n if (categories.length === 0) {\r\n let categoriesIncludingProducts: CategoryDto[] = [];\r\n const fetchCategoriesIncludingProducts = await ResponseWrapper({\r\n action: async () => {\r\n const value: AxiosResponse = await Axios.get('api/products/categories', {\r\n params: {\r\n storeId: localizationState.currentStore.id,\r\n isDelivery: localizationState.distributionType === OrderDistributionType.Delivery,\r\n deliveryDateTime: localizationState.selectedOrderTime?.dateTimeFrame,\r\n },\r\n });\r\n categoriesIncludingProducts = value.data;\r\n return true;\r\n },\r\n dispatch,\r\n errorCallback: async () => false,\r\n });\r\n\r\n if (!fetchCategoriesIncludingProducts) {\r\n dispatch({\r\n type: ProductsActions.ProductActionTypes.SET_LOADER,\r\n payload: {\r\n name: LOADER_NAME,\r\n on: false,\r\n },\r\n });\r\n return;\r\n }\r\n\r\n const categoriesWithAnyProduct: CategoryDto[] = categoriesIncludingProducts.filter((c) => c.products.some((p) => !!p));\r\n\r\n const fetchCategoriesSuccess = await ResponseWrapper({\r\n action: async () => {\r\n const value: AxiosResponse = await Axios.get('api/products/categories?includeProducts=false', {\r\n params: {\r\n storeId: localizationState.currentStore.id,\r\n deliveryDateTime: localizationState.selectedOrderTime?.dateTimeFrame,\r\n },\r\n });\r\n categories = value.data.filter((c) => categoriesWithAnyProduct.map((cp) => cp.id).includes(c.id));\r\n return true;\r\n },\r\n dispatch,\r\n errorCallback: async () => false,\r\n });\r\n\r\n if (!fetchCategoriesSuccess) {\r\n dispatch({\r\n type: ProductsActions.ProductActionTypes.SET_LOADER,\r\n payload: {\r\n name: LOADER_NAME,\r\n on: false,\r\n },\r\n });\r\n return;\r\n }\r\n\r\n dispatch({\r\n type: ProductActionTypes.SET_CATEGORIES,\r\n payload: categories,\r\n });\r\n\r\n if (category) {\r\n setActiveCategory(categories, category, dispatch);\r\n }\r\n\r\n dispatch({\r\n type: ProductActionTypes.SET_PRODUCTS,\r\n payload: categoriesWithAnyProduct,\r\n });\r\n } else if (category) {\r\n setActiveCategory(categories, category, dispatch);\r\n }\r\n\r\n dispatch({\r\n type: ProductsActions.ProductActionTypes.SET_LOADER,\r\n payload: {\r\n name: LOADER_NAME,\r\n on: false,\r\n },\r\n });\r\n };\r\n\r\nconst setActiveCategory = (\r\n categories: Category[],\r\n categoryRoute: string,\r\n dispatch: ThunkDispatch,\r\n) => {\r\n const selectedCategory = categories.find((w) => w.route.toLowerCase() === categoryRoute.toLowerCase());\r\n\r\n if (selectedCategory === undefined) {\r\n redirectToNotFound(); // redirect to not found page\r\n return;\r\n }\r\n\r\n dispatch({\r\n type: ProductActionTypes.SET_ACTIVE_CATEGORY,\r\n payload: selectedCategory.id,\r\n });\r\n};\r\n\r\nexport const refreshProducts = (): ThunkAction => async (dispatch, getState) => {\r\n const localizationState = getState().localization;\r\n const state = getState();\r\n const LOADER_NAME = 'refreshProducts';\r\n dispatch({\r\n type: ProductsActions.ProductActionTypes.SET_LOADER,\r\n payload: {\r\n name: LOADER_NAME,\r\n on: true,\r\n },\r\n });\r\n const {\r\n products: { activeCategory },\r\n } = state;\r\n\r\n await ResponseWrapper({\r\n action: async () => {\r\n const value: AxiosResponse = await Axios.get('api/products/categories', {\r\n params: {\r\n categoryCode: activeCategory,\r\n storeId: localizationState.currentStore.id,\r\n isDelivery: localizationState.distributionType === OrderDistributionType.Delivery,\r\n deliveryDateTime: localizationState.selectedOrderTime?.dateTimeFrame,\r\n },\r\n });\r\n dispatch({\r\n type: ProductActionTypes.SET_PRODUCTS,\r\n payload: value.data,\r\n });\r\n\r\n dispatch({\r\n type: ProductActionTypes.SET_ACTIVE_CATEGORY,\r\n payload: activeCategory,\r\n });\r\n },\r\n dispatch,\r\n });\r\n dispatch({\r\n type: ProductsActions.ProductActionTypes.SET_LOADER,\r\n payload: {\r\n name: LOADER_NAME,\r\n on: false,\r\n },\r\n });\r\n};\r\n\r\nexport const getToppings =\r\n (): ThunkAction =>\r\n async (dispatch): Promise => {\r\n ResponseWrapper({\r\n action: async () => {\r\n const value: AxiosResponse = await Axios.get('api/products/toppings');\r\n dispatch({\r\n type: ProductActionTypes.SET_TOPPINGS,\r\n payload: value.data,\r\n });\r\n },\r\n dispatch,\r\n });\r\n };\r\n\r\nexport const getAppConfiguration =\r\n (): ThunkAction =>\r\n async (dispatch): Promise => {\r\n ResponseWrapper({\r\n action: async () => {\r\n const value: AxiosResponse = await Axios.get('api/configuration');\r\n dispatch({\r\n type: ProductActionTypes.SET_CONFIGURATION,\r\n payload: value.data,\r\n });\r\n },\r\n dispatch,\r\n });\r\n };\r\n\r\nexport const initProductsStoreData =\r\n (): ThunkAction =>\r\n async (dispatch): Promise => {\r\n dispatch(getAppConfiguration());\r\n dispatch(getToppings());\r\n };\r\n\r\nexport const getSeoText =\r\n (category: string, seoContainer: HTMLElement): ThunkAction =>\r\n async (dispatch): Promise => {\r\n ResponseWrapper({\r\n action: async () => {\r\n const value: AxiosResponse = await Axios.get(`api/products/${category}/seo`);\r\n const seo = value.data;\r\n seoContainer.innerHTML = seo.html;\r\n dispatch({\r\n type: ProductActionTypes.SET_PRODUCT_HEADER,\r\n payload: seo.header,\r\n });\r\n dispatch({\r\n type: MetadataActionTypes.SET_TITLE,\r\n payload: seo.title,\r\n });\r\n },\r\n dispatch,\r\n errorCallback: async () => {\r\n seoContainer.innerHTML = '';\r\n },\r\n });\r\n };\r\n\r\nexport const SetProductsLoader = (name: string, on: boolean) => {\r\n return {\r\n type: ProductsActions.ProductActionTypes.SET_LOADER,\r\n payload: {\r\n name,\r\n on,\r\n },\r\n };\r\n};\r\n\r\nexport type ProductActions =\r\n | SetCategories\r\n | SetActiveCategory\r\n | SetConfiguration\r\n | SetProducts\r\n | SetToppings\r\n | SetLoader\r\n | SetProductHeader;\r\n","/* eslint-disable no-param-reassign */\r\nimport { BasketState } from 'apps/ProductsApp/store';\r\nimport { AxiosError, AxiosResponse } from 'axios';\r\nimport { ThunkAction } from 'redux-thunk';\r\nimport { FormControl } from 'shared/components/form-input.component';\r\nimport Axios from 'shared/api/axios';\r\nimport { Action } from 'redux';\r\nimport { CommonValidators, FormValidatorHandler } from 'shared/validators';\r\nimport { OrderDistributionType, UserMessageType } from 'shared/types';\r\nimport ResponseWrapper from 'shared/tools/api-response-wrapper';\r\nimport { redirectToOtherAppURL } from 'shared/helpers/routing-helpers';\r\n\r\nimport { isOfferComplexType } from 'shared/helpers/coupons-helpers';\r\nimport { AddressWizzardActions } from 'apps/NavigationApp/store/actions';\r\nimport { AddressWizzardSteps } from 'apps/NavigationApp/navigation.types';\r\nimport {\r\n AccountHistoryOrderDto,\r\n AccountOrdersDto,\r\n HistoryOrderCoupon,\r\n HistoryOrderProduct,\r\n} from 'apps/AccountManagementApp/account-details.types';\r\n\r\nimport { ApplicationState } from '..';\r\nimport { OfferTypes, Topping, Offer } from '../../types/dto.types';\r\nimport {\r\n AppliedCoupon,\r\n Basket,\r\n BasketItem,\r\n BasketOffer,\r\n CrossSellOffer,\r\n RecalculationError,\r\n SimplifiedBasketItem,\r\n SKU,\r\n XTastyChoice,\r\n} from '../../types/basket.types';\r\nimport { OffersActions, ProductsActions } from '../actions';\r\nimport { checkOfferCombinationValidity } from '../offers/offers.actions';\r\nimport { refreshProducts } from '../products/products.actions';\r\nimport { cookieExists, removeBasketFromLocalStorage } from 'shared/utils';\r\nimport { appCulture } from 'shared/helpers/routing-helpers';\r\n\r\nconst BASKET_LOADER = 'basketLoader';\r\n\r\nexport enum BasketActionTypes {\r\n SET_BASKET = '[BASKET_APP] SET_BASKET',\r\n SET_CROSS_SELL = '[BASKET_APP] SET_CROSS_SELL',\r\n SET_VOUCHER_MODAL_VISIBILITY = '[BASKET_APP] SET_VOUCHER_MODAL_VISIBILITY',\r\n SET_VOUCHER_INPUT = '[BASKET_APP] SET_VOUCHER_INPUT',\r\n SET_PAUSED_RECALCULATE_REQUEST = '[BASKET_APP] SET_PAUSED_RECALCULATE_REQUEST',\r\n SET_PRODUCT_NOT_AVAILABLE_MODAL = '[BASKET_APP] SET_PRODUCT_NOT_AVAILABLE_MODAL',\r\n SET_OFFER_NOT_AVAILABLE_MODAL = '[BASKET_APP] SET_OFFER_NOT_AVAILABLE_MODAL',\r\n SET_OUT_OF_STOCK_PRODUCTS = '[BASKET_APP] SET_OUT_OF_STOCK_PRODUCTS',\r\n SET_LAST_USER_ORDER = '[BASKET_APP] SET_LAST_USER_ORDER',\r\n SET_LANGUAGE = '[BASKET_APP] SET_LANGUAGE',\r\n SET_NO_OF_VOUCHERS_EXCEEDED_MODAL = '[BASKET_APP] SET_NO_OF_VOUCHERS_EXCEEDED_MODAL',\r\n SET_COUPON_CODE_INVALID_MODAL = '[BASKET_APP] SET_COUPON_CODE_INVALID_MODAL',\r\n}\r\n\r\nexport interface SetBasket extends Action {\r\n type: BasketActionTypes.SET_BASKET;\r\n payload: Basket;\r\n}\r\nexport interface SetCrossSell extends Action {\r\n type: BasketActionTypes.SET_CROSS_SELL;\r\n payload: CrossSellOffer;\r\n}\r\nexport interface SetCouponModalVisibility extends Action {\r\n type: BasketActionTypes.SET_VOUCHER_MODAL_VISIBILITY;\r\n payload: boolean;\r\n}\r\n\r\nexport interface SetVoucherInput extends Action {\r\n type: BasketActionTypes.SET_VOUCHER_INPUT;\r\n payload: FormControl;\r\n}\r\n\r\nexport interface SetLastUserOrder extends Action {\r\n type: BasketActionTypes.SET_LAST_USER_ORDER;\r\n payload: AccountHistoryOrderDto;\r\n}\r\n\r\nexport interface SetTempItem extends Action {\r\n type: BasketActionTypes.SET_PAUSED_RECALCULATE_REQUEST;\r\n payload?: { items: BasketItem[]; coupons: AppliedCoupon[]; params: BasketOptions; compiledOffers?: BasketOffer[] };\r\n}\r\nexport interface SetProductNotAvailableModal extends Action {\r\n type: BasketActionTypes.SET_PRODUCT_NOT_AVAILABLE_MODAL;\r\n payload: boolean;\r\n}\r\nexport interface SetOfferNotAvailableModal extends Action {\r\n type: BasketActionTypes.SET_OFFER_NOT_AVAILABLE_MODAL;\r\n payload: boolean;\r\n}\r\nexport interface SetOutOfStockProducts extends Action {\r\n type: BasketActionTypes.SET_OUT_OF_STOCK_PRODUCTS;\r\n payload?: BasketState['outOfStockDetails'];\r\n}\r\nexport interface SetLanguage extends Action {\r\n type: BasketActionTypes.SET_LANGUAGE;\r\n payload: string;\r\n}\r\nexport interface SetNoOfVoucherExceeded extends Action {\r\n type: BasketActionTypes.SET_NO_OF_VOUCHERS_EXCEEDED_MODAL;\r\n payload: boolean;\r\n}\r\nexport interface SetCouponCodeInvalid extends Action {\r\n type: BasketActionTypes.SET_COUPON_CODE_INVALID_MODAL;\r\n payload: boolean;\r\n}\r\n\r\nexport const getEmptyBasket =\r\n (force = false): ThunkAction =>\r\n async (dispatch, getState): Promise => {\r\n const { basket, pausedRecalculateRequest } = getState().basket;\r\n\r\n ResponseWrapper({\r\n action: async () => {\r\n if (pausedRecalculateRequest) {\r\n return;\r\n }\r\n if ((basket.items.length === 0 && basket.coupons.length === 0) || force) {\r\n const value: AxiosResponse = await Axios.get('api/baskets/');\r\n\r\n dispatch({ type: BasketActionTypes.SET_BASKET, payload: { ...value.data, compiledOffers: [] } });\r\n }\r\n },\r\n\r\n dispatch,\r\n });\r\n };\r\n\r\ninterface ItemToSimplify {\r\n sku: SKU;\r\n addedToppings?: Topping[];\r\n removedToppings?: Topping[];\r\n xTastyChoices?: XTastyChoice[];\r\n appliedDealId?: string;\r\n appliedDealIndex?: number;\r\n amount?: number;\r\n}\r\n\r\nfunction mapItemToSimplified(item: ItemToSimplify): SimplifiedBasketItem {\r\n return {\r\n sku: item.sku,\r\n addedToppings: item.addedToppings ? item.addedToppings : [],\r\n removedToppings: item.removedToppings ? item.removedToppings : [],\r\n xTastyChoices: item.xTastyChoices ? item.xTastyChoices : [],\r\n appliedDealId: item.appliedDealId ?? '',\r\n appliedDealIndex: item.appliedDealIndex,\r\n amount: item.amount ? item.amount : 1,\r\n };\r\n}\r\n\r\nexport const addProductBySKU =\r\n (sku: SKU): ThunkAction =>\r\n (dispatch): void => {\r\n dispatch(addProduct(mapItemToSimplified({ sku })));\r\n };\r\n\r\nexport const addProduct =\r\n (addedItem: SimplifiedBasketItem): ThunkAction =>\r\n async (dispatch, getState): Promise => {\r\n const basket = { ...getState().basket.basket };\r\n const items = [...basket.items];\r\n\r\n items.push(addedItem as BasketItem);\r\n\r\n dispatch(recalculateBasket({ items, coupons: basket.coupons }));\r\n };\r\n\r\nexport const replaceProduct =\r\n (\r\n productToReplace: SimplifiedBasketItem,\r\n productBeforeChanges: SimplifiedBasketItem,\r\n ): ThunkAction =>\r\n async (dispatch, getState): Promise => {\r\n const basket = { ...getState().basket.basket };\r\n const items = [...basket.items];\r\n\r\n const itemToReplaceIndex = items.findIndex((el) => JSON.stringify(el) === JSON.stringify(productBeforeChanges));\r\n if (itemToReplaceIndex !== -1) {\r\n items[itemToReplaceIndex] = productToReplace as BasketItem;\r\n }\r\n\r\n if (!getState().localization.currentStore.id) {\r\n dispatch(AddressWizzardActions.changeWizzardStep(AddressWizzardSteps.LocalizationModal));\r\n return;\r\n }\r\n\r\n dispatch(recalculateBasket({ items, coupons: basket.coupons }));\r\n };\r\n\r\nexport const removeProduct =\r\n (item: BasketItem): ThunkAction =>\r\n async (dispatch, getState): Promise => {\r\n const basket = { ...getState().basket.basket };\r\n const items = [...basket.items];\r\n const coupons = [...basket.coupons];\r\n const itemIndex = items.findIndex((el) => JSON.stringify(el) === JSON.stringify(item));\r\n\r\n if (items[itemIndex].appliedDealId && items[itemIndex].appliedDealIdentifier) {\r\n const couponIndex = coupons.findIndex(\r\n (coupon) => coupon.code === items[itemIndex].appliedDealId && coupon.type !== OfferTypes.PERC_DIS,\r\n );\r\n couponIndex >= 0 && coupons.splice(couponIndex, 1);\r\n }\r\n items.splice(itemIndex, 1);\r\n\r\n dispatch(recalculateBasket({ items, coupons }));\r\n };\r\n\r\nexport const addCoupon =\r\n (couponCode: string, includeSuggestions = false, useRecursively = false): ThunkAction =>\r\n async (dispatch, getState): Promise => {\r\n const state = getState();\r\n const basket = { ...state.basket.basket };\r\n let items = [...basket.items];\r\n let coupons = [...basket.coupons];\r\n const { offersCombo } = state.offers;\r\n\r\n if (offersCombo && offersCombo.length > 0) {\r\n offersCombo.forEach((offer) => {\r\n if (!offer.isPossible) {\r\n let shouldRemoveItems = true;\r\n coupons = coupons.filter((coupon) => {\r\n if (coupon.code === offer.couponId) {\r\n shouldRemoveItems = isOfferComplexType(coupon.type);\r\n return false;\r\n }\r\n return true;\r\n });\r\n if (shouldRemoveItems) {\r\n items = items.filter((item) => item.appliedDealId !== offer.couponId);\r\n } else {\r\n // remove applied coupon id from item when coupon is replaced by other\r\n items.forEach((item) => {\r\n if (item.appliedDealId === offer.couponId) item.appliedDealId = '';\r\n });\r\n }\r\n }\r\n });\r\n dispatch({ type: OffersActions.OffersActionTypes.SET_OFFERS_COMBINATION });\r\n }\r\n\r\n coupons.push({ code: couponCode, useRecursively } as AppliedCoupon);\r\n\r\n dispatch(recalculateBasket({ items, coupons, includeSuggestions }));\r\n };\r\n\r\nexport const addCompiledOffer =\r\n (dealIdentifier?: string): ThunkAction =>\r\n async (dispatch, getState): Promise => {\r\n const state = getState();\r\n\r\n const basket = { ...state.basket.basket };\r\n const { customizationOffer, offersCombo } = state.offers;\r\n let coupons = [...basket.coupons];\r\n let items = dealIdentifier ? basket.items.filter((item) => item.appliedDealIdentifier !== dealIdentifier) : [...basket.items];\r\n const compilationItems = customizationOffer?.choiceSlots.map((item) => {\r\n return {\r\n ...item.selectedChoice,\r\n appliedDealIndex:\r\n item.selectedChoice?.appliedDealIndex && item.selectedChoice?.appliedDealIndex >= 0\r\n ? item.selectedChoice.appliedDealIndex\r\n : state.basket.basket.compiledOffers.length,\r\n appliedDealId: customizationOffer.code,\r\n } as BasketItem;\r\n }) as BasketItem[];\r\n\r\n if (offersCombo && offersCombo.length > 0) {\r\n offersCombo.forEach((offer) => {\r\n if (!offer.isPossible) {\r\n let shouldRemoveItems = true;\r\n coupons = [...coupons].filter((coupon) => {\r\n if (coupon.code === offer.couponId) {\r\n shouldRemoveItems = isOfferComplexType(coupon.type);\r\n return false;\r\n }\r\n return true;\r\n });\r\n if (shouldRemoveItems) {\r\n items = [...items].filter((item) => item.appliedDealId !== offer.couponId);\r\n }\r\n }\r\n });\r\n dispatch({ type: OffersActions.OffersActionTypes.SET_OFFERS_COMBINATION });\r\n }\r\n\r\n if (!customizationOffer?.appliedDealId) {\r\n customizationOffer && coupons.push({ code: customizationOffer?.code } as AppliedCoupon);\r\n }\r\n\r\n compilationItems && items.push(...compilationItems);\r\n dispatch({ type: OffersActions.OffersActionTypes.SET_CUSTOMIZATION_OFFER });\r\n dispatch(recalculateBasket({ items, coupons }));\r\n };\r\n\r\nexport const removeCoupon =\r\n (code: string, includeSuggestions = false, removeAll = false): ThunkAction =>\r\n async (dispatch, getState): Promise => {\r\n const basket = { ...getState().basket.basket };\r\n let coupons = [...basket.coupons];\r\n if (removeAll) {\r\n coupons = basket.coupons.filter((coupon) => coupon.code !== code);\r\n } else {\r\n coupons.splice(\r\n basket.coupons.findIndex((coupon) => coupon.code === code),\r\n 1,\r\n );\r\n }\r\n\r\n dispatch(recalculateBasket({ items: basket.items, coupons, includeSuggestions }));\r\n };\r\n\r\nexport const removeCompiledOffer =\r\n (appliedDealId: string, code: string): ThunkAction =>\r\n async (dispatch, getState): Promise => {\r\n const state = getState();\r\n const basket = { ...state.basket.basket };\r\n const couponIndex = basket.coupons.findIndex((coupon) => coupon.code === code);\r\n const coupons = [...basket.coupons];\r\n const items = basket.items.filter((item) => item.appliedDealIdentifier !== appliedDealId);\r\n\r\n coupons.splice(couponIndex, 1);\r\n\r\n dispatch(recalculateBasket({ items, coupons }));\r\n };\r\n\r\nexport interface BasketOptions {\r\n includeSuggestions?: boolean;\r\n redirectToProducts?: boolean;\r\n removeInvalidProductsNCoupons?: boolean;\r\n}\r\ninterface RecalculateBasketParams extends BasketOptions {\r\n items: BasketItem[];\r\n coupons: AppliedCoupon[];\r\n}\r\n\r\nexport const refreshBasket =\r\n (): ThunkAction =>\r\n async (dispatch, getState): Promise => {\r\n const { basket } = getState().basket;\r\n if (basket.items.length > 0 || basket.coupons.length > 0) {\r\n dispatch(\r\n recalculateBasket({\r\n items: basket.items,\r\n coupons: basket.coupons,\r\n includeSuggestions: false,\r\n }),\r\n );\r\n }\r\n };\r\n\r\nexport const reorderFromHistoryProductsNCoupons =\r\n (\r\n historyCoupons: HistoryOrderCoupon[],\r\n historyProducts: HistoryOrderProduct[],\r\n redirectToProducts = false,\r\n ): ThunkAction =>\r\n async (dispatch, getState): Promise => {\r\n const { basket } = getState().basket;\r\n\r\n const newBasket = addHistoryBasketToCurrent(basket, historyCoupons, historyProducts);\r\n\r\n if (newBasket.items.length > 0 || newBasket.coupons.length > 0) {\r\n dispatch(\r\n recalculateBasket({\r\n items: newBasket.items,\r\n coupons: newBasket.coupons,\r\n includeSuggestions: false,\r\n redirectToProducts,\r\n removeInvalidProductsNCoupons: true,\r\n }),\r\n );\r\n }\r\n };\r\n \r\nexport const recalculateBasket =\r\n ({\r\n items,\r\n coupons,\r\n includeSuggestions = false,\r\n redirectToProducts = false,\r\n removeInvalidProductsNCoupons = false,\r\n }: RecalculateBasketParams): ThunkAction =>\r\n async (dispatch, getState): Promise => {\r\n const state = getState();\r\n dispatch(ProductsActions.SetProductsLoader(BASKET_LOADER, true));\r\n ResponseWrapper({\r\n action: async () => {\r\n const localizationCookieExpired = !cookieExists('localization');\r\n if (!state.localization.currentStore.id) {\r\n dispatch({\r\n type: BasketActionTypes.SET_PAUSED_RECALCULATE_REQUEST,\r\n payload: {\r\n items,\r\n coupons,\r\n params: {\r\n includeSuggestions,\r\n redirectToProducts,\r\n removeInvalidProductsNCoupons,\r\n },\r\n },\r\n });\r\n dispatch(ProductsActions.SetProductsLoader(BASKET_LOADER, false));\r\n dispatch(AddressWizzardActions.changeWizzardStep(AddressWizzardSteps.LocalizationModal));\r\n dispatch(saveBasket());\r\n return;\r\n }\r\n\r\n if (localizationCookieExpired) {\r\n // so there is redux localization, but it is expired (not in cookie)\r\n dispatch(removeBasket());\r\n dispatch(ProductsActions.SetProductsLoader(BASKET_LOADER, false));\r\n dispatch(AddressWizzardActions.changeWizzardStep(AddressWizzardSteps.LocalizationModal));\r\n return;\r\n }\r\n\r\n const value: AxiosResponse = await Axios.post(\r\n 'api/baskets',\r\n {\r\n items: items.map((item) => mapItemToSimplified(item)),\r\n coupons,\r\n isDelivery: state.localization.distributionType === OrderDistributionType.Delivery,\r\n orderDateTime: state.localization.selectedOrderTime?.dateTimeFrame,\r\n storeId: state.localization.currentStore.id,\r\n deliveryAddress: {\r\n Street: state.localization.selectedAddress.street,\r\n City: state.localization.selectedAddress.city,\r\n Country: state.localization.selectedAddress.region,\r\n District: state.localization.selectedAddress.region,\r\n StreetNumber: state.localization.selectedAddress.streetNumber,\r\n },\r\n removeInvalidProductsNCoupons,\r\n },\r\n {\r\n params: {\r\n includeSuggestions,\r\n },\r\n },\r\n );\r\n\r\n const basketWithOffers = groupCompiledOffers(value.data);\r\n dispatch({\r\n type: BasketActionTypes.SET_BASKET,\r\n payload: basketWithOffers,\r\n });\r\n dispatch(ProductsActions.SetProductsLoader(BASKET_LOADER, false));\r\n dispatch(saveBasket());\r\n\r\n const removedCoupons = (value.data.removedCouponsCodes && value.data.removedCouponsCodes.length > 0) ?? false;\r\n const removedProducts = (value.data.removedProductsIds && value.data.removedProductsIds.length > 0) ?? false;\r\n\r\n if (removeInvalidProductsNCoupons && (removedCoupons || removedProducts)) {\r\n dispatch({ type: BasketActionTypes.SET_PRODUCT_NOT_AVAILABLE_MODAL, payload: true });\r\n }\r\n\r\n if (redirectToProducts){\r\n redirectToOtherAppURL('products');\r\n }\r\n },\r\n dispatch,\r\n allowedErr: {\r\n // TODO update to different status code after proper backend fix\r\n errorCodes: [\r\n 'PRICE_CALCULATION_INVALID_PRODUCTS',\r\n 'ProductNotAvailableForSelectedDeliveryTime',\r\n 'RequestedProductNotAvailableForStore',\r\n 'ProductOutOfStock',\r\n 'PRODUCT_NOT_FOUND',\r\n 'RequestedProductsDoNotMatchCouponCodes',\r\n 'CouponProductCompositionInvalid',\r\n 'NoActionFoundForCouponCode',\r\n 'SingleUseCouponUsagesExceeded',\r\n 'OptionOutOfStock',\r\n 'CouponCodeInvalid',\r\n ],\r\n action: (err: AxiosError) => {\r\n const errorDescription = err.response?.data.errorDescription;\r\n\r\n if (errorDescription === 'RequestedProductsDoNotMatchCouponCodes'\r\n || errorDescription === 'CouponProductCompositionInvalid'\r\n ) {\r\n dispatch({ type: OffersActions.OffersActionTypes.SET_INVALID_PRODUCT_COMPOSITION_MODAL, payload: true });\r\n dispatch(ProductsActions.SetProductsLoader(BASKET_LOADER, false));\r\n return;\r\n }\r\n\r\n if (err.response?.data.errorCode === 'SingleUseCouponUsagesExceeded') {\r\n dispatch({ type: BasketActionTypes.SET_NO_OF_VOUCHERS_EXCEEDED_MODAL, payload: true });\r\n dispatch(ProductsActions.SetProductsLoader(BASKET_LOADER, false));\r\n return;\r\n }\r\n\r\n if (err.response?.data.errorCode === 'CouponCodeInvalid') {\r\n dispatch({ type: BasketActionTypes.SET_COUPON_CODE_INVALID_MODAL, payload: true });\r\n dispatch(ProductsActions.SetProductsLoader(BASKET_LOADER, false));\r\n return;\r\n }\r\n\r\n dispatch({ type: BasketActionTypes.SET_PRODUCT_NOT_AVAILABLE_MODAL, payload: true });\r\n dispatch(ProductsActions.SetProductsLoader(BASKET_LOADER, false));\r\n\r\n if (errorDescription === 'ProductOutOfStock'\r\n || errorDescription === 'OptionOutOfStock') {\r\n const outOfStockProducts = err.response?.data.entitiesErrors.map((item) => item.entityIdentifier);\r\n if (outOfStockProducts && outOfStockProducts.length > 0) {\r\n dispatch({\r\n type: BasketActionTypes.SET_OUT_OF_STOCK_PRODUCTS,\r\n payload: { outOfStockProducts, basketItems: items, basketCoupons: coupons },\r\n });\r\n }\r\n }\r\n },\r\n },\r\n errorCallback: async () => {\r\n dispatch(ProductsActions.SetProductsLoader(BASKET_LOADER, false));\r\n },\r\n });\r\n };\r\n\r\nexport const getCrossSell =\r\n (): ThunkAction =>\r\n async (dispatch, getState): Promise => {\r\n const state = getState();\r\n ResponseWrapper({\r\n action: async () => {\r\n const value: AxiosResponse = await Axios.get('api/offers/cross-sell', {\r\n params: {\r\n storeId: state.localization.currentStore.id,\r\n deliveryDateTime: state.localization.selectedOrderTime?.dateTimeFrame,\r\n },\r\n });\r\n dispatch({\r\n type: BasketActionTypes.SET_CROSS_SELL,\r\n payload: value.data[0],\r\n });\r\n },\r\n dispatch,\r\n });\r\n };\r\n\r\nexport const getLastUserOrder =\r\n (): ThunkAction =>\r\n async (dispatch): Promise => {\r\n ResponseWrapper({\r\n action: async () => {\r\n const response: AxiosResponse = await Axios.get('api/accounts/orders/history');\r\n if (response?.data.historyOrders && response.data.historyOrders.length > 0) {\r\n dispatch({\r\n type: BasketActionTypes.SET_LAST_USER_ORDER,\r\n payload: response.data.historyOrders[0],\r\n });\r\n }\r\n },\r\n dispatch,\r\n });\r\n };\r\n\r\nexport const updateVoucherInput =\r\n (voucher: string, validate = false): ThunkAction =>\r\n async (dispatch, getState): Promise => {\r\n const state = getState();\r\n const validator = new FormValidatorHandler({\r\n value: voucher,\r\n validators: [\r\n CommonValidators.required({\r\n message: state.productsStaticContent.voucherModal.errorMessageRequired,\r\n messageType: UserMessageType.ERROR,\r\n }),\r\n ],\r\n });\r\n\r\n dispatch({\r\n type: BasketActionTypes.SET_VOUCHER_INPUT,\r\n payload: {\r\n value: voucher,\r\n errorMessage: validate ? validator.validate().messages[0]?.message : undefined,\r\n touched: true,\r\n },\r\n });\r\n };\r\n\r\nexport const addVoucher =\r\n (redirectCallback: (code: string) => void): ThunkAction =>\r\n async (dispatch, getState): Promise => {\r\n const state = getState();\r\n\r\n if (state.basket.voucherControl.touched && !state.basket.voucherControl.errorMessage) {\r\n ResponseWrapper({\r\n action: async () => {\r\n dispatch(ProductsActions.SetProductsLoader(BASKET_LOADER, true));\r\n const value: AxiosResponse = await Axios.get(`api/offers/vouchers/${state.basket.voucherControl.value}`, {\r\n params: {\r\n deliveryType: state.localization.distributionType,\r\n storeId: state.localization.currentStore.id,\r\n },\r\n });\r\n if (value.data) {\r\n dispatch(checkOfferCombinationValidity(value.data.code, () => redirectCallback(value.data.code), 0));\r\n dispatch({ type: BasketActionTypes.SET_VOUCHER_MODAL_VISIBILITY, payload: false });\r\n gtm.cartModule.offerPromoAdded(value.data, state.basket.basketTraceId);\r\n }\r\n dispatch(ProductsActions.SetProductsLoader(BASKET_LOADER, false));\r\n },\r\n dispatch,\r\n allowedErr: {\r\n statusArr: [404, 400, 500],\r\n action: (): void => {\r\n dispatch({\r\n type: BasketActionTypes.SET_VOUCHER_INPUT,\r\n payload: {\r\n value: state.basket.voucherControl.value,\r\n errorMessage: state.productsStaticContent.voucherModal.errorMessageWrongCoupon,\r\n touched: true,\r\n },\r\n });\r\n dispatch(ProductsActions.SetProductsLoader(BASKET_LOADER, false));\r\n },\r\n },\r\n });\r\n }\r\n };\r\n\r\nexport const continueRecalculateRequest =\r\n (items: BasketItem[], coupons: AppliedCoupon[], params: BasketOptions): ThunkAction =>\r\n async (dispatch, getState): Promise => {\r\n let updatedCoupons = coupons;\r\n if (coupons.length > 0) {\r\n const state = getState();\r\n let { offers } = state.offers;\r\n\r\n if (offers.length === 0) {\r\n const value: AxiosResponse = await Axios.get('api/offers', {\r\n params: {\r\n storeId: state.localization.currentStore.id,\r\n deliveryType: state.localization.distributionType,\r\n deliveryDateTime: state.localization.selectedOrderTime?.dateTimeFrame,\r\n },\r\n });\r\n offers = value.data;\r\n }\r\n\r\n const isOfferAssignedToStore = offers.find((offer) => offer.code === coupons[0].code);\r\n\r\n if (!isOfferAssignedToStore) {\r\n const value: AxiosResponse = await Axios.get('api/offers/cross-sell', {\r\n params: {\r\n storeId: state.localization.currentStore.id,\r\n deliveryDateTime: state.localization.selectedOrderTime?.dateTimeFrame,\r\n },\r\n });\r\n\r\n if (value.data[0].code !== coupons[0].code) {\r\n dispatch({ type: BasketActionTypes.SET_PRODUCT_NOT_AVAILABLE_MODAL, payload: true });\r\n updatedCoupons = [];\r\n }\r\n }\r\n }\r\n\r\n dispatch(recalculateBasket({ items, coupons: updatedCoupons, ...params }));\r\n dispatch({ type: BasketActionTypes.SET_PAUSED_RECALCULATE_REQUEST });\r\n };\r\n\r\nexport const saveBasket =\r\n (): ThunkAction =>\r\n async (_dispatch, getState): Promise => {\r\n const state = getState();\r\n const { basket, pausedRecalculateRequest, basketTraceId } = state.basket;\r\n\r\n const basketJson = JSON.stringify({\r\n language: appCulture(),\r\n basket,\r\n pausedRecalculateRequest,\r\n basketTraceId,\r\n });\r\n\r\n localStorage.setItem('basket', basketJson);\r\n\r\n _dispatch({ type: BasketActionTypes.SET_LANGUAGE, payload: appCulture() });\r\n };\r\n\r\nexport const removeBasket =\r\n (): ThunkAction =>\r\n async (dispatch): Promise => {\r\n removeBasketFromLocalStorage();\r\n dispatch(getEmptyBasket(true));\r\n };\r\n\r\nfunction groupCompiledOffers(basket: Basket): Basket {\r\n const updatedBasket = { ...basket };\r\n updatedBasket.compiledOffers = [];\r\n\r\n updatedBasket.items.forEach((item, index) => {\r\n if (!item.appliedDealIdentifier) return;\r\n\r\n const compileOfferIndex = updatedBasket.compiledOffers.findIndex(\r\n (offer) => offer.appliedDealIdentifier === item.appliedDealIdentifier,\r\n );\r\n\r\n if (compileOfferIndex >= 0) {\r\n updatedBasket.compiledOffers[compileOfferIndex].choices.push(item);\r\n updatedBasket.items[index].isCompilationPart = true;\r\n updatedBasket.items[index].appliedDealIndex = compileOfferIndex;\r\n return;\r\n }\r\n\r\n const currentCoupon = updatedBasket.coupons.find(\r\n (coupon) => coupon.identifier === item.appliedDealIdentifier,\r\n ) as AppliedCoupon;\r\n if (!isOfferComplexType(currentCoupon.type)) return;\r\n\r\n updatedBasket.compiledOffers.push({\r\n appliedDealIdentifier: item.appliedDealIdentifier,\r\n choices: [item],\r\n price: currentCoupon.price,\r\n title: currentCoupon.displayTitle,\r\n code: currentCoupon.code,\r\n type: currentCoupon.type,\r\n });\r\n updatedBasket.items[index].isCompilationPart = true;\r\n updatedBasket.items[index].appliedDealIndex = updatedBasket.compiledOffers.length - 1;\r\n });\r\n\r\n return updatedBasket;\r\n}\r\n\r\nexport const removeOutOfStockProducts =\r\n (): ThunkAction =>\r\n async (dispatch, getState): Promise => {\r\n const {\r\n basket: { outOfStockDetails },\r\n } = getState();\r\n if (!outOfStockDetails) {\r\n dispatch({ type: BasketActionTypes.SET_PRODUCT_NOT_AVAILABLE_MODAL, payload: false });\r\n dispatch({ type: BasketActionTypes.SET_OFFER_NOT_AVAILABLE_MODAL, payload: false });\r\n return;\r\n }\r\n\r\n const { outOfStockProducts, basketItems, basketCoupons } = outOfStockDetails;\r\n\r\n const removedItemsDealIndexes = basketItems\r\n .filter((item) => outOfStockProducts?.includes(item.sku.productId) && item.appliedDealIndex >= 0)\r\n .map((item) => item.appliedDealIndex)\r\n .removeDuplicates();\r\n\r\n const updatedItems = basketItems\r\n .filter((item) => !outOfStockProducts.includes(item.sku.productId))\r\n .map((item) => {\r\n return { ...item, appliedDealId: removedItemsDealIndexes.includes(item.appliedDealIndex) ? '' : item.appliedDealId };\r\n });\r\n const updatedCoupons = basketCoupons.filter((_, index) => !removedItemsDealIndexes.includes(index));\r\n\r\n dispatch(recalculateBasket({ items: updatedItems, coupons: updatedCoupons }));\r\n dispatch({ type: BasketActionTypes.SET_PRODUCT_NOT_AVAILABLE_MODAL, payload: false });\r\n dispatch({ type: BasketActionTypes.SET_OFFER_NOT_AVAILABLE_MODAL, payload: false });\r\n dispatch({ type: BasketActionTypes.SET_OUT_OF_STOCK_PRODUCTS });\r\n dispatch(refreshProducts());\r\n };\r\n\r\nfunction addHistoryBasketToCurrent(\r\n currentBasket: Basket,\r\n historyCoupons: HistoryOrderCoupon[],\r\n historyProducts: HistoryOrderProduct[],\r\n): RecalculateBasketParams {\r\n const newItems = [...currentBasket.items];\r\n const newCoupons = [...currentBasket.coupons];\r\n let currentCouponIndex = currentBasket.coupons.length;\r\n historyCoupons.forEach((cp) => {\r\n const originCouponProducts = cp.products.map((pr) => {\r\n return {\r\n addedToppings: pr.addedToppings,\r\n removedToppings: pr.removedToppings,\r\n amount: pr.amount,\r\n xTastyChoices: pr.xTastyChoices,\r\n sku: {\r\n productTitle: pr.title,\r\n optionTitle: pr.optionTitle,\r\n optionSubTitle: pr.optionSubType,\r\n optionId: pr.optionId,\r\n productId: pr.id,\r\n },\r\n appliedDealId: cp.code,\r\n appliedDealIndex: currentCouponIndex,\r\n } as SimplifiedBasketItem;\r\n });\r\n const originCoupon = {\r\n code: cp.code,\r\n description: cp.description,\r\n discount: cp.discount,\r\n displayTitle: cp.title,\r\n isApplied: true,\r\n price: cp.price,\r\n type: cp.type,\r\n useRecursively: false,\r\n } as AppliedCoupon;\r\n newItems.push(...(originCouponProducts as BasketItem[]));\r\n newCoupons.push(originCoupon);\r\n currentCouponIndex++;\r\n });\r\n\r\n const productsFromOriginOrder = historyProducts.map((pr) => {\r\n return {\r\n addedToppings: pr.addedToppings,\r\n removedToppings: pr.removedToppings,\r\n amount: pr.amount,\r\n xTastyChoices: pr.xTastyChoices,\r\n sku: {\r\n productTitle: pr.title,\r\n optionTitle: pr.optionTitle,\r\n optionSubTitle: pr.optionSubType,\r\n optionId: pr.optionId,\r\n productId: pr.id,\r\n },\r\n } as SimplifiedBasketItem;\r\n });\r\n\r\n newItems.push(...(productsFromOriginOrder as BasketItem[]));\r\n\r\n const recalcParams: RecalculateBasketParams = {\r\n items: newItems,\r\n coupons: newCoupons,\r\n includeSuggestions: false,\r\n };\r\n\r\n return recalcParams;\r\n}\r\n\r\nexport type BasketActions =\r\n | SetLastUserOrder\r\n | SetBasket\r\n | SetCrossSell\r\n | SetCouponModalVisibility\r\n | SetVoucherInput\r\n | SetTempItem\r\n | SetProductNotAvailableModal\r\n | SetOfferNotAvailableModal\r\n | SetOutOfStockProducts\r\n | SetLanguage\r\n | SetNoOfVoucherExceeded\r\n | SetCouponCodeInvalid;\r\n","import { OptionDetails, ProductDetails, Topping } from 'apps/ProductsApp/types/dto.types';\r\nimport { OptionGroup } from 'apps/ProductsApp/containers/crust-selection.container';\r\nimport { SliceCustomization } from 'apps/ProductsApp/types/catalog.types';\r\n\r\nexport function extractAvailableToppings(allToppings: Topping[], selectedOption: OptionDetails): Topping[] {\r\n const availableToppings: Topping[] = [];\r\n const availableToppingBases = selectedOption?.additionalToppings;\r\n availableToppingBases &&\r\n availableToppingBases.forEach((atb) => {\r\n const topping = allToppings.find((el) => el.id === atb.id);\r\n topping && availableToppings.push({ ...topping, price: atb.price });\r\n });\r\n return availableToppings;\r\n}\r\n\r\nexport function extractDefaultToppings(allToppings: Topping[], selectedOption: OptionDetails): Topping[] {\r\n const defaultToppings: Topping[] = [];\r\n const defaultToppingBases = selectedOption.defaultToppings;\r\n defaultToppingBases &&\r\n defaultToppingBases.forEach((dtb) => {\r\n const topping = allToppings.find((el) => el.id === dtb.id);\r\n topping && defaultToppings.push({ ...topping, price: dtb.price });\r\n });\r\n return defaultToppings;\r\n}\r\n\r\nexport function prepareOptionsGroups(productToCustomize: ProductDetails): OptionGroup[] {\r\n const sortedProducts = productToCustomize.options.sort((a, b) => a.sortOrder - b.sortOrder);\r\n const optionTypesWithoutDuplicates = new Set(sortedProducts.map((opt) => opt.type));\r\n const availableOptionTypes = Array.from(optionTypesWithoutDuplicates);\r\n const availableOptionGroups: OptionGroup[] = availableOptionTypes.map((optionType) => {\r\n return {\r\n title: optionType,\r\n options: sortedProducts.filter((op) => op.type === optionType),\r\n } as OptionGroup;\r\n });\r\n return availableOptionGroups;\r\n}\r\n\r\nexport function initSlices(currentSlices: SliceCustomization[], sliceCount: number): SliceCustomization[] {\r\n const slicesModel: SliceCustomization[] = [];\r\n if (sliceCount <= 1) {\r\n // this is standard pizza not xTasty\r\n return [\r\n {\r\n ...currentSlices[0],\r\n sliceProductConfirmed: true,\r\n },\r\n ];\r\n }\r\n for (let i = 0; i < sliceCount; i++) {\r\n slicesModel.push(currentSlices[i] ?? {});\r\n }\r\n return slicesModel;\r\n}\r\n\r\nexport function groupToppingsToDisplay(defaultToppings: Topping[], addedToppings: Topping[], removedToppings: Topping[]): string[] {\r\n const groupedToppings: string[] = [];\r\n const defaultSauce = defaultToppings.find((el) => el.categoryId === 'SAU');\r\n const defaultCheese = defaultToppings.find((el) => el.categoryId === 'RND');\r\n const selectedSauce = addedToppings.find((el) => el.categoryId === 'SAU');\r\n const selectedCheese = addedToppings.find((el) => el.categoryId === 'RND');\r\n\r\n const defToppingsWithoutSauceNCheese = [...defaultToppings].filter(\r\n (topping) => topping.categoryId !== 'SAU' && topping.categoryId !== 'RND',\r\n );\r\n const addedToppingsWithoutSauceNCheese = [...addedToppings].filter(\r\n (topping) => topping.categoryId !== 'SAU' && topping.categoryId !== 'RND',\r\n );\r\n\r\n const selectedToppings = defToppingsWithoutSauceNCheese.concat(addedToppingsWithoutSauceNCheese);\r\n removedToppings.forEach((removedTopping) => {\r\n const indexToRemove = selectedToppings.findIndex((el) => el.id === removedTopping.id);\r\n if (indexToRemove > -1) {\r\n selectedToppings.splice(indexToRemove, 1);\r\n }\r\n });\r\n\r\n const countedToppings: Array<{ topping: Topping; count: number }> = [];\r\n selectedToppings.forEach((selectedTopping) => {\r\n const index = countedToppings.findIndex((el) => el.topping.id === selectedTopping.id);\r\n if (index === -1) {\r\n countedToppings.push({ topping: selectedTopping, count: 1 });\r\n } else {\r\n countedToppings[index].count++;\r\n }\r\n });\r\n\r\n const sauce = selectedSauce ? selectedSauce.title : defaultSauce ? defaultSauce.title : undefined;\r\n const cheese = selectedCheese ? selectedCheese.title : defaultCheese ? defaultCheese.title : undefined;\r\n\r\n sauce !== undefined && groupedToppings.push(sauce);\r\n cheese !== undefined && groupedToppings.push(cheese);\r\n countedToppings.forEach((ct) => {\r\n groupedToppings.push(`${ct.topping.title}${ct.count > 1 ? ` x${ct.count}` : ''}`);\r\n });\r\n return groupedToppings;\r\n}\r\n","import { ApplicationState } from 'apps/ProductsApp/store';\r\nimport { CustomizeProductStep } from 'apps/ProductsApp/store/customize-product/customize-product.reducer';\r\nimport { CustomizationProduct, SliceCustomization } from 'apps/ProductsApp/types/catalog.types';\r\nimport { AxiosResponse } from 'axios';\r\nimport Axios from 'shared/api/axios';\r\nimport { Dispatch } from 'react';\r\nimport { Action } from 'redux';\r\nimport { ThunkAction } from 'redux-thunk';\r\nimport ResponseWrapper from 'shared/tools/api-response-wrapper';\r\nimport { BasketItem, SpecificationToppingsPrices, SimplifiedBasketItem } from 'apps/ProductsApp/types/basket.types';\r\nimport { OrderDistributionType } from 'shared/types';\r\nimport { extractDefaultToppings, initSlices } from 'apps/ProductsApp/helpers/customize-product.helper';\r\nimport { CategoryDto, OptionDetails, Option, Product, ProductDetails, Topping } from '../../types/dto.types';\r\nimport { ProductsActions } from '../actions';\r\n\r\nexport enum CustomizeProductActionTypes {\r\n CLEAR_CUSTOMIZE_STATE = '[CUSTOMIZE_PRODUCT] CLEAR_CUSTOMIZE_STATE',\r\n SET_CUSTOMIZATION_PIZZA = '[CUSTOMIZE_PRODUCT] SET_CUSTOMIZATION_PIZZA',\r\n SET_CUSTOMIZATION_PRODUCT = '[CUSTOMIZE_PRODUCT] SET_CUSTOMIZATION_PRODUCT',\r\n SET_CURRENT_STEP = '[CUSTOMIZE_PRODUCT] SET_CURRENT_STEP',\r\n SET_ADD_FUNCTION = '[CUSTOMIZE_PRODUCT] SET_ADD_FUNCTION',\r\n SET_ACTIVE_OPTION = '[CUSTOMIZE_PRODUCT] SET_ACTIVE_OPTION',\r\n SET_ACTIVE_SLICE = '[CUSTOMIZE_PRODUCT] SET_ACTIVE_SLICE',\r\n SET_ADDED_TOPPINGS = '[CUSTOMIZE_PRODUCT] SET_ADDED_TOPPINGS',\r\n SET_REMOVED_TOPPINGS = '[CUSTOMIZE_PRODUCT] SET_REMOVED_TOPPINGS',\r\n SET_SELECTED_CHEESE = '[CUSTOMIZE_PRODUCT] SET_SELECTED_CHEESE',\r\n SET_SELECTED_SAUCE = '[CUSTOMIZE_PRODUCT] SET_SELECTED_SAUCE',\r\n SET_SLICE_PRODUCT = '[CUSTOMIZE_PRODUCT] SET_SLICE_PRODUCT',\r\n INIT_SLICES = '[CUSTOMIZE_PRODUCT] INIT_SLICES',\r\n LOAD_PRODUCT_FROM_MODEL = '[CUSTOMIZE_PRODUCT] LOAD_PRODUCT_FROM_MODEL',\r\n CONFIRM_SLICE_PRODUCT = '[CUSTOMIZE_PRODUCT] CONFIRM_SLICE_PRODUCT',\r\n SET_AVAILABLE_RECIPES = '[CUSTOMIZE_PRODUCT] SET_AVAILABLE_RECIPES',\r\n SET_TOPPINGS_PRICE = '[CUSTOMIZE_PRODUCT] SET_TOPPINGS_PRICE',\r\n SET_PRODUCT_PRICE = '[CUSTOMIZE_PRODUCT] SET_PRODUCT_PRICE',\r\n}\r\n\r\nconst CUSTOMIZE_PRODUCT_LOADER = 'customizeProductLoader';\r\n\r\ninterface SetCustomizationPizza extends Action {\r\n type: CustomizeProductActionTypes.SET_CUSTOMIZATION_PIZZA;\r\n payload: CustomizationProduct;\r\n}\r\ninterface SetCustomizationProduct extends Action {\r\n type: CustomizeProductActionTypes.SET_CUSTOMIZATION_PRODUCT;\r\n payload: CustomizationProduct;\r\n}\r\n\r\ninterface ClearCustomizeState extends Action {\r\n type: CustomizeProductActionTypes.CLEAR_CUSTOMIZE_STATE;\r\n}\r\n\r\ninterface SetCurrentStep extends Action {\r\n type: CustomizeProductActionTypes.SET_CURRENT_STEP;\r\n payload: CustomizeProductStep;\r\n}\r\n\r\ninterface SetActiveOption extends Action {\r\n type: CustomizeProductActionTypes.SET_ACTIVE_OPTION;\r\n payload: OptionDetails;\r\n}\r\ninterface SetAddedToppings extends Action {\r\n type: CustomizeProductActionTypes.SET_ADDED_TOPPINGS;\r\n payload: Topping[];\r\n}\r\ninterface SetRemovedToppings extends Action {\r\n type: CustomizeProductActionTypes.SET_REMOVED_TOPPINGS;\r\n payload: Topping[];\r\n}\r\n\r\ninterface SetSelectedCheese extends Action {\r\n type: CustomizeProductActionTypes.SET_SELECTED_CHEESE;\r\n payload: Topping;\r\n}\r\n\r\ninterface SetSelectedSauce extends Action {\r\n type: CustomizeProductActionTypes.SET_SELECTED_SAUCE;\r\n payload: Topping;\r\n}\r\n\r\ninterface InitSlices extends Action {\r\n type: CustomizeProductActionTypes.INIT_SLICES;\r\n payload: { slices: SliceCustomization[]; activeSlice: number };\r\n}\r\n\r\ninterface SetActiveSlice extends Action {\r\n type: CustomizeProductActionTypes.SET_ACTIVE_SLICE;\r\n payload: number;\r\n}\r\n\r\ninterface SetAddFunction extends Action {\r\n type: CustomizeProductActionTypes.SET_ADD_FUNCTION;\r\n payload: (basketItemToAdd: SimplifiedBasketItem) => void;\r\n}\r\ninterface CustomizeProductFromBasket extends Action {\r\n type: CustomizeProductActionTypes.LOAD_PRODUCT_FROM_MODEL;\r\n payload: {\r\n slices: SliceCustomization[];\r\n activeOption: OptionDetails;\r\n };\r\n}\r\ninterface SetRecipeOnSlice extends Action {\r\n type: CustomizeProductActionTypes.SET_SLICE_PRODUCT;\r\n payload: ProductDetails;\r\n}\r\ninterface ConfirmRecipeOnSlice extends Action {\r\n type: CustomizeProductActionTypes.CONFIRM_SLICE_PRODUCT;\r\n}\r\ninterface SetAvailableRecipes extends Action {\r\n type: CustomizeProductActionTypes.SET_AVAILABLE_RECIPES;\r\n payload: Product[];\r\n}\r\ninterface SetToppingsPrice extends Action {\r\n type: CustomizeProductActionTypes.SET_TOPPINGS_PRICE;\r\n payload: SpecificationToppingsPrices;\r\n}\r\n\r\ninterface SetProductPrice extends Action {\r\n type: CustomizeProductActionTypes.SET_PRODUCT_PRICE;\r\n payload: number;\r\n}\r\n\r\nexport function clearCustomizeState() {\r\n return (dispatch: Dispatch): void => {\r\n dispatch({\r\n type: CustomizeProductActionTypes.CLEAR_CUSTOMIZE_STATE,\r\n });\r\n };\r\n}\r\n\r\ninterface SetCustomizationProductProps {\r\n productId: string;\r\n callbackFunction: (basketItemToAdd: BasketItem) => void;\r\n limitedOptions?: Option[];\r\n position: number;\r\n offerCode?: string;\r\n offerChoiceIndex?: number;\r\n}\r\n\r\nexport const setCustomizationProduct =\r\n ({\r\n productId,\r\n callbackFunction,\r\n limitedOptions,\r\n position,\r\n offerCode,\r\n offerChoiceIndex\r\n }: SetCustomizationProductProps): ThunkAction =>\r\n async (dispatch, getState): Promise => {\r\n ResponseWrapper({\r\n action: async () => {\r\n try {\r\n dispatch(ProductsActions.SetProductsLoader(CUSTOMIZE_PRODUCT_LOADER, true));\r\n dispatch({\r\n type: CustomizeProductActionTypes.SET_ADD_FUNCTION,\r\n payload: callbackFunction,\r\n });\r\n const storeId = getState().localization.currentStore.id;\r\n const value: ProductDetails = await getProductDetails(productId, storeId);\r\n const isStarter = value.categoryId !== 'PIZ';\r\n\r\n if (limitedOptions) {\r\n const updatedOptions = limitedOptions.map((option) => {\r\n return value.options.find((detailedOption) => {\r\n return (\r\n JSON.stringify(detailedOption.sku.optionId) === JSON.stringify(option.sku.optionId) &&\r\n JSON.stringify(detailedOption.sku.productId) === JSON.stringify(option.sku.productId)\r\n );\r\n }) as OptionDetails;\r\n });\r\n value.options = updatedOptions;\r\n }\r\n\r\n dispatch({\r\n type: isStarter\r\n ? CustomizeProductActionTypes.SET_CUSTOMIZATION_PRODUCT\r\n : CustomizeProductActionTypes.SET_CUSTOMIZATION_PIZZA,\r\n payload: { ...value, position, offerCode, offerChoiceIndex },\r\n });\r\n dispatch(ProductsActions.SetProductsLoader(CUSTOMIZE_PRODUCT_LOADER, false));\r\n } catch {\r\n dispatch(ProductsActions.SetProductsLoader(CUSTOMIZE_PRODUCT_LOADER, false));\r\n }\r\n },\r\n dispatch,\r\n });\r\n };\r\n\r\nexport const editCustomizationProduct =\r\n (\r\n basketItem: BasketItem,\r\n callbackFunction: (basketItemToReplace: SimplifiedBasketItem) => void,\r\n ): ThunkAction =>\r\n async (dispatch, getState): Promise => {\r\n const state = getState();\r\n ResponseWrapper({\r\n action: async () => {\r\n try {\r\n dispatch(ProductsActions.SetProductsLoader(CUSTOMIZE_PRODUCT_LOADER, true));\r\n dispatch({\r\n type: CustomizeProductActionTypes.SET_ADD_FUNCTION,\r\n payload: callbackFunction,\r\n });\r\n const storeId = getState().localization.currentStore.id;\r\n const product: ProductDetails = await getProductDetails(basketItem.sku.productId, storeId);\r\n const isStarter = product.categoryId !== 'PIZ';\r\n const optionDetails = product.options.find((el) => el.id.toString() === basketItem.sku.optionId);\r\n\r\n optionDetails &&\r\n dispatch({\r\n type: CustomizeProductActionTypes.LOAD_PRODUCT_FROM_MODEL,\r\n payload: {\r\n slices: await initSlicesFromBasketItem(basketItem, state.products.toppings, storeId, product),\r\n activeOption: optionDetails,\r\n },\r\n });\r\n if (basketItem.specificationToppingsPrices) {\r\n dispatch({\r\n type: CustomizeProductActionTypes.SET_TOPPINGS_PRICE,\r\n payload: basketItem.specificationToppingsPrices,\r\n });\r\n }\r\n if (isStarter) {\r\n dispatch({\r\n type: CustomizeProductActionTypes.SET_CUSTOMIZATION_PRODUCT,\r\n payload: product,\r\n });\r\n } else {\r\n dispatch({\r\n type: CustomizeProductActionTypes.SET_CUSTOMIZATION_PIZZA,\r\n payload: product,\r\n });\r\n }\r\n\r\n dispatch(ProductsActions.SetProductsLoader(CUSTOMIZE_PRODUCT_LOADER, false));\r\n } catch {\r\n dispatch(ProductsActions.SetProductsLoader(CUSTOMIZE_PRODUCT_LOADER, false));\r\n }\r\n },\r\n dispatch,\r\n });\r\n };\r\n\r\nexport const setAvailableRecipes =\r\n (storeId?: string): ThunkAction =>\r\n async (dispatch): Promise => {\r\n ResponseWrapper({\r\n action: async () => {\r\n try {\r\n const allPizzas: AxiosResponse = await Axios.get(`api/products/categories`, {\r\n params: {\r\n categoryCode: 'PIZ',\r\n storeId,\r\n },\r\n });\r\n dispatch({ type: CustomizeProductActionTypes.SET_AVAILABLE_RECIPES, payload: allPizzas.data[0].products });\r\n } catch (ex) {\r\n console.warn(`Could not fetch all products for category PIZ`, ex);\r\n }\r\n },\r\n dispatch,\r\n });\r\n };\r\n\r\nexport const setSliceProduct =\r\n (productId: string): ThunkAction =>\r\n async (dispatch, getState): Promise => {\r\n const state = getState();\r\n\r\n ResponseWrapper({\r\n action: async () => {\r\n try {\r\n const storeId = getState().localization.currentStore.id;\r\n const productDetails: ProductDetails = await getProductDetails(productId, storeId);\r\n const { activeOption, slices, activeSlice } = state.customizeProduct;\r\n const selectedOptionId = activeOption?.id;\r\n const productOption = productDetails.options.find((el) => el.id === selectedOptionId);\r\n if (productOption) {\r\n const defaultToppings = extractDefaultToppings(state.products.toppings, productOption);\r\n const slicesWithDefaultToppings = updateSliceWithDefaultToppings(slices, activeSlice, defaultToppings, true);\r\n dispatch({\r\n type: CustomizeProductActionTypes.INIT_SLICES,\r\n payload: {\r\n slices: slicesWithDefaultToppings,\r\n activeSlice,\r\n },\r\n });\r\n }\r\n dispatch({ type: CustomizeProductActionTypes.SET_SLICE_PRODUCT, payload: productDetails });\r\n } catch {\r\n console.warn(`Could not find details for product with id: ${productId}`);\r\n }\r\n },\r\n dispatch,\r\n });\r\n };\r\n\r\nexport const setActiveOption =\r\n (option: OptionDetails): ThunkAction =>\r\n (dispatch, getState): void => {\r\n const state = getState();\r\n const { activeSlice, productToCustomize } = state.customizeProduct;\r\n const xTastySlicesCount = productToCustomize?.xTastySlicesCount ?? 1;\r\n let slices = initSlices(state.customizeProduct.slices, xTastySlicesCount);\r\n if (slices.length === 1) {\r\n const defaultToppings = extractDefaultToppings(state.products.toppings, option);\r\n slices = updateSliceWithDefaultToppings(slices, activeSlice, defaultToppings);\r\n }\r\n dispatch({\r\n type: CustomizeProductActionTypes.SET_ACTIVE_OPTION,\r\n payload: option,\r\n });\r\n\r\n dispatch({\r\n type: CustomizeProductActionTypes.INIT_SLICES,\r\n payload: {\r\n slices,\r\n activeSlice: 0,\r\n },\r\n });\r\n };\r\n\r\nfunction updateSliceWithDefaultToppings(\r\n currentSlices: SliceCustomization[],\r\n sliceId: number,\r\n defaultToppings: Topping[],\r\n resetSauceNCheese = false,\r\n): SliceCustomization[] {\r\n const slices = [...currentSlices];\r\n const defaultSauce = defaultToppings.find((el) => el.categoryId === 'SAU');\r\n const defaultCheese = defaultToppings.find((el) => el.categoryId === 'RND');\r\n slices[sliceId].defaultSauce = defaultSauce;\r\n slices[sliceId].defaultCheese = defaultCheese;\r\n slices[sliceId].defaultToppings = defaultToppings;\r\n if (resetSauceNCheese || slices[sliceId].selectedSauce === undefined) {\r\n slices[sliceId].selectedSauce = defaultSauce;\r\n }\r\n if (resetSauceNCheese || slices[sliceId].selectedCheese === undefined) {\r\n slices[sliceId].selectedCheese = defaultCheese;\r\n }\r\n return slices;\r\n}\r\n\r\nasync function initSlicesFromBasketItem(\r\n item: BasketItem,\r\n allToppings: Topping[],\r\n storeId: string,\r\n baseProduct: ProductDetails,\r\n): Promise {\r\n if (item.xTastyChoices.length > 0) {\r\n const sliceCustomizations: SliceCustomization[] = new Array(item.xTastyChoices.length);\r\n item.xTastyChoices.map(async (xtastyPart, index) => {\r\n const product: ProductDetails = await getProductDetails(xtastyPart.productId, storeId);\r\n const productOption = product.options.find((el) => el.id.toString() === item.sku.optionId);\r\n const defaultToppings = productOption ? extractDefaultToppings(allToppings, productOption) : [];\r\n sliceCustomizations[index] = {\r\n sliceProductConfirmed: true,\r\n sliceProduct: product,\r\n ...getSliceCustomization(defaultToppings, xtastyPart.addedToppings, xtastyPart.removedToppings),\r\n } as SliceCustomization;\r\n });\r\n return sliceCustomizations;\r\n }\r\n\r\n const productOption = baseProduct.options.find((el) => el.id.toString() === item.sku.optionId);\r\n const defaultToppings = productOption ? extractDefaultToppings(allToppings, productOption) : [];\r\n return [\r\n {\r\n ...getSliceCustomization(defaultToppings, item.addedToppings ?? [], item.removedToppings ?? []),\r\n },\r\n ];\r\n}\r\n\r\nfunction getSliceCustomization(defaultToppings: Topping[], addedToppings: Topping[], removedToppings: Topping[]): SliceCustomization {\r\n const defaultSauce = defaultToppings.find((el) => el.categoryId === 'SAU');\r\n const defaultCheese = defaultToppings.find((el) => el.categoryId === 'RND');\r\n const selectedSauce = addedToppings.find((el) => el.categoryId === 'SAU') ?? defaultSauce;\r\n const selectedCheese = addedToppings.find((el) => el.categoryId === 'RND') ?? defaultCheese;\r\n const addedWithoutSaucesNCheeses = addedToppings.filter((topping) => topping.categoryId !== 'SAU' && topping.categoryId !== 'RND');\r\n const removedWithoutSaucesNCheeses = removedToppings.filter(\r\n (topping) => topping.categoryId !== 'SAU' && topping.categoryId !== 'RND',\r\n );\r\n\r\n return {\r\n defaultToppings,\r\n defaultCheese,\r\n defaultSauce,\r\n selectedCheese,\r\n selectedSauce,\r\n addedToppings: addedWithoutSaucesNCheeses,\r\n removedToppings: removedWithoutSaucesNCheeses,\r\n } as SliceCustomization;\r\n}\r\n\r\nasync function getProductDetails(productId: string, storeId: string): Promise {\r\n const product = await Axios.get(`api/products/details/${productId}`, {\r\n params: {\r\n storeId,\r\n },\r\n });\r\n return product.data;\r\n}\r\n\r\nexport const addToppings =\r\n (addedToppings: Topping[]): ThunkAction =>\r\n async (dispatch): Promise => {\r\n dispatch({\r\n type: CustomizeProductActionTypes.SET_ADDED_TOPPINGS,\r\n payload: addedToppings,\r\n });\r\n dispatch(updatePrice());\r\n };\r\n\r\nexport const removeToppings =\r\n (removedToppings: Topping[]): ThunkAction =>\r\n async (dispatch): Promise => {\r\n dispatch({\r\n type: CustomizeProductActionTypes.SET_REMOVED_TOPPINGS,\r\n payload: removedToppings,\r\n });\r\n dispatch(updatePrice());\r\n };\r\n\r\nexport const updatePrice =\r\n (): ThunkAction =>\r\n async (dispatch, getState): Promise => {\r\n const { customizeProduct, localization } = getState();\r\n const { productToCustomize, activeOption, activeSlice, slices } = customizeProduct;\r\n const { currentStore, distributionType } = localization;\r\n\r\n dispatch(ProductsActions.SetProductsLoader(CUSTOMIZE_PRODUCT_LOADER, true));\r\n\r\n await ResponseWrapper({\r\n action: async () => {\r\n const isReadyToPriceUpdate = !productToCustomize?.isXTasty || slices.every(s => s.sliceProductConfirmed);\r\n if (!isReadyToPriceUpdate){\r\n dispatch(ProductsActions.SetProductsLoader(CUSTOMIZE_PRODUCT_LOADER, false));\r\n return;\r\n }\r\n\r\n const toppingsPrice = await Axios.post<{ toppingsCalculationResult: SpecificationToppingsPrices }>(\r\n 'api/baskets/toppings-calculation',\r\n {\r\n storeId: currentStore.id,\r\n deliverOrder: distributionType === OrderDistributionType.Delivery,\r\n productId: productToCustomize?.id,\r\n optionId: activeOption?.sku.optionId,\r\n productSpecification: productToCustomize?.isXTasty\r\n ? slices.map((slice) => {\r\n return {\r\n productId: slice.sliceProduct?.id,\r\n addedToppings: slice.addedToppings?.map((topping) => topping.id) ?? [],\r\n removedToppings: slice.removedToppings?.map((topping) => topping.id) ?? [],\r\n };\r\n })\r\n : [\r\n {\r\n productId: productToCustomize?.id,\r\n addedToppings: slices[activeSlice].addedToppings?.map((topping) => topping.id) ?? [],\r\n removedToppings: slices[activeSlice].removedToppings?.map((topping) => topping.id) ?? [],\r\n },\r\n ],\r\n },\r\n );\r\n\r\n dispatch({\r\n type: CustomizeProductActionTypes.SET_TOPPINGS_PRICE,\r\n payload: toppingsPrice.data.toppingsCalculationResult,\r\n });\r\n dispatch(ProductsActions.SetProductsLoader(CUSTOMIZE_PRODUCT_LOADER, false));\r\n },\r\n dispatch,\r\n errorCallback: async (err) => {\r\n dispatch(ProductsActions.SetProductsLoader(CUSTOMIZE_PRODUCT_LOADER, false));\r\n console.error(err);\r\n },\r\n });\r\n };\r\n\r\nconst recalculateProductPrice =\r\n (): ThunkAction =>\r\n async (dispatch, getState): Promise => {\r\n const { customizeProduct, localization } = getState();\r\n const { productToCustomize, activeOption, activeSlice, slices } = customizeProduct;\r\n const { currentStore, distributionType } = localization;\r\n\r\n dispatch(ProductsActions.SetProductsLoader(CUSTOMIZE_PRODUCT_LOADER, true));\r\n\r\n await ResponseWrapper({\r\n action: async () => {\r\n const isReadyToPriceUpdate = !productToCustomize?.isXTasty || slices.every(s => s.sliceProductConfirmed);\r\n if (!isReadyToPriceUpdate){\r\n dispatch(ProductsActions.SetProductsLoader(CUSTOMIZE_PRODUCT_LOADER, false));\r\n return;\r\n }\r\n\r\n const calculatedPrice = await Axios.post('api/baskets/product-calculation', {\r\n storeId: currentStore.id,\r\n deliverOrder: distributionType === OrderDistributionType.Delivery,\r\n productId: productToCustomize?.id,\r\n optionId: activeOption?.sku.optionId,\r\n productSpecification: productToCustomize?.isXTasty\r\n ? slices.map((slice) => {\r\n return {\r\n productId: slice.sliceProduct?.id,\r\n addedToppings: [],\r\n removedToppings: [],\r\n };\r\n })\r\n : [\r\n {\r\n productId: productToCustomize?.id,\r\n addedToppings: slices[activeSlice].addedToppings?.map((topping) => topping.id) ?? [],\r\n removedToppings: slices[activeSlice].removedToppings?.map((topping) => topping.id) ?? [],\r\n },\r\n ],\r\n });\r\n\r\n dispatch({\r\n type: CustomizeProductActionTypes.SET_PRODUCT_PRICE,\r\n payload: calculatedPrice.data.price ?? 0,\r\n });\r\n dispatch(ProductsActions.SetProductsLoader(CUSTOMIZE_PRODUCT_LOADER, false));\r\n },\r\n dispatch,\r\n errorCallback: async (err) => {\r\n dispatch(ProductsActions.SetProductsLoader(CUSTOMIZE_PRODUCT_LOADER, false));\r\n console.error(err);\r\n },\r\n });\r\n };\r\n\r\nexport const setSauce =\r\n (sauce: Topping): ThunkAction =>\r\n async (dispatch): Promise => {\r\n dispatch({\r\n type: CustomizeProductActionTypes.SET_SELECTED_SAUCE,\r\n payload: sauce,\r\n });\r\n dispatch(updatePrice());\r\n };\r\n\r\nexport const setCheese =\r\n (cheese: Topping): ThunkAction =>\r\n async (dispatch): Promise => {\r\n dispatch({\r\n type: CustomizeProductActionTypes.SET_SELECTED_CHEESE,\r\n payload: cheese,\r\n });\r\n dispatch(updatePrice());\r\n };\r\n\r\nexport const confirmSliceProduct =\r\n (): ThunkAction =>\r\n async (dispatch): Promise => {\r\n dispatch({\r\n type: CustomizeProductActionTypes.CONFIRM_SLICE_PRODUCT,\r\n });\r\n dispatch(updatePrice());\r\n dispatch(recalculateProductPrice());\r\n };\r\n\r\nexport type CustomizeProductActions =\r\n | ClearCustomizeState\r\n | ConfirmRecipeOnSlice\r\n | SetCustomizationPizza\r\n | CustomizeProductFromBasket\r\n | InitSlices\r\n | SetCustomizationProduct\r\n | SetCurrentStep\r\n | SetAddFunction\r\n | SetActiveOption\r\n | SetAddedToppings\r\n | SetRemovedToppings\r\n | SetSelectedCheese\r\n | SetSelectedSauce\r\n | SetActiveSlice\r\n | SetAvailableRecipes\r\n | SetRecipeOnSlice\r\n | SetToppingsPrice\r\n | SetProductPrice;\r\n","export enum LocalizationRequestErrorType {\r\n ERROR = 'Error',\r\n LOCALIZATION_DISABLED = 'LocalizationDisabled',\r\n}\r\n\r\nexport type LocationRequestSuccessCallback = (latitude: number, longitude: number) => void;\r\nexport type LocationRequestErrorCallback = (errorType: LocalizationRequestErrorType) => void;\r\n\r\nexport enum PushNotificationsProvider {\r\n FIREBASE = 0,\r\n HMS = 1,\r\n}\r\n","export enum StoreState {\r\n OPEN,\r\n OPEN_BUT_NO_ONLINE_ORDERS,\r\n OPEN_BUT_NO_DELIVERY_ORDERS,\r\n OPEN_BUT_NO_DELIVERY_BASED_ON_DELIVERY_HOURS,\r\n OPEN_BUT_NO_PICKUP_BASED_ON_PICKU_PHOURS,\r\n CLOSED,\r\n OPEN_BUT_NO_PICKUP_ORDERS,\r\n}\r\n\r\nexport enum LocalizationStrategy {\r\n PH_ES = 'PHES',\r\n PH_MX = 'PHMX'\r\n}\r\n","/* eslint-disable @typescript-eslint/no-throw-literal */\r\n/* eslint-disable import/no-cycle */\r\nimport { Action } from 'redux';\r\nimport { ThunkAction } from 'redux-thunk';\r\nimport Axios from 'shared/api/axios';\r\nimport axios, { AxiosResponse } from 'axios';\r\n\r\n// shared\r\nimport { GlobalActionTypes, SetLoader, setMessageWithExpirationTime } from 'shared/store/global/global.actions';\r\nimport { UserMessageType, PropertyChangedPayload, OrderDistributionType } from 'shared/types';\r\nimport ResponseWrapper from 'shared/tools/api-response-wrapper';\r\nimport { LocalizationRequestErrorType } from 'typings/web-bridge.types';\r\nimport { AdditionalAddressInfoDto, SelectedDateTimeFrame } from 'apps/LocalizationApp/types/dto.types';\r\nimport { AccountDetailsAddressDto } from 'apps/AccountManagementApp/account-details.types';\r\nimport { storeDataInCookie } from 'shared/utils';\r\nimport { add } from 'date-fns';\r\nimport { ApplicationState } from '.';\r\nimport { CurrentStore, StoreStatus } from './reducers';\r\nimport { AddressDetailsDto, AddressSuggestionDto, AvailableHoursDto, StoreDto } from '../types/dto.types';\r\nimport { LocalizationStrategy } from '../types/localization.types';\r\n\r\n// store\r\nimport { getStoreStatus } from '../helpers/store-status';\r\n\r\nexport enum LocalizationActionTypes {\r\n CHANGE_ORDER_DISTRIBUTION = '[LOCALIZATION_APP] CHANGE_ORDER_DISTRIBUTION',\r\n ON_PROPERTY_CHANGED = '[LOCALIZATION_APP] ON_PROPERTY_CHANGED',\r\n SET_SUGGESTIONS = '[LOCALIZATION_APP] SET_SUGGESTIONS',\r\n SET_SELECTED_ADDRESS = '[LOCALIZATION_APP] SET_SELECTED_ADDRESS',\r\n SET_ORDER_TIME = '[LOCALIZATION_APP] SET_ORDER_TIME',\r\n SET_NEARBY_STORES = '[LOCALIZATION_APP] SET_NEARBY_STORES',\r\n SET_CURRENT_STORE = '[LOCALIZATION_APP] SET_CURRENT_STORE',\r\n CLEAR_STORE = '[LOCALIZATION_APP] CLEAR_STORE',\r\n SHOW_TOAST = '[LOCALIZATION_APP] SHOW_TOAST',\r\n SHOW_MODAL = '[LOCALIZATION_APP] SHOW_MODAL',\r\n SHOW_NUMBER_INPUT = '[LOCALIZATION_APP] SHOW_NUMBER_INPUT',\r\n SET_LAST_USED_ADDRESSES = '[LOCALIZATION_APP] SET_LAST_USED_ADDRESSES',\r\n SET_LAST_USED_STORES = '[LOCALIZATION_APP] SET_LAST_USED_STORES',\r\n SET_FORCE_DELIVERY_DISTRIBUTION = '[LOCALIZATION_APP] SET_FORCE_DELIVERY_DISTRIBUTION',\r\n SET_SELECTED_STORE_STATUS = '[LOCALIZATION_APP] SET_CURRENT_STORE_STATUS',\r\n SET_ADDRESS_ADDITIONAL_INFO = '[LOCALIZATION_APP] SET_ADDRESS_ADDITIONAL_INFO',\r\n}\r\n\r\ninterface ChangeOrderDistribution {\r\n type: LocalizationActionTypes.CHANGE_ORDER_DISTRIBUTION;\r\n payload: OrderDistributionType;\r\n}\r\ninterface OnPropertyChanged {\r\n type: LocalizationActionTypes.ON_PROPERTY_CHANGED;\r\n payload: PropertyChangedPayload;\r\n}\r\ninterface SetSuggestions {\r\n type: LocalizationActionTypes.SET_SUGGESTIONS;\r\n payload: AddressSuggestionDto[];\r\n}\r\ninterface SetSelectedAddress {\r\n type: LocalizationActionTypes.SET_SELECTED_ADDRESS;\r\n payload?: AddressDetailsDto;\r\n}\r\ninterface SetSelectedOrderTime {\r\n type: LocalizationActionTypes.SET_ORDER_TIME;\r\n payload: SelectedDateTimeFrame;\r\n}\r\ninterface SetNearbyStores {\r\n type: LocalizationActionTypes.SET_NEARBY_STORES;\r\n payload: StoreDto[];\r\n}\r\ninterface ClearStore extends Action {\r\n type: LocalizationActionTypes.CLEAR_STORE;\r\n}\r\ninterface ShowToast extends Action {\r\n type: LocalizationActionTypes.SHOW_TOAST;\r\n payload: boolean;\r\n}\r\ninterface ShowModal extends Action {\r\n type: LocalizationActionTypes.SHOW_MODAL;\r\n payload: boolean;\r\n}\r\ninterface ShowNumberInput extends Action {\r\n type: LocalizationActionTypes.SHOW_NUMBER_INPUT;\r\n payload: boolean;\r\n}\r\ninterface SetLastUsedAddresses extends Action {\r\n type: LocalizationActionTypes.SET_LAST_USED_ADDRESSES;\r\n payload: AccountDetailsAddressDto[];\r\n}\r\ninterface SetLastUsedStores extends Action {\r\n type: LocalizationActionTypes.SET_LAST_USED_STORES;\r\n payload: StoreDto[];\r\n}\r\ninterface SetForceDeliveryDistribution extends Action {\r\n type: LocalizationActionTypes.SET_FORCE_DELIVERY_DISTRIBUTION;\r\n payload: boolean;\r\n}\r\ninterface SetSelectedtStoreStatus extends Action {\r\n type: LocalizationActionTypes.SET_SELECTED_STORE_STATUS;\r\n payload: StoreStatus;\r\n}\r\ninterface SetAddressAdditionalInfo extends Action {\r\n type: LocalizationActionTypes.SET_ADDRESS_ADDITIONAL_INFO;\r\n payload: AdditionalAddressInfoDto;\r\n}\r\n\r\nconst CancellationToken = axios.CancelToken;\r\nlet suggestionCancel: () => void;\r\n\r\nexport const getSuggestions =\r\n (input: string): ThunkAction =>\r\n async (dispatch): Promise => {\r\n if (input.length < 3) {\r\n return; // to short address\r\n }\r\n\r\n if (suggestionCancel) {\r\n suggestionCancel();\r\n }\r\n\r\n ResponseWrapper({\r\n action: async () => {\r\n const value: AxiosResponse = await Axios.get('api/locations/suggestions', {\r\n params: { input },\r\n cancelToken: new CancellationToken((cancelExecutor: () => void) => {\r\n suggestionCancel = cancelExecutor;\r\n }),\r\n });\r\n dispatch({\r\n type: LocalizationActionTypes.SET_SUGGESTIONS,\r\n payload: value.data,\r\n });\r\n },\r\n dispatch,\r\n });\r\n };\r\n\r\nexport const getSelectedAddress =\r\n (placeId: string): ThunkAction =>\r\n async (dispatch, getState): Promise => {\r\n const state = getState();\r\n ResponseWrapper({\r\n action: async () => {\r\n const value: AxiosResponse = await Axios.get('api/locations/details', { params: { placeId } });\r\n const isDelivery = state.localization.distributionType === OrderDistributionType.Delivery;\r\n\r\n dispatch({\r\n type: LocalizationActionTypes.SHOW_NUMBER_INPUT,\r\n payload: isDelivery && !value.data.isCompleteAddress,\r\n });\r\n\r\n dispatch({\r\n type: LocalizationActionTypes.SET_SELECTED_ADDRESS,\r\n payload: value.data,\r\n });\r\n\r\n if (!value.data.streetNumber && state.localization.distributionType === OrderDistributionType.Delivery) {\r\n dispatch(\r\n setMessageWithExpirationTime({\r\n message: state.staticContent.messages.tooltipsFillStreetNumber,\r\n type: UserMessageType.WARNING,\r\n }),\r\n );\r\n }\r\n\r\n if (value.data.isCompleteAddress && state.localization.distributionType === OrderDistributionType.Delivery) {\r\n dispatch(\r\n setMessageWithExpirationTime({\r\n message: state.staticContent.messages.tooltipsAdressConfirmation,\r\n type: UserMessageType.WARNING,\r\n }),\r\n );\r\n }\r\n\r\n if (!isDelivery) {\r\n dispatch(getNearbyStores());\r\n }\r\n },\r\n dispatch,\r\n });\r\n };\r\n\r\nexport const getCoordsSuggestions =\r\n (): ThunkAction =>\r\n async (dispatch, getState): Promise => {\r\n const state = getState();\r\n const { tooltipsGeoDisabled, errorMessagesImpossibleToLocateDelivery } = state.staticContent.messages;\r\n\r\n navigator.geolocation.getCurrentPosition(\r\n (position) => {\r\n dispatch(SetLoader(true));\r\n dispatch(prepareCoordsSuggestions(position.coords.latitude, position.coords.longitude));\r\n },\r\n (err) => {\r\n const warning = err.code === 1;\r\n const message = warning ? tooltipsGeoDisabled : errorMessagesImpossibleToLocateDelivery;\r\n const type = warning ? UserMessageType.WARNING : UserMessageType.ERROR;\r\n dispatch(SetLoader(false));\r\n dispatch(\r\n setMessageWithExpirationTime({\r\n message,\r\n type,\r\n }),\r\n );\r\n },\r\n );\r\n };\r\n\r\nexport const prepareCoordsSuggestions =\r\n (latitude: number, longitude: number): ThunkAction =>\r\n async (dispatch, getState): Promise => {\r\n const state = getState();\r\n const { errorMessagesImpossibleToLocateDelivery } = state.staticContent.messages;\r\n\r\n ResponseWrapper({\r\n action: async () => {\r\n const apiResponse: AxiosResponse = await Axios.get('api/locations/suggestion-for-coordinates', {\r\n params: {\r\n latitude,\r\n longitude,\r\n language: 'es',\r\n },\r\n });\r\n\r\n if (!apiResponse.data.isCompleteAddress) {\r\n dispatch({\r\n type: LocalizationActionTypes.SHOW_NUMBER_INPUT,\r\n payload: true,\r\n });\r\n }\r\n\r\n dispatch({ type: LocalizationActionTypes.SET_SELECTED_ADDRESS, payload: apiResponse.data });\r\n\r\n if (apiResponse.data.isCompleteAddress) {\r\n dispatch(\r\n setMessageWithExpirationTime({\r\n message: state.staticContent.messages.tooltipsAdressConfirmation,\r\n type: UserMessageType.WARNING,\r\n }),\r\n );\r\n }\r\n\r\n if (state.localization.distributionType === OrderDistributionType.Pickup) {\r\n dispatch(getNearbyStores());\r\n }\r\n dispatch(SetLoader(false));\r\n },\r\n dispatch,\r\n errMessage: {\r\n type: UserMessageType.ERROR,\r\n message: errorMessagesImpossibleToLocateDelivery,\r\n },\r\n });\r\n };\r\n\r\nexport const setRequestLocalizationError =\r\n (error: LocalizationRequestErrorType): ThunkAction =>\r\n async (dispatch, getState): Promise => {\r\n const state = getState();\r\n const { errorMessagesImpossibleToLocateDelivery, tooltipsGeoDisabled } = state.staticContent.messages;\r\n\r\n const errorMessage =\r\n error === LocalizationRequestErrorType.LOCALIZATION_DISABLED\r\n ? tooltipsGeoDisabled\r\n : errorMessagesImpossibleToLocateDelivery;\r\n dispatch(\r\n setMessageWithExpirationTime({\r\n message: errorMessage,\r\n type: UserMessageType.WARNING,\r\n }),\r\n );\r\n };\r\n\r\nconst getNearbyStores =\r\n (): ThunkAction =>\r\n async (dispatch, getState): Promise => {\r\n const state = getState();\r\n const { selectedAddressDetails } = state.localization;\r\n\r\n ResponseWrapper({\r\n action: async () => {\r\n const value: AxiosResponse = await Axios.get('api/stores/nearby-pickup-stores', {\r\n params: {\r\n address: selectedAddressDetails,\r\n limit: 5,\r\n includeDistance: true,\r\n },\r\n });\r\n\r\n if (value.data.length <= 0) {\r\n dispatch(\r\n setMessageWithExpirationTime({\r\n message: state.staticContent.messages.errorMessagesNoStores,\r\n type: UserMessageType.ERROR,\r\n }),\r\n );\r\n dispatch(clearCurrentStoreStatus());\r\n }\r\n dispatch({\r\n type: LocalizationActionTypes.SET_NEARBY_STORES,\r\n payload: value.data,\r\n });\r\n },\r\n dispatch,\r\n });\r\n };\r\n\r\nconst getStoreAvailableHours = async (storeId: string, distributionType: OrderDistributionType): Promise => {\r\n const apiUrl =\r\n distributionType === OrderDistributionType.Delivery\r\n ? 'api/stores/available-times-for-delivery'\r\n : 'api/stores/available-times-for-pickup';\r\n\r\n const value: AxiosResponse = await Axios.get(apiUrl, {\r\n params: {\r\n storeId,\r\n },\r\n });\r\n\r\n return value?.data;\r\n};\r\n\r\nexport const getCurrentStore =\r\n (): ThunkAction =>\r\n async (dispatch, getState): Promise => {\r\n const state = getState();\r\n const { selectedAddress, distributionType, selectedAddressDetails: selectedAddressOriginalValue } = state.localization;\r\n\r\n return ResponseWrapper({\r\n action: async (): Promise => {\r\n const storeToDeliveryResponse: AxiosResponse = await Axios.get('api/stores/store-delivering-to-address', {\r\n params: {\r\n address: selectedAddressOriginalValue,\r\n },\r\n });\r\n const storeToDelivery = storeToDeliveryResponse.data;\r\n\r\n if (\r\n storeToDelivery &&\r\n !storeToDelivery.isUsingS4DRegistry &&\r\n selectedAddress.localizationStrategy === LocalizationStrategy.PH_MX\r\n ) {\r\n if (!storeToDelivery.externalStoreId) throw 'Store external ID not provided';\r\n\r\n const additionalAddressInfo = await getAdditionalAddressInfo(selectedAddress, storeToDelivery.externalStoreId);\r\n dispatch({ type: LocalizationActionTypes.SET_ADDRESS_ADDITIONAL_INFO, payload: additionalAddressInfo });\r\n }\r\n\r\n const storeStatus = await getStoreStatus(storeToDelivery.id, distributionType);\r\n const dataReady = storeToDelivery && storeStatus;\r\n dispatch({\r\n type: LocalizationActionTypes.SET_SELECTED_STORE_STATUS,\r\n payload: { ...storeStatus, storePhoneNumber: storeToDelivery.phoneNumber },\r\n });\r\n\r\n if (dataReady && !storeStatus.canPlaceOrder) {\r\n dispatch({ type: LocalizationActionTypes.CLEAR_STORE });\r\n dispatch(SetLoader(false));\r\n dispatch({ type: LocalizationActionTypes.SHOW_MODAL, payload: true });\r\n return;\r\n }\r\n\r\n // it is possible that getStoreStatus method will return canPlaceOrder with TRUE value, but there will be no available opening hours\r\n // this situation will occur when the store is ALREADY closed this day - we are checking it here and showing toast\r\n const availableHours = await getStoreAvailableHours(storeToDelivery.id, distributionType);\r\n if (!availableHours.timeframes || availableHours?.timeframes.length === 0) {\r\n dispatch(SetLoader(false));\r\n dispatch({ type: LocalizationActionTypes.CLEAR_STORE });\r\n dispatch({\r\n type: LocalizationActionTypes.SHOW_TOAST,\r\n payload: true,\r\n });\r\n setTimeout(\r\n () =>\r\n dispatch({\r\n type: LocalizationActionTypes.SHOW_TOAST,\r\n payload: false,\r\n }),\r\n 5000,\r\n );\r\n return;\r\n }\r\n\r\n dispatch({\r\n type: LocalizationActionTypes.SET_CURRENT_STORE,\r\n payload: {\r\n ...storeToDelivery,\r\n availableHours,\r\n isOpen: storeStatus.canPlaceOrder,\r\n },\r\n });\r\n\r\n dispatch(SetLoader(false));\r\n dispatch({ type: LocalizationActionTypes.SHOW_MODAL, payload: true });\r\n },\r\n dispatch,\r\n allowedErr: {\r\n statusArr: [404],\r\n action: (): void => {\r\n gtm.localizationModule.localizationError();\r\n dispatch(SetLoader(false));\r\n dispatch({ type: LocalizationActionTypes.SHOW_MODAL, payload: true });\r\n dispatch(clearCurrentStoreStatus());\r\n dispatch(getNearbyStores());\r\n },\r\n },\r\n });\r\n };\r\n\r\nexport const setCurrentStoreForPickup =\r\n (store: StoreDto): ThunkAction =>\r\n async (dispatch, getState): Promise => {\r\n const { distributionType } = getState().localization;\r\n return ResponseWrapper({\r\n action: async (): Promise => {\r\n const storeStatus = await getStoreStatus(store.id, distributionType);\r\n const dataReady = storeStatus;\r\n dispatch({\r\n type: LocalizationActionTypes.SET_SELECTED_STORE_STATUS,\r\n payload: { ...storeStatus, storePhoneNumber: store.phoneNumber },\r\n });\r\n\r\n if (dataReady && !storeStatus.canPlaceOrder) {\r\n dispatch({ type: LocalizationActionTypes.CLEAR_STORE });\r\n dispatch({ type: LocalizationActionTypes.SHOW_MODAL, payload: true });\r\n return;\r\n }\r\n\r\n // it is possible that getStoreStatus method will return canPlaceOrder with TRUE value, but there will be no available opening hours\r\n // this situation will occur when the store is ALREADY closed this day - we are checking it here and showing toast\r\n const availableHours = await getStoreAvailableHours(store.id, distributionType);\r\n if (!availableHours.timeframes || availableHours?.timeframes.length === 0) {\r\n dispatch({ type: LocalizationActionTypes.CLEAR_STORE });\r\n dispatch({\r\n type: LocalizationActionTypes.SHOW_TOAST,\r\n payload: true,\r\n });\r\n setTimeout(\r\n () =>\r\n dispatch({\r\n type: LocalizationActionTypes.SHOW_TOAST,\r\n payload: false,\r\n }),\r\n 5000,\r\n );\r\n return;\r\n }\r\n\r\n if (distributionType === OrderDistributionType.Delivery) {\r\n dispatch({ type: LocalizationActionTypes.CHANGE_ORDER_DISTRIBUTION, payload: OrderDistributionType.Pickup });\r\n dispatch({ type: LocalizationActionTypes.SET_NEARBY_STORES, payload: [] });\r\n }\r\n\r\n dispatch({\r\n type: LocalizationActionTypes.SET_CURRENT_STORE,\r\n payload: {\r\n availableHours,\r\n isOpen: storeStatus.canPlaceOrder,\r\n ...store,\r\n },\r\n });\r\n\r\n dispatch({ type: LocalizationActionTypes.SHOW_MODAL, payload: true });\r\n },\r\n dispatch,\r\n });\r\n };\r\n\r\nexport type GetAvailableHours = (\r\n storeId: string,\r\n distributionType: OrderDistributionType,\r\n) => ThunkAction;\r\ninterface SetCurrentStore extends Action {\r\n type: LocalizationActionTypes.SET_CURRENT_STORE;\r\n payload: CurrentStore;\r\n}\r\n\r\nexport const getCityBySelectedAddress = async (selectedAddress: AddressDetailsDto): Promise => {\r\n const input = `${selectedAddress.street}, ${selectedAddress.streetNumber}`;\r\n const suggestions: AxiosResponse = await Axios.get('api/locations/suggestions', { params: { input } });\r\n\r\n if (suggestions.data.length > 0) {\r\n const value: AxiosResponse = await Axios.get('api/locations/details', {\r\n params: { placeId: suggestions.data[0].placeId },\r\n });\r\n\r\n return value.data.city;\r\n }\r\n\r\n return undefined;\r\n};\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nexport const validateAddress = async (\r\n selectedAddress: AddressDetailsDto,\r\n dispatch: any,\r\n message: string,\r\n): Promise => {\r\n const input = `${selectedAddress.street}, ${selectedAddress.streetNumber}, ${selectedAddress.city}, ${selectedAddress.postalCode}, ${selectedAddress.region}`;\r\n const suggestions: AxiosResponse = await Axios.get('api/locations/suggestions', { params: { input } });\r\n\r\n if (suggestions.data?.length == 0){\r\n dispatch(setMessageWithExpirationTime({ message, type: UserMessageType.ERROR }));\r\n return undefined;\r\n }\r\n\r\n if (!selectedAddress){\r\n return undefined;\r\n }\r\n\r\n // for not complete addresses and historic ones we need to choose the MOST PROBABLE suggestion\r\n const addressForValidation = selectedAddress.isCompleteAddress && selectedAddress.placeId\r\n ? suggestions.data.find(s => s.placeId === selectedAddress.placeId)\r\n : suggestions.data[0];\r\n\r\n if (addressForValidation){\r\n const primaryAddress: AxiosResponse = await Axios.get('api/locations/details', {\r\n params: { placeId: addressForValidation.placeId },\r\n });\r\n\r\n if (primaryAddress?.data?.isCompleteAddress) {\r\n return { ...selectedAddress, ...primaryAddress.data };\r\n }\r\n }\r\n\r\n // alternate address from suggestions - for MX locations, location with street number is often returned as second suggestion\r\n const alternateAddressForValidation = suggestions.data[1];\r\n if (alternateAddressForValidation) {\r\n const secondaryAddress: AxiosResponse = await Axios.get('api/locations/details', {\r\n params: { placeId: alternateAddressForValidation.placeId },\r\n });\r\n\r\n if (secondaryAddress?.data?.isCompleteAddress) {\r\n return { ...selectedAddress, ...secondaryAddress.data };\r\n }\r\n }\r\n\r\n dispatch(setMessageWithExpirationTime({ message, type: UserMessageType.ERROR }));\r\n return undefined;\r\n};\r\n\r\nexport const getAdditionalAddressInfo = async (\r\n selectedAddress: AddressDetailsDto,\r\n storeExternalId: string,\r\n): Promise => {\r\n const result: AxiosResponse = await Axios.get('api/locations/additional-info', {\r\n params: {\r\n streetName: selectedAddress.street,\r\n streetNumber: selectedAddress.streetNumber,\r\n city: selectedAddress.city,\r\n state: selectedAddress.region,\r\n postalCode: selectedAddress.postalCode,\r\n country: selectedAddress.country,\r\n latitude: selectedAddress.latitude,\r\n longitude: selectedAddress.longitude,\r\n storeId: storeExternalId,\r\n },\r\n });\r\n\r\n return result.data;\r\n};\r\n\r\nexport const setStoreAndSave =\r\n (store?: StoreDto, isOpen?: boolean): ThunkAction =>\r\n async (dispatch, getState): Promise => {\r\n if (store && isOpen !== undefined) {\r\n dispatch({\r\n type: LocalizationActionTypes.SET_CURRENT_STORE,\r\n payload: {\r\n isOpen,\r\n ...store,\r\n },\r\n });\r\n }\r\n\r\n const state = getState();\r\n const { currentStore, selectedAddress, distributionType, selectedOrderTime } = state.localization;\r\n const updatedCurrentStore = { ...currentStore, availableHours: undefined };\r\n\r\n const json = JSON.stringify({\r\n currentStore: updatedCurrentStore,\r\n selectedAddress,\r\n distributionType,\r\n selectedOrderTime,\r\n });\r\n\r\n const expirationDate = selectedOrderTime?.isAsap\r\n ? add(new Date(), { minutes: 30 })\r\n : new Date(selectedOrderTime?.utcDateTimeFrame as Date);\r\n\r\n storeDataInCookie('localization', json, expirationDate);\r\n\r\n if (currentStore.id !== '') {\r\n gtm.localizationModule.localizationSuccess(distributionType, currentStore.id);\r\n }\r\n };\r\n\r\nexport const refreshSelectedAddressAndSave =\r\n (addressAddition: string, addressRemarks: string): ThunkAction =>\r\n async (dispatch, getState): Promise => {\r\n const state = getState();\r\n const { currentStore, selectedAddress, distributionType, selectedOrderTime } = state.localization;\r\n\r\n const updatedSelectedAddress = { ...selectedAddress, addressAddition, remark: addressRemarks };\r\n dispatch({\r\n type: LocalizationActionTypes.SET_SELECTED_ADDRESS,\r\n payload: updatedSelectedAddress,\r\n });\r\n\r\n const json = JSON.stringify({\r\n currentStore,\r\n selectedAddress: updatedSelectedAddress,\r\n distributionType,\r\n selectedOrderTime,\r\n });\r\n\r\n const expirationDate = selectedOrderTime?.isAsap\r\n ? add(new Date(), { minutes: 30 })\r\n : new Date(selectedOrderTime?.utcDateTimeFrame as Date);\r\n\r\n storeDataInCookie('localization', json, expirationDate);\r\n };\r\n\r\nexport const changeDistributionType =\r\n (distributionType: OrderDistributionType): ThunkAction =>\r\n async (dispatch): Promise => {\r\n dispatch({\r\n type: GlobalActionTypes.CLEAR_MESSAGES,\r\n });\r\n dispatch({\r\n type: LocalizationActionTypes.SET_FORCE_DELIVERY_DISTRIBUTION,\r\n payload: false,\r\n });\r\n dispatch({\r\n type: LocalizationActionTypes.CHANGE_ORDER_DISTRIBUTION,\r\n payload: distributionType,\r\n });\r\n dispatch({ type: LocalizationActionTypes.SET_NEARBY_STORES, payload: [] });\r\n };\r\n\r\nexport const getLastAddresses =\r\n (): ThunkAction =>\r\n async (dispatch): Promise => {\r\n return ResponseWrapper({\r\n action: async (): Promise => {\r\n const addresses = await Axios.get('api/accounts/addresses', { params: { limit: 5 } });\r\n\r\n dispatch({ type: LocalizationActionTypes.SET_LAST_USED_ADDRESSES, payload: addresses.data });\r\n },\r\n dispatch,\r\n });\r\n };\r\n\r\nexport const getLastStores =\r\n (): ThunkAction =>\r\n async (dispatch): Promise => {\r\n return ResponseWrapper({\r\n action: async (): Promise => {\r\n const addresses = await Axios.get('api/accounts/last-pickup-stores');\r\n\r\n dispatch({ type: LocalizationActionTypes.SET_LAST_USED_STORES, payload: addresses.data });\r\n },\r\n dispatch,\r\n });\r\n };\r\n\r\nexport const clearStoreAndSave =\r\n (): ThunkAction =>\r\n async (dispatch): Promise => {\r\n dispatch({ type: LocalizationActionTypes.CLEAR_STORE });\r\n dispatch(setStoreAndSave());\r\n };\r\n\r\nexport const setCurrentStoreStatus =\r\n (store: StoreDto, toDeliver: boolean): ThunkAction =>\r\n async (dispatch): Promise => {\r\n return ResponseWrapper({\r\n action: async (): Promise => {\r\n const params = { storeId: store.id, toDeliver };\r\n const storeStatus = await Axios.get('api/stores/store-status', { params });\r\n dispatch({\r\n type: LocalizationActionTypes.SET_SELECTED_STORE_STATUS,\r\n payload: { ...storeStatus, storePhoneNumber: store.phoneNumber },\r\n });\r\n },\r\n dispatch,\r\n });\r\n };\r\n\r\nexport const clearCurrentStoreStatus =\r\n (): ThunkAction =>\r\n async (dispatch): Promise => {\r\n dispatch({ type: LocalizationActionTypes.SET_SELECTED_STORE_STATUS, payload: undefined });\r\n };\r\n\r\nexport type LocalizationActions =\r\n | ChangeOrderDistribution\r\n | OnPropertyChanged\r\n | SetSuggestions\r\n | SetSelectedAddress\r\n | SetSelectedOrderTime\r\n | SetCurrentStore\r\n | SetNearbyStores\r\n | ClearStore\r\n | ShowToast\r\n | ShowModal\r\n | ShowNumberInput\r\n | SetLastUsedAddresses\r\n | SetLastUsedStores\r\n | SetForceDeliveryDistribution\r\n | SetSelectedtStoreStatus\r\n | SetAddressAdditionalInfo;\r\n","import Axios from 'shared/api/axios';\r\n\r\nimport { OrderDistributionType } from 'shared/types';\r\nimport { DateTime } from 'shared/helpers';\r\nimport { StoreDto, StoreStatusDto } from '../types/dto.types';\r\n\r\nexport const getStoreStatus = async (storeId: string, distributionType: OrderDistributionType): Promise => {\r\n const params = { storeId, toDeliver: distributionType === OrderDistributionType.Delivery };\r\n const storeStatusResponse = await Axios.get('api/stores/store-status', { params });\r\n\r\n return storeStatusResponse.data;\r\n};\r\n","import { FormControl } from 'shared/components/form-input.component';\r\nimport { PaymentMethod, OneClickPayment } from '../../types/checkout.types';\r\nimport { CheckoutActionTypes, CheckoutActions } from './checkout.actions';\r\n\r\nexport interface CheckoutForm {\r\n isFormDirty: boolean;\r\n remark: FormControl;\r\n addressAddition: FormControl;\r\n addressRemark: FormControl;\r\n firstName: FormControl;\r\n lastName: FormControl;\r\n phoneNumber: FormControl;\r\n email: FormControl;\r\n selectedPaymentMethod?: PaymentMethod;\r\n selectedQuickPaymentMethod?: OneClickPayment;\r\n savePaymentMethod: boolean;\r\n commercialCommunication: boolean;\r\n acceptPolicy: boolean;\r\n acceptGeneralConditions: boolean;\r\n satisfactionSurvey: boolean;\r\n usePaysWithCashAmount: boolean;\r\n paysWithCashAmount: FormControl;\r\n isCompanyModuleEnabled: boolean;\r\n invoice: boolean;\r\n invoiceCIF: FormControl;\r\n invoiceBusinessName: FormControl;\r\n invoiceAddress: FormControl;\r\n}\r\n\r\nexport interface OrderValidation {\r\n typeOfError: OrderError;\r\n values: string[];\r\n}\r\nexport enum OrderError {\r\n MinimumValueNotReached = 'MinimumValueNotReached',\r\n MaximumValueReached = 'MaximumValueReached',\r\n NoOfferApplied = 'NoOfferApplied', // This is special one - that just a warning\r\n CMSTranslatedError = 'CMSTranslatedError',\r\n GenericError = 'GenericError',\r\n ItemUnavailableInExternalSystem = 'ItemUnavailableInExternalSystem',\r\n}\r\nexport interface CheckoutState {\r\n availablePaymentMethods: PaymentMethod[];\r\n oneClickPaymentMethods: OneClickPayment[];\r\n checkoutForm: CheckoutForm;\r\n validation?: OrderValidation[];\r\n confirmedWarning?: OrderError;\r\n ctaDisabled: boolean;\r\n}\r\n\r\nconst initialState: CheckoutState = {\r\n availablePaymentMethods: [],\r\n oneClickPaymentMethods: [],\r\n ctaDisabled: false,\r\n checkoutForm: {\r\n isFormDirty: false,\r\n remark: {\r\n value: '',\r\n touched: false,\r\n },\r\n addressAddition: {\r\n value: '',\r\n touched: false,\r\n },\r\n addressRemark: {\r\n value: '',\r\n touched: false,\r\n },\r\n firstName: {\r\n value: '',\r\n touched: false,\r\n },\r\n lastName: {\r\n value: '',\r\n touched: false,\r\n },\r\n phoneNumber: {\r\n value: '',\r\n touched: false,\r\n },\r\n email: {\r\n value: '',\r\n touched: false,\r\n },\r\n savePaymentMethod: false,\r\n commercialCommunication: false,\r\n acceptPolicy: false,\r\n acceptGeneralConditions: false,\r\n satisfactionSurvey: false,\r\n usePaysWithCashAmount: false,\r\n paysWithCashAmount: {\r\n value: '',\r\n touched: false,\r\n },\r\n isCompanyModuleEnabled: false,\r\n invoice: false,\r\n invoiceAddress: {\r\n value: '',\r\n touched: false,\r\n },\r\n invoiceCIF: {\r\n value: '',\r\n touched: false,\r\n },\r\n invoiceBusinessName: {\r\n value: '',\r\n touched: false,\r\n },\r\n },\r\n};\r\n\r\nconst checkoutReducer = (state = initialState, action: CheckoutActions): CheckoutState => {\r\n switch (action.type) {\r\n case CheckoutActionTypes.CLEAR_CHECKOUT_STATE: {\r\n return {\r\n ...initialState,\r\n };\r\n }\r\n case CheckoutActionTypes.SET_CTA_DISABLED: {\r\n return {\r\n ...state,\r\n ctaDisabled: action.payload,\r\n };\r\n }\r\n case CheckoutActionTypes.SET_ORDER_VALIDATED: {\r\n return {\r\n ...state,\r\n validation: action.payload,\r\n };\r\n }\r\n case CheckoutActionTypes.CLEAR_ORDER_VALIDATED: {\r\n return {\r\n ...state,\r\n validation: undefined,\r\n };\r\n }\r\n case CheckoutActionTypes.SET_CHECKOUT_PREFERENCES: {\r\n return {\r\n ...state,\r\n checkoutForm: {\r\n ...state.checkoutForm,\r\n ...action.payload,\r\n },\r\n };\r\n }\r\n case CheckoutActionTypes.SET_AVAILABLE_PAYMENT_METHODS: {\r\n return {\r\n ...state,\r\n availablePaymentMethods: action.payload,\r\n };\r\n }\r\n case CheckoutActionTypes.SET_QUICK_PAYMENT_METHODS: {\r\n return {\r\n ...state,\r\n oneClickPaymentMethods: action.payload,\r\n };\r\n }\r\n case CheckoutActionTypes.SET_ACTIVE_PAYMENT_METHOD: {\r\n return {\r\n ...state,\r\n checkoutForm: {\r\n ...state.checkoutForm,\r\n savePaymentMethod: false,\r\n selectedPaymentMethod: action.payload,\r\n selectedQuickPaymentMethod: undefined,\r\n },\r\n };\r\n }\r\n case CheckoutActionTypes.SET_QUICK_PAYMENT_METHOD: {\r\n return {\r\n ...state,\r\n checkoutForm: {\r\n ...state.checkoutForm,\r\n savePaymentMethod: false,\r\n selectedQuickPaymentMethod: action.payload,\r\n selectedPaymentMethod: undefined,\r\n },\r\n };\r\n }\r\n case CheckoutActionTypes.ON_PROPERTY_CHANGED: {\r\n const { name, value } = action.payload;\r\n return {\r\n ...state,\r\n checkoutForm: {\r\n ...state.checkoutForm,\r\n [name]: {\r\n value,\r\n touched: true,\r\n },\r\n },\r\n };\r\n }\r\n case CheckoutActionTypes.ON_CHECKBOX_CHANGED: {\r\n const { name, value } = action.payload;\r\n return {\r\n ...state,\r\n checkoutForm: {\r\n ...state.checkoutForm,\r\n [name]: value,\r\n },\r\n };\r\n }\r\n case CheckoutActionTypes.SET_FORM_DIRTY: {\r\n return {\r\n ...state,\r\n checkoutForm: {\r\n ...state.checkoutForm,\r\n isFormDirty: action.payload,\r\n },\r\n };\r\n }\r\n case CheckoutActionTypes.SET_ORDER_FORMS: {\r\n return {\r\n ...state,\r\n checkoutForm: {\r\n ...action.payload,\r\n },\r\n };\r\n }\r\n case CheckoutActionTypes.SET_CONFIRMED_WARNING: {\r\n return {\r\n ...state,\r\n confirmedWarning: action.payload,\r\n };\r\n }\r\n\r\n default: {\r\n return { ...state };\r\n }\r\n }\r\n};\r\n\r\nexport default checkoutReducer;\r\n","import { AxiosResponse } from 'axios';\r\nimport Axios from 'shared/api/axios';\r\nimport { Action } from 'redux';\r\nimport { ThunkAction } from 'redux-thunk';\r\nimport ResponseWrapper from 'shared/tools/api-response-wrapper';\r\nimport { CheckoutStaticContent } from 'apps/ProductsApp/store/static-content/checkout-static-content-reducer';\r\nimport { ApplicationState } from '../index';\r\n\r\nexport enum CheckoutStaticContentActionTypes {\r\n SET_STATIC_CONTENT = '[Checkout.StaticContent] SET_STATIC_CONTENT',\r\n}\r\n\r\ninterface SetStaticContent {\r\n type: CheckoutStaticContentActionTypes.SET_STATIC_CONTENT;\r\n payload: CheckoutStaticContent;\r\n}\r\n\r\nexport const getStaticContent =\r\n (): ThunkAction =>\r\n async (dispatch): Promise => {\r\n ResponseWrapper({\r\n action: async () => {\r\n const value: AxiosResponse = await Axios.get('api/static-content/checkout');\r\n dispatch({\r\n type: CheckoutStaticContentActionTypes.SET_STATIC_CONTENT,\r\n payload: value.data,\r\n });\r\n },\r\n dispatch,\r\n });\r\n };\r\n\r\nexport type StaticContentActions = SetStaticContent;\r\n","import {\r\n CheckoutStaticContentActionTypes,\r\n StaticContentActions,\r\n} from 'apps/ProductsApp/store/static-content/checkout-static-content.actions';\r\n\r\ninterface CheckoutHeaderContent {\r\n headerText: string;\r\n headerIcon: string;\r\n goBackText: string;\r\n goBackLink: string;\r\n}\r\ninterface CheckoutBasketContent {\r\n headerText: string;\r\n deliveryChargeText: string;\r\n}\r\n\r\ninterface CheckoutOrderRemarkContent {\r\n headerText: string;\r\n remarkLabel: string;\r\n remarkPlaceholder: string;\r\n}\r\nexport interface CheckoutOffersContent {\r\n noOffersText: string;\r\n selectedOfferPrefix: string;\r\n selectedOfferSuffix: string;\r\n}\r\ninterface CheckoutDeliveryContent {\r\n headerText: string;\r\n deliveryText: string;\r\n pickupText: string;\r\n exampleDeliveryText: string;\r\n addressAdditionLabel: string;\r\n addressAdditionPlaceholder: string;\r\n addressAdditionError: string;\r\n addressRemarkLabel: string;\r\n addressRemarkPlaceholder: string;\r\n addressRemarkError: string;\r\n orderTimeText: string;\r\n}\r\n\r\ninterface CheckoutContactContent {\r\n headerText: string;\r\n firstLastNameVisible: boolean;\r\n firstNameRequiredError: string;\r\n firstNameLabel: string;\r\n firstNameMaxLength: number | undefined;\r\n firstNamePlaceholder: string;\r\n lastNameRequiredError: string;\r\n lastNameLabel: string;\r\n lastNameMaxLength: number | undefined;\r\n lastNamePlaceholder: string;\r\n phoneNumberRequiredError: string;\r\n phoneNumberInvalidError: string;\r\n phoneNumberLabel: string;\r\n phoneNumberPlaceholder: string;\r\n emailLabel: string;\r\n emailPlaceholder: string;\r\n emailRequiredError: string;\r\n emailInvalidError: string;\r\n acceptCommunication: string;\r\n}\r\ninterface CheckoutPaymentContent {\r\n headerText: string;\r\n favoritePayments: string;\r\n otherPayments: string;\r\n savePayment: string;\r\n paymentAddition: string;\r\n paymentAdditionPlaceholder: string;\r\n paymentAdditionError: string;\r\n paymentAdditionMaxError: string;\r\n paymentAdditionMinError: string;\r\n favoritePaymentMethodPrefix: string;\r\n favoritePaymentMethodSuffix: string;\r\n invoice: string;\r\n invoiceCIFLabel: string;\r\n invoiceCIFPlaceholder: string;\r\n invoiceCIFRequiredError: string;\r\n invoiceCIFInvalidError: string;\r\n invoiceNameLabel: string;\r\n invoiceNamePlaceholder: string;\r\n invoiceNameError: string;\r\n invoiceAddressLabel: string;\r\n invoiceAddressPlaceholder: string;\r\n invoiceAddressError: string;\r\n}\r\ninterface CheckoutFinalizeContent {\r\n acceptGeneralConditionsPrefix: string;\r\n acceptGeneralConditionsLinkText: string;\r\n acceptGeneralConditionsLink: string;\r\n acceptPrivacyPolicyPrefix: string;\r\n acceptPrivacyPolicyLinkText: string;\r\n acceptPrivacyPolicyLink: string;\r\n skipSurveyText: string;\r\n cta: string;\r\n ctaLarge: string;\r\n ctaSmall: string;\r\n}\r\n\r\nexport interface CheckoutValidationMessages {\r\n minimumValue: string;\r\n maximumValue: string;\r\n genericError: string;\r\n errorHeader: string;\r\n noOfferApplied: string;\r\n noOfferAppliedHeader: string;\r\n inputMaxLength: string;\r\n productsUnavailable: string;\r\n missingMenuItemsError: string;\r\n updatingCustomerDataError: string;\r\n sendingToStoreError: string;\r\n invalidStoreIdError: string;\r\n}\r\n\r\nexport interface CheckoutStaticContent {\r\n header: CheckoutHeaderContent;\r\n basket: CheckoutBasketContent;\r\n offers: CheckoutOffersContent;\r\n remark: CheckoutOrderRemarkContent;\r\n delivery: CheckoutDeliveryContent;\r\n contact: CheckoutContactContent;\r\n payment: CheckoutPaymentContent;\r\n finalize: CheckoutFinalizeContent;\r\n checkoutValidation: CheckoutValidationMessages;\r\n cancelModal: {\r\n title: string;\r\n description: string;\r\n };\r\n failedModal: {\r\n title: string;\r\n description: string;\r\n };\r\n errorModal: {\r\n title: string;\r\n description: string;\r\n };\r\n}\r\n\r\nexport const initialState: CheckoutStaticContent = {\r\n header: {\r\n goBackLink: '/products',\r\n goBackText: 'Cambiar',\r\n headerIcon: '../../assets/icons/Lock.svg',\r\n headerText: 'Pago securo',\r\n },\r\n basket: {\r\n headerText: 'Resumel del pedido',\r\n deliveryChargeText: 'Suplemento de extra radio',\r\n },\r\n offers: {\r\n noOffersText: 'Aún no has aplicado ninguna promoción',\r\n selectedOfferPrefix: '¡Has aplicado ',\r\n selectedOfferSuffix: ' promoción!',\r\n },\r\n remark: {\r\n headerText: 'Observaciones del pedido',\r\n remarkLabel: 'Comentarios sobre el pedido',\r\n remarkPlaceholder: 'Sin cebolla, sin picante...',\r\n },\r\n contact: {\r\n headerText: 'Datos de contacto',\r\n acceptCommunication: 'Sí, acepto recibir comunicaciones comerciales y ofertas personalizadas según mi perfil.',\r\n emailInvalidError: 'Introduce un email válido',\r\n emailRequiredError: 'El email es necesario',\r\n emailLabel: 'Email*',\r\n emailPlaceholder: 'Para enviarte la confirmación',\r\n phoneNumberInvalidError: 'Introduce un número válido',\r\n phoneNumberRequiredError: 'El número de teléfono es necesario',\r\n phoneNumberLabel: 'Teléfono*',\r\n phoneNumberPlaceholder: 'Para poder contactarte',\r\n firstLastNameVisible: false,\r\n firstNameRequiredError: 'El nombre es necesario',\r\n firstNameLabel: 'Nombre',\r\n firstNamePlaceholder: 'Tu nombre',\r\n firstNameMaxLength: undefined,\r\n lastNameRequiredError: 'El apellido es necesario',\r\n lastNameLabel: 'Apellido',\r\n lastNamePlaceholder: 'Tu apellido',\r\n lastNameMaxLength: undefined,\r\n },\r\n delivery: {\r\n headerText: 'Datos de entrega',\r\n deliveryText: 'Recibirás tu pedido en ',\r\n pickupText: 'Podrás recoger tu pedido en ',\r\n exampleDeliveryText: 'Dinos tu piso, escalera, puerta...',\r\n addressAdditionLabel: 'Más información sobre la dirección',\r\n addressAdditionPlaceholder: 'Ej: Piso 2, Puerta A.',\r\n addressAdditionError: '',\r\n addressRemarkLabel: 'Observaciones de la dirección',\r\n addressRemarkPlaceholder: 'Ej: No funciona el telefonillo',\r\n addressRemarkError: '',\r\n orderTimeText: 'Hora de entrega',\r\n },\r\n payment: {\r\n headerText: 'Métodos de pago',\r\n favoritePayments: 'Tus métodos de pago favoritos',\r\n otherPayments: 'Otros métodos de pago',\r\n savePayment: 'Guardar tarjeta para futuras compras',\r\n paymentAddition: 'Necesito cambio',\r\n paymentAdditionError: 'Introduce una cantidad',\r\n paymentAdditionMaxError: 'Introduce una cantidad inferior a',\r\n paymentAdditionMinError: 'Ingrese una cantidad mayor que',\r\n paymentAdditionPlaceholder: 'Ej: 20',\r\n favoritePaymentMethodPrefix: 'Pago con mi',\r\n favoritePaymentMethodSuffix: 'favorita',\r\n invoice: 'Deseo recibir factura',\r\n invoiceCIFLabel: 'CIF* (LnnnnnnnL/n)*',\r\n invoiceCIFPlaceholder: 'Introduce el CIF',\r\n invoiceCIFRequiredError: 'El CIF es necesario',\r\n invoiceCIFInvalidError: 'Introduce un CIF válido',\r\n invoiceNameLabel: 'Nombre de la empresa*',\r\n invoiceNamePlaceholder: 'Introduce el nombre de empresa',\r\n invoiceNameError: 'El nombre de empresa es necesario',\r\n invoiceAddressLabel: 'Dirección*',\r\n invoiceAddressPlaceholder: 'Introduce la direccion empresa',\r\n invoiceAddressError: 'La dirección es necesaria',\r\n },\r\n finalize: {\r\n acceptGeneralConditionsPrefix: 'He leído y acepto las ',\r\n acceptGeneralConditionsLinkText: 'Condiciones generales de compra',\r\n acceptGeneralConditionsLink: '/general-conditions',\r\n acceptPrivacyPolicyPrefix: ' y la',\r\n acceptPrivacyPolicyLinkText: 'Política de Privacidad',\r\n acceptPrivacyPolicyLink: '/policy-privacy',\r\n skipSurveyText: 'No quiero recibir encuestas de satisfacción del pedido realizado.',\r\n cta: 'Finalizar',\r\n ctaSmall: 'Pagar con',\r\n ctaLarge: 'Finalizar y pagar con',\r\n },\r\n checkoutValidation: {\r\n minimumValue: 'El pedido no alcanza el importe mínimo',\r\n maximumValue: 'El pedido alcanza la cantidad máxima',\r\n genericError: 'Hay un error de orden.',\r\n errorHeader: 'Por favor, revisa tu pedido',\r\n noOfferApplied: 'Activa las promociones para conseguir el mejor precio en tu pedido.',\r\n noOfferAppliedHeader: '¡Atención! No has aplicado tu oferta',\r\n inputMaxLength: 'Se excedió la longitud máxima',\r\n productsUnavailable: 'Los siguientes productos no están disponibles',\r\n missingMenuItemsError: 'Producto no disponible en tienda pídalo al 5582505650',\r\n updatingCustomerDataError: 'Zona de reparto o producto no disponible en tienda seleccionada, marque al 5582505650',\r\n sendingToStoreError: 'Tienda de reparto no disponible, haga su pedido al 5582505650',\r\n invalidStoreIdError: 'No es posible generar tu pedido, ordene en el 5582505650',\r\n },\r\n cancelModal: {\r\n title: 'El pago ha sido cancelado',\r\n description: 'Por favor, vuelve a intentarlo para realizar tu pedido',\r\n },\r\n failedModal: {\r\n title: 'El pago ha fallado',\r\n description: 'Por favor, vuelve a intentarlo en unos instantes y si el problema persiste, contacta con tu entidad bancaria.',\r\n },\r\n errorModal: {\r\n title: 'Tu pedido no ha llegado a la tienda',\r\n description: 'Disculpanos por el incoveniente. Por favor, comunicate con la tienda',\r\n },\r\n};\r\n\r\nconst checkoutStaticContentReducer = (state = initialState, action: StaticContentActions): CheckoutStaticContent => {\r\n switch (action.type) {\r\n case CheckoutStaticContentActionTypes.SET_STATIC_CONTENT: {\r\n const { payload } = action;\r\n return {\r\n ...state,\r\n ...payload,\r\n };\r\n }\r\n default: {\r\n return { ...state };\r\n }\r\n }\r\n};\r\n\r\nexport default checkoutStaticContentReducer;\r\n","import { AxiosError, AxiosResponse } from 'axios';\r\nimport { Action } from 'redux';\r\nimport { ThunkAction } from 'redux-thunk';\r\nimport { refreshSelectedAddressAndSave } from 'apps/LocalizationApp/Store/actions';\r\nimport { OrderDistributionType, PlaceOrderError, PropertyChangedPayload } from 'shared/types';\r\nimport Axios from 'shared/api/axios';\r\nimport ResponseWrapper from 'shared/tools/api-response-wrapper';\r\nimport { OrderDetailsResponse } from 'apps/ProductsApp/types/dto.types';\r\nimport { CheckoutForm, OrderError, OrderValidation } from 'apps/ProductsApp/store/checkout/checkout.reducer';\r\nimport { initialState } from 'apps/ProductsApp/store/static-content/checkout-static-content-reducer';\r\nimport { redirectToExternalURL, redirectToOtherAppURL } from 'shared/helpers/routing-helpers';\r\nimport { OrderDto, PaymentMethod, CheckoutPreferences, PlacedOrderSuccessDto, OneClickPayment } from '../../types/checkout.types';\r\nimport { ApplicationState } from '../index';\r\nimport { BasketActions, ProductsActions } from '../actions';\r\n\r\nexport enum CheckoutActionTypes {\r\n SET_CHECKOUT_REMARK = '[CHECKOUT] SET_CHECKOUT_REMARK',\r\n ON_PROPERTY_CHANGED = '[CHECKOUT] ON_PROPERTY_CHANGED',\r\n ON_CHECKBOX_CHANGED = '[CHECKOUT] ON_CHECKBOX_CHANGED',\r\n SET_FORM_DIRTY = '[CHECKOUT] SET_FORM_DIRTY',\r\n SET_AVAILABLE_PAYMENT_METHODS = '[CHECKOUT] SET_AVAILABLE_PAYMENT_METHODS',\r\n SET_CHECKOUT_PREFERENCES = '[CHECKOUT] SET_CHECKOUT_PREFERENCES',\r\n SET_QUICK_PAYMENT_METHODS = '[CHECKOUT] SET_QUICK_PAYMENT_METHODS',\r\n SET_ACTIVE_PAYMENT_METHOD = '[CHECKOUT] SET_ACTIVE_PAYMENT_METHOD',\r\n SET_QUICK_PAYMENT_METHOD = '[CHECKOUT] SET_QUICK_PAYMENT_METHOD',\r\n SET_ORDER_VALIDATED = '[CHECKOUT] SET_ORDER_VALIDATED',\r\n CLEAR_ORDER_VALIDATED = '[CHECKOUT] CLEAR_ORDER_VALIDATED',\r\n CLEAR_CHECKOUT_STATE = '[CHECKOUT] CLEAR_CHECKOUT_STATE',\r\n SET_ORDER_FORMS = '[CHECKOUT] SET_ORDER_FORMS',\r\n SET_CONFIRMED_WARNING = '[CHECKOUT] SET_CONFIRMED_WARNING',\r\n SET_CTA_DISABLED = '[CHECKOUT] SET_CTA_DISABLED',\r\n}\r\n\r\nconst CHECKOUT_LOADER = 'checkoutLoader';\r\n\r\ninterface OnPropertyChanged extends Action {\r\n type: CheckoutActionTypes.ON_PROPERTY_CHANGED;\r\n payload: PropertyChangedPayload;\r\n}\r\ninterface OnCheckboxChanged extends Action {\r\n type: CheckoutActionTypes.ON_CHECKBOX_CHANGED;\r\n payload: { name: string; value: boolean };\r\n}\r\ninterface SetFormDirty extends Action {\r\n type: CheckoutActionTypes.SET_FORM_DIRTY;\r\n payload: boolean;\r\n}\r\ninterface SetAvailablePaymentMethods extends Action {\r\n type: CheckoutActionTypes.SET_AVAILABLE_PAYMENT_METHODS;\r\n payload: PaymentMethod[];\r\n}\r\ninterface SetCheckoutPreferences extends Action {\r\n type: CheckoutActionTypes.SET_CHECKOUT_PREFERENCES;\r\n payload: CheckoutPreferences[];\r\n}\r\ninterface SetQuickPaymentMethods extends Action {\r\n type: CheckoutActionTypes.SET_QUICK_PAYMENT_METHODS;\r\n payload: OneClickPayment[];\r\n}\r\ninterface SetActivePaymentMethod extends Action {\r\n type: CheckoutActionTypes.SET_ACTIVE_PAYMENT_METHOD;\r\n payload: PaymentMethod;\r\n}\r\ninterface SetQuickPaymentMethod extends Action {\r\n type: CheckoutActionTypes.SET_QUICK_PAYMENT_METHOD;\r\n payload: OneClickPayment;\r\n}\r\n\r\ninterface SetOrderValidated extends Action {\r\n type: CheckoutActionTypes.SET_ORDER_VALIDATED;\r\n payload: OrderValidation[];\r\n}\r\ninterface ClearOrderValidated extends Action {\r\n type: CheckoutActionTypes.CLEAR_ORDER_VALIDATED;\r\n}\r\ninterface ClearCheckoutState extends Action {\r\n type: CheckoutActionTypes.CLEAR_CHECKOUT_STATE;\r\n}\r\ninterface SetOrderForms extends Action {\r\n type: CheckoutActionTypes.SET_ORDER_FORMS;\r\n payload: CheckoutForm;\r\n}\r\ninterface SetConfirmedWarning extends Action {\r\n type: CheckoutActionTypes.SET_CONFIRMED_WARNING;\r\n payload?: OrderError;\r\n}\r\ninterface SetCtaDisabled extends Action {\r\n type: CheckoutActionTypes.SET_CTA_DISABLED;\r\n payload: boolean;\r\n}\r\n\r\nexport const getApplicableOffers =\r\n (): ThunkAction =>\r\n async (dispatch, getState): Promise => {\r\n const { basket } = getState().basket;\r\n const { items, coupons } = basket;\r\n\r\n dispatch(BasketActions.recalculateBasket({ items, coupons, includeSuggestions: true }));\r\n };\r\n\r\nexport const getAvailablePaymentMethods =\r\n (): ThunkAction =>\r\n async (dispatch, getState): Promise => {\r\n const state = getState();\r\n const { currentStore, distributionType } = state.localization;\r\n const { currentUser } = state.global;\r\n // TO DO - > FETCH PLATFORM CODE FROM API\r\n const platformCode = distributionType === OrderDistributionType.Delivery ? 'OPM' : 'OAF';\r\n const paymentMethods: AxiosResponse = await Axios.get('api/orders/payment-methods', {\r\n params: {\r\n paymentPlatformCode: platformCode,\r\n storeId: currentStore.id,\r\n },\r\n });\r\n paymentMethods.data.orderByAsc('sort');\r\n dispatch({\r\n type: CheckoutActionTypes.SET_AVAILABLE_PAYMENT_METHODS,\r\n payload: paymentMethods.data,\r\n });\r\n\r\n if (currentUser) {\r\n const quickPaymentMethods: AxiosResponse = await Axios.get('api/orders/payment-methods-quick', {\r\n params: {\r\n paymentPlatformCode: platformCode,\r\n storeId: currentStore.id,\r\n },\r\n });\r\n dispatch({\r\n type: CheckoutActionTypes.SET_QUICK_PAYMENT_METHODS,\r\n payload: quickPaymentMethods.data,\r\n });\r\n }\r\n };\r\n\r\nexport const getCheckoutPreferences =\r\n (): ThunkAction =>\r\n async (dispatch): Promise => {\r\n const checkoutPreferences: AxiosResponse = await Axios.get('api/orders/checkout-preferences');\r\n dispatch({\r\n type: CheckoutActionTypes.SET_CHECKOUT_PREFERENCES,\r\n payload: checkoutPreferences.data,\r\n });\r\n };\r\n\r\nexport const updateCheckoutFormControl =\r\n (updateControl: React.ChangeEvent): ThunkAction =>\r\n async (dispatch): Promise => {\r\n dispatch({\r\n type: CheckoutActionTypes.ON_PROPERTY_CHANGED,\r\n payload: {\r\n name: updateControl.target.name,\r\n value: updateControl.target.value,\r\n },\r\n });\r\n };\r\nexport const updateCheckoutFormControlByName =\r\n (name: string, value: string): ThunkAction =>\r\n async (dispatch): Promise => {\r\n dispatch({\r\n type: CheckoutActionTypes.ON_PROPERTY_CHANGED,\r\n payload: {\r\n name,\r\n value,\r\n },\r\n });\r\n };\r\n\r\nexport const updateCheckoutCheckbox =\r\n (value: boolean, name: string): ThunkAction =>\r\n async (dispatch): Promise => {\r\n dispatch({\r\n type: CheckoutActionTypes.ON_CHECKBOX_CHANGED,\r\n payload: { value, name },\r\n });\r\n };\r\n\r\nexport const validateAndPlaceOrder =\r\n (): ThunkAction =>\r\n async (dispatch, getState): Promise => {\r\n const state = getState();\r\n const orderDto = buildOrderDto(state);\r\n if (!orderDto) return;\r\n gtm.checkoutModule.orderSubmit(state.basket.basketTraceId);\r\n\r\n await ResponseWrapper({\r\n action: async () => {\r\n const validationResult: AxiosResponse = await Axios.post(`api/orders/validate`, orderDto);\r\n const errors = validationResult.data.length > 0;\r\n if (errors && validationResult.data[0].typeOfError !== state.checkout.confirmedWarning) {\r\n dispatch(ProductsActions.SetProductsLoader(CHECKOUT_LOADER, false));\r\n dispatch(setCtaButtonDisabled(false));\r\n dispatch({\r\n type: CheckoutActionTypes.SET_ORDER_VALIDATED,\r\n payload: validationResult.data,\r\n });\r\n\r\n return;\r\n }\r\n dispatch(placeOrder());\r\n },\r\n dispatch,\r\n allowedErr: {\r\n errorCodes: ['ProductOutOfStock'],\r\n action: (): void => {\r\n dispatch(ProductsActions.SetProductsLoader(CHECKOUT_LOADER, false));\r\n dispatch(setCtaButtonDisabled(false));\r\n dispatch({ type: BasketActions.BasketActionTypes.SET_PRODUCT_NOT_AVAILABLE_MODAL, payload: true });\r\n },\r\n },\r\n });\r\n };\r\n\r\nconst placeOrder =\r\n (): ThunkAction =>\r\n async (dispatch, getState): Promise => {\r\n const state = getState();\r\n\r\n const orderDto = buildOrderDto(state);\r\n if (!orderDto) return;\r\n\r\n await ResponseWrapper({\r\n action: async () => {\r\n Axios.post(`api/orders`, orderDto)\r\n .then((orderPlacementResult: AxiosResponse) => {\r\n if (orderPlacementResult.data.succeeded) {\r\n dispatch(\r\n refreshSelectedAddressAndSave(\r\n state.checkout.checkoutForm.addressAddition.value,\r\n state.checkout.checkoutForm.addressRemark.value,\r\n ),\r\n );\r\n const orderPlacementSuccess = orderPlacementResult.data as PlacedOrderSuccessDto;\r\n if (orderPlacementSuccess.paymentMustBeStarted) {\r\n const mobile = window.S4DWebBridge();\r\n if (mobile) {\r\n mobile.openExternalUrl(orderPlacementSuccess.startPaymentUrl);\r\n } else {\r\n redirectToExternalURL(orderPlacementSuccess.startPaymentUrl);\r\n }\r\n } else {\r\n redirectToOtherAppURL(`thank-you?id=${orderPlacementResult.data.publicOrderId}`);\r\n }\r\n if (window.S4DWebBridge()) dispatch(ProductsActions.SetProductsLoader(CHECKOUT_LOADER, false));\r\n gtm.checkoutModule.increasePurchases();\r\n }\r\n })\r\n .catch((apiError: AxiosError) => {\r\n const orderPlacementError = apiError.response?.data as PlaceOrderError;\r\n\r\n let errorType = OrderError.GenericError;\r\n let values: string[] = [];\r\n if (orderPlacementError.contentMessageForErrorFound){\r\n errorType = OrderError.CMSTranslatedError\r\n values = [orderPlacementError.errorTranslations?.title, orderPlacementError.errorTranslations?.description]\r\n }\r\n if (orderPlacementError.entitiesErrors?.length > 0){\r\n errorType = OrderError.ItemUnavailableInExternalSystem\r\n values = orderPlacementError.entitiesErrors.map(ee => ee.entityIdentifier)\r\n }\r\n\r\n const { errorHeader } = state.checkoutStaticContent.checkoutValidation;\r\n if (orderPlacementError.errorCode === '40') {\r\n errorType = OrderError.CMSTranslatedError;\r\n values = [\r\n errorHeader,\r\n state.checkoutStaticContent.checkoutValidation.updatingCustomerDataError ||\r\n initialState.checkoutValidation.updatingCustomerDataError,\r\n ];\r\n }\r\n if (orderPlacementError.errorCode === '70') {\r\n errorType = OrderError.CMSTranslatedError;\r\n values = [\r\n errorHeader,\r\n state.checkoutStaticContent.checkoutValidation.missingMenuItemsError ||\r\n initialState.checkoutValidation.missingMenuItemsError,\r\n ];\r\n }\r\n if (orderPlacementError.errorCode === '120') {\r\n errorType = OrderError.CMSTranslatedError;\r\n values = [\r\n errorHeader,\r\n state.checkoutStaticContent.checkoutValidation.sendingToStoreError ||\r\n initialState.checkoutValidation.sendingToStoreError,\r\n ];\r\n }\r\n if (orderPlacementError.errorCode === '140') {\r\n errorType = OrderError.CMSTranslatedError;\r\n values = [\r\n errorHeader,\r\n state.checkoutStaticContent.checkoutValidation.invalidStoreIdError ||\r\n initialState.checkoutValidation.invalidStoreIdError,\r\n ];\r\n }\r\n\r\n const validationResult: OrderValidation = {\r\n typeOfError: errorType,\r\n values: values,\r\n };\r\n dispatch({\r\n type: CheckoutActionTypes.SET_ORDER_VALIDATED,\r\n payload: [validationResult],\r\n });\r\n dispatch(setCtaButtonDisabled(false));\r\n dispatch(ProductsActions.SetProductsLoader(CHECKOUT_LOADER, false));\r\n gtm.checkoutModule.orderError(state.basket.basketTraceId);\r\n });\r\n },\r\n dispatch,\r\n });\r\n };\r\n\r\nexport const getOrderDetails =\r\n (publicOrderId: string): ThunkAction =>\r\n async (dispatch): Promise => {\r\n await ResponseWrapper({\r\n action: async () => {\r\n const orderData: AxiosResponse = await Axios.get(`api/orders/${publicOrderId}/checkout-details`);\r\n\r\n dispatch({ type: CheckoutActionTypes.SET_ORDER_FORMS, payload: mapToCheckoutForm(orderData.data) });\r\n },\r\n dispatch,\r\n });\r\n };\r\n\r\nexport const setCtaButtonDisabled =\r\n (disabled: boolean): ThunkAction =>\r\n async (dispatch): Promise => {\r\n dispatch({ type: CheckoutActionTypes.SET_CTA_DISABLED, payload: disabled });\r\n };\r\n\r\nfunction buildOrderDto(state: ApplicationState): OrderDto | undefined {\r\n const { localization, basket: BasketState, checkout, global } = state;\r\n const { selectedAddress, selectedOrderTime, currentStore } = localization;\r\n const { checkoutForm } = checkout;\r\n const { basket } = BasketState;\r\n\r\n const deviceTokensJson = localStorage.getItem('deviceTokens');\r\n const deviceTokensParsed = deviceTokensJson && JSON.parse(deviceTokensJson);\r\n\r\n if (selectedAddress && selectedOrderTime && currentStore && basket.items.length > 0) {\r\n return {\r\n basket: {\r\n ...basket,\r\n deliveryAddress: {\r\n ...basket.deliveryAddress,\r\n latitude: selectedAddress.latitude,\r\n longitude: selectedAddress.longitude,\r\n zipCode: selectedAddress.postalCode,\r\n additionalInfo: selectedAddress.additionalInfo\r\n },\r\n orderDateTime: selectedOrderTime.isAsap ? null : selectedOrderTime.dateTimeFrame,\r\n paymentMethod: checkoutForm.selectedQuickPaymentMethod?.id ?? checkoutForm.selectedPaymentMethod?.id,\r\n },\r\n store: {\r\n id: currentStore.id,\r\n },\r\n firstName: checkoutForm.firstName?.value || global.currentUser?.firstName,\r\n lastName: checkoutForm.lastName?.value || global.currentUser?.lastName,\r\n addressAddition: checkoutForm.addressAddition.value,\r\n addressRemark: checkoutForm.addressRemark.value,\r\n phoneNumber: checkoutForm.phoneNumber.value,\r\n emailAddress: checkoutForm.email.value,\r\n isAsap: selectedOrderTime.isAsap ?? false,\r\n orderDate: selectedOrderTime.isAsap ? null : selectedOrderTime.dateTimeFrame,\r\n orderRemark: checkoutForm.remark.value,\r\n skipSatisfactionSurvey: checkoutForm.satisfactionSurvey,\r\n commercialCommunication: checkoutForm.commercialCommunication,\r\n acceptPrivacyPolicy: checkoutForm.acceptPolicy,\r\n acceptGeneralConditions: checkoutForm.acceptGeneralConditions,\r\n paysWithCashAmount: checkoutForm.usePaysWithCashAmount ? checkoutForm.paysWithCashAmount.value : null,\r\n savePaymentMethod: checkoutForm.savePaymentMethod,\r\n payment: {\r\n paymentId: '', // TDB when payment id passed from rest - REMOVE FROM BASKET?\r\n oneClickPaymentId: checkoutForm.selectedQuickPaymentMethod?.oneClickPaymentId,\r\n },\r\n company: {\r\n isCompanyCustomer: checkoutForm.invoice,\r\n vatId: checkoutForm.invoiceCIF.value,\r\n companyName: checkoutForm.invoiceBusinessName.value,\r\n companyAddress: checkoutForm.invoiceAddress.value,\r\n },\r\n deviceId: deviceTokensParsed?.deviceId,\r\n installationId: deviceTokensParsed?.installationId,\r\n provider: deviceTokensParsed?.provider,\r\n } as OrderDto;\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nfunction mapToCheckoutForm(data: OrderDetailsResponse): CheckoutForm {\r\n // TODO add selectedPaymentMethod along with refactor this control on checkout page\r\n return {\r\n isFormDirty: false,\r\n remark: { value: data.orderRemark, touched: !!data.orderRemark },\r\n addressAddition: { value: data.addressAddition, touched: !!data.addressAddition },\r\n addressRemark: { value: data.addressRemark, touched: !!data.addressRemark },\r\n firstName: { value: data.firstName, touched: !!data.firstName },\r\n lastName: { value: data.lastName, touched: !!data.lastName },\r\n phoneNumber: { value: data.phoneNumber, touched: !!data.phoneNumber },\r\n email: { value: data.emailAddress, touched: !!data.emailAddress },\r\n // selectedPaymentMethod?: {value: data.},\r\n savePaymentMethod: false,\r\n commercialCommunication: false,\r\n acceptPolicy: true,\r\n acceptGeneralConditions: true,\r\n satisfactionSurvey: false,\r\n usePaysWithCashAmount: false,\r\n paysWithCashAmount: { value: '', touched: false },\r\n isCompanyModuleEnabled: false,\r\n invoice: data.receiptCompanyData?.isCompanyCustomer,\r\n invoiceCIF: { value: data.receiptCompanyData?.vatId, touched: !!data.receiptCompanyData?.vatId },\r\n invoiceBusinessName: { value: data.receiptCompanyData?.companyName, touched: !!data.receiptCompanyData?.companyName },\r\n invoiceAddress: { value: data.receiptCompanyData?.companyAddress, touched: !!data.receiptCompanyData?.companyAddress },\r\n };\r\n}\r\n\r\nexport type CheckoutActions =\r\n | SetCtaDisabled\r\n | SetOrderValidated\r\n | ClearOrderValidated\r\n | OnPropertyChanged\r\n | OnCheckboxChanged\r\n | SetFormDirty\r\n | SetAvailablePaymentMethods\r\n | SetCheckoutPreferences\r\n | SetQuickPaymentMethods\r\n | SetQuickPaymentMethod\r\n | SetActivePaymentMethod\r\n | ClearCheckoutState\r\n | SetOrderForms\r\n | SetConfirmedWarning;\r\n","import { CustomizationProduct, Recipe, SliceCustomization } from 'apps/ProductsApp/types/catalog.types';\r\nimport { SpecificationToppingsPrices, SimplifiedBasketItem } from 'apps/ProductsApp/types/basket.types';\r\nimport { CustomizeProductActions, CustomizeProductActionTypes } from './customize-product.actions';\r\nimport { OptionDetails, StoreStockStatus, Topping } from '../../types/dto.types';\r\n\r\nexport enum CustomizeProductStep {\r\n SelectCrust,\r\n SelectRecipe,\r\n SelectTopping,\r\n SelectStarter, // this is kind'a customize product that is no pizza...\r\n}\r\n\r\nexport interface CustomizeProductState {\r\n basketItemGuid?: string;\r\n productToCustomize?: CustomizationProduct;\r\n availableRecipes: Recipe[];\r\n componentState?: CustomizeProductStep;\r\n activeOption?: OptionDetails;\r\n activeSlice: number;\r\n slices: SliceCustomization[];\r\n addToBasketDispatch: (basketItemToAdd: SimplifiedBasketItem) => void;\r\n toppingsPrice: SpecificationToppingsPrices;\r\n}\r\n\r\nconst initialState: CustomizeProductState = {\r\n addToBasketDispatch: () => {\r\n console.warn('Add to basket method was not passed to dispatcher!');\r\n },\r\n activeSlice: 0,\r\n availableRecipes: [],\r\n slices: [],\r\n toppingsPrice: { totalToppingsPrice: 0, toppingsCalculationResult: [] },\r\n};\r\n\r\nexport const customizeProductReducer = (state = initialState, action: CustomizeProductActions): CustomizeProductState => {\r\n switch (action.type) {\r\n case CustomizeProductActionTypes.SET_CUSTOMIZATION_PIZZA: {\r\n return {\r\n ...state,\r\n componentState: CustomizeProductStep.SelectCrust,\r\n productToCustomize: action.payload,\r\n };\r\n }\r\n case CustomizeProductActionTypes.SET_CUSTOMIZATION_PRODUCT: {\r\n const activeOption = state.activeOption ?? action.payload.options[0];\r\n return {\r\n ...state,\r\n componentState: CustomizeProductStep.SelectStarter,\r\n productToCustomize: action.payload,\r\n activeOption,\r\n };\r\n }\r\n\r\n case CustomizeProductActionTypes.CLEAR_CUSTOMIZE_STATE: {\r\n return { ...initialState };\r\n }\r\n\r\n case CustomizeProductActionTypes.SET_CURRENT_STEP: {\r\n return {\r\n ...state,\r\n componentState: action.payload,\r\n };\r\n }\r\n case CustomizeProductActionTypes.SET_ADD_FUNCTION: {\r\n return {\r\n ...state,\r\n addToBasketDispatch: action.payload,\r\n };\r\n }\r\n case CustomizeProductActionTypes.SET_ACTIVE_SLICE: {\r\n return {\r\n ...state,\r\n activeSlice: action.payload,\r\n };\r\n }\r\n case CustomizeProductActionTypes.LOAD_PRODUCT_FROM_MODEL: {\r\n const { activeOption, slices } = action.payload;\r\n\r\n return {\r\n ...state,\r\n activeOption,\r\n slices,\r\n };\r\n }\r\n case CustomizeProductActionTypes.CONFIRM_SLICE_PRODUCT: {\r\n return {\r\n ...state,\r\n componentState: CustomizeProductStep.SelectTopping,\r\n slices: state.slices.map((slice, index) => {\r\n if (index === state.activeSlice) {\r\n return {\r\n ...slice,\r\n addedToppings: [], // we need to clean toppings on slice recipe change\r\n removedToppings: [],\r\n sliceProductConfirmed: true,\r\n };\r\n }\r\n return slice;\r\n }),\r\n };\r\n }\r\n case CustomizeProductActionTypes.SET_ACTIVE_OPTION: {\r\n return {\r\n ...state,\r\n activeOption: action.payload,\r\n };\r\n }\r\n\r\n case CustomizeProductActionTypes.INIT_SLICES: {\r\n return {\r\n ...state,\r\n slices: action.payload.slices,\r\n activeSlice: action.payload.activeSlice,\r\n };\r\n }\r\n case CustomizeProductActionTypes.SET_ADDED_TOPPINGS: {\r\n return {\r\n ...state,\r\n slices: state.slices.map((slice, index) => {\r\n if (index === state.activeSlice) {\r\n return {\r\n ...slice,\r\n addedToppings: action.payload,\r\n };\r\n }\r\n return slice;\r\n }),\r\n };\r\n }\r\n case CustomizeProductActionTypes.SET_REMOVED_TOPPINGS: {\r\n return {\r\n ...state,\r\n slices: state.slices.map((slice, index) => {\r\n if (index === state.activeSlice) {\r\n return {\r\n ...slice,\r\n removedToppings: action.payload,\r\n };\r\n }\r\n return slice;\r\n }),\r\n };\r\n }\r\n case CustomizeProductActionTypes.SET_SELECTED_CHEESE: {\r\n return {\r\n ...state,\r\n slices: state.slices.map((slice, index) => {\r\n if (index === state.activeSlice) {\r\n const addedToppings = slice.addedToppings?.filter((topping) => topping.id !== slice.selectedCheese?.id) ?? [];\r\n const removedToppings =\r\n slice.removedToppings?.filter((topping) => topping.id !== slice.defaultCheese?.id) ?? [];\r\n if (slice.defaultCheese?.id !== action.payload.id) {\r\n addedToppings.push(action.payload);\r\n if (slice.defaultCheese && !removedToppings.includes(slice.defaultCheese)) {\r\n removedToppings.push(slice.defaultCheese);\r\n }\r\n }\r\n return {\r\n ...slice,\r\n selectedCheese: action.payload,\r\n addedToppings,\r\n removedToppings,\r\n };\r\n }\r\n return slice;\r\n }),\r\n };\r\n }\r\n case CustomizeProductActionTypes.SET_SELECTED_SAUCE: {\r\n return {\r\n ...state,\r\n slices: state.slices.map((slice, index) => {\r\n if (index === state.activeSlice) {\r\n const addedToppings = slice.addedToppings?.filter((topping) => topping.id !== slice.selectedSauce?.id) ?? [];\r\n const removedToppings =\r\n slice.removedToppings?.filter((topping) => topping.id !== slice.defaultSauce?.id) ?? [];\r\n if (slice.defaultSauce?.id !== action.payload.id) {\r\n addedToppings.push(action.payload);\r\n if (slice.defaultSauce && !removedToppings.includes(slice.defaultSauce)) {\r\n removedToppings.push(slice.defaultSauce);\r\n }\r\n }\r\n return {\r\n ...slice,\r\n selectedSauce: action.payload,\r\n addedToppings,\r\n removedToppings,\r\n };\r\n }\r\n return slice;\r\n }),\r\n };\r\n }\r\n case CustomizeProductActionTypes.SET_AVAILABLE_RECIPES: {\r\n const filteredProducts = action.payload.filter(\r\n (pr) =>\r\n state.activeOption?.xTastyProducts.some((xpr) => xpr.toString() === pr.id) &&\r\n pr.stockStatus !== StoreStockStatus.OutOfStock,\r\n );\r\n\r\n const recipes = filteredProducts.map((fpr) => {\r\n return { id: fpr.id, name: fpr.title, description: fpr.description };\r\n });\r\n\r\n return {\r\n ...state,\r\n availableRecipes: recipes,\r\n };\r\n }\r\n case CustomizeProductActionTypes.SET_SLICE_PRODUCT: {\r\n return {\r\n ...state,\r\n slices: state.slices.map((slice, index) => {\r\n if (index === state.activeSlice) {\r\n return {\r\n ...slice,\r\n sliceProduct: action.payload,\r\n sliceProductConfirmed: undefined,\r\n };\r\n }\r\n return slice;\r\n }),\r\n };\r\n }\r\n case CustomizeProductActionTypes.SET_TOPPINGS_PRICE: {\r\n return {\r\n ...state,\r\n toppingsPrice: action.payload,\r\n };\r\n }\r\n\r\n case CustomizeProductActionTypes.SET_PRODUCT_PRICE: {\r\n if (state.activeOption) {\r\n return {\r\n ...state,\r\n activeOption: {\r\n ...state.activeOption!,\r\n deliveryPrice: action.payload,\r\n pickupPrice: action.payload,\r\n },\r\n };\r\n }\r\n return {\r\n ...state,\r\n };\r\n }\r\n\r\n default: {\r\n return {\r\n ...state,\r\n };\r\n }\r\n }\r\n};\r\n","import { ApplicationState, ProductsStaticContent } from 'apps/ProductsApp/store';\r\nimport React from 'react';\r\nimport { useSelector } from 'react-redux';\r\n\r\nexport interface PizzaSliceButtonProps {\r\n active?: boolean;\r\n disabled?: boolean;\r\n onClick: () => void;\r\n title: string;\r\n rightIcon?: boolean;\r\n showIcon?: boolean;\r\n}\r\n\r\nconst PizzaSliceButton: React.FC = ({ active, disabled, title, onClick, rightIcon, showIcon = true }) => {\r\n const { xTastyPizza } = useSelector((state) => state.productsStaticContent);\r\n\r\n return (\r\n \r\n
\r\n {showIcon && (\r\n \r\n )}\r\n

{title}

\r\n
\r\n \r\n );\r\n};\r\nexport default PizzaSliceButton;\r\n","import React from 'react';\r\nimport PizzaSliceButton from 'apps/ProductsApp/components/customize/pizza-slice.component';\r\nimport { ApplicationState, ProductsStaticContent } from 'apps/ProductsApp/store';\r\nimport { useSelector } from 'react-redux';\r\nimport { SliceCustomization } from 'apps/ProductsApp/types/catalog.types';\r\n\r\nexport interface PizzaPartSwitchProps {\r\n activeSliceNumber: number;\r\n onSliceChange: (sliceNumber: number) => void;\r\n disabledSlices?: number[];\r\n slices: SliceCustomization[];\r\n}\r\n\r\nconst PizzaPartSwitch: React.FC = ({ activeSliceNumber, onSliceChange, disabledSlices, slices }) => {\r\n const { xTastyPizza } = useSelector((state) => state.productsStaticContent);\r\n\r\n const slicesCount = slices.length;\r\n\r\n function getSliceDescription(sliceNumber: number): string {\r\n if (slicesCount === 2) {\r\n if (sliceNumber === 1) return xTastyPizza.firstHalfTabText;\r\n if (sliceNumber === 2) return xTastyPizza.secondHalfTabText;\r\n }\r\n return `Part ${sliceNumber}`;\r\n }\r\n\r\n return (\r\n
\r\n {slices.map((_, index) => {\r\n return (\r\n ds === index)}\r\n title={getSliceDescription(index + 1)}\r\n rightIcon={index % 2 !== 0}\r\n onClick={(): void => onSliceChange(index)}\r\n />\r\n );\r\n })}\r\n
\r\n );\r\n};\r\nexport default PizzaPartSwitch;\r\n","import React from 'react';\r\n\r\nexport interface RadioProps {\r\n selected?: boolean;\r\n onClick?: (event: React.MouseEvent) => void;\r\n testId: string;\r\n}\r\n\r\nconst Radio: React.FC = ({ onClick, selected, testId }) => {\r\n return (\r\n {\r\n onClick && onClick(event);\r\n }}\r\n data-testid={`${testId}__radio-button`}\r\n />\r\n );\r\n};\r\nexport default Radio;\r\n","import React from 'react';\r\nimport Radio from 'shared/components/radio.component';\r\n\r\nexport interface ReceiptOptionProps {\r\n receiptName: string;\r\n receiptDescription: string;\r\n selected: boolean;\r\n onClick: () => void;\r\n}\r\n\r\nconst ReceiptOption: React.FC = ({ receiptName, receiptDescription, onClick, selected }) => {\r\n return (\r\n \r\n \r\n
\r\n

\r\n {receiptName}\r\n

\r\n

\r\n {receiptDescription}\r\n

\r\n
\r\n \r\n );\r\n};\r\nexport default ReceiptOption;\r\n","import React, { useEffect } from 'react';\r\nimport ReceiptOption from 'apps/ProductsApp/components/customize/receipt-option.component';\r\nimport { Recipe } from 'apps/ProductsApp/types/catalog.types';\r\n\r\nexport interface RecipeSelectorProps {\r\n availableRecipes: Recipe[];\r\n activeReceiptId?: string;\r\n onReceiptSelected: (recipeId: string) => void;\r\n headerText: string;\r\n}\r\n\r\nconst RecipeSelector: React.FC = ({ availableRecipes, activeReceiptId, onReceiptSelected, headerText }) => {\r\n useEffect(() => {\r\n if (activeReceiptId === undefined && availableRecipes.length > 0) {\r\n onReceiptSelected(availableRecipes[0].id);\r\n }\r\n }, []);\r\n\r\n return (\r\n
\r\n
\r\n {headerText}\r\n
\r\n {availableRecipes.map((recipe) => {\r\n return (\r\n onReceiptSelected(recipe.id)}\r\n receiptName={recipe.name}\r\n receiptDescription={recipe.description}\r\n selected={activeReceiptId === recipe.id}\r\n />\r\n );\r\n })}\r\n
\r\n );\r\n};\r\nexport default RecipeSelector;\r\n","import React from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { ApplicationState, OffersState, ProductsStaticContent } from 'apps/ProductsApp/store';\r\nimport { CustomizeProductState, CustomizeProductStep } from 'apps/ProductsApp/store/customize-product/customize-product.reducer';\r\nimport PizzaPartSwitch from 'apps/ProductsApp/components/customize/pizza-part-switch.component';\r\nimport RecipeSelector from 'apps/ProductsApp/components/customize/receipt-selection.component';\r\nimport { CustomizeProductActionTypes, setSliceProduct } from 'apps/ProductsApp/store/customize-product/customize-product.actions';\r\nimport { ProductDetails } from '../types/dto.types';\r\nimport { Recipe } from '../types/catalog.types';\r\n\r\nconst RecipeSelection: React.FC = () => {\r\n const dispatch = useDispatch();\r\n const { customizePizza, xTastyPizza } = useSelector(\r\n (state) => state.productsStaticContent,\r\n );\r\n const { availableRecipes, activeSlice, productToCustomize, componentState, slices } = useSelector<\r\n ApplicationState,\r\n CustomizeProductState\r\n >((state) => state.customizeProduct);\r\n const { customizationOffer } = useSelector(state => state.offers);\r\n\r\n function filterRecipesBasingOnOfferContext(recipes: Recipe[]): Recipe[] {\r\n if (!productToCustomize\r\n || !customizationOffer\r\n || productToCustomize.offerChoiceIndex == undefined\r\n || !productToCustomize.isXTasty) {\r\n return recipes;\r\n }\r\n\r\n const selectedChoice = customizationOffer?.choiceSlots[productToCustomize.offerChoiceIndex];\r\n const productToCustomizeWithCouponContext = selectedChoice?.choices.find(c => c.id === productToCustomize.id) as ProductDetails;\r\n const availableXTastyFlavorIds = productToCustomizeWithCouponContext?.xTastyProducts?.map(xp => xp.id.toString());\r\n\r\n if (!availableXTastyFlavorIds) {\r\n return recipes; \r\n }\r\n\r\n return recipes.filter(r => availableXTastyFlavorIds?.includes(r.id));\r\n }\r\n\r\n function setReceiptOnSlice(recipeId: string): void {\r\n dispatch(setSliceProduct(recipeId));\r\n gtm.variantModule.selectRecipe(productToCustomize?.id ?? 'unknown', recipeId);\r\n }\r\n\r\n function setActiveSlice(sliceNumber: number): void {\r\n if (!slices[sliceNumber]?.sliceProductConfirmed) {\r\n dispatch({ type: CustomizeProductActionTypes.SET_CURRENT_STEP, payload: CustomizeProductStep.SelectRecipe });\r\n } else {\r\n dispatch({ type: CustomizeProductActionTypes.SET_CURRENT_STEP, payload: CustomizeProductStep.SelectTopping });\r\n }\r\n dispatch({ type: CustomizeProductActionTypes.SET_ACTIVE_SLICE, payload: sliceNumber });\r\n }\r\n\r\n function getActiveSliceReceipt(): string {\r\n return slices[activeSlice].sliceProduct?.title ?? 'Not selected';\r\n }\r\n\r\n function getDisabledSlices(): number[] {\r\n const disabledSlices: number[] = [];\r\n slices.forEach((slice, index) => {\r\n !slice.sliceProductConfirmed && disabledSlices.push(index + 1);\r\n });\r\n return disabledSlices;\r\n }\r\n\r\n const recipesToShow = filterRecipesBasingOnOfferContext(availableRecipes);\r\n\r\n switch (componentState) {\r\n case CustomizeProductStep.SelectTopping:\r\n return productToCustomize?.isXTasty ? (\r\n <>\r\n setActiveSlice(id)}\r\n />\r\n
\r\n \r\n {getActiveSliceReceipt()}\r\n \r\n {\r\n dispatch({\r\n type: CustomizeProductActionTypes.SET_CURRENT_STEP,\r\n payload: CustomizeProductStep.SelectRecipe,\r\n });\r\n }}\r\n data-testid=\"recipe-selector__button--select-recipe\"\r\n >\r\n {customizePizza.changeText}\r\n

\r\n
\r\n \r\n ) : null;\r\n case CustomizeProductStep.SelectRecipe:\r\n return (\r\n <>\r\n setActiveSlice(id)}\r\n />\r\n {recipesToShow.length > 0 && (\r\n {\r\n setReceiptOnSlice(id);\r\n }}\r\n headerText={xTastyPizza.selectRecipeText}\r\n />\r\n )}\r\n \r\n );\r\n\r\n default:\r\n return null;\r\n }\r\n};\r\n\r\nexport default RecipeSelection;\r\n","import React from 'react';\r\nimport { PaymentHelper } from 'shared/helpers';\r\n\r\ninterface SpecialOptionData {\r\n id: number;\r\n title: string;\r\n imageThumbnailUrl: string;\r\n price: number | null;\r\n}\r\n\r\ninterface SpecialOptionProps {\r\n specialOption: SpecialOptionData;\r\n showPrice?: boolean;\r\n showImg?: boolean;\r\n isGratis?: boolean;\r\n selectedOptionId?: number;\r\n onOptionChange: (soc: number) => void;\r\n}\r\n\r\nconst SpecialOption: React.FC = ({\r\n specialOption,\r\n selectedOptionId,\r\n onOptionChange,\r\n showImg,\r\n showPrice,\r\n isGratis,\r\n}) => {\r\n return (\r\n {\r\n onOptionChange(specialOption.id);\r\n }}\r\n data-testid={`special-option__button--change-option-${specialOption.id}`}\r\n >\r\n {selectedOptionId === specialOption.id ? : }\r\n
\r\n {showImg && }\r\n

\r\n {specialOption.title}\r\n

\r\n
\r\n

\r\n {showPrice && specialOption.price !== null && PaymentHelper.formatToDisplay(specialOption.price)}\r\n {isGratis && 'Gratis'}\r\n

\r\n \r\n );\r\n};\r\n\r\nexport default SpecialOption;\r\n","import React, { useState } from 'react';\r\nimport SpecialOption from 'apps/ProductsApp/components/customize/special-option.component';\r\nimport { OptionDetails } from '../../types/dto.types';\r\n\r\ninterface SpecialOptionSelectorProps {\r\n specialOptions: OptionDetails[];\r\n selectedOptionId?: number;\r\n onOptionChange: (option: OptionDetails) => void;\r\n defaultExpanded?: boolean;\r\n title: string;\r\n}\r\n\r\nconst SpecialOptionSelector: React.FC = ({\r\n specialOptions,\r\n selectedOptionId,\r\n defaultExpanded,\r\n title,\r\n onOptionChange,\r\n}) => {\r\n const [expanded, setExpanded] = useState(defaultExpanded ?? false);\r\n\r\n function onClick(): void {\r\n setExpanded(!expanded);\r\n }\r\n\r\n const activeOption = specialOptions.find((el) => el.id === selectedOptionId);\r\n\r\n return (\r\n
\r\n \r\n {expanded ? {title} : {activeOption?.title}}\r\n\r\n \r\n
\r\n
\r\n {specialOptions.map((specialOption) => {\r\n return (\r\n {\r\n onOptionChange(specialOption);\r\n }}\r\n isGratis\r\n showImg\r\n selectedOptionId={selectedOptionId}\r\n specialOption={{\r\n id: specialOption.id,\r\n imageThumbnailUrl: specialOption.image,\r\n price: specialOption.deliveryPrice,\r\n title: specialOption.title,\r\n }}\r\n />\r\n );\r\n })}\r\n
\r\n \r\n );\r\n};\r\n\r\nexport default SpecialOptionSelector;\r\n","import React from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { ApplicationState } from 'apps/ProductsApp/store';\r\nimport { CustomizeProductState, CustomizeProductStep } from 'apps/ProductsApp/store/customize-product/customize-product.reducer';\r\nimport { CustomizeProductActionTypes } from 'apps/ProductsApp/store/customize-product/customize-product.actions';\r\nimport SpecialOptionSelector from '../components/customize/special-option-selector.component';\r\n\r\nconst StarterSelection: React.FC = () => {\r\n const dispatch = useDispatch();\r\n const { activeOption, productToCustomize, componentState } = useSelector(\r\n (state) => state.customizeProduct,\r\n );\r\n\r\n if (!productToCustomize || componentState !== CustomizeProductStep.SelectStarter) {\r\n return <>;\r\n }\r\n\r\n return (\r\n
\r\n {\r\n dispatch({\r\n type: CustomizeProductActionTypes.SET_ACTIVE_OPTION,\r\n payload: option,\r\n });\r\n }}\r\n title=\"Elige und Salsa\"\r\n />\r\n
\r\n );\r\n};\r\n\r\nexport default StarterSelection;\r\n","import React, { useState } from 'react';\r\nimport { PaymentHelper } from 'shared/helpers';\r\nimport { OptionDetails } from '../../types/dto.types';\r\n\r\ninterface CrustOptionProps {\r\n showPrice: boolean;\r\n option: OptionDetails;\r\n selected?: boolean;\r\n onClick: () => void;\r\n isDelivery: boolean;\r\n}\r\n\r\nconst CrustOption: React.FC = ({ option, selected, onClick, showPrice, isDelivery }) => {\r\n const [imgError, setImgError] = useState(false);\r\n\r\n return (\r\n
\r\n {selected ? (\r\n
\r\n ) : (\r\n {\r\n setImgError(true);\r\n }}\r\n className=\"crust-option-image\"\r\n />\r\n )}\r\n\r\n
\r\n

\r\n {option.title}\r\n

\r\n

\r\n {option.description}\r\n

\r\n
\r\n {showPrice && (\r\n

\r\n {PaymentHelper.formatToDisplay(isDelivery ? option.deliveryPrice : option.pickupPrice)}\r\n

\r\n )}\r\n
\r\n );\r\n};\r\n\r\nexport default CrustOption;\r\n","import React from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { LocalizationState } from 'apps/LocalizationApp/Store';\r\nimport { setActiveOption } from 'apps/ProductsApp/store/customize-product/customize-product.actions';\r\nimport { OrderDistributionType } from 'shared/types';\r\nimport { CustomizeProductStep } from '../store/customize-product/customize-product.reducer';\r\nimport { prepareOptionsGroups } from '../helpers/customize-product.helper';\r\nimport { ApplicationState, CustomizeProductState, ProductsStaticContent } from '../store';\r\nimport { CustomizeProductActions } from '../store/actions';\r\nimport { OptionDetails } from '../types/dto.types';\r\nimport CrustOption from '../components/customize/crust-option.component';\r\n\r\nexport interface OptionGroup {\r\n title: string;\r\n options: OptionDetails[];\r\n}\r\n\r\nconst CrustSelection: React.FC = () => {\r\n const dispatch = useDispatch();\r\n const { currentStore, distributionType } = useSelector((state) => state.localization);\r\n const { customizePizza } = useSelector((state) => state.productsStaticContent);\r\n const { activeOption, productToCustomize, componentState, slices } = useSelector(\r\n (state) => state.customizeProduct,\r\n );\r\n\r\n const isUserLocalized = currentStore.id !== undefined && currentStore.id.length > 0;\r\n const isDealPart = (function () {\r\n return window.location.pathname.includes('deal');\r\n })();\r\n\r\n const optionGroups = productToCustomize && prepareOptionsGroups(productToCustomize);\r\n const allSlicesConfirmed = slices.length > 0 && slices.every((slice) => slice.sliceProductConfirmed);\r\n\r\n switch (componentState) {\r\n case CustomizeProductStep.SelectCrust: {\r\n return (\r\n
\r\n
{customizePizza.selectCrustHeadingText}
\r\n {optionGroups &&\r\n optionGroups.map((optionGroup) => {\r\n return (\r\n
\r\n
\r\n \r\n {optionGroup.title}\r\n \r\n
\r\n {optionGroup.options.map((od) => {\r\n return (\r\n {\r\n dispatch(setActiveOption(od));\r\n if (productToCustomize?.isXTasty) {\r\n dispatch(CustomizeProductActions.setAvailableRecipes(currentStore.id));\r\n dispatch({\r\n type: CustomizeProductActions.CustomizeProductActionTypes.SET_CURRENT_STEP,\r\n payload: allSlicesConfirmed\r\n ? CustomizeProductStep.SelectTopping\r\n : CustomizeProductStep.SelectRecipe,\r\n });\r\n } else {\r\n dispatch({\r\n type: CustomizeProductActions.CustomizeProductActionTypes.SET_CURRENT_STEP,\r\n payload: CustomizeProductStep.SelectTopping,\r\n });\r\n }\r\n\r\n gtm.variantModule.selectOption(\r\n od,\r\n productToCustomize?.id ?? 'unknown',\r\n distributionType === OrderDistributionType.Delivery,\r\n );\r\n }}\r\n selected={activeOption?.id === od.id}\r\n isDelivery={distributionType === OrderDistributionType.Delivery}\r\n />\r\n );\r\n })}\r\n
\r\n );\r\n })}\r\n
\r\n );\r\n }\r\n case CustomizeProductStep.SelectTopping: {\r\n return (\r\n
\r\n {`${activeOption?.type} - ${activeOption?.title}`}\r\n {\r\n dispatch({\r\n type: CustomizeProductActions.CustomizeProductActionTypes.SET_CURRENT_STEP,\r\n payload: CustomizeProductStep.SelectCrust,\r\n });\r\n }}\r\n >\r\n {customizePizza.changeText}\r\n

\r\n
\r\n );\r\n }\r\n case CustomizeProductStep.SelectRecipe: {\r\n return (\r\n
\r\n {`${activeOption?.type} - ${activeOption?.title}`}\r\n {\r\n dispatch({\r\n type: CustomizeProductActions.CustomizeProductActionTypes.SET_CURRENT_STEP,\r\n payload: CustomizeProductStep.SelectCrust,\r\n });\r\n }}\r\n >\r\n {customizePizza.changeText}\r\n

\r\n
\r\n );\r\n }\r\n default:\r\n return <>;\r\n }\r\n};\r\n\r\nexport default CrustSelection;\r\n","import { Topping } from 'apps/ProductsApp/types/dto.types';\r\nimport React from 'react';\r\nimport { PaymentHelper } from 'shared/helpers';\r\n\r\ninterface ToppingOptionProps {\r\n topping: Topping;\r\n removeTopping?: boolean;\r\n showPrice?: boolean;\r\n onToppingClick: (clicked: Topping) => void;\r\n canAddTopping?: (toppingId: number) => boolean;\r\n}\r\n\r\nconst ToppingOption: React.FC = ({ topping, onToppingClick, removeTopping, showPrice, canAddTopping }) => {\r\n return (\r\n {\r\n onToppingClick(topping);\r\n }}\r\n data-testid={`topping-option__button--toggle-topping-${topping.id}`}\r\n >\r\n \r\n

\r\n {topping.title}\r\n {showPrice && (\r\n \r\n {topping.price && PaymentHelper.formatToDisplay(topping.price)}\r\n \r\n )}\r\n

\r\n \r\n
\r\n );\r\n};\r\n\r\nexport default ToppingOption;\r\n","import React, { useState } from 'react';\r\nimport SpecialOption from 'apps/ProductsApp/components/customize/special-option.component';\r\nimport { Topping } from '../../types/dto.types';\r\n\r\ninterface SpecialOptionSelectorProps {\r\n specialOptions: Topping[];\r\n selectedOptionId: number;\r\n onOptionChange: (option: Topping) => void;\r\n defaultExpanded?: boolean;\r\n title: string;\r\n}\r\n\r\nconst SpecialToppingSelector: React.FC = ({\r\n specialOptions,\r\n selectedOptionId,\r\n defaultExpanded,\r\n title,\r\n onOptionChange,\r\n}) => {\r\n const [expanded, setExpanded] = useState(defaultExpanded ?? false);\r\n\r\n function onClick(): void {\r\n setExpanded(!expanded);\r\n }\r\n\r\n const activeOption = specialOptions.find((el) => el.id === selectedOptionId);\r\n\r\n return (\r\n
\r\n \r\n {expanded ? (\r\n \r\n {title}\r\n \r\n ) : (\r\n

\r\n {activeOption?.title ? activeOption?.title : title}\r\n

\r\n )}\r\n\r\n \r\n
\r\n
\r\n {specialOptions.map((specialOption) => {\r\n return (\r\n {\r\n onOptionChange(specialOption);\r\n }}\r\n selectedOptionId={selectedOptionId}\r\n specialOption={specialOption}\r\n />\r\n );\r\n })}\r\n
\r\n \r\n );\r\n};\r\n\r\nexport default SpecialToppingSelector;\r\n","import React from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { ApplicationState } from 'apps/ProductsApp/store';\r\nimport { ProductsStaticContent } from 'apps/ProductsApp/store/static-content/products-static-content.reducer';\r\nimport ToppingOption from 'apps/ProductsApp/components/customize/topping-option.component';\r\nimport { ProductsState } from 'apps/ProductsApp/store/products/products.reducer';\r\nimport { CustomizeProductState, CustomizeProductStep } from 'apps/ProductsApp/store/customize-product/customize-product.reducer';\r\nimport { extractAvailableToppings } from 'apps/ProductsApp/helpers/customize-product.helper';\r\nimport { addToppings, removeToppings, setSauce, setCheese } from 'apps/ProductsApp/store/customize-product/customize-product.actions';\r\nimport SpecialToppingSelector from '../components/customize/special-topping-selector.component';\r\nimport { Topping } from '../types/dto.types';\r\n\r\nconst ToppingSelection: React.FC = () => {\r\n const dispatch = useDispatch();\r\n const { customizePizza } = useSelector((state) => state.productsStaticContent);\r\n const { configuration, toppings } = useSelector((state) => state.products);\r\n const { productToCustomize, activeOption, componentState, activeSlice, slices } = useSelector<\r\n ApplicationState,\r\n CustomizeProductState\r\n >((state) => state.customizeProduct);\r\n\r\n const currentXTastySlice =\r\n productToCustomize?.isXTasty && slices[activeSlice] !== undefined ? slices[activeSlice].sliceProduct : undefined;\r\n const selectedSliceProductOption = currentXTastySlice && currentXTastySlice.options.find((el) => el.id === activeOption?.id);\r\n\r\n const customizationProduct = currentXTastySlice ?? productToCustomize;\r\n\r\n if (!activeOption || !customizationProduct || componentState !== CustomizeProductStep.SelectTopping) {\r\n return <>;\r\n }\r\n\r\n const addedToppings = slices[activeSlice]?.addedToppings ?? [];\r\n const removedToppings = slices[activeSlice]?.removedToppings ?? [];\r\n const defaultToppings = slices[activeSlice].defaultToppings ?? [];\r\n const selectedSauce = slices[activeSlice]?.selectedSauce;\r\n const selectedCheese = slices[activeSlice]?.selectedCheese;\r\n\r\n const updatedAddedToppings = addedToppings.map((topping) => {\r\n return topping.imageThumbnailUrl\r\n ? topping\r\n : ({\r\n ...topping,\r\n imageThumbnailUrl: toppings.find((item) => item.id === topping.id)?.imageThumbnailUrl,\r\n } as Topping);\r\n });\r\n\r\n const availableToppings = extractAvailableToppings(toppings, selectedSliceProductOption ?? activeOption);\r\n\r\n const maximumToppingsCount = productToCustomize?.isCreateCustomPizza \r\n ? configuration.maxToppingsForCustomPizza\r\n : configuration.maxExtraToppingsForEditPizza;\r\n const maximumSingleToppingCount = maximumToppingsCount; // for PH You can have 8 bacons if You like\r\n\r\n const sauces = availableToppings.filter((el) => el.categoryId === 'SAU');\r\n const cheeses = availableToppings.filter((el) => el.categoryId === 'RND');\r\n const normalToppings = availableToppings.filter((el) => el.categoryId !== 'SAU' && el.categoryId !== 'RND');\r\n\r\n const selectedToppings = defaultToppings\r\n .concat(updatedAddedToppings)\r\n .filter((topping) => topping.categoryId !== 'SAU' && topping.categoryId !== 'RND');\r\n removedToppings.forEach((removedTopping) => {\r\n const indexToRemove = selectedToppings.findIndex((el) => el.id === removedTopping.id);\r\n if (indexToRemove > -1) {\r\n selectedToppings.splice(indexToRemove, 1);\r\n }\r\n });\r\n\r\n const toppingAddingDisabled = selectedToppings.length >= maximumToppingsCount;\r\n const anyToppingAdded = selectedToppings.length > 0;\r\n\r\n function addTopping(top: Topping): void {\r\n const defaultRemovedToppingIndex = removedToppings.findIndex((el) => el.id === top.id);\r\n if (defaultRemovedToppingIndex > -1) {\r\n const newRemovedToppings = [...removedToppings];\r\n newRemovedToppings.splice(defaultRemovedToppingIndex, 1);\r\n dispatch(removeToppings(newRemovedToppings));\r\n } else {\r\n const newAddedToppings = [...addedToppings];\r\n newAddedToppings.push(top);\r\n dispatch(addToppings(newAddedToppings));\r\n }\r\n gtm.variantModule.selectTopping(top, productToCustomize?.id ?? 'unknown');\r\n }\r\n\r\n function removeAddedTopping(top: Topping): void {\r\n // first we check if removal topping is in added toppings\r\n const additionalToppingRemoveIndex = addedToppings.findIndex((el) => el.id === top.id);\r\n if (additionalToppingRemoveIndex > -1) {\r\n const newAddedToppings = [...addedToppings];\r\n // cannot use .filter here because there may be two same topping,\r\n // and we would like to delete only one\r\n newAddedToppings.splice(additionalToppingRemoveIndex, 1);\r\n dispatch(addToppings(newAddedToppings));\r\n } else {\r\n // ok topping is not in added topping, but may be default one as below\r\n const defaultToppingRemoveIndex = defaultToppings.findIndex((el) => el.id === top.id);\r\n if (defaultToppingRemoveIndex > -1) {\r\n const newRemovedToppings = [...removedToppings];\r\n newRemovedToppings.push(top);\r\n dispatch(removeToppings(newRemovedToppings));\r\n }\r\n }\r\n gtm.variantModule.unselectTopping(top, productToCustomize?.id ?? 'unknown');\r\n }\r\n\r\n function canAddTopping(toppingId: number): boolean {\r\n if (!toppingAddingDisabled) {\r\n if (selectedToppings.filter((el) => el.id === toppingId).length >= maximumSingleToppingCount) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n return (\r\n
\r\n
{customizePizza.selectSauceCheeseHeadingText}
\r\n {\r\n dispatch(setSauce(sauce));\r\n gtm.variantModule.selectTopping(sauce, productToCustomize?.id ?? 'unknown');\r\n }}\r\n title={customizePizza.selectSauceText}\r\n />\r\n {\r\n dispatch(setCheese(cheese));\r\n gtm.variantModule.selectTopping(cheese, productToCustomize?.id ?? 'unknown');\r\n }}\r\n title={customizePizza.selectCheeseText}\r\n />\r\n
{customizePizza.selectedToppingsHeadingText}
\r\n {anyToppingAdded ? (\r\n
\r\n {selectedToppings\r\n .filter((topping) => topping.categoryId !== 'SAU' && topping.categoryId !== 'RND')\r\n .map((addedTopping, index) => {\r\n return (\r\n \r\n );\r\n })}\r\n
\r\n ) : (\r\n
{customizePizza.noToppingsText}
\r\n )}\r\n
{customizePizza.availableToppingsHeadingText}
\r\n \r\n {normalToppings.map((topping) => {\r\n return (\r\n \r\n );\r\n })}\r\n
\r\n \r\n );\r\n};\r\n\r\nexport default ToppingSelection;\r\n","import { CalculatedTopping } from 'apps/ProductsApp/types/basket.types';\r\nimport React from 'react';\r\nimport { Topping } from '../../types/dto.types';\r\n\r\ninterface ToppingOverviewProps {\r\n addedToppings: Topping[];\r\n removedToppings: Topping[];\r\n toppingsPrices?: CalculatedTopping[];\r\n isSticky?: boolean;\r\n productTitle?: string;\r\n noSpacings?: boolean;\r\n showPrice?: boolean;\r\n removedLabel: string;\r\n addedLabel: string;\r\n}\r\n\r\nconst ToppingOverview: React.FC = ({\r\n productTitle,\r\n addedToppings,\r\n removedToppings,\r\n isSticky,\r\n noSpacings,\r\n showPrice = false,\r\n toppingsPrices,\r\n removedLabel,\r\n addedLabel,\r\n}) => {\r\n const updatedAddedToppings = (\r\n toppingsPrices\r\n ? toppingsPrices.map((topping) => {\r\n return {\r\n ...addedToppings.find((addTopping) => addTopping.id.toString() === topping.toppingId.toString()),\r\n price: topping.price,\r\n } as Topping;\r\n })\r\n : addedToppings\r\n ).filter((topping) => topping.categoryId !== 'SAU' && topping.categoryId !== 'RND' && topping.title);\r\n const updatedRemovedToppings = removedToppings.filter((topping) => topping.categoryId !== 'SAU' && topping.categoryId !== 'RND');\r\n\r\n return (\r\n
\r\n {isSticky &&
{productTitle}
}\r\n {(updatedAddedToppings.length > 0 || updatedRemovedToppings.length > 0) && (\r\n
\r\n {updatedAddedToppings.length > 0 && (\r\n
\r\n

\r\n {addedLabel} - \r\n \r\n {updatedAddedToppings\r\n .map((ad) => {\r\n return ad.price > 0 && showPrice ? `${ad.title}*` : ad.title;\r\n })\r\n .join(', ')}\r\n \r\n

\r\n
\r\n )}\r\n {updatedRemovedToppings.length > 0 && (\r\n
\r\n

\r\n {removedLabel} - \r\n \r\n {updatedRemovedToppings\r\n .filter((topping) => topping.categoryId !== 'SAU' && topping.categoryId !== 'RND')\r\n .map((ad) => {\r\n return ad.title;\r\n })\r\n .join(', ')}\r\n \r\n

\r\n
\r\n )}\r\n
\r\n )}\r\n
\r\n );\r\n};\r\n\r\nexport default ToppingOverview;\r\n","/* eslint-disable react/jsx-no-bind */\r\n/* eslint-disable jsx-a11y/no-noninteractive-element-interactions */\r\nimport React, { useEffect, useState } from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { PaymentHelper } from 'shared/helpers';\r\nimport Backdrop from 'shared/components/modal.compontent';\r\nimport { LocalizationState } from 'apps/LocalizationApp/Store';\r\nimport { confirmSliceProduct, setActiveOption } from 'apps/ProductsApp/store/customize-product/customize-product.actions';\r\nimport { Option } from 'apps/ProductsApp/types/dto.types';\r\nimport { OrderDistributionType } from 'shared/types';\r\nimport { CustomizeProductStep } from '../store/customize-product/customize-product.reducer';\r\nimport RecipeSelection from './recipe-selection.container';\r\nimport StarterSelection from './starter-option.container';\r\nimport CrustSelection from './crust-selection.container';\r\nimport ToppingSelection from './topping-selection.container';\r\nimport ToppingOverview from '../components/customize/toppings-overview.component';\r\nimport { ApplicationState, ProductsStaticContent, CustomizeProductState, ProductsState } from '../store';\r\nimport { CustomizeProductActions } from '../store/actions';\r\nimport { BasketItem, XTastyChoice } from '../types/basket.types';\r\n\r\nconst CustomizeProduct: React.FC = () => {\r\n let customizationWindow: HTMLElement | null = null;\r\n let customizationImageSmall: HTMLElement | null = null;\r\n const [isOverviewSticky, setOverviewSticky] = useState(false);\r\n\r\n const dispatch = useDispatch();\r\n const { currentStore, distributionType } = useSelector((state) => state.localization);\r\n const { customizePizza, xTastyPizza, addedToppingLabel, removedToppingLabel } = useSelector<\r\n ApplicationState,\r\n ProductsStaticContent\r\n >((state) => state.productsStaticContent);\r\n const {\r\n activeSlice,\r\n productToCustomize,\r\n activeOption,\r\n componentState,\r\n slices,\r\n addToBasketDispatch,\r\n availableRecipes,\r\n toppingsPrice,\r\n } = useSelector((state) => state.customizeProduct);\r\n const { categories } = useSelector((state) => state.products);\r\n\r\n const isDelivery = distributionType === OrderDistributionType.Delivery;\r\n const isUserLocalized = currentStore.id !== undefined && currentStore.id.length > 0;\r\n const addedToppings = slices[activeSlice]?.addedToppings ?? [];\r\n const removedToppings = slices[activeSlice]?.removedToppings ?? [];\r\n const isXTasty = productToCustomize?.isXTasty;\r\n\r\n let productPrice = activeOption ? activeOption.deliveryPrice + toppingsPrice?.totalToppingsPrice : 0;\r\n\r\n if (currentStore.id && activeOption) {\r\n productPrice =\r\n distributionType === OrderDistributionType.Delivery\r\n ? activeOption.deliveryPrice + toppingsPrice?.totalToppingsPrice\r\n : activeOption.pickupPrice + toppingsPrice?.totalToppingsPrice;\r\n }\r\n\r\n useEffect(() => {\r\n if (productToCustomize) {\r\n gtm.screenLoad(\r\n 'product-customization',\r\n `product-customization.${categories.find((el) => el.id === productToCustomize.categoryId)?.title}.${\r\n productToCustomize.title\r\n }`,\r\n );\r\n gtm.productsModule.productsLoad([productToCustomize], isDelivery, isUserLocalized);\r\n gtm.productsModule.view(productToCustomize?.title);\r\n }\r\n setOverviewSticky(false);\r\n customizationWindow = document.getElementById('customization-window');\r\n customizationImageSmall = document.getElementById('customization-image-small');\r\n customizationWindow && customizationWindow.addEventListener('scroll', handleScroll);\r\n }, [productToCustomize]);\r\n\r\n useEffect(() => {\r\n if (isXTasty) {\r\n gtm.modalLoad(`pizza-half-${activeSlice + 1}`);\r\n }\r\n }, [activeSlice]);\r\n\r\n useEffect(() => {\r\n scrollTop();\r\n }, [componentState]);\r\n\r\n if (!productToCustomize) {\r\n return <>;\r\n }\r\n\r\n function handleScroll(): void {\r\n const imgHeight = customizationImageSmall?.offsetHeight;\r\n if (customizationWindow && imgHeight && customizationWindow.scrollTop > imgHeight) {\r\n setOverviewSticky(true);\r\n } else {\r\n setOverviewSticky(false);\r\n }\r\n }\r\n function scrollTop(): void {\r\n const customizeWindow = document.getElementById('customization-window') as HTMLElement;\r\n const contentCustomizationWindow = document.getElementById('content-customization-window') as HTMLElement;\r\n customizeWindow && customizeWindow.scrollTo(0, 0);\r\n contentCustomizationWindow && contentCustomizationWindow.scrollTo(0, 0);\r\n }\r\n function onClose(): void {\r\n dispatch(CustomizeProductActions.clearCustomizeState());\r\n }\r\n function itemPrice(option: Option): string {\r\n return isDelivery ? option.deliveryPrice.toString() : option.pickupPrice.toString();\r\n }\r\n\r\n function addToBasket(): void {\r\n if (activeOption) {\r\n const basketItemToAdd = {\r\n sku: {\r\n ...activeOption.sku,\r\n productTitle: productToCustomize?.title,\r\n optionTitle: activeOption.title,\r\n optionSubTitle: productToCustomize?.categoryId === 'PIZ' ? activeOption.type : undefined,\r\n },\r\n basePrice: +itemPrice(activeOption),\r\n price: +itemPrice(activeOption),\r\n specificationToppingsPrices: toppingsPrice,\r\n extraCharge: activeOption.extraCharge,\r\n } as BasketItem;\r\n\r\n if (isXTasty) {\r\n addToBasketDispatch({\r\n ...basketItemToAdd,\r\n xTastyChoices: slices.map((slice) => {\r\n const currentRemovedToppings = slice.removedToppings ?? [];\r\n const currentAddedToppings = slice.addedToppings ?? [];\r\n\r\n return {\r\n productId: slice.sliceProduct?.id ?? '',\r\n productName: slice.sliceProduct?.title ?? '',\r\n defaultToppings: slice.defaultToppings,\r\n addedToppings: currentAddedToppings,\r\n removedToppings: currentRemovedToppings,\r\n } as XTastyChoice;\r\n }),\r\n }); // customized x tasty pizza\r\n } else {\r\n const currentSlice = slices[activeSlice];\r\n \r\n if (currentSlice) {\r\n addToBasketDispatch({\r\n ...basketItemToAdd,\r\n addedToppings,\r\n removedToppings,\r\n }); // customized pizza\r\n } else {\r\n addToBasketDispatch({\r\n ...basketItemToAdd,\r\n }); // starter or other not pizza product\r\n }\r\n }\r\n gtm.productsModule.addProductToBasket(\r\n productToCustomize,\r\n activeOption,\r\n itemPrice(activeOption),\r\n productToCustomize?.position as number,\r\n );\r\n }\r\n }\r\n\r\n const isStarter = componentState === CustomizeProductStep.SelectStarter;\r\n const isSelectCrust = componentState === CustomizeProductStep.SelectCrust;\r\n const isSelectRecipe = componentState === CustomizeProductStep.SelectRecipe;\r\n const isSelectSliceTopping = componentState === CustomizeProductStep.SelectTopping && productToCustomize.isXTasty;\r\n const isSelectCrustForXtasty = componentState === CustomizeProductStep.SelectCrust && productToCustomize.isXTasty;\r\n const isXtasty = productToCustomize.isXTasty;\r\n const allSlicesConfirmed = slices.every((slice) => slice.sliceProductConfirmed);\r\n const isDealPart = ((): boolean => {\r\n return window.location.pathname.includes('deal');\r\n })();\r\n\r\n const canShowPrice = isUserLocalized && ((isXtasty && allSlicesConfirmed) || !isXtasty) && !isDealPart && !isNaN(productPrice);\r\n\r\n function getButtonText(): string {\r\n if (isSelectSliceTopping && !allSlicesConfirmed) return xTastyPizza.nextSliceText;\r\n if (isSelectCrust || isSelectRecipe) return customizePizza.ctaContinueText;\r\n\r\n return productToCustomize?.offerCode ? customizePizza.ctaAddToOfferText : customizePizza.ctaAddToBasketText;\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 {productToCustomize.title}\r\n \r\n \r\n {productToCustomize.title}\r\n \r\n

\r\n {productToCustomize.description}\r\n

\r\n {!isSelectCrustForXtasty && (\r\n \r\n )}\r\n {productToCustomize.tags.map((tag) => {\r\n return (\r\n
\r\n \r\n

{tag.title}

\r\n
\r\n );\r\n })}\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n {activeOption && (\r\n
\r\n {\r\n switch (componentState) {\r\n case CustomizeProductStep.SelectCrust: {\r\n dispatch(setActiveOption(activeOption));\r\n if (productToCustomize.isXTasty) {\r\n dispatch({\r\n type: CustomizeProductActions.CustomizeProductActionTypes.SET_CURRENT_STEP,\r\n payload: allSlicesConfirmed\r\n ? CustomizeProductStep.SelectTopping\r\n : CustomizeProductStep.SelectRecipe,\r\n });\r\n dispatch(CustomizeProductActions.setAvailableRecipes(currentStore.id));\r\n break;\r\n } else {\r\n dispatch({\r\n type: CustomizeProductActions.CustomizeProductActionTypes.SET_CURRENT_STEP,\r\n payload: CustomizeProductStep.SelectTopping,\r\n });\r\n break;\r\n }\r\n }\r\n case CustomizeProductStep.SelectRecipe: {\r\n if (availableRecipes.length === 0) break;\r\n if (!slices[activeSlice].sliceProductConfirmed) {\r\n dispatch(confirmSliceProduct());\r\n } else {\r\n dispatch({\r\n type: CustomizeProductActions.CustomizeProductActionTypes.SET_CURRENT_STEP,\r\n payload: CustomizeProductStep.SelectTopping,\r\n });\r\n }\r\n break;\r\n }\r\n case CustomizeProductStep.SelectTopping: {\r\n if (productToCustomize.isXTasty && !allSlicesConfirmed) {\r\n dispatch({\r\n type: CustomizeProductActions.CustomizeProductActionTypes.SET_ACTIVE_SLICE,\r\n payload: activeSlice + 1,\r\n });\r\n dispatch({\r\n type: CustomizeProductActions.CustomizeProductActionTypes.SET_CURRENT_STEP,\r\n payload: CustomizeProductStep.SelectRecipe,\r\n });\r\n break;\r\n } else {\r\n addToBasket();\r\n onClose();\r\n break;\r\n }\r\n }\r\n case CustomizeProductStep.SelectStarter: {\r\n addToBasket();\r\n onClose();\r\n break;\r\n }\r\n default:\r\n break;\r\n }\r\n }}\r\n >\r\n

{getButtonText()}

\r\n {canShowPrice && (\r\n

\r\n {PaymentHelper.formatToDisplay(productPrice)}\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 CustomizeProduct;\r\n","import useKeyPress from 'hooks/useKeyPress';\r\nimport React from 'react';\r\nimport Modal, { ModalProps } from 'shared/components/modal.compontent';\r\n\r\ninterface Props extends ModalProps {\r\n labels: {\r\n header: string;\r\n subHeader: string;\r\n ctaText?: string;\r\n };\r\n isVisible: boolean;\r\n onConfirmFn?: () => void;\r\n testId: string;\r\n}\r\n\r\nconst SingleActionModal = ({ labels, isVisible, cancelCallbackFn, onConfirmFn, testId }: Props) => {\r\n useKeyPress('ENTER', onConfirmFn || cancelCallbackFn);\r\n\r\n return (\r\n \r\n
\r\n
\r\n {labels.header}\r\n
\r\n

\r\n {labels.subHeader}\r\n

\r\n {labels.ctaText && (\r\n \r\n {labels.ctaText}\r\n \r\n )}\r\n
\r\n \r\n );\r\n};\r\n\r\nexport default SingleActionModal;\r\n","import React from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport SingleActionModal from 'shared/components/single-action-modal.component';\r\nimport { ApplicationState, BasketState, ProductsStaticContent } from '../store';\r\nimport { removeOutOfStockProducts } from '../store/basket/basket.actions';\r\n\r\nconst ProductNotAvailableModal = () => {\r\n const { productNotAvailableModal, offerNotAvailableModal } = useSelector(\r\n (state) => state.productsStaticContent,\r\n );\r\n const { showProductNotAvailableModal, showOfferNotAvailableModal } = useSelector(\r\n (state) => state.basket,\r\n );\r\n const dispatch = useDispatch();\r\n\r\n return (\r\n
\r\n {\r\n dispatch(removeOutOfStockProducts());\r\n }}\r\n testId={showProductNotAvailableModal ? 'product-not-available-modal' : 'coupon-not-available-modal'}\r\n />\r\n
\r\n );\r\n};\r\n\r\nexport default ProductNotAvailableModal;\r\n","import React from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport SingleActionModal from 'shared/components/single-action-modal.component';\r\nimport { ApplicationState, BasketState, ProductsStaticContent } from '../store';\r\nimport { BasketActionTypes } from '../store/basket/basket.actions';\r\n\r\nconst NoOfVouchersExceededModal = () => {\r\n const { noOfVouchersExceededModal } = useSelector(\r\n (state) => state.productsStaticContent,\r\n );\r\n const { showNoOfVouchersExceededModal } = useSelector(\r\n (state) => state.basket,\r\n );\r\n const dispatch = useDispatch();\r\n\r\n return (\r\n
\r\n {\r\n dispatch({ type: BasketActionTypes.SET_NO_OF_VOUCHERS_EXCEEDED_MODAL, payload: false });\r\n }}\r\n testId={'no-of-vochers-exceeded-modal'}\r\n />\r\n
\r\n );\r\n};\r\n\r\nexport default NoOfVouchersExceededModal;","import React from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport SingleActionModal from 'shared/components/single-action-modal.component';\r\nimport { ApplicationState, BasketState, ProductsStaticContent } from '../store';\r\nimport { BasketActionTypes } from '../store/basket/basket.actions';\r\n\r\nconst CouponCodeInvalidModal = () => {\r\n const { couponCodeInvalidModal } = useSelector((state) => state.productsStaticContent);\r\n const { showCouponCodeInvalidModal } = useSelector((state) => state.basket);\r\n const dispatch = useDispatch();\r\n\r\n return (\r\n
\r\n {\r\n dispatch({ type: BasketActionTypes.SET_COUPON_CODE_INVALID_MODAL, payload: false });\r\n }}\r\n testId=\"coupon-code-invalid-modal\"\r\n />\r\n
\r\n );\r\n};\r\n\r\nexport default CouponCodeInvalidModal;\r\n","export const changeMobileBarsColor = (lowerBarColor: string | undefined, upperBarColor: string | undefined): void => {\r\n const mobile = window.S4DWebBridge();\r\n if (mobile) {\r\n if (lowerBarColor){\r\n mobile.setBackgroundColor(lowerBarColor, 2);\r\n }\r\n if (upperBarColor){\r\n mobile.setBackgroundColor(upperBarColor, 1);\r\n }\r\n }\r\n};","import { AxiosResponse } from 'axios';\r\nimport { Action } from 'redux';\r\nimport { ThunkAction } from 'redux-thunk';\r\nimport Axios from '../../api/axios';\r\nimport { StaticContent } from '../../types';\r\n\r\nexport enum StaticContentActionTypes {\r\n SET_STATIC_CONTENT = '[Shared.StaticContent] SET_STATIC_CONTENT',\r\n SET_SIMPLIFIED_FOOTER = '[Shared.StaticContent] SET_SIMPLIFIED_FOOTER',\r\n SET_CONFIGURATION = '[Shared.StaticContent] SET_CONFIGURATION'\r\n}\r\n\r\ninterface SetStaticContent {\r\n type: StaticContentActionTypes.SET_STATIC_CONTENT;\r\n payload: StaticContent['messages'];\r\n}\r\ninterface SetSimplifiedFooter {\r\n type: StaticContentActionTypes.SET_SIMPLIFIED_FOOTER;\r\n payload: StaticContent['simplifiedFooter'];\r\n}\r\n\r\ninterface SetConfiguration {\r\n type: StaticContentActionTypes.SET_CONFIGURATION;\r\n payload: StaticContent['configuration'];\r\n}\r\n\r\nexport const getStaticContent =\r\n (): ThunkAction =>\r\n async (dispatch): Promise => {\r\n try {\r\n const value: AxiosResponse = await Axios.get('api/static-content');\r\n dispatch({\r\n type: StaticContentActionTypes.SET_STATIC_CONTENT,\r\n payload: value.data,\r\n });\r\n } catch (err) {\r\n console.error(err);\r\n throw err;\r\n }\r\n };\r\n\r\nexport const getSimplifiedFooterStaticContent =\r\n (): ThunkAction =>\r\n async (dispatch): Promise => {\r\n try {\r\n const footer: AxiosResponse = await Axios.get('api/static-content/simplified-footer');\r\n dispatch({ type: StaticContentActionTypes.SET_SIMPLIFIED_FOOTER, payload: footer.data });\r\n } catch (err) {\r\n console.error(err);\r\n throw err;\r\n }\r\n };\r\n\r\nexport const getCmsConfiguration =\r\n (): ThunkAction =>\r\n async (dispatch): Promise => {\r\n try {\r\n const value: AxiosResponse = await Axios.get('api/static-content/cms-configuration');\r\n dispatch({\r\n type: StaticContentActionTypes.SET_CONFIGURATION,\r\n payload: value.data,\r\n });\r\n } catch (err) {\r\n console.error(err);\r\n throw err;\r\n }\r\n };\r\n\r\nexport type StaticContentActions = SetStaticContent | SetSimplifiedFooter | SetConfiguration;\r\n","import { AppConfiguration, AppReviewTarget, SupportedCulture, UserMessage } from '../../types';\r\nimport { GlobalActions, GlobalActionTypes } from './global.actions';\r\n\r\nconst { SET_USER_STATUS, SET_MESSAGES, CLEAR_MESSAGES, SET_LOADER_STATE, SHOW_UNHANDLED_ERROR_MODAL, SET_SUPPORTED_CULTURES, SET_APP_CONFIGURATION } =\r\n GlobalActionTypes;\r\n\r\nexport interface UserInfo {\r\n email: string;\r\n phone: string;\r\n firstName?: string;\r\n lastName?: string;\r\n lastActiveOrder?: string;\r\n}\r\n\r\nexport interface GlobalState {\r\n messages: UserMessage[];\r\n host: string;\r\n signedin: boolean;\r\n currentUser?: UserInfo;\r\n loader: boolean;\r\n showErrorModal: boolean;\r\n supportedCultures: SupportedCulture[];\r\n appConfiguration: AppConfiguration;\r\n}\r\n\r\nconst initialState: GlobalState = {\r\n messages: [],\r\n host: (document.getElementById('baseUrl') as HTMLInputElement).value,\r\n signedin: false,\r\n loader: false,\r\n showErrorModal: false,\r\n supportedCultures: [],\r\n appConfiguration: {\r\n maxChangeableToppingsForEditPizza: 8,\r\n maxExtraToppingsForEditPizza: 8,\r\n maxToppingsForCustomPizza: 8,\r\n appReviewsEnabled: false,\r\n positiveReviewsTarget: AppReviewTarget.NATIVE_STORE,\r\n negativeReviewsTarget: AppReviewTarget.DB\r\n }\r\n};\r\n\r\nconst authCookies = document.cookie;\r\n\r\nif (authCookies) {\r\n const items = authCookies.split(';');\r\n\r\n for (let i = 0; i < items.length; i++) {\r\n const name = items[i].substring(0, items[i].indexOf('='));\r\n const value = items[i].substring(items[i].indexOf('=') + 1);\r\n\r\n if (name.toLowerCase().replace(/ /g, '') === 'pizza-hut-access-token') {\r\n const json = decodeURIComponent(value);\r\n const obj = JSON.parse(json);\r\n\r\n initialState.currentUser = {\r\n email: obj.Email,\r\n phone: obj.Phone,\r\n firstName: obj.FirstName,\r\n lastName: obj.LastName,\r\n lastActiveOrder: obj.LastActiveOrder,\r\n };\r\n initialState.signedin = true;\r\n }\r\n }\r\n}\r\n\r\nconst globalReducer = (state = initialState, action: GlobalActions): GlobalState => {\r\n switch (action.type) {\r\n case SET_MESSAGES: {\r\n return {\r\n ...state,\r\n messages: action.payload,\r\n };\r\n }\r\n case CLEAR_MESSAGES: {\r\n return {\r\n ...state,\r\n messages: initialState.messages,\r\n };\r\n }\r\n case SET_USER_STATUS: {\r\n const { signedin } = action.payload;\r\n return {\r\n ...state,\r\n signedin,\r\n };\r\n }\r\n case SET_LOADER_STATE: {\r\n const { value } = action.payload;\r\n return {\r\n ...state,\r\n loader: value,\r\n };\r\n }\r\n case SHOW_UNHANDLED_ERROR_MODAL: {\r\n return {\r\n ...state,\r\n showErrorModal: action.payload,\r\n };\r\n }\r\n case SET_SUPPORTED_CULTURES: {\r\n return {\r\n ...state,\r\n supportedCultures: action.payload,\r\n };\r\n }\r\n case SET_APP_CONFIGURATION: {\r\n return {\r\n ...state,\r\n appConfiguration: action.payload,\r\n };\r\n }\r\n default:\r\n return {\r\n ...state,\r\n };\r\n }\r\n};\r\n\r\nexport default globalReducer;\r\n","import { StaticContentActionTypes, StaticContentActions } from './static-content.actions';\r\nimport { StaticContent } from '../../types';\r\n\r\nexport const initialState: StaticContent = {\r\n messages: {\r\n tooltipsGeoDisabled: '',\r\n tooltipsFillAddress: '',\r\n tooltipsFillStreetNumber: '',\r\n tooltipsAdressConfirmation: '',\r\n errorMessagesWrongAddress: '',\r\n errorMessagesWrongStreetNumber: '',\r\n errorMessagesImpossibleToLocateDelivery: '',\r\n errorMessagesImpossibleToLocatePickup: '',\r\n errorMessagesNoStores: '',\r\n errorModalTitle: 'Ooops....!',\r\n errorModalDescription: 'Something went terribly wrong...',\r\n apiKey: '',\r\n },\r\n simplifiedFooter: [],\r\n configuration: {\r\n hideCouponsScratchedPrices: false,\r\n }\r\n};\r\n\r\nconst staticContentReducer = (state = initialState, action: StaticContentActions): StaticContent => {\r\n switch (action.type) {\r\n case StaticContentActionTypes.SET_STATIC_CONTENT: {\r\n return {\r\n ...state,\r\n messages: action.payload,\r\n };\r\n }\r\n case StaticContentActionTypes.SET_SIMPLIFIED_FOOTER: {\r\n return {\r\n ...state,\r\n simplifiedFooter: action.payload,\r\n };\r\n }\r\n case StaticContentActionTypes.SET_CONFIGURATION: {\r\n return {\r\n ...state,\r\n configuration: action.payload,\r\n }\r\n }\r\n default: {\r\n return { ...state };\r\n }\r\n }\r\n};\r\n\r\nexport default staticContentReducer;\r\n","import { OrderDistributionType } from 'shared/types';\r\nimport { SelectedDateTimeFrame } from 'apps/LocalizationApp/types/dto.types';\r\nimport { LocalizationActionTypes, LocalizationActions } from './actions';\r\nimport { AddressDetailsDto, AddressSuggestionDto, AvailableHoursDto, StoreDto, StoreStatusDto } from '../types/dto.types';\r\n\r\nexport interface CurrentStore extends StoreDto {\r\n isOpen?: boolean;\r\n availableHours?: AvailableHoursDto;\r\n}\r\nexport interface StoreStatus extends StoreStatusDto {\r\n storePhoneNumber: string;\r\n}\r\n\r\nexport interface LocalizationState {\r\n distributionType: OrderDistributionType;\r\n suggestions: AddressSuggestionDto[];\r\n nearbyStores: StoreDto[];\r\n currentStore: CurrentStore;\r\n selectedStoreStatus: StoreStatus;\r\n selectedAddress: AddressDetailsDto;\r\n selectedAddressDetails: string;\r\n availableHours?: AvailableHoursDto;\r\n selectedOrderTime?: SelectedDateTimeFrame;\r\n fetched: boolean;\r\n showToast: boolean;\r\n showModal: boolean;\r\n showNumberInput: boolean;\r\n lastAddresses: AddressDetailsDto[];\r\n lastStores: StoreDto[];\r\n forceDeliveryDistributionType: boolean;\r\n}\r\n\r\nconst emptySelectedAddress = {\r\n city: '',\r\n country: '',\r\n isCompleteAddress: false,\r\n region: '',\r\n street: '',\r\n streetNumber: '',\r\n addressAddition: '',\r\n remark: '',\r\n value: '',\r\n placeId: '',\r\n longitude: undefined,\r\n latitude: undefined,\r\n postalCode: '',\r\n localizationStrategy: '',\r\n additionalInfo: undefined\r\n};\r\n\r\nexport const initialState: LocalizationState = {\r\n distributionType: OrderDistributionType.Delivery,\r\n fetched: false,\r\n suggestions: [],\r\n nearbyStores: [],\r\n selectedAddress: emptySelectedAddress,\r\n selectedAddressDetails: '',\r\n currentStore: {\r\n city: '',\r\n distance: 0,\r\n id: '',\r\n name: '',\r\n street: '',\r\n streetNumber: '',\r\n phoneNumber: '',\r\n },\r\n selectedStoreStatus: {\r\n state: undefined,\r\n stateDescription: '',\r\n reason: '',\r\n canPlaceOrder: false,\r\n timestamp: '',\r\n storePhoneNumber: '',\r\n },\r\n showToast: false,\r\n showModal: false,\r\n showNumberInput: false,\r\n lastAddresses: [],\r\n lastStores: [],\r\n forceDeliveryDistributionType: false,\r\n};\r\n\r\nconst localizationReducer = (state = initialState, action: LocalizationActions): LocalizationState => {\r\n switch (action.type) {\r\n case LocalizationActionTypes.CHANGE_ORDER_DISTRIBUTION: {\r\n const updatedSelectedAddress = { ...state.selectedAddress };\r\n const { streetNumber, street, city } = state.selectedAddress;\r\n const showNumberInput = action.payload === OrderDistributionType.Delivery && !!street && !streetNumber;\r\n\r\n if (updatedSelectedAddress.street && updatedSelectedAddress.city) {\r\n if (action.payload !== OrderDistributionType.Delivery) {\r\n updatedSelectedAddress.value = `${street}, ${streetNumber ? `${streetNumber}, ${city}` : city}`;\r\n } else if (showNumberInput) {\r\n updatedSelectedAddress.value = `${street}, ${city}`;\r\n } else {\r\n updatedSelectedAddress.value = `${street}, ${streetNumber}, ${city}`;\r\n }\r\n }\r\n return {\r\n ...state,\r\n fetched: false,\r\n selectedAddress: updatedSelectedAddress,\r\n distributionType: action.payload,\r\n showNumberInput,\r\n };\r\n }\r\n case LocalizationActionTypes.ON_PROPERTY_CHANGED: {\r\n const { value, name } = action.payload;\r\n const selectedAddress = name === 'value' ? emptySelectedAddress : state.selectedAddress;\r\n\r\n return {\r\n ...state,\r\n selectedAddress: {\r\n ...selectedAddress,\r\n [name]: value,\r\n },\r\n };\r\n }\r\n case LocalizationActionTypes.SET_SUGGESTIONS: {\r\n return {\r\n ...state,\r\n suggestions: action.payload,\r\n };\r\n }\r\n\r\n case LocalizationActionTypes.SET_SELECTED_ADDRESS: {\r\n if (!action.payload) {\r\n return {\r\n ...state,\r\n selectedAddress: { ...initialState.selectedAddress },\r\n };\r\n }\r\n\r\n const { streetNumber, street, city, postalCode, region, value } = action.payload;\r\n // \"value\" has the most details, but when we are using \"stored\" addresses (last 5 ones) we do not have this value\r\n const addressDetails = value && value.length > 1 \r\n ? value\r\n : `${street} ${streetNumber}, ${city}, ${postalCode}, ${region}`;\r\n\r\n let displayValue = value;\r\n if (street && city) {\r\n if (state.distributionType !== OrderDistributionType.Delivery) {\r\n displayValue = `${street}, ${streetNumber ? `${streetNumber}, ${city}` : city}`;\r\n } else if ((state.showNumberInput && streetNumber) || streetNumber) {\r\n displayValue = `${street}, ${streetNumber}, ${city}`;\r\n } else {\r\n displayValue = `${street}, ${city}`;\r\n }\r\n }\r\n\r\n return {\r\n ...state,\r\n selectedAddress: {\r\n ...action.payload,\r\n streetNumber: streetNumber || '',\r\n value: displayValue || state.selectedAddress.value,\r\n },\r\n selectedAddressDetails: addressDetails\r\n };\r\n }\r\n case LocalizationActionTypes.SET_ORDER_TIME: {\r\n return {\r\n ...state,\r\n selectedOrderTime: action.payload,\r\n };\r\n }\r\n case LocalizationActionTypes.SET_CURRENT_STORE: {\r\n return {\r\n ...state,\r\n currentStore: {\r\n ...state.currentStore,\r\n ...action.payload,\r\n },\r\n };\r\n }\r\n case LocalizationActionTypes.SET_NEARBY_STORES: {\r\n return {\r\n ...state,\r\n nearbyStores: action.payload,\r\n };\r\n }\r\n case LocalizationActionTypes.CLEAR_STORE: {\r\n return {\r\n ...state,\r\n selectedAddress: emptySelectedAddress,\r\n currentStore: { ...initialState.currentStore },\r\n nearbyStores: [],\r\n showNumberInput: false,\r\n };\r\n }\r\n case LocalizationActionTypes.SHOW_TOAST: {\r\n return {\r\n ...state,\r\n showToast: action.payload,\r\n };\r\n }\r\n case LocalizationActionTypes.SHOW_MODAL: {\r\n return {\r\n ...state,\r\n showModal: action.payload,\r\n };\r\n }\r\n case LocalizationActionTypes.SHOW_NUMBER_INPUT: {\r\n return {\r\n ...state,\r\n showNumberInput: action.payload,\r\n };\r\n }\r\n case LocalizationActionTypes.SET_LAST_USED_ADDRESSES: {\r\n return {\r\n ...state,\r\n lastAddresses: action.payload.map((accAddress) => {\r\n return {\r\n city: accAddress.city,\r\n isCompleteAddress: true,\r\n region: accAddress.district,\r\n street: accAddress.street,\r\n streetNumber: accAddress.streetNumber,\r\n addressAddition: accAddress.addressAddition,\r\n remark: accAddress.remark,\r\n value: '',\r\n placeId: '',\r\n country: accAddress.country,\r\n latitude: accAddress.latitude,\r\n longitude: accAddress.longitude,\r\n postalCode: accAddress.postalCode,\r\n localizationStrategy: accAddress.localizationStrategy,\r\n additionalInfo: accAddress.additionalInfo\r\n };\r\n }),\r\n };\r\n }\r\n case LocalizationActionTypes.SET_LAST_USED_STORES: {\r\n return {\r\n ...state,\r\n lastStores: action.payload,\r\n };\r\n }\r\n case LocalizationActionTypes.SET_FORCE_DELIVERY_DISTRIBUTION: {\r\n return {\r\n ...state,\r\n forceDeliveryDistributionType: action.payload,\r\n };\r\n }\r\n case LocalizationActionTypes.SET_SELECTED_STORE_STATUS: {\r\n const storeStatus = action.payload ?? state.selectedStoreStatus;\r\n return {\r\n ...state,\r\n selectedStoreStatus: {\r\n ...storeStatus,\r\n },\r\n };\r\n }\r\n case LocalizationActionTypes.SET_ADDRESS_ADDITIONAL_INFO: {\r\n return {\r\n ...state,\r\n selectedAddress: {\r\n ...state.selectedAddress,\r\n additionalInfo: action.payload\r\n },\r\n };\r\n }\r\n\r\n default: {\r\n return { ...state };\r\n }\r\n }\r\n};\r\n\r\nexport default localizationReducer;\r\n","import Axios from 'shared/api/axios';\r\nimport { AxiosResponse } from 'axios';\r\nimport { Action } from 'redux';\r\nimport { ThunkAction } from 'redux-thunk';\r\nimport ResponseWrapper from 'shared/tools/api-response-wrapper';\r\nimport { LocalizationStaticContent } from './localization-static-content.reducer';\r\nimport { ApplicationState } from '../index';\r\n\r\nexport enum LocalizationStaticContentActionTypes {\r\n SET_STATIC_CONTENT = '[Localization.StaticContent] SET_STATIC_CONTENT',\r\n}\r\n\r\ninterface SetStaticContent {\r\n type: LocalizationStaticContentActionTypes.SET_STATIC_CONTENT;\r\n payload: LocalizationStaticContent;\r\n}\r\n\r\nexport const getStaticContent =\r\n (): ThunkAction =>\r\n async (dispatch): Promise => {\r\n ResponseWrapper({\r\n action: async () => {\r\n const value: AxiosResponse = await Axios.get('api/static-content/localization');\r\n dispatch({\r\n type: LocalizationStaticContentActionTypes.SET_STATIC_CONTENT,\r\n payload: value.data,\r\n });\r\n },\r\n dispatch,\r\n });\r\n };\r\n\r\nexport type StaticContentActions = SetStaticContent;\r\n","import { LocalizationStaticContentActionTypes, StaticContentActions } from './localization-static-content.actions';\r\n\r\nexport interface LocalizationAdditionContent {\r\n // this is text displayed above localization input\r\n headerText: string;\r\n paragraphText: string;\r\n linkText?: string;\r\n linkHref?: string;\r\n}\r\n\r\ninterface ChangeStoreLabels {\r\n changeDeliveryTitle: string;\r\n changePickupTitle: string;\r\n changeStoreButton: string;\r\n goToCatalogButton: string;\r\n}\r\n\r\nexport interface LocalizationStaticContent {\r\n localizationInputPlaceholder: string;\r\n deliveryAddition?: LocalizationAdditionContent;\r\n deliveryIcon: string;\r\n deliveryIconDisabled: string;\r\n deliveryTabText: string;\r\n dropdownLabelPickupResults: string;\r\n dropdownDeliveryLabelRegisteredUser: string;\r\n dropdownPickupLabelRegisteredUser: string;\r\n geolocationTextDelivery: string;\r\n geolocationTextPickup: string;\r\n mainCTA: string;\r\n pickupAddition?: LocalizationAdditionContent;\r\n pickupIcon: string;\r\n pickupIconDisabled: string;\r\n pickupTabText: string;\r\n signInLink: string;\r\n changeStore: ChangeStoreLabels;\r\n storeIsClosedToast: string;\r\n chooseTimeHeading: string;\r\n chooseTimeAsap: string;\r\n storeDistanceUnit: string;\r\n storeUnavailable: {\r\n outOfDeliveryRangeHeading: string;\r\n outOfDeliveryRangeText: string;\r\n distancePrefix: string;\r\n distanceSuffix: string;\r\n noStoreAvailable: string;\r\n returnButton: string;\r\n };\r\n addressAlertModal: {\r\n title: string;\r\n confirmButton: string;\r\n cancelButton: string;\r\n informationText: string;\r\n };\r\n storeStatusInfo: {\r\n noOnlineOrdersModalHeader: string;\r\n noOnlineOrdersModalText: string;\r\n noDeliveryOrdersModalHeader: string;\r\n noDeliveryOrdersModalText: string;\r\n noPickupOrdersModalHeader: string;\r\n noPickupOrdersModalText: string;\r\n customStoreUnavailabilityModalHeader: string;\r\n customStoreUnavailabilityModalText: string;\r\n storeStatusModalConfirmButtonText: string;\r\n };\r\n}\r\n\r\nconst initialState: LocalizationStaticContent = {\r\n deliveryIcon: '../../assets/icons/Delivery_circle.svg',\r\n deliveryIconDisabled: '../../assets/icons/Delivery_gray_circle.svg',\r\n deliveryTabText: 'Delivery',\r\n dropdownLabelPickupResults: 'Elige tu tienda más cercana',\r\n dropdownDeliveryLabelRegisteredUser: 'Mis direcciones de entrega',\r\n dropdownPickupLabelRegisteredUser: 'Mis tiendas favoritas',\r\n geolocationTextDelivery: 'Usar mi ubicación actual',\r\n geolocationTextPickup: 'Encontrar mi Pizza Hut mas cercano',\r\n localizationInputPlaceholder: 'Eg. Katowice, Sowińskiego 46',\r\n mainCTA: 'Empezar pedido',\r\n pickupIcon: '../../assets/icons/Takeaway_circle.svg',\r\n pickupIconDisabled: '../../assets/icons/Takeaway_gray_circle.svg',\r\n pickupTabText: 'Pickup',\r\n signInLink: 'Inicia sesión para pedir mucho más rápido',\r\n storeDistanceUnit: '[km]',\r\n changeStore: {\r\n changeDeliveryTitle: 'Recibirás tu pedido en',\r\n changePickupTitle: 'Podres recoger tu pedidio en',\r\n changeStoreButton: 'Cambiar dirección',\r\n goToCatalogButton: 'Ver ofertas',\r\n },\r\n storeIsClosedToast: '¡Vaya! Parece que esta tienda aún no ha abierto. Por favor, inténtalo más tarde.',\r\n chooseTimeHeading: '¿Cuándo quieres tu pedido?',\r\n chooseTimeAsap: 'Lo antes posible',\r\n storeUnavailable: {\r\n outOfDeliveryRangeHeading: 'Vaya, aún no repartimos en esta área',\r\n outOfDeliveryRangeText: 'Elige tu tienda más cercana y recoge allí tu pedido.',\r\n distancePrefix: 'A ',\r\n distanceSuffix: ' Kms de distancia de ti',\r\n noStoreAvailable: 'Vaya, aún no repartimos en esta área, pero pronto lo haremos.',\r\n returnButton: 'Volver',\r\n },\r\n addressAlertModal: {\r\n title: '',\r\n confirmButton: '',\r\n cancelButton: '',\r\n informationText: '',\r\n },\r\n storeStatusInfo: {\r\n noOnlineOrdersModalHeader: '',\r\n noOnlineOrdersModalText: '',\r\n noDeliveryOrdersModalHeader: '',\r\n noDeliveryOrdersModalText: '',\r\n noPickupOrdersModalHeader: '',\r\n noPickupOrdersModalText: '',\r\n customStoreUnavailabilityModalHeader: '',\r\n customStoreUnavailabilityModalText: '',\r\n storeStatusModalConfirmButtonText: '',\r\n },\r\n};\r\n\r\nconst localizationStaticContentReducer = (state = initialState, action: StaticContentActions): LocalizationStaticContent => {\r\n switch (action.type) {\r\n case LocalizationStaticContentActionTypes.SET_STATIC_CONTENT: {\r\n const { payload } = action;\r\n return {\r\n ...state,\r\n ...payload,\r\n };\r\n }\r\n default: {\r\n return { ...state };\r\n }\r\n }\r\n};\r\n\r\nexport default localizationStaticContentReducer;\r\n","import { createStore, applyMiddleware, compose, combineReducers } from 'redux';\r\nimport thunk from 'redux-thunk';\r\nimport { LoadReduxFromCookie } from 'shared/utils';\r\n\r\nimport staticContent from 'shared/store/static-content/static-content.reducer';\r\nimport globalReducer, { GlobalState } from 'shared/store/global/global.reducer';\r\nimport { StaticContent } from 'shared/types';\r\nimport localization, { LocalizationState as _localizationState, initialState as localizationInitialState } from './reducers';\r\nimport localizationStaticContent, { LocalizationStaticContent } from './static-content/localization-static-content.reducer';\r\n\r\nexport interface ApplicationState {\r\n localization: LocalizationState;\r\n staticContent: StaticContent;\r\n localizationStaticContent: LocalizationStaticContent;\r\n global: GlobalState;\r\n}\r\n\r\nconst localizationReducers = {\r\n localization,\r\n localizationStaticContent,\r\n staticContent,\r\n};\r\n\r\nconst rootReducer = combineReducers({\r\n global: globalReducer,\r\n ...localizationReducers,\r\n});\r\n\r\nconst composeEnhancers = (process.env.NODE_ENV === 'development' && window && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__) || compose;\r\n\r\nconst middlewares = [thunk];\r\nconst enhancer = composeEnhancers(applyMiddleware(...middlewares));\r\n\r\nconst store = createStore(\r\n rootReducer,\r\n {\r\n localization: LoadReduxFromCookie({\r\n state: localizationInitialState,\r\n key: 'localization',\r\n }),\r\n },\r\n enhancer,\r\n);\r\n\r\nexport default store;\r\nexport const LocalizationReducers = localizationReducers;\r\nexport type LocalizationState = _localizationState;\r\n","// types\r\nimport { HeaderType } from '../../navigation.types';\r\n\r\nexport interface NavigationState {\r\n headerType: HeaderType;\r\n}\r\n\r\nexport const naviationInitState: NavigationState = {\r\n headerType: HeaderType.Other,\r\n};\r\n\r\nconst navigationReducer = (state = naviationInitState, action: unknown): NavigationState => {\r\n return state;\r\n};\r\n\r\nexport default navigationReducer;\r\n","// actions\r\nimport { AddressActions, AddressWizzardActionsTypes } from './address-wizzard.actions';\r\n\r\n// types\r\nimport { AddressWizzardSteps } from '../../navigation.types';\r\n\r\nconst { SET_WIZZARD_STEP } = AddressWizzardActionsTypes;\r\n\r\nexport interface AddressWizzardState {\r\n currentWizzardStep: AddressWizzardSteps;\r\n}\r\n\r\nexport const addressWizzardInitState: AddressWizzardState = {\r\n currentWizzardStep: AddressWizzardSteps.None,\r\n};\r\n\r\nconst addressWizzardReducer = (state = addressWizzardInitState, action: AddressActions): AddressWizzardState => {\r\n switch (action.type) {\r\n case SET_WIZZARD_STEP: {\r\n const { step } = action.payload;\r\n return {\r\n ...state,\r\n currentWizzardStep: step,\r\n };\r\n }\r\n default: {\r\n return { ...state };\r\n }\r\n }\r\n};\r\n\r\nexport default addressWizzardReducer;\r\n","import { NavigationStaticContentActionTypes, NavigationStaticContentActions } from './static-content.actions';\r\n\r\nexport interface SelectedAddressLabels {\r\n title: string;\r\n delivery: string;\r\n pickup: string;\r\n}\r\nexport interface AccountDropdownLabels {\r\n login: string;\r\n newUserLabel: string;\r\n createAccount: string;\r\n myAccount: string;\r\n myOrders: string;\r\n logout: string;\r\n}\r\nexport interface NavigationStaticContent {\r\n dropdownMenu: AccountDropdownLabels;\r\n logoutModal: {\r\n title: string;\r\n confirmButton: string;\r\n cancelButton: string;\r\n };\r\n selectedAddress: SelectedAddressLabels;\r\n trackOrder: string;\r\n}\r\n\r\nconst initialState: NavigationStaticContent = {\r\n dropdownMenu: {\r\n login: 'Iniciar sesión',\r\n newUserLabel: '¿Eres nuevo?',\r\n createAccount: 'Crea tu cuenta',\r\n myAccount: 'Mi cuenta',\r\n myOrders: 'Mis pedidos',\r\n logout: 'Cerrar sesión',\r\n },\r\n logoutModal: {\r\n title: '¿Quieres salir de tu cuenta?',\r\n confirmButton: 'Continuar',\r\n cancelButton: 'Cancelar',\r\n },\r\n selectedAddress: {\r\n title: 'Pedido',\r\n pickup: 'A recoger',\r\n delivery: 'A domicilio',\r\n },\r\n trackOrder: 'Track your order',\r\n};\r\n\r\nconst pageNotFoundStaticContentReducer = (state = initialState, action: NavigationStaticContentActions): NavigationStaticContent => {\r\n switch (action.type) {\r\n case NavigationStaticContentActionTypes.SET_STATIC_CONTENT: {\r\n return {\r\n ...action.payload,\r\n };\r\n }\r\n default:\r\n return { ...state };\r\n }\r\n};\r\n\r\nexport default pageNotFoundStaticContentReducer;\r\n","import { createStore, applyMiddleware, compose, combineReducers } from 'redux';\r\nimport thunk from 'redux-thunk';\r\nimport { LoadReduxFromCookie } from 'shared/utils';\r\n\r\n// shared\r\nimport global, { GlobalState } from 'shared/store/global/global.reducer';\r\n\r\n// store\r\nimport { LocalizationReducers, LocalizationState } from 'apps/LocalizationApp/Store';\r\nimport { initialState as localizationInitialState } from 'apps/LocalizationApp/Store/reducers';\r\nimport navigation, { NavigationState as _navigationState, naviationInitState } from './navigation/navigation.reducer';\r\nimport addressWizzard, { AddressWizzardState as _addressWizzardState } from './address-wizzard/address-wizzard.reducer';\r\nimport navigationStaticContent, {\r\n NavigationStaticContent as _navigationStaticContentState,\r\n} from './static-content/static-content.reducer';\r\n\r\nexport interface ApplicationState {\r\n localization: LocalizationState;\r\n navigation: _navigationState;\r\n addressWizzard: _addressWizzardState;\r\n navigationStaticContent: _navigationStaticContentState;\r\n global: GlobalState;\r\n}\r\n\r\nconst navigationReducers = {\r\n navigation,\r\n addressWizzard,\r\n navigationStaticContent,\r\n};\r\n\r\nconst rootReducer = combineReducers({\r\n global,\r\n ...navigationReducers,\r\n ...LocalizationReducers,\r\n});\r\n\r\nconst composeEnhancers = (process.env.NODE_ENV === 'development' && window && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__) || compose;\r\n\r\nconst middlewares = [thunk];\r\nconst enhancer = composeEnhancers(applyMiddleware(...middlewares));\r\n\r\nconst store = createStore(\r\n rootReducer,\r\n {\r\n localization: LoadReduxFromCookie({\r\n state: localizationInitialState,\r\n key: 'localization',\r\n }),\r\n },\r\n enhancer,\r\n);\r\n\r\nexport default store;\r\nexport const NavigationReducers = navigationReducers;\r\nexport type NavigationState = _navigationState;\r\nexport type AddressWizzardState = _addressWizzardState;\r\nexport type NavigationStaticContentState = _navigationStaticContentState;\r\nexport const NavigationInitialState = naviationInitState;\r\n","import { ProductActions, ProductActionTypes } from './products.actions';\r\nimport { Category, CategoryDto, Topping, AppConfiguration } from '../../types/dto.types';\r\n\r\nexport interface ProductsState {\r\n activeCategory: string;\r\n categories: Category[];\r\n configuration: AppConfiguration;\r\n items: CategoryDto[];\r\n toppings: Topping[];\r\n loader: {\r\n getProducts: boolean;\r\n refreshProducts: boolean;\r\n offersLoader: boolean;\r\n basketLoader: boolean;\r\n checkoutLoader: boolean;\r\n customizeProductLoader: boolean;\r\n };\r\n header: string;\r\n}\r\n\r\nconst initialState: ProductsState = {\r\n activeCategory: 'PIZ',\r\n categories: [],\r\n configuration: {\r\n maxChangeableToppingsForEditPizza: 8,\r\n maxExtraToppingsForEditPizza: 8,\r\n maxToppingsForCustomPizza: 8,\r\n },\r\n loader: {\r\n getProducts: false,\r\n refreshProducts: false,\r\n offersLoader: false,\r\n basketLoader: false,\r\n checkoutLoader: false,\r\n customizeProductLoader: false,\r\n },\r\n items: [],\r\n toppings: [],\r\n header: '',\r\n};\r\n\r\nconst productsReducer = (state = initialState, action: ProductActions): ProductsState => {\r\n switch (action.type) {\r\n case ProductActionTypes.SET_CONFIGURATION: {\r\n return {\r\n ...state,\r\n configuration: action.payload,\r\n };\r\n }\r\n case ProductActionTypes.SET_CATEGORIES: {\r\n return {\r\n ...state,\r\n categories: action.payload,\r\n };\r\n }\r\n case ProductActionTypes.SET_ACTIVE_CATEGORY: {\r\n return {\r\n ...state,\r\n activeCategory: action.payload,\r\n };\r\n }\r\n case ProductActionTypes.SET_PRODUCTS: {\r\n return {\r\n ...state,\r\n items: action.payload,\r\n };\r\n }\r\n case ProductActionTypes.SET_TOPPINGS: {\r\n return {\r\n ...state,\r\n toppings: action.payload,\r\n };\r\n }\r\n case ProductActionTypes.SET_LOADER: {\r\n const { name, on } = action.payload;\r\n return {\r\n ...state,\r\n loader: {\r\n ...state.loader,\r\n [name]: on,\r\n },\r\n };\r\n }\r\n case ProductActionTypes.SET_PRODUCT_HEADER: {\r\n const header = action.payload;\r\n return {\r\n ...state,\r\n header,\r\n };\r\n }\r\n default: {\r\n return { ...state };\r\n }\r\n }\r\n};\r\n\r\nexport default productsReducer;\r\n","import { MetadataActions, MetadataActionTypes } from './metadata.actions';\r\n\r\nexport interface MetadataState {\r\n title: string;\r\n}\r\n\r\nconst initialState: MetadataState = {\r\n title: ''\r\n};\r\n\r\nconst metadataReducer = (state = initialState, action: MetadataActions): MetadataState => {\r\n switch (action.type) {\r\n case MetadataActionTypes.SET_TITLE: {\r\n const title = action.payload;\r\n return {\r\n ...state,\r\n title,\r\n };\r\n }\r\n default: {\r\n return { ...state };\r\n }\r\n }\r\n};\r\n\r\nexport default metadataReducer;\r\n","import { ProductsStaticContentActionTypes, StaticContentActions } from './products-static-content.actions';\r\n\r\ninterface AllergenStaticContent {\r\n allergenInfoText: string;\r\n allergenLinkText: string;\r\n allergenLinkFullText: string;\r\n allergenLinkUrl: string;\r\n}\r\nexport interface InlineBannerStaticContent {\r\n inlineBannerImage: string;\r\n inlineBannerRow: number;\r\n inlineBannerUrl: string;\r\n inlineBannerVisibility: boolean;\r\n}\r\n\r\ninterface CustomizePizzaStaticContent {\r\n availableToppingsHeadingText: string;\r\n changeText: string;\r\n ctaContinueText: string;\r\n ctaAddToBasketText: string;\r\n ctaAddToOfferText: string;\r\n noToppingsText: string;\r\n selectCheeseText: string;\r\n selectSauceText: string;\r\n selectSauceCheeseHeadingText: string;\r\n selectCrustHeadingText: string;\r\n selectedToppingsHeadingText: string;\r\n}\r\n\r\nexport interface XTastyStaticContent {\r\n firstHalfTabText: string;\r\n secondHalfTabText: string;\r\n pizzaHalfIconActiveUrl: string;\r\n pizzaHalfIconDisabledUrl: string;\r\n pizzaHalfIconUnactiveUrl: string;\r\n selectRecipeText: string;\r\n nextSliceText: string;\r\n}\r\n\r\ninterface ProductCardStaticContent {\r\n dropdownLabel: string;\r\n pizzaDropdownLabel: string;\r\n starterDropdownLabel: string;\r\n mainCta: string;\r\n modifyButton: string;\r\n xtastyCta: string;\r\n cyoCta: string;\r\n isOutOfStock: string;\r\n}\r\nexport interface OffersStaticContent {\r\n offersCategory: string;\r\n mainCta: string;\r\n chooseProduct: string;\r\n choosePizza: string;\r\n chooseProductHeading: string;\r\n offerCompositionMainCta: string;\r\n offerCompilationGoBackButton: string;\r\n popularOffers: string;\r\n}\r\n\r\nexport interface BasketStaticContent {\r\n backButton: string;\r\n header: string;\r\n dynamicText: string;\r\n dynamicTextLink: string;\r\n dynamicTextItemsAddedPrefix: string;\r\n dynamicTextLinkItemsAdded: string;\r\n dynamicTextItemsAddedSuffix: string;\r\n promoCodeHeader: string;\r\n promoCodeLink: string;\r\n upsellHeader: string;\r\n cta: string;\r\n}\r\n\r\nexport interface VoucherModalStaticContent {\r\n heading: string;\r\n info: string;\r\n cta: string;\r\n placeholder: string;\r\n errorMessageRequired: string;\r\n errorMessageWrongCoupon: string;\r\n}\r\n\r\nexport interface ModalBaseStaticContent {\r\n header: string;\r\n subHeader: string;\r\n ctaText: string;\r\n}\r\nexport interface LastUserOrderLabels {\r\n header: string;\r\n showDetails: string;\r\n hideDetails: string;\r\n ctaText: string;\r\n}\r\n\r\nexport interface ProductsStaticContent {\r\n allergen: AllergenStaticContent;\r\n customizePizza: CustomizePizzaStaticContent;\r\n xTastyPizza: XTastyStaticContent;\r\n inlineBanner: InlineBannerStaticContent;\r\n productCard: ProductCardStaticContent;\r\n basket: BasketStaticContent;\r\n offers: OffersStaticContent;\r\n voucherModal: VoucherModalStaticContent;\r\n showBasket: string;\r\n extraSurcharge: string;\r\n addedToppingLabel: string;\r\n removedToppingLabel: string;\r\n productNotAvailableModal: ModalBaseStaticContent;\r\n offerNotAvailableModal: ModalBaseStaticContent;\r\n invalidCombinationModal: ModalBaseStaticContent;\r\n invalidProductCompositionForOfferModal: ModalBaseStaticContent;\r\n productIngredients: string;\r\n lastUserOrder: LastUserOrderLabels;\r\n noOfVouchersExceededModal: ModalBaseStaticContent;\r\n couponCodeInvalidModal: ModalBaseStaticContent;\r\n}\r\n\r\nconst initialState: ProductsStaticContent = {\r\n addedToppingLabel: 'Con',\r\n removedToppingLabel: 'Sin',\r\n allergen: {\r\n allergenInfoText: 'Listado de alérgenos',\r\n allergenLinkFullText: 'Informacion alergenos',\r\n allergenLinkText: 'IInfórmate aquí',\r\n allergenLinkUrl: '/allergens',\r\n },\r\n customizePizza: {\r\n availableToppingsHeadingText: 'Añade Ingredientes',\r\n changeText: 'Cambiar',\r\n ctaContinueText: 'Continuar',\r\n ctaAddToBasketText: 'Añadir al carrito',\r\n ctaAddToOfferText: 'Añadir al oferta',\r\n noToppingsText: 'No has añadido ningún ingrediente',\r\n selectCheeseText: 'Tu base de queso',\r\n selectSauceText: 'Tu salsa',\r\n selectSauceCheeseHeadingText: 'Cambia tu salsa o base de mozarella',\r\n selectCrustHeadingText: 'Selecciona tamaño y masa',\r\n selectedToppingsHeadingText: 'Tus ingredientes',\r\n },\r\n inlineBanner: {\r\n inlineBannerImage: '',\r\n inlineBannerRow: 0,\r\n inlineBannerUrl: '',\r\n inlineBannerVisibility: false,\r\n },\r\n productCard: {\r\n dropdownLabel: '¿Cómo te apetece?',\r\n pizzaDropdownLabel: 'Elige el tamaño y la masa',\r\n starterDropdownLabel: 'Elige la salsa',\r\n mainCta: 'Añadir',\r\n modifyButton: 'personalizar',\r\n cyoCta: 'Crear!',\r\n xtastyCta: 'Componer!',\r\n isOutOfStock: 'No disponible',\r\n },\r\n basket: {\r\n backButton: '< Atrás',\r\n header: 'Mi Pedido',\r\n dynamicText: 'Aún no has añadido ningún producto a tu cesta, ',\r\n dynamicTextLink: '¿quieres ver nuestras ofertas?',\r\n dynamicTextItemsAddedPrefix: 'Recuerda que también puedes aplicar tus ',\r\n dynamicTextLinkItemsAdded: 'ofertas',\r\n dynamicTextItemsAddedSuffix: ' en el último paso.',\r\n promoCodeHeader: '¿Tienes algún código promocional?',\r\n promoCodeLink: 'Añade tu tu código promocional aquí',\r\n upsellHeader: '¡Completa tu pedido!',\r\n cta: 'Continuar',\r\n },\r\n voucherModal: {\r\n heading: 'Introduce aquí tu código de descuento',\r\n info: 'Si no lo tienes ¡no te preocupes! Ve a nuestra página de ofertas para conseguir las mejores promociones.',\r\n cta: 'Apilcar',\r\n placeholder: 'Código de descuento',\r\n errorMessageRequired: 'Código de descuento requiere',\r\n errorMessageWrongCoupon: 'Código de descuento inválido',\r\n },\r\n offers: {\r\n offersCategory: 'Ofertas',\r\n mainCta: 'Elegir oferta',\r\n choosePizza: 'Anade tu pizza',\r\n chooseProduct: 'Choose a product',\r\n chooseProductHeading: 'Choose a product',\r\n offerCompositionMainCta: 'Añadir oferta',\r\n offerCompilationGoBackButton: '< Volver a Ofertas',\r\n popularOffers: 'Ofertas especiales',\r\n },\r\n xTastyPizza: {\r\n nextSliceText: 'Siguiente rebanada',\r\n firstHalfTabText: 'Primera Mitad',\r\n secondHalfTabText: 'Segunda Mitad',\r\n pizzaHalfIconUnactiveUrl: 'assets/icons/PizzaHalf_unactive.svg',\r\n pizzaHalfIconActiveUrl: 'assets/icons/PizzaHalf_active.svg',\r\n pizzaHalfIconDisabledUrl: 'assets/icons/PizzaHalf_disabled.svg',\r\n selectRecipeText: 'Selecciona la base de tu pizza',\r\n },\r\n showBasket: 'Ver pedido',\r\n extraSurcharge: 'Suplemento de {price}* de la masa {crustType} incluido en el precio.',\r\n productNotAvailableModal: {\r\n header: 'Tu selección no está disponible en esta tienda',\r\n subHeader:\r\n '¡Vaya! Parece que la oferta o producto que has elegido no está disponible en tu tienda. Por favor, elige otro y disfruta el mejor sabor.',\r\n ctaText: 'Entendido',\r\n },\r\n offerNotAvailableModal: {\r\n header: 'Tu selección no está disponible en esta tienda',\r\n subHeader:\r\n '¡Vaya! Parece que la oferta o producto que has elegido no está disponible en tu tienda. Por favor, elige otro y disfruta el mejor sabor.',\r\n ctaText: 'Entendido',\r\n },\r\n invalidCombinationModal: {\r\n header: 'Estas ofertas no se pueden acumular',\r\n subHeader: 'Parece que las ofertas que has elegido no son acumulables. Si continúas, la oferta anterior se anulará.',\r\n ctaText: '¡De acuerdo!',\r\n },\r\n invalidProductCompositionForOfferModal: {\r\n header: 'Esta oferta no es compatible',\r\n subHeader: '¡Vaya! Parece que los productos que ha elegido no se pueden combinar con esta oferta.',\r\n ctaText: '¡De acuerdo!',\r\n },\r\n productIngredients: 'Ver valores nutricionales',\r\n lastUserOrder: {\r\n header: 'Repite tu último pedido',\r\n showDetails: 'Ver detalles',\r\n hideDetails: 'Ocultar detalles',\r\n ctaText: 'Añadir',\r\n },\r\n noOfVouchersExceededModal: {\r\n header: 'Tu selección no está disponible en esta tienda',\r\n subHeader:\r\n '¡Vaya! Parece que la oferta o producto que has elegido no está disponible en tu tienda. Por favor, elige otro y disfruta el mejor sabor',\r\n ctaText: 'Entendido',\r\n },\r\n couponCodeInvalidModal: {\r\n header: 'Tu selección no está disponible en esta tienda',\r\n subHeader: 'Código de descuento inválido',\r\n ctaText: 'Entendido',\r\n },\r\n};\r\n\r\nconst productsStaticContentReducer = (state = initialState, action: StaticContentActions): ProductsStaticContent => {\r\n switch (action.type) {\r\n case ProductsStaticContentActionTypes.SET_STATIC_CONTENT: {\r\n const { payload } = action;\r\n return {\r\n ...state,\r\n ...payload,\r\n inlineBanner: state.inlineBanner,\r\n };\r\n }\r\n case ProductsStaticContentActionTypes.SET_INLINE_BANNER: {\r\n const { payload } = action;\r\n return {\r\n ...state,\r\n inlineBanner: payload,\r\n };\r\n }\r\n default: {\r\n return { ...state };\r\n }\r\n }\r\n};\r\n\r\nexport default productsStaticContentReducer;\r\n","function uuidGenerator(): string {\r\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function replacing(c): string {\r\n const r = (Math.random() * 16) | 0;\r\n const v = c === 'x' ? r : r & (0x3 | 0x8);\r\n return v.toString(16);\r\n });\r\n}\r\n\r\nexport default uuidGenerator;\r\n","import { AccountHistoryOrderDto } from 'apps/AccountManagementApp/account-details.types';\r\nimport { FormControl } from 'shared/components/form-input.component';\r\nimport uuidGenerator from 'shared/tools/uuid-generator';\r\nimport { AppliedCoupon, Basket, BasketItem, BasketOffer, CrossSellOffer } from '../../types/basket.types';\r\nimport { BasketActionTypes, BasketActions, BasketOptions } from './basket.actions';\r\n\r\nexport interface BasketState {\r\n language: string;\r\n basket: Basket;\r\n basketTraceId: string;\r\n crossSell?: CrossSellOffer;\r\n showVoucherModal: boolean;\r\n voucherControl: FormControl;\r\n pausedRecalculateRequest?: {\r\n items: BasketItem[];\r\n coupons: AppliedCoupon[];\r\n compiledOffers?: BasketOffer[];\r\n params: BasketOptions;\r\n };\r\n showProductNotAvailableModal: boolean;\r\n showOfferNotAvailableModal: boolean;\r\n outOfStockDetails?: { outOfStockProducts: string[]; basketItems: BasketItem[]; basketCoupons: AppliedCoupon[] };\r\n lastUserOrder?: AccountHistoryOrderDto;\r\n showNoOfVouchersExceededModal: boolean;\r\n showCouponCodeInvalidModal: boolean;\r\n}\r\n\r\nexport const initialState: BasketState = {\r\n language: '',\r\n basket: {\r\n items: [],\r\n coupons: [],\r\n compiledOffers: [],\r\n totalPrice: 0,\r\n deliveryAddress: undefined\r\n },\r\n basketTraceId: uuidGenerator(),\r\n showVoucherModal: false,\r\n voucherControl: {\r\n value: '',\r\n touched: false,\r\n },\r\n showProductNotAvailableModal: false,\r\n showOfferNotAvailableModal: false,\r\n showNoOfVouchersExceededModal: false,\r\n showCouponCodeInvalidModal: false,\r\n};\r\n\r\nconst basketReducer = (state = initialState, action: BasketActions): BasketState => {\r\n switch (action.type) {\r\n case BasketActionTypes.SET_BASKET: {\r\n return {\r\n ...state,\r\n basket: action.payload,\r\n };\r\n }\r\n case BasketActionTypes.SET_LANGUAGE: {\r\n return {\r\n ...state,\r\n language: action.payload,\r\n };\r\n }\r\n case BasketActionTypes.SET_CROSS_SELL: {\r\n return {\r\n ...state,\r\n crossSell: action.payload,\r\n };\r\n }\r\n case BasketActionTypes.SET_VOUCHER_MODAL_VISIBILITY: {\r\n return {\r\n ...state,\r\n showVoucherModal: action.payload,\r\n };\r\n }\r\n case BasketActionTypes.SET_VOUCHER_INPUT: {\r\n return {\r\n ...state,\r\n voucherControl: action.payload,\r\n };\r\n }\r\n case BasketActionTypes.SET_PAUSED_RECALCULATE_REQUEST: {\r\n return {\r\n ...state,\r\n pausedRecalculateRequest: action.payload,\r\n };\r\n }\r\n case BasketActionTypes.SET_PRODUCT_NOT_AVAILABLE_MODAL: {\r\n return {\r\n ...state,\r\n showProductNotAvailableModal: action.payload,\r\n };\r\n }\r\n case BasketActionTypes.SET_OFFER_NOT_AVAILABLE_MODAL: {\r\n return {\r\n ...state,\r\n showOfferNotAvailableModal: action.payload,\r\n };\r\n }\r\n case BasketActionTypes.SET_LAST_USER_ORDER: {\r\n return {\r\n ...state,\r\n lastUserOrder: action.payload,\r\n };\r\n }\r\n case BasketActionTypes.SET_OUT_OF_STOCK_PRODUCTS: {\r\n return {\r\n ...state,\r\n outOfStockDetails: action.payload,\r\n };\r\n }\r\n case BasketActionTypes.SET_NO_OF_VOUCHERS_EXCEEDED_MODAL: {\r\n return {\r\n ...state,\r\n showNoOfVouchersExceededModal: action.payload,\r\n };\r\n }\r\n case BasketActionTypes.SET_COUPON_CODE_INVALID_MODAL: {\r\n return {\r\n ...state,\r\n showCouponCodeInvalidModal: action.payload,\r\n };\r\n }\r\n default: {\r\n return { ...state };\r\n }\r\n }\r\n};\r\n\r\nexport default basketReducer;\r\n","import { Offer, OfferCustomizationDetails, OffersComboDto } from '../../types/dto.types';\r\nimport { OffersActionTypes, OffersActions } from './offers.actions';\r\n\r\nexport interface OffersState {\r\n offers: Offer[];\r\n customizationOffer?: OfferCustomizationDetails;\r\n openDealConfiguration?: boolean;\r\n offersCombo?: OffersComboDto[];\r\n invalidComboModal?: {\r\n show: boolean;\r\n couponCode: string;\r\n addedOfferPosition: number | string;\r\n };\r\n invalidProductCompositionModal?: {\r\n show: boolean;\r\n };\r\n}\r\n\r\nconst initialState: OffersState = {\r\n offers: [],\r\n};\r\n\r\nconst offersReducer = (state = initialState, action: OffersActions): OffersState => {\r\n switch (action.type) {\r\n case OffersActionTypes.SET_OFFERS: {\r\n return {\r\n ...state,\r\n offers: action.payload,\r\n };\r\n }\r\n case OffersActionTypes.SET_CUSTOMIZATION_OFFER: {\r\n return {\r\n ...state,\r\n customizationOffer: action.payload,\r\n };\r\n }\r\n case OffersActionTypes.SET_OPEN_DEAL_CONFIGURATION: {\r\n return {\r\n ...state,\r\n openDealConfiguration: action.payload,\r\n };\r\n }\r\n case OffersActionTypes.SET_OFFERS_COMBINATION: {\r\n return {\r\n ...state,\r\n offersCombo: action.payload,\r\n };\r\n }\r\n case OffersActionTypes.SET_INVALID_COMBINATION_MODAL: {\r\n return {\r\n ...state,\r\n invalidComboModal: action.payload,\r\n };\r\n }\r\n case OffersActionTypes.SET_INVALID_PRODUCT_COMPOSITION_MODAL: {\r\n return {\r\n ...state,\r\n invalidProductCompositionModal: action.payload,\r\n };\r\n }\r\n default: {\r\n return { ...state };\r\n }\r\n }\r\n};\r\n\r\nexport default offersReducer;\r\n","import { createStore, applyMiddleware, compose, combineReducers } from 'redux';\r\nimport thunk from 'redux-thunk';\r\nimport { LoadReduxFromLocalStorage, LoadReduxFromCookie } from 'shared/utils';\r\n\r\nimport {\r\n NavigationReducers,\r\n ApplicationState as NavigationApplicationState,\r\n NavigationInitialState,\r\n AddressWizzardState,\r\n} from 'apps/NavigationApp/store';\r\nimport { HeaderType } from 'apps/NavigationApp/navigation.types';\r\nimport globalReducer, { GlobalState } from 'shared/store/global/global.reducer';\r\nimport { LocalizationReducers, ApplicationState as LocalizationApplicationState } from 'apps/LocalizationApp/Store/';\r\nimport { LocalizationState, initialState as localizationInitState } from 'apps/LocalizationApp/Store/reducers';\r\nimport { CustomizeProductState, customizeProductReducer } from 'apps/ProductsApp/store/customize-product/customize-product.reducer';\r\nimport checkoutStaticContent, { CheckoutStaticContent } from 'apps/ProductsApp/store/static-content/checkout-static-content-reducer';\r\n\r\n// store\r\nimport { addressWizzardInitState } from 'apps/NavigationApp/store/address-wizzard/address-wizzard.reducer';\r\nimport products, { ProductsState } from './products/products.reducer';\r\nimport metadata, { MetadataState } from './metadata/metadata.reducer';\r\nimport productsStaticContent, { ProductsStaticContent } from './static-content/products-static-content.reducer';\r\nimport basketReducer, { BasketState, initialState as basketInitState } from './basket/basket.reducer';\r\nimport offers, { OffersState } from './offers/offers.reducer';\r\nimport checkout, { CheckoutState } from './checkout/checkout.reducer';\r\n\r\nexport interface ApplicationState extends NavigationApplicationState, LocalizationApplicationState {\r\n productsStaticContent: ProductsStaticContent;\r\n global: GlobalState;\r\n basket: BasketState;\r\n products: ProductsState;\r\n customizeProduct: CustomizeProductState;\r\n offers: OffersState;\r\n checkout: CheckoutState;\r\n checkoutStaticContent: CheckoutStaticContent;\r\n metadata: MetadataState;\r\n}\r\n\r\nconst rootReducer = combineReducers({\r\n productsStaticContent,\r\n global: globalReducer,\r\n basket: basketReducer,\r\n customizeProduct: customizeProductReducer,\r\n products,\r\n offers,\r\n checkout,\r\n checkoutStaticContent,\r\n metadata,\r\n ...NavigationReducers,\r\n ...LocalizationReducers,\r\n});\r\n\r\nconst composeEnhancers = (process.env.NODE_ENV === 'development' && window && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__) || compose;\r\n\r\nconst middlewares = [thunk];\r\nconst enhancer = composeEnhancers(applyMiddleware(...middlewares));\r\n\r\nconst store = createStore(\r\n rootReducer,\r\n {\r\n localization: LoadReduxFromCookie({\r\n state: localizationInitState,\r\n key: 'localization',\r\n }),\r\n navigation: {\r\n ...NavigationInitialState,\r\n headerType: HeaderType.PLPorOLP,\r\n },\r\n basket: LoadReduxFromLocalStorage({\r\n state: basketInitState,\r\n key: 'basket',\r\n }),\r\n addressWizzard: LoadReduxFromLocalStorage({\r\n state: addressWizzardInitState,\r\n key: 'addressWizzard',\r\n }),\r\n },\r\n enhancer,\r\n);\r\n\r\nexport default store;\r\nexport { ProductsStaticContent, GlobalState, BasketState, ProductsState, CustomizeProductState, OffersState, MetadataState };\r\nexport type AppDispatch = typeof store.dispatch;\r\n","import { RefObject, useEffect, useRef } from 'react';\r\n\r\nfunction useEventListener(eventName: K, handler: (event: WindowEventMap[K]) => void): void;\r\nfunction useEventListener(\r\n eventName: K,\r\n handler: (event: HTMLElementEventMap[K]) => void,\r\n element: RefObject,\r\n): void;\r\n\r\nfunction useEventListener(\r\n eventName: KW | KH,\r\n handler: (event: WindowEventMap[KW] | HTMLElementEventMap[KH] | Event) => void,\r\n element?: RefObject,\r\n) {\r\n // Create a ref that stores handler\r\n const savedHandler = useRef();\r\n\r\n useEffect(() => {\r\n // Define the listening target\r\n const targetElement: T | Window = element?.current || window;\r\n if (!(targetElement && targetElement.addEventListener)) {\r\n return;\r\n }\r\n\r\n // Update saved handler if necessary\r\n if (savedHandler.current !== handler) {\r\n savedHandler.current = handler;\r\n }\r\n\r\n // Create event listener that calls handler function stored in ref\r\n const eventListener: typeof handler = (event) => {\r\n // eslint-disable-next-line no-extra-boolean-cast\r\n if (!!savedHandler?.current) {\r\n savedHandler.current(event);\r\n }\r\n };\r\n\r\n targetElement.addEventListener(eventName, eventListener);\r\n\r\n // Remove event listener on cleanup\r\n return () => {\r\n targetElement.removeEventListener(eventName, eventListener);\r\n };\r\n }, [eventName, element, handler]);\r\n}\r\n\r\nexport default useEventListener;\r\n","import { RefObject } from 'react';\r\nimport useEventListener from './useEventListener';\r\n\r\ntype Handler = (event: Event) => void;\r\n\r\nfunction useOnClickOutside(ref: RefObject, handler: Handler): void {\r\n useEventListener('click', (event) => {\r\n const el = ref?.current;\r\n\r\n // Do nothing if clicking ref's element or descendent elements\r\n if (!el || el.contains(event.target as Node)) {\r\n return;\r\n }\r\n\r\n handler(event);\r\n });\r\n}\r\n\r\nexport default useOnClickOutside;\r\n","import React, { useRef, useState } from 'react';\r\nimport useOnClickOutside from 'hooks/useOutsideClick';\r\nimport { appCulture, hostURL } from 'shared/helpers/routing-helpers';\r\nimport { SupportedCulture } from 'shared/types';\r\nimport { capitalizeFirstLetter } from 'shared/utils';\r\nimport Radio from 'shared/components/radio.component';\r\n\r\ninterface LanguageSwitchProps {\r\n cultures: SupportedCulture[];\r\n}\r\n\r\nconst LanguageSwitch: React.FC = ({ cultures }): JSX.Element | null => {\r\n const [expand, setExpand] = useState(false);\r\n\r\n const ref = useRef(null);\r\n\r\n useOnClickOutside(ref, () => {\r\n setExpand(false);\r\n });\r\n\r\n if (!cultures || cultures.length === 1) return null;\r\n\r\n const baseUrl = hostURL();\r\n const selectedCulture = cultures.find((clt) => clt.id === appCulture()) ?? cultures.find((clt) => clt.isDefault);\r\n\r\n function createLink(culture: SupportedCulture): string {\r\n const baseUrlWithCulture = new URL(createBaseUrl(culture));\r\n baseUrlWithCulture.searchParams.append('forceCulture', 'true');\r\n return baseUrlWithCulture.href;\r\n }\r\n\r\n function createBaseUrl(culture: SupportedCulture): string {\r\n const segments = document.location.pathname\r\n .concat(document.location.search)\r\n .split('/')\r\n .filter((el) => el !== '');\r\n if (segments.length >= 1) {\r\n if (segments[0] === appCulture()) {\r\n if (segments[0] === culture.id) {\r\n return document.location.href;\r\n }\r\n segments.shift();\r\n }\r\n return `${baseUrl}${culture.isDefault ? '' : `${culture.id}/`}${segments.join('/')}`;\r\n }\r\n return `${baseUrl}${culture.isDefault ? '' : `${culture.id}/`}`;\r\n }\r\n\r\n return (\r\n
setExpand(!expand)} ref={ref}>\r\n \r\n

{capitalizeFirstLetter(selectedCulture?.fullName).slice(0, 3)}

\r\n \r\n
\r\n
\r\n {cultures.map((culture) => {\r\n return (\r\n \r\n
\r\n \r\n
\r\n\r\n

{capitalizeFirstLetter(culture.fullName)}

\r\n \r\n );\r\n })}\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default LanguageSwitch;\r\n","import React, { useRef, useState } from 'react';\r\nimport useOnClickOutside from 'hooks/useOutsideClick';\r\nimport { hostURL, redirectToOtherAppURL } from 'shared/helpers/routing-helpers';\r\n\r\nimport { AccountDropdownLabels } from 'apps/NavigationApp/store/static-content/static-content.reducer';\r\n\r\ninterface AccountDropdownProps {\r\n singedIn: boolean;\r\n labels: AccountDropdownLabels;\r\n showModal(): void;\r\n}\r\n\r\nconst AccountDropdown: React.FC = ({ singedIn, labels, showModal }): JSX.Element | null => {\r\n const [expand, setExpand] = useState(false);\r\n const currentPath = window.location.pathname;\r\n\r\n const userIcon = singedIn ? 'Account_filled.svg' : 'Account.svg';\r\n\r\n const ref = useRef(null);\r\n\r\n useOnClickOutside(ref, () => {\r\n setExpand(false);\r\n });\r\n\r\n return (\r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
setExpand(!expand)} ref={ref}>\r\n \r\n \r\n \r\n
\r\n {!singedIn && (\r\n <>\r\n {\r\n redirectToOtherAppURL('account');\r\n }}\r\n className=\"btn btn-outline-primary signin-button btn-sm mb-3 mt-4\"\r\n type=\"button\"\r\n data-testid=\"navigation-menu-dropdown__button--login\"\r\n >\r\n {labels.login}\r\n \r\n
\r\n

{labels.newUserLabel}

\r\n
\r\n \r\n {labels.createAccount}\r\n \r\n
\r\n
\r\n \r\n )}\r\n\r\n \r\n \r\n

{labels.myAccount}

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

{labels.myOrders}

\r\n \r\n {singedIn && (\r\n {\r\n showModal();\r\n }}\r\n data-testid=\"navigation-menu-dropdown__button--logout\"\r\n >\r\n \r\n

{labels.logout}

\r\n \r\n )}\r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default AccountDropdown;\r\n","import React, { useEffect, useState } from 'react';\r\nimport { SelectedAddressLabels } from 'apps/NavigationApp/store/static-content/static-content.reducer';\r\n\r\n// types\r\nimport { HeaderType, SimplifiedAddress } from '../navigation.types';\r\n\r\ninterface SelectedAddressProps {\r\n headerType: HeaderType;\r\n address: SimplifiedAddress;\r\n onAddressClickFn(): void;\r\n isDelivery: boolean;\r\n labels: SelectedAddressLabels;\r\n}\r\n\r\nconst SelectedAddress = ({ headerType, address, onAddressClickFn, isDelivery, labels }: SelectedAddressProps): JSX.Element => {\r\n const [streetWidth, setStreetWidth] = useState(0);\r\n\r\n useEffect(() => {\r\n function renderBtnStyle(): void {\r\n const containerWidth = document.getElementById('header-address-container')?.clientWidth;\r\n const iconWidth = document.getElementById('header-address-icon')?.clientWidth;\r\n const prefixWidth = document.getElementById('header-address-prefix')?.clientWidth;\r\n const textEndWidth = document.getElementById('header-address-non-truncated-part')?.clientWidth;\r\n\r\n if (containerWidth && iconWidth && prefixWidth && textEndWidth) {\r\n return setStreetWidth(containerWidth - (iconWidth + 4) - prefixWidth - textEndWidth);\r\n }\r\n\r\n if (containerWidth && iconWidth && textEndWidth) {\r\n return setStreetWidth(containerWidth - (iconWidth + 4) - textEndWidth);\r\n }\r\n }\r\n\r\n renderBtnStyle();\r\n window.addEventListener('resize', renderBtnStyle);\r\n\r\n return (): void => {\r\n window.removeEventListener('resize', renderBtnStyle);\r\n };\r\n }, []);\r\n const addressVisibility = headerType === HeaderType.Other || !address.street;\r\n\r\n if (addressVisibility) {\r\n return <>;\r\n }\r\n\r\n // TODO update labels to be fetched from CMS\r\n return (\r\n <>\r\n {address && (\r\n
\r\n
\r\n
\r\n \r\n
\r\n {labels.title}\r\n \r\n {isDelivery ? labels.delivery : labels.pickup}\r\n \r\n
\r\n \r\n \r\n {address.street}\r\n \r\n \r\n , {address.streetNumber}, {address.city}\r\n \r\n
\r\n
\r\n
\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default SelectedAddress;\r\n","import React from 'react';\r\n\r\ninterface ToastProps {\r\n show: boolean;\r\n message: string;\r\n onClose(): void;\r\n}\r\n\r\nconst Toast: React.FC = ({ message, onClose, show }) => {\r\n return (\r\n \r\n {message}\r\n \r\n \r\n );\r\n};\r\n\r\nexport default Toast;\r\n","import { LocalizationStaticContent } from 'apps/LocalizationApp/Store/static-content/localization-static-content.reducer';\r\nimport React from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { ApplicationState } from '../Store';\r\nimport { LocalizationState } from '../Store/reducers';\r\nimport { StoreDto } from '../types/dto.types';\r\n\r\ninterface StoresListProps {\r\n onSelect(store: StoreDto): void;\r\n show: boolean;\r\n onToggle(): void;\r\n distanceUnit: string;\r\n}\r\n\r\nconst StoresList: React.FC = ({ onSelect, show, onToggle, distanceUnit }) => {\r\n const { nearbyStores, selectedAddress } = useSelector((state) => state.localization);\r\n const { dropdownLabelPickupResults } = useSelector(\r\n (state) => state.localizationStaticContent,\r\n );\r\n\r\n function renderStores(): JSX.Element {\r\n return (\r\n <>\r\n \r\n

{dropdownLabelPickupResults}

\r\n \r\n \r\n
\r\n {show &&\r\n nearbyStores.map((store) => {\r\n return (\r\n {\r\n gtm.localizationModule.submitClickedOnCollection();\r\n onSelect(store);\r\n }}\r\n key={store.id}\r\n className=\"store-suggestion-item p-2 px-lg-3 d-flex\"\r\n data-testid=\"localization__button--select-store\"\r\n >\r\n
\r\n \r\n
\r\n

\r\n {`${store.street}, ${store.streetNumber}${\r\n selectedAddress.isCompleteAddress\r\n ? ` (${(store.distance / 1000).toFixed(1)} ${distanceUnit})`\r\n : ''\r\n }`}\r\n

\r\n

\r\n {store.city}\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 <>{nearbyStores.length > 0 && renderStores()};\r\n};\r\n\r\nexport default StoresList;\r\n","import React, { useEffect, useState } from 'react';\r\nimport { AddressDetailsDto, AddressSuggestionDto } from '../../apps/LocalizationApp/types/dto.types';\r\n\r\ninterface PredictionsProps {\r\n suggestions: AddressSuggestionDto[];\r\n onSelect(placeId: string): void;\r\n selectedAddress: AddressDetailsDto;\r\n}\r\n\r\nconst Suggestions: React.FC = ({ suggestions, onSelect, selectedAddress }) => {\r\n const [selectedSuggestion, setSelectedSuggestion] = useState();\r\n const suggestionsIds = suggestions.map((suggestion) => suggestion.placeId);\r\n\r\n useEffect(() => {\r\n window.addEventListener('keydown', handleKeyboardNavigation);\r\n if (selectedSuggestion) {\r\n document.getElementById(selectedSuggestion)?.classList.add('selected');\r\n }\r\n return () => {\r\n window.removeEventListener('keydown', handleKeyboardNavigation);\r\n };\r\n });\r\n\r\n const handleKeyboardNavigation = (e: KeyboardEvent) => {\r\n switch (e.key) {\r\n case 'Down':\r\n e.preventDefault();\r\n moveDown();\r\n case 'ArrowDown':\r\n e.preventDefault();\r\n moveDown();\r\n break;\r\n case 'Up':\r\n e.preventDefault();\r\n moveUp();\r\n case 'ArrowUp':\r\n e.preventDefault();\r\n moveUp();\r\n break;\r\n case 'Enter':\r\n e.preventDefault();\r\n selectedSuggestion && onSelect(selectedSuggestion);\r\n default:\r\n break;\r\n }\r\n };\r\n\r\n const moveDown = () => {\r\n if (selectedSuggestion) {\r\n const currentSuggestion = document.getElementById(selectedSuggestion);\r\n const currentSuggestionIndex = suggestionsIds.indexOf(selectedSuggestion);\r\n const nextSuggestion = suggestionsIds[currentSuggestionIndex < suggestionsIds.length - 1 ? currentSuggestionIndex + 1 : 0];\r\n currentSuggestion?.classList.remove('selected');\r\n setSelectedSuggestion(nextSuggestion);\r\n } else {\r\n setSelectedSuggestion(suggestionsIds[0]);\r\n }\r\n };\r\n\r\n const moveUp = () => {\r\n if (selectedSuggestion) {\r\n const currentSuggestion = document.getElementById(selectedSuggestion);\r\n const currentSuggestionIndex = suggestionsIds.indexOf(selectedSuggestion);\r\n const nextSuggestion =\r\n suggestionsIds[currentSuggestionIndex === 0 ? suggestionsIds.length - 1 : currentSuggestionIndex - 1];\r\n currentSuggestion?.classList.remove('selected');\r\n setSelectedSuggestion(nextSuggestion);\r\n } else {\r\n setSelectedSuggestion(suggestionsIds[-1]);\r\n }\r\n };\r\n\r\n function renderSuggestion(suggestion: AddressSuggestionDto): JSX.Element {\r\n const isSuggestionSubstr = suggestion.mainText.toLowerCase().includes(selectedAddress.value.toLowerCase());\r\n const formattedSuggestion =\r\n isSuggestionSubstr && suggestion.mainText.toLowerCase().split(selectedAddress.value.toLowerCase(), 2);\r\n return (\r\n <>\r\n {formattedSuggestion ? (\r\n

\r\n {formattedSuggestion[0]}\r\n {selectedAddress.value}\r\n {formattedSuggestion[1]}\r\n

\r\n ) : (\r\n

\r\n {suggestion.mainText}\r\n

\r\n )}\r\n {suggestion.secondaryText && (\r\n

\r\n {suggestion.secondaryText}\r\n

\r\n )}\r\n \r\n );\r\n }\r\n\r\n return (\r\n <>\r\n {suggestions &&\r\n suggestions.map((suggestion) => (\r\n {\r\n onSelect(suggestion.placeId);\r\n }}\r\n key={suggestion.placeId}\r\n className=\"address-suggestion-item d-flex p-1\"\r\n data-testid=\"localization__button--select-suggestion\"\r\n tabIndex={0}\r\n id={suggestion.placeId}\r\n >\r\n
\r\n \r\n
{renderSuggestion(suggestion)}
\r\n
\r\n \r\n ))}{' '}\r\n \r\n );\r\n};\r\n\r\nexport default Suggestions;\r\n","import React from 'react';\r\nimport useShowDelay from 'hooks/useShowDelay';\r\nimport { ApplicationState } from 'apps/LocalizationApp/Store';\r\nimport { useSelector } from 'react-redux';\r\nimport { LocalizationStaticContent } from '../Store/static-content/localization-static-content.reducer';\r\nimport { AddressDetailsDto } from '../types/dto.types';\r\n\r\ninterface AddressInputProps {\r\n address: AddressDetailsDto;\r\n isPickup: boolean;\r\n onChangeFn(sender?: React.ChangeEvent, clear?: boolean): void;\r\n onClear(): void;\r\n suggestionsHelper(): void;\r\n showStreetNumberInput: boolean;\r\n}\r\n\r\nconst AddressInput: React.FC = ({\r\n address,\r\n isPickup,\r\n onChangeFn,\r\n onClear,\r\n suggestionsHelper,\r\n showStreetNumberInput,\r\n}) => {\r\n const { localizationInputPlaceholder } = useSelector(\r\n (state) => state.localizationStaticContent,\r\n );\r\n\r\n const { value, streetNumber } = address;\r\n const { show: showClear } = useShowDelay(!!value);\r\n\r\n function onClickHandler(): void {\r\n if (value) {\r\n suggestionsHelper();\r\n }\r\n isPickup ? gtm.localizationModule.inputClickedOnCollection() : gtm.localizationModule.inputClickedOnDelivery();\r\n }\r\n\r\n function getInputStyle(): string {\r\n if (!showStreetNumberInput) return 'rounded-top';\r\n return 'rounded';\r\n }\r\n\r\n return (\r\n
\r\n \r\n \r\n\r\n {showStreetNumberInput && (\r\n \r\n )}\r\n
\r\n );\r\n};\r\n\r\nexport default AddressInput;\r\n","import React, { useEffect, useState } from 'react';\r\nimport { useSelector } from 'react-redux';\r\n\r\n// shared\r\nimport { GlobalState } from 'shared/store/global/global.reducer';\r\nimport { StaticContent, UserMessageType } from 'shared/types';\r\nimport { ApplicationState } from '../Store';\r\n\r\ninterface InfoPanelContainerProps {\r\n testId: string;\r\n}\r\n\r\nfunction getContainerClassByType(type: UserMessageType): string {\r\n switch (type) {\r\n case UserMessageType.INFO:\r\n return 'bg-white';\r\n case UserMessageType.WARNING:\r\n return 'bg-warning';\r\n default:\r\n return 'bg-white';\r\n }\r\n}\r\n\r\nfunction getTextClassByType(type: UserMessageType): string {\r\n switch (type) {\r\n case UserMessageType.INFO:\r\n return '';\r\n case UserMessageType.WARNING:\r\n return 'px-3 py-2';\r\n default:\r\n return 'text-danger p-bold';\r\n }\r\n}\r\n\r\nfunction getArrowClassByType(type: UserMessageType): string {\r\n switch (type) {\r\n case UserMessageType.INFO:\r\n return 'border-0';\r\n case UserMessageType.WARNING:\r\n return 'border-warning';\r\n default:\r\n return 'border-0';\r\n }\r\n}\r\n\r\nconst InfoPanelContainer: React.FC = ({ testId }) => {\r\n const globalState = useSelector((e) => e.global);\r\n const { messages } = useSelector((state) => state.staticContent);\r\n const [offset, setOffset] = useState<{}>();\r\n\r\n const firstElement = globalState.messages[0];\r\n\r\n useEffect((): void => {\r\n if (firstElement && firstElement.message) {\r\n if (firstElement.message === messages.tooltipsFillStreetNumber) {\r\n setOffset({ right: 20 });\r\n return;\r\n }\r\n setOffset(undefined);\r\n }\r\n }, [globalState]);\r\n\r\n if (globalState.messages.length === 0) return <>;\r\n\r\n return (\r\n \r\n

{firstElement.message}

\r\n {offset &&
}\r\n
\r\n );\r\n};\r\n\r\nexport default InfoPanelContainer;\r\n","import React from 'react';\r\nimport { LocalizationAdditionContent } from '../Store/static-content/localization-static-content.reducer';\r\n\r\ninterface LocalizationAdditionProps {\r\n additionData?: LocalizationAdditionContent;\r\n}\r\n\r\nconst LocalizationAddition: React.FC = ({ additionData }) => {\r\n if (!additionData) return null;\r\n return (\r\n
\r\n {additionData.headerText}\r\n

\r\n {additionData.paragraphText}\r\n {additionData.linkText && additionData.linkHref && (\r\n \r\n {additionData.linkText}\r\n \r\n )}\r\n

\r\n
\r\n );\r\n};\r\n\r\nexport default LocalizationAddition;\r\n","import React from 'react';\r\nimport { OrderDistributionType } from 'shared/types';\r\nimport { AddressDetailsDto, StoreDto } from '../types/dto.types';\r\n\r\ninterface Props {\r\n onSelectStoreFn(store: StoreDto): void;\r\n onSelectAddressFn(address: AddressDetailsDto): void;\r\n lastAddresses: AddressDetailsDto[];\r\n lastStores: StoreDto[];\r\n distributionType: OrderDistributionType;\r\n dropdownLabel: string;\r\n onToggleFn(): void;\r\n showLastUsed: boolean;\r\n}\r\n\r\nconst LastUsedAddresses = ({\r\n onSelectAddressFn,\r\n onSelectStoreFn,\r\n lastAddresses,\r\n lastStores,\r\n distributionType,\r\n dropdownLabel,\r\n onToggleFn,\r\n showLastUsed,\r\n}: Props) => {\r\n if (distributionType === OrderDistributionType.Delivery && lastAddresses.length < 1) {\r\n return <>;\r\n }\r\n if (distributionType === OrderDistributionType.Pickup && lastStores.length < 1) {\r\n return <>;\r\n }\r\n\r\n function renderAddress(address: AddressDetailsDto): JSX.Element {\r\n return (\r\n onSelectAddressFn(address)}\r\n key={address.city + address.street + address.streetNumber}\r\n className=\"store-suggestion-item p-2 px-lg-3 d-flex\"\r\n data-testid=\"localization__button--select-store\"\r\n >\r\n
\r\n \r\n
\r\n {`${address.street}, ${address.streetNumber}`}

\r\n

\r\n {address.city}\r\n

\r\n
\r\n
\r\n \r\n );\r\n }\r\n\r\n function renderStore(store: StoreDto) {\r\n return (\r\n onSelectStoreFn(store)}\r\n key={store.id}\r\n className=\"store-suggestion-item p-2 px-lg-3 d-flex\"\r\n data-testid=\"localization__button--select-store\"\r\n >\r\n
\r\n \r\n
\r\n {`${store.street}, ${store.streetNumber}`}

\r\n

\r\n {store.city}\r\n

\r\n
\r\n
\r\n \r\n );\r\n }\r\n\r\n function renderItems(): JSX.Element {\r\n if (distributionType === OrderDistributionType.Delivery) {\r\n return <>{lastAddresses.map((address) => renderAddress(address))};\r\n }\r\n return <>{lastStores.map((store) => renderStore(store))};\r\n }\r\n\r\n return (\r\n <>\r\n \r\n

{dropdownLabel}

\r\n \r\n \r\n
\r\n {showLastUsed && renderItems()}\r\n
\r\n \r\n );\r\n};\r\n\r\nexport default LastUsedAddresses;\r\n","import { Dispatch } from 'redux';\r\nimport { AddressDetailsDto } from '../types/dto.types';\r\nimport { FormValidatorHandler, CommonValidators } from '../../../shared/validators';\r\nimport { setMessageWithExpirationTime, ValidateAndNotify } from '../../../shared/store/global/global.actions';\r\nimport { UserMessageType, StaticContent } from '../../../shared/types';\r\n\r\ninterface ValidateAddressArgs {\r\n address: AddressDetailsDto;\r\n messages: StaticContent['messages'];\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n dispatch: Dispatch;\r\n}\r\n\r\nexport const ValidatePickupAddress = ({ dispatch, address, messages }: ValidateAddressArgs): boolean => {\r\n const { tooltipsFillAddress, errorMessagesWrongAddress } = messages;\r\n const validators: FormValidatorHandler[] = [\r\n new FormValidatorHandler({\r\n value: address.street,\r\n validators: [CommonValidators.required({ message: tooltipsFillAddress, messageType: UserMessageType.WARNING })],\r\n }),\r\n new FormValidatorHandler({\r\n value: address.city,\r\n validators: [CommonValidators.required({ message: tooltipsFillAddress, messageType: UserMessageType.WARNING })],\r\n }),\r\n ];\r\n\r\n let isAtLeastOneValid = false;\r\n\r\n validators.forEach((validator) => {\r\n const result = validator.validate();\r\n if (result.success) {\r\n isAtLeastOneValid = true;\r\n }\r\n });\r\n\r\n if (!isAtLeastOneValid) {\r\n if (address.value) {\r\n dispatch(\r\n setMessageWithExpirationTime({\r\n message: errorMessagesWrongAddress,\r\n type: UserMessageType.ERROR,\r\n }),\r\n );\r\n return false;\r\n }\r\n for (let index = 0; index < validators.length; index++) {\r\n const validator = validators[index];\r\n if (\r\n !ValidateAndNotify({\r\n dispatch,\r\n validator,\r\n })\r\n ) {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n};\r\nexport enum ValidateDeliveryResponse {\r\n StreetErr = 'STREET',\r\n NumberErr = 'NUMBER',\r\n Valid = 'VALID',\r\n}\r\nexport const ValidateDeliveryAddress = ({ dispatch, address, messages }: ValidateAddressArgs): ValidateDeliveryResponse => {\r\n const { tooltipsFillAddress, tooltipsFillStreetNumber, errorMessagesWrongAddress } = messages;\r\n const validators: FormValidatorHandler[] = [\r\n new FormValidatorHandler({\r\n value: address.value,\r\n validators: [CommonValidators.required({ message: tooltipsFillAddress, messageType: UserMessageType.WARNING })],\r\n }),\r\n new FormValidatorHandler({\r\n value: address.street,\r\n validators: [CommonValidators.required({ message: errorMessagesWrongAddress, messageType: UserMessageType.ERROR })],\r\n }),\r\n new FormValidatorHandler({\r\n value: address.streetNumber,\r\n validators: [CommonValidators.required({ message: tooltipsFillStreetNumber, messageType: UserMessageType.WARNING })],\r\n }),\r\n ];\r\n\r\n for (let index = 0; index < validators.length; index++) {\r\n const validator = validators[index];\r\n\r\n if (\r\n !ValidateAndNotify({\r\n dispatch,\r\n validator,\r\n })\r\n ) {\r\n return index === 0 ? ValidateDeliveryResponse.StreetErr : ValidateDeliveryResponse.NumberErr;\r\n }\r\n }\r\n\r\n return ValidateDeliveryResponse.Valid;\r\n};\r\n","/* eslint-disable react/jsx-no-bind */\r\nimport React, { useEffect, useState } from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport useVisible from 'hooks/useVisible';\r\n\r\n// shared\r\nimport { StringHelper } from 'shared/helpers';\r\nimport { OrderDistributionType, UserMessageType, StaticContent } from 'shared/types';\r\nimport { SetLoader, setMessageWithExpirationTime } from 'shared/store/global/global.actions';\r\nimport { LocalizationRequestErrorType } from 'typings/web-bridge.types';\r\n\r\n// components\r\nimport { GlobalState } from 'shared/store/global/global.reducer';\r\nimport StoresList from '../Components/stores-list.component';\r\nimport Suggestions from '../../../shared/components/suggestions.component';\r\nimport AddressInput from '../Components/address-input.component';\r\nimport InfoPanelContainer from './info-panel.container';\r\nimport LocalizationAddition from '../Components/localization-addition.component';\r\nimport LastUsedAddresses from '../Components/last-used-addresses.component';\r\n\r\n// validators\r\nimport { ValidateDeliveryAddress, ValidateDeliveryResponse } from '../Validators/address.validator';\r\n\r\n// store\r\nimport { LocalizationActionTypes, validateAddress, getCityBySelectedAddress } from '../Store/actions';\r\nimport * as LocalizationActions from '../Store/actions';\r\nimport { LocalizationState } from '../Store/reducers';\r\nimport { ApplicationState } from '../Store';\r\nimport { LocalizationStaticContent } from '../Store/static-content/localization-static-content.reducer';\r\n\r\nlet predictionsTimer: ReturnType;\r\n\r\nconst LocalizationSearch: React.FC = () => {\r\n const { messages } = useSelector((state) => state.staticContent);\r\n const {\r\n mainCTA,\r\n geolocationTextDelivery,\r\n geolocationTextPickup,\r\n signInLink,\r\n deliveryAddition,\r\n pickupAddition,\r\n dropdownDeliveryLabelRegisteredUser,\r\n dropdownPickupLabelRegisteredUser,\r\n storeDistanceUnit,\r\n } = useSelector((state) => state.localizationStaticContent);\r\n\r\n const { signedin } = useSelector((state) => state.global);\r\n\r\n const { ref, isVisible, setIsVisible } = useVisible(false);\r\n const [showStores, setShowStores] = useState(true);\r\n const [showLastUsed, setShowLastUsed] = useState(false);\r\n\r\n const dispatch = useDispatch();\r\n const { selectedAddress, suggestions, distributionType, showNumberInput, lastAddresses, lastStores } = useSelector<\r\n ApplicationState,\r\n LocalizationState\r\n >((state) => state.localization);\r\n\r\n const isDelivery = distributionType === OrderDistributionType.Delivery;\r\n const showSuggestions = suggestions && suggestions.length > 0 && isVisible;\r\n\r\n function setFocusOnInput(input: 'address' | 'number'): void {\r\n if (input === 'address') {\r\n // eslint-disable-next-line no-unused-expressions\r\n document.getElementById('address-input--main-field')?.focus();\r\n } else {\r\n // eslint-disable-next-line no-unused-expressions\r\n document.getElementById('address-input--street-number')?.focus();\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n if (showNumberInput && selectedAddress.value) {\r\n setFocusOnInput('number');\r\n }\r\n }, [showNumberInput]);\r\n\r\n useEffect(() => {\r\n if (signedin) {\r\n dispatch(LocalizationActions.getLastAddresses());\r\n dispatch(LocalizationActions.getLastStores());\r\n }\r\n }, [signedin]);\r\n\r\n function userLocationHandler(): void {\r\n isDelivery ? gtm.localizationModule.geolocationClickedOnDelivery() : gtm.localizationModule.geolocationClickedOnCollection();\r\n\r\n const mobile = window.S4DWebBridge();\r\n if (mobile == null) {\r\n dispatch(LocalizationActions.getCoordsSuggestions());\r\n } else {\r\n dispatch(SetLoader(true));\r\n mobile.requestLocation(successMobileLocationRequestHandler, failedMobileLocationRequestHandler);\r\n }\r\n\r\n if (!isDelivery) {\r\n setShowStores(true);\r\n setShowLastUsed(false);\r\n }\r\n }\r\n\r\n function successMobileLocationRequestHandler(latitude: number, longitude: number): void {\r\n dispatch(LocalizationActions.prepareCoordsSuggestions(latitude, longitude));\r\n }\r\n\r\n function failedMobileLocationRequestHandler(error: LocalizationRequestErrorType): void {\r\n dispatch(LocalizationActions.setRequestLocalizationError(error));\r\n dispatch(SetLoader(false));\r\n }\r\n\r\n function selectSuggestionHandler(placeId: string): void {\r\n isDelivery ? gtm.localizationModule.suggestionClickedOnDelivery() : gtm.localizationModule.suggestionClickedOnCollection();\r\n dispatch(LocalizationActions.getSelectedAddress(placeId));\r\n setIsVisible(false);\r\n\r\n if (!isDelivery) {\r\n setShowStores(true);\r\n setShowLastUsed(false);\r\n }\r\n }\r\n\r\n async function goToTimeSlotSelect(): Promise {\r\n if (!selectedAddress.value) {\r\n dispatch(setMessageWithExpirationTime({ message: messages.tooltipsFillAddress, type: UserMessageType.WARNING }));\r\n setFocusOnInput('address');\r\n return;\r\n }\r\n if (!selectedAddress.street) {\r\n dispatch(setMessageWithExpirationTime({ message: messages.errorMessagesWrongAddress, type: UserMessageType.ERROR }));\r\n setFocusOnInput('address');\r\n return;\r\n }\r\n const validationResult = ValidateDeliveryAddress({ address: selectedAddress, dispatch, messages });\r\n if (validationResult !== ValidateDeliveryResponse.Valid) {\r\n if (validationResult === ValidateDeliveryResponse.NumberErr) {\r\n setFocusOnInput('number');\r\n return;\r\n }\r\n setFocusOnInput('address');\r\n return;\r\n }\r\n if (!selectedAddress.city) {\r\n // Google's api sometimes can't return the city for address that don't provide an house number\r\n // At this stage we know for sure the value of house number and we can make a new request to get the city\r\n const city = await getCityBySelectedAddress(selectedAddress);\r\n if (city) {\r\n selectedAddress.city = city;\r\n }\r\n }\r\n dispatch(SetLoader(true));\r\n const validAddress = await validateAddress(selectedAddress, dispatch, messages.errorMessagesWrongStreetNumber);\r\n if (validAddress) {\r\n dispatch({ type: LocalizationActions.LocalizationActionTypes.SET_SELECTED_ADDRESS, payload: validAddress });\r\n dispatch(LocalizationActions.getCurrentStore());\r\n } else {\r\n dispatch(SetLoader(false));\r\n setFocusOnInput('number');\r\n }\r\n }\r\n\r\n function getSuggestions(value: string): void {\r\n clearTimeout(predictionsTimer);\r\n predictionsTimer = setTimeout(() => {\r\n dispatch(LocalizationActions.getSuggestions(value));\r\n setIsVisible(true);\r\n }, 250);\r\n }\r\n\r\n function onPropertyChange(sender: React.ChangeEvent): void {\r\n const { name, value } = sender.target;\r\n dispatch({ type: LocalizationActionTypes.ON_PROPERTY_CHANGED, payload: { name, value } });\r\n\r\n name !== 'streetNumber' && getSuggestions(value);\r\n }\r\n\r\n function getGeolocationStyle(): string {\r\n if (!isDelivery) return 'border-top-0';\r\n if (showNumberInput) return 'rounded mt-1';\r\n return 'border-top-0';\r\n }\r\n\r\n return (\r\n
\r\n \r\n \r\n {\r\n dispatch({ type: LocalizationActionTypes.SET_SELECTED_ADDRESS });\r\n dispatch({ type: LocalizationActionTypes.CLEAR_STORE });\r\n }}\r\n suggestionsHelper={(): void => setIsVisible(true)}\r\n showStreetNumberInput={showNumberInput}\r\n />\r\n {showSuggestions && (\r\n
\r\n \r\n \r\n
\r\n
\r\n )}\r\n
\r\n \r\n \r\n {isDelivery ? geolocationTextDelivery : geolocationTextPickup}\r\n \r\n
\r\n {isDelivery && (\r\n {\r\n gtm.localizationModule.submitClickedOnDelivery();\r\n goToTimeSlotSelect();\r\n }}\r\n data-testid=\"localization__button--get-to-select-hour-modal\"\r\n >\r\n {mainCTA}\r\n \r\n )}\r\n {!isDelivery && (\r\n {\r\n dispatch(LocalizationActions.setCurrentStoreForPickup(store));\r\n }}\r\n show={showStores}\r\n onToggle={(): void => {\r\n setShowStores((prevState) => !prevState);\r\n showLastUsed && setShowLastUsed(false);\r\n }}\r\n />\r\n )}\r\n\r\n {!signedin && (\r\n

\r\n \r\n {StringHelper.GetFirstNWords(signInLink, 2)}\r\n \r\n {StringHelper.OmitFirstNWords(signInLink, 2)}\r\n

\r\n )}\r\n {signedin && (\r\n {\r\n dispatch({\r\n type: LocalizationActionTypes.SET_SELECTED_ADDRESS,\r\n payload: { ...address, isCompleteAddress: true },\r\n });\r\n }}\r\n onSelectStoreFn={(store) => {\r\n dispatch(LocalizationActions.setCurrentStoreForPickup(store));\r\n }}\r\n lastAddresses={lastAddresses}\r\n lastStores={lastStores}\r\n distributionType={distributionType}\r\n dropdownLabel={\r\n distributionType === OrderDistributionType.Delivery\r\n ? dropdownDeliveryLabelRegisteredUser\r\n : dropdownPickupLabelRegisteredUser\r\n }\r\n onToggleFn={(): void => {\r\n setShowLastUsed((prev) => !prev);\r\n showStores && setShowStores(false);\r\n }}\r\n showLastUsed={showLastUsed}\r\n />\r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default LocalizationSearch;\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { useState, useRef, useEffect, MouseEvent, MutableRefObject } from 'react';\r\n\r\ninterface ObjectVisibleHook {\r\n ref: React.MutableRefObject;\r\n isVisible: boolean;\r\n setIsVisible: React.Dispatch>;\r\n}\r\n\r\nfunction useVisible(initialIsVisible?: boolean): ObjectVisibleHook {\r\n const [isVisible, setIsVisible] = useState(initialIsVisible ?? false);\r\n const ref = useRef(null);\r\n\r\n const handleClickOutside = (ev: globalThis.MouseEvent): any => {\r\n if (ref.current !== null) {\r\n if (!ref.current.contains(ev.target)) {\r\n setIsVisible(false);\r\n }\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n document.addEventListener('click', handleClickOutside, true);\r\n return (): void => {\r\n document.removeEventListener('click', handleClickOutside, true);\r\n };\r\n }, []);\r\n\r\n return { ref, isVisible, setIsVisible };\r\n}\r\nexport default useVisible;\r\n","/* eslint-disable no-use-before-define */\r\nimport React, { useEffect, useState } from 'react';\r\nimport uuidGenerator from 'shared/tools/uuid-generator';\r\nimport { AvailableDateTimeFrame, SelectedDateTimeFrame } from 'apps/LocalizationApp/types/dto.types';\r\n\r\ninterface SelectTimeProps {\r\n availableHours: AvailableDateTimeFrame[];\r\n onSetTimeFn(orderTime: SelectedDateTimeFrame): void;\r\n labels: {\r\n mainCTA: string;\r\n chooseTimeHeading: string;\r\n chooseTimeAsap: string;\r\n };\r\n}\r\n\r\nconst SelectTime: React.FC = function ({ availableHours, onSetTimeFn, labels }) {\r\n useEffect(() => {\r\n gtm.modalLoad('order-time-select');\r\n }, []);\r\n\r\n const [selectedDateTimeFrame, setSelectedDateTimeFrame] = useState();\r\n\r\n function onTimeSelected(index: number): void {\r\n const baseDateTimeFrame = availableHours[index];\r\n setSelectedDateTimeFrame({\r\n dateTimeFrame: baseDateTimeFrame.isAsap ? undefined : baseDateTimeFrame.dateTimeFrame,\r\n isAsap: baseDateTimeFrame.isAsap,\r\n timeFrame: baseDateTimeFrame.timeFrame,\r\n isFirstAvailableDateFrame: index === 0,\r\n utcDateTimeFrame: baseDateTimeFrame.utcDateTimeFrame,\r\n });\r\n }\r\n\r\n function setOrderTime(): void {\r\n selectedDateTimeFrame && onSetTimeFn(selectedDateTimeFrame);\r\n }\r\n\r\n function renderHourDisplayValue(index: number): string {\r\n if (index < 0) return '';\r\n const hour = availableHours[index].timeFrame;\r\n return printHour(hour, availableHours[index].isAsap, index === 0);\r\n }\r\n\r\n function printHour(hour: string, isAsap: boolean, isFirstOnList: boolean) {\r\n if (isAsap) {\r\n return labels.chooseTimeAsap;\r\n }\r\n if (isFirstOnList) {\r\n return `${labels.chooseTimeAsap} ${hour}`;\r\n }\r\n return hour;\r\n }\r\n\r\n useEffect(() => {\r\n onTimeSelected(0);\r\n }, []);\r\n\r\n return (\r\n
\r\n {labels.chooseTimeHeading}\r\n
\r\n \r\n \r\n \r\n {renderHourDisplayValue(\r\n (selectedDateTimeFrame &&\r\n availableHours.findIndex((ah) => ah.timeFrame === selectedDateTimeFrame.timeFrame)) ??\r\n 0,\r\n )}\r\n \r\n \r\n
\r\n {availableHours.map((hour, index) => (\r\n onTimeSelected(index)}\r\n data-testid={`localization__button--available-hour-${hour?.timeFrame}`}\r\n >\r\n {renderHourDisplayValue(index)}\r\n \r\n ))}\r\n
\r\n
\r\n \r\n {labels.mainCTA}\r\n \r\n
\r\n );\r\n};\r\n\r\nexport default SelectTime;\r\n","import React from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { ApplicationState } from '../Store';\r\nimport { LocalizationStaticContent } from '../Store/static-content/localization-static-content.reducer';\r\nimport { StoreDto } from '../types/dto.types';\r\n\r\ninterface StoreUnavailableProps {\r\n nearbyStores: StoreDto[];\r\n currentStoreId: string;\r\n onSelect(store: StoreDto): void;\r\n onReturn(): void;\r\n}\r\n\r\nconst StoreUnavailable: React.FC = ({ nearbyStores, currentStoreId, onSelect, onReturn }) => {\r\n const { storeUnavailable } = useSelector((state) => state.localizationStaticContent);\r\n const storesList: StoreDto[] = nearbyStores.filter((store) => store.id !== currentStoreId);\r\n\r\n return (\r\n <>\r\n {storesList.length > 0 && (\r\n
\r\n
\r\n

\r\n {storeUnavailable.outOfDeliveryRangeHeading}\r\n

\r\n

{storeUnavailable.outOfDeliveryRangeText}

\r\n
\r\n {storesList.map((store) => {\r\n return (\r\n onSelect(store)}\r\n key={store.id}\r\n data-testid=\"localization__button--select-another-store\"\r\n >\r\n

{`${store.street}, ${store.streetNumber} (${store.city})`}

\r\n

{`${storeUnavailable.distancePrefix}${(\r\n store.distance / 1000\r\n ).toFixed(2)}${storeUnavailable.distanceSuffix}`}

\r\n \r\n
\r\n );\r\n })}\r\n \r\n )}\r\n {storesList.length <= 0 && (\r\n \r\n

\r\n {storeUnavailable.noStoreAvailable}\r\n

\r\n \r\n {storeUnavailable.returnButton}\r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default StoreUnavailable;\r\n","import React from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\n\r\n// components\r\nimport Backdrop from 'shared/components/modal.compontent';\r\nimport SelectTime from 'shared/components/select-time.component';\r\nimport StoreUnavailable from '../Components/store-unavailable.component';\r\n\r\n// store\r\nimport { LocalizationActionTypes, setCurrentStoreForPickup, setStoreAndSave } from '../Store/actions';\r\nimport { LocalizationState } from '../Store/reducers';\r\nimport { ApplicationState } from '../Store';\r\nimport { StoreDto } from '../types/dto.types';\r\nimport { LocalizationStaticContent } from '../Store/static-content/localization-static-content.reducer';\r\n\r\nconst ChooseTime: React.FC = () => {\r\n const { currentStore, nearbyStores, distributionType, showModal } = useSelector(\r\n (state) => state.localization,\r\n );\r\n const { mainCTA, chooseTimeHeading, chooseTimeAsap } = useSelector(\r\n (state) => state.localizationStaticContent,\r\n );\r\n\r\n const dispatch = useDispatch();\r\n\r\n if (!showModal) return <>;\r\n\r\n function selectStoreHandler(store: StoreDto): void {\r\n dispatch(setCurrentStoreForPickup(store));\r\n }\r\n\r\n function onClose(): void {\r\n dispatch({ type: LocalizationActionTypes.CLEAR_STORE });\r\n dispatch({ type: LocalizationActionTypes.CHANGE_ORDER_DISTRIBUTION, payload: distributionType });\r\n dispatch({ type: LocalizationActionTypes.SHOW_MODAL, payload: false });\r\n }\r\n\r\n function renderData(): JSX.Element {\r\n if (currentStore?.isOpen && currentStore.availableHours && currentStore.availableHours.timeframes.length > 0) {\r\n return (\r\n {\r\n dispatch({\r\n type: LocalizationActionTypes.SET_ORDER_TIME,\r\n payload: orderTime,\r\n });\r\n dispatch(setStoreAndSave());\r\n gtm.localizationModule.orderTimeSelected();\r\n window.location.href = '/products/offers';\r\n }}\r\n labels={{ mainCTA, chooseTimeHeading, chooseTimeAsap }}\r\n />\r\n );\r\n }\r\n return (\r\n \r\n );\r\n }\r\n\r\n return (\r\n \r\n {renderData()}\r\n \r\n );\r\n};\r\n\r\nexport default ChooseTime;\r\n","import { ApplicationState } from 'apps/LocalizationApp/Store';\r\nimport { LocalizationStaticContent } from 'apps/LocalizationApp/Store/static-content/localization-static-content.reducer';\r\nimport React from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { OrderDistributionType } from 'shared/types';\r\n\r\nexport interface OrderDistributionSwitchProps {\r\n distributionType: OrderDistributionType;\r\n distributionChange: (type: OrderDistributionType) => void;\r\n}\r\n\r\nconst OrderTypeSwitch: React.FC = ({ distributionType, distributionChange }) => {\r\n const { pickupIcon, pickupIconDisabled, deliveryIcon, deliveryIconDisabled } = useSelector<\r\n ApplicationState,\r\n LocalizationStaticContent\r\n >((state) => state.localizationStaticContent);\r\n const isPickup = distributionType === OrderDistributionType.Pickup;\r\n const { deliveryTabText, pickupTabText } = useSelector(\r\n (state) => state.localizationStaticContent,\r\n );\r\n return (\r\n
\r\n {\r\n distributionChange(OrderDistributionType.Delivery);\r\n gtm.localizationModule.deliveryTabClicked();\r\n }}\r\n className={`d-flex font-weight-bold justify-content-center align-items-center mr-1 w-100 ${\r\n distributionType === OrderDistributionType.Delivery ? 'active' : ''\r\n }`}\r\n data-testid=\"localization__button--delivery-switch\"\r\n >\r\n
\r\n \r\n
\r\n \r\n {deliveryTabText}\r\n \r\n
\r\n {\r\n distributionChange(OrderDistributionType.Pickup);\r\n gtm.localizationModule.collectionTabClicked();\r\n }}\r\n className={`d-flex font-weight-bold justify-content-center align-items-center ml-1 w-100 ${\r\n distributionType === OrderDistributionType.Pickup ? 'active' : ''\r\n }`}\r\n data-testid=\"localization__button--pickup-switch\"\r\n >\r\n
\r\n \r\n
\r\n \r\n {pickupTabText}\r\n \r\n \r\n \r\n );\r\n};\r\nexport default OrderTypeSwitch;\r\n","import React from 'react';\r\n\r\ninterface ChangeAddressAlertProps {\r\n labels: {\r\n title: string;\r\n informationText: string;\r\n confirmButton: string;\r\n cancelButton: string;\r\n };\r\n onConfirmFn(): void;\r\n onCancelFn(): void;\r\n}\r\n\r\nconst ChangeAddressAlert: React.FC = ({ labels, onConfirmFn, onCancelFn }) => {\r\n const { title, informationText, confirmButton, cancelButton } = labels;\r\n\r\n return (\r\n
\r\n
\r\n

\r\n {title}\r\n

\r\n \r\n {informationText}\r\n

\r\n \r\n {confirmButton}\r\n \r\n \r\n {cancelButton}\r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default ChangeAddressAlert;\r\n","import React, { useState } from 'react';\r\nimport { useSelector } from 'react-redux';\r\n\r\n// store\r\nimport { OrderDistributionType } from 'shared/types';\r\nimport ChangeAddressAlert from 'shared/components/change-address-alert.component';\r\nimport { ApplicationState } from '../Store';\r\nimport { LocalizationState } from '../Store/reducers';\r\nimport { LocalizationStaticContent } from '../Store/static-content/localization-static-content.reducer';\r\n\r\ninterface ChangeStoreProps {\r\n onContinueFn(): void;\r\n onChangeStoreFn(): void;\r\n}\r\n\r\nconst ChangeStore: React.FC = ({ onContinueFn, onChangeStoreFn }) => {\r\n // store\r\n const { changeStore, addressAlertModal } = useSelector(\r\n (state) => state.localizationStaticContent,\r\n );\r\n const { selectedAddress, distributionType, currentStore } = useSelector(\r\n (state) => state.localization,\r\n );\r\n\r\n const [showConfirm, setShowConfirm] = useState(false);\r\n\r\n // actions\r\n const onChangeStore = (): void => {\r\n gtm.localizationModule.changeAddressClicked();\r\n const basket = localStorage.getItem('basket');\r\n const parsedBasket = basket ? JSON.parse(basket) : null;\r\n if (parsedBasket?.basket?.items?.length > 0) {\r\n setShowConfirm(true);\r\n return;\r\n }\r\n\r\n onChangeStoreFn();\r\n };\r\n\r\n if (showConfirm) {\r\n return (\r\n {\r\n setShowConfirm(false);\r\n }}\r\n />\r\n );\r\n }\r\n\r\n return (\r\n
\r\n
\r\n

\r\n {distributionType === OrderDistributionType.Delivery\r\n ? changeStore.changeDeliveryTitle\r\n : changeStore.changePickupTitle}\r\n

\r\n

\r\n {distributionType === OrderDistributionType.Delivery\r\n ? `${selectedAddress.street}, ${selectedAddress.streetNumber}. ${selectedAddress.city}`\r\n : `${currentStore.street}, ${currentStore.streetNumber}. ${currentStore.city}`}\r\n

\r\n \r\n {changeStore.changeStoreButton}\r\n \r\n \r\n {changeStore.goToCatalogButton}\r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default ChangeStore;\r\n","import React, { useEffect } from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\n\r\nimport SingleActionModal from 'shared/components/single-action-modal.component';\r\n\r\nimport { OrderDistributionType } from 'shared/types';\r\nimport { LocalizationState } from '../Store/reducers';\r\nimport { ApplicationState } from '../Store';\r\nimport { LocalizationStaticContent } from '../Store/static-content/localization-static-content.reducer';\r\nimport { StoreState } from '../types/localization.types';\r\nimport { LocalizationActionTypes } from '../Store/actions';\r\n\r\ninterface Props {\r\n isVisible: boolean;\r\n}\r\n\r\nconst StoreStatusInfo = ({ isVisible }: Props): JSX.Element => {\r\n const { selectedStoreStatus, distributionType } = useSelector((state) => state.localization);\r\n const { storeStatusInfo } = useSelector((state) => state.localizationStaticContent);\r\n const dispatch = useDispatch();\r\n\r\n const renderModalSwitch = (): JSX.Element | null => {\r\n switch (selectedStoreStatus.state) {\r\n case StoreState.OPEN_BUT_NO_ONLINE_ORDERS:\r\n const modalText = `${storeStatusInfo.noOnlineOrdersModalText} ${selectedStoreStatus.storePhoneNumber}`;\r\n return (\r\n {\r\n dispatch({ type: LocalizationActionTypes.SHOW_MODAL, payload: false });\r\n }}\r\n onConfirmFn={() => {\r\n dispatch({ type: LocalizationActionTypes.SHOW_MODAL, payload: false });\r\n }}\r\n isVisible\r\n testId=\"no-online-orders-modal\"\r\n />\r\n );\r\n case StoreState.OPEN_BUT_NO_DELIVERY_ORDERS:\r\n return (\r\n {\r\n dispatch({ type: LocalizationActionTypes.SHOW_MODAL, payload: false });\r\n }}\r\n onConfirmFn={() => {\r\n dispatch({ type: LocalizationActionTypes.SHOW_MODAL, payload: false });\r\n }}\r\n isVisible\r\n testId=\"no-delivery-orders-modal\"\r\n />\r\n );\r\n case StoreState.OPEN_BUT_NO_PICKUP_ORDERS:\r\n return (\r\n {\r\n dispatch({ type: LocalizationActionTypes.SHOW_MODAL, payload: false });\r\n }}\r\n onConfirmFn={() => {\r\n dispatch({ type: LocalizationActionTypes.SHOW_MODAL, payload: false });\r\n }}\r\n isVisible\r\n testId=\"no-pickup-orders-modal\"\r\n />\r\n );\r\n case StoreState.CLOSED:\r\n const header =\r\n distributionType === OrderDistributionType.Delivery\r\n ? storeStatusInfo.noDeliveryOrdersModalHeader\r\n : storeStatusInfo.noPickupOrdersModalHeader;\r\n const subheader =\r\n distributionType === OrderDistributionType.Delivery\r\n ? storeStatusInfo.noDeliveryOrdersModalText\r\n : storeStatusInfo.noPickupOrdersModalText;\r\n\r\n return (\r\n {\r\n dispatch({ type: LocalizationActionTypes.SHOW_MODAL, payload: false });\r\n }}\r\n onConfirmFn={() => {\r\n dispatch({ type: LocalizationActionTypes.SHOW_MODAL, payload: false });\r\n }}\r\n isVisible\r\n testId=\"no-pickup-orders-modal\"\r\n />\r\n );\r\n default:\r\n return null;\r\n }\r\n };\r\n\r\n return
{isVisible ? renderModalSwitch() : null}
;\r\n};\r\n\r\nexport default StoreStatusInfo;\r\n","import React, { useEffect } from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\n\r\n// shared\r\nimport { RoutingHelpers } from 'shared/helpers';\r\nimport { OrderDistributionType } from 'shared/types';\r\nimport { getStaticContent } from 'shared/store/static-content/static-content.actions';\r\nimport { GlobalState } from 'shared/store/global/global.reducer';\r\nimport Loader from 'shared/components/loader.component';\r\n\r\n// components\r\nimport Toast from 'shared/components/toast.component';\r\nimport LocalizationSearch from './localization-search.container';\r\nimport ChooseTime from './choose-time.container';\r\nimport OrderTypeSwitch from '../Components/order-type-switch.component';\r\nimport ChangeStore from '../Components/change-store.component';\r\nimport StoreStatusInfo from './store-status-info.container';\r\n\r\n// store\r\nimport { LocalizationState } from '../Store/reducers';\r\nimport * as LocalizationActions from '../Store/actions';\r\nimport { ApplicationState } from '../Store';\r\nimport { getStaticContent as getLocalizationStaticContent } from '../Store/static-content/localization-static-content.actions';\r\nimport { LocalizationStaticContent } from '../Store/static-content/localization-static-content.reducer';\r\nimport { cookieExists } from 'shared/utils';\r\n\r\nconst SearchWindow = (): JSX.Element => {\r\n const { currentStore, distributionType, forceDeliveryDistributionType, selectedStoreStatus, showModal, nearbyStores, showToast } =\r\n useSelector((state) => state.localization);\r\n const { storeIsClosedToast } = useSelector(\r\n (state) => state.localizationStaticContent,\r\n );\r\n const { loader } = useSelector((state) => state.global);\r\n const dispatch = useDispatch();\r\n\r\n useEffect(() => {\r\n dispatch(getStaticContent());\r\n dispatch(getLocalizationStaticContent());\r\n }, []);\r\n\r\n const storeSelected = currentStore.id !== '' && cookieExists('localization');\r\n\r\n return (\r\n
\r\n {storeSelected ? (\r\n {\r\n dispatch(LocalizationActions.clearStoreAndSave());\r\n forceDeliveryDistributionType &&\r\n dispatch(LocalizationActions.changeDistributionType(OrderDistributionType.Delivery));\r\n localStorage.removeItem('basket');\r\n }}\r\n />\r\n ) : (\r\n
\r\n {\r\n dispatch(LocalizationActions.changeDistributionType(type));\r\n }}\r\n />\r\n
\r\n \r\n
\r\n
\r\n )}\r\n {!selectedStoreStatus.canPlaceOrder &&\r\n selectedStoreStatus.state !== undefined &&\r\n nearbyStores.length === 0 &&\r\n showModal ? (\r\n \r\n ) : (\r\n \r\n )}\r\n {loader && }\r\n {\r\n dispatch({ type: LocalizationActions.LocalizationActionTypes.SHOW_TOAST, payload: false });\r\n }}\r\n />\r\n
\r\n );\r\n};\r\n\r\nexport default SearchWindow;\r\n\r\nconst redirectToOffers = (): void => {\r\n const { redirectToOtherAppURL } = RoutingHelpers;\r\n redirectToOtherAppURL('products/offers');\r\n};\r\n","import React, { useEffect } from 'react';\r\nimport { useSelector, useDispatch } from 'react-redux';\r\nimport { useHistory } from 'react-router';\r\n\r\n// components\r\nimport SearchWindowContainer from 'apps/LocalizationApp/Containers/search-window.container';\r\nimport ChangeStoreContainer from 'apps/LocalizationApp/Components/change-store.component';\r\nimport { clearStoreAndSave } from 'apps/LocalizationApp/Store/actions';\r\nimport { getStaticContent } from 'apps/LocalizationApp/Store/static-content/localization-static-content.actions';\r\nimport LocalizationModal from 'shared/components/modal.compontent';\r\n\r\n// store\r\nimport { getProducts } from 'apps/ProductsApp/store/products/products.actions';\r\nimport { getOffers } from 'apps/ProductsApp/store/offers/offers.actions';\r\nimport { LocalizationState } from 'apps/LocalizationApp/Store';\r\nimport { AddressWizzardActions } from '../store/actions';\r\nimport { ApplicationState, AddressWizzardState } from '../store';\r\n// types\r\nimport { AddressWizzardSteps } from '../navigation.types';\r\n\r\nconst AddressWizzard: React.FC = () => {\r\n // redux state\r\n const dispatch = useDispatch();\r\n const addressWizzard = useSelector((state) => state.addressWizzard);\r\n const { showModal } = useSelector((state) => state.localization);\r\n const history = useHistory();\r\n\r\n const localizationModalVisibility = addressWizzard.currentWizzardStep !== AddressWizzardSteps.None;\r\n const isLastStep = addressWizzard.currentWizzardStep === AddressWizzardSteps.LocalizationModal;\r\n\r\n // actions\r\n const cancelWizzardProcess = (): void => {\r\n dispatch(AddressWizzardActions.changeWizzardStep(AddressWizzardSteps.None));\r\n };\r\n\r\n const changeWizzardStep = (step: AddressWizzardSteps): void => {\r\n dispatch(AddressWizzardActions.changeWizzardStep(step));\r\n };\r\n\r\n useEffect(() => {\r\n dispatch(getStaticContent());\r\n }, []);\r\n\r\n // wizzard steps\r\n const renderWizzardContent = (): JSX.Element => {\r\n const currentPath = history && history.location.pathname.replace(/\\//g, '');\r\n switch (addressWizzard.currentWizzardStep) {\r\n case AddressWizzardSteps.ChangeAddressModal:\r\n return (\r\n {\r\n history.push('/offers');\r\n cancelWizzardProcess();\r\n }}\r\n onChangeStoreFn={(): void => {\r\n dispatch(clearStoreAndSave());\r\n if (currentPath === 'offers') {\r\n dispatch(getOffers());\r\n } else if (currentPath) {\r\n dispatch(getProducts(history.location.pathname.replace(/\\//g, '')));\r\n }\r\n changeWizzardStep(AddressWizzardSteps.LocalizationModal);\r\n }}\r\n />\r\n );\r\n case AddressWizzardSteps.LocalizationModal:\r\n return ;\r\n default:\r\n return <>;\r\n }\r\n };\r\n\r\n return (\r\n \r\n {renderWizzardContent()}\r\n \r\n );\r\n};\r\n\r\nexport default AddressWizzard;\r\n","import useKeyPress from 'hooks/useKeyPress';\r\nimport React from 'react';\r\n\r\n// shared\r\nimport Modal from 'shared/components/modal.compontent';\r\nimport { NavigationStaticContent } from '../store/static-content/static-content.reducer';\r\n\r\ninterface LogoutModalProps {\r\n submitCallbackFn(confirmed: boolean): void;\r\n isVisible: boolean;\r\n labels: NavigationStaticContent['logoutModal'];\r\n}\r\n\r\nconst LogoutModal: React.FC = ({ submitCallbackFn, isVisible, labels }) => {\r\n isVisible &&\r\n useKeyPress('ENTER', () => {\r\n submitCallbackFn(true);\r\n });\r\n\r\n return (\r\n {\r\n submitCallbackFn(false);\r\n }}\r\n >\r\n
\r\n

{labels.title}

\r\n {\r\n submitCallbackFn(true);\r\n }}\r\n className=\"btn btn-primary btn-sm w-100 mb-1 mt-3\"\r\n data-testid=\"logout-modal__button--confirm\"\r\n >\r\n {labels.confirmButton}\r\n \r\n\r\n {\r\n submitCallbackFn(false);\r\n }}\r\n data-testid=\"logout-modal__button--cancel\"\r\n >\r\n {labels.cancelButton}\r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default LogoutModal;\r\n","import React, { useEffect, useState } from 'react';\r\nimport { useSelector, useDispatch } from 'react-redux';\r\n\r\n// shared\r\nimport { redirectToOtherAppURL, hostURL } from 'shared/helpers/routing-helpers';\r\nimport LanguageSwitch from 'apps/NavigationApp/components/language-switch.component';\r\n\r\n// store\r\nimport { GlobalState } from 'shared/store/global/global.reducer';\r\nimport { OrderDistributionType } from 'shared/types';\r\nimport { LocalizationState } from 'apps/LocalizationApp/Store/reducers';\r\nimport { getLanguages, logoutHandler } from 'shared/store/global/global.actions';\r\nimport AccountDropdown from 'apps/NavigationApp/components/account-dropdown';\r\nimport { ApplicationState, NavigationStaticContentState } from '../store';\r\nimport { NavigationState } from '../store/navigation/navigation.reducer';\r\nimport * as WizzardActions from '../store/address-wizzard/address-wizzard.actions';\r\n\r\n// components\r\nimport SelectedAddressComponent from '../components/selected-address.component';\r\nimport AddressWizzardContainer from './address-wizzard.container';\r\nimport LogoutModal from '../components/logout-modal.component';\r\n\r\n// types\r\nimport { AddressWizzardSteps, HeaderType, SimplifiedAddress } from '../navigation.types';\r\nimport { getStaticContent } from '../store/static-content/static-content.actions';\r\n\r\nconst MainHeader: React.FC = () => {\r\n const isErrorPage = (document.getElementById('baseUrl') as HTMLInputElement)\r\n ? (document.getElementById('isErrorPage') as HTMLInputElement)?.value === 'true'\r\n : false;\r\n\r\n const dispatch = useDispatch();\r\n const [logoutModal, showLogoutModal] = useState(false);\r\n\r\n // redux state\r\n const { distributionType, selectedAddress, currentStore } = useSelector(\r\n (state) => state.localization,\r\n );\r\n const { headerType } = useSelector((state) => state.navigation);\r\n const { signedin, currentUser, supportedCultures } = useSelector((state) => state.global);\r\n const {\r\n logoutModal: logoutLabels,\r\n dropdownMenu: labels,\r\n selectedAddress: selectedAddressLabels,\r\n trackOrder,\r\n } = useSelector((state) => state.navigationStaticContent);\r\n // component props\r\n const isDelivery = distributionType === OrderDistributionType.Delivery;\r\n const address: SimplifiedAddress = isDelivery\r\n ? { street: selectedAddress.street, streetNumber: selectedAddress.streetNumber, city: selectedAddress.city }\r\n : { street: currentStore.street, streetNumber: currentStore.streetNumber, city: currentStore.city };\r\n\r\n // actions\r\n const onAddressClick = (): void => {\r\n // start wizzard session\r\n dispatch(WizzardActions.changeWizzardStep(AddressWizzardSteps.ChangeAddressModal));\r\n };\r\n useEffect(() => {\r\n dispatch(getStaticContent());\r\n dispatch(getLanguages());\r\n }, []);\r\n\r\n // render\r\n return (\r\n <>\r\n {signedin && currentUser?.lastActiveOrder && (\r\n
\r\n redirectToOtherAppURL(`thank-you?id=${currentUser.lastActiveOrder}&orderTracker=true`)}\r\n >\r\n

{trackOrder}

{' '}\r\n \r\n
\r\n \r\n )}\r\n \r\n \r\n {\r\n if (!confirmed) {\r\n showLogoutModal(false);\r\n return;\r\n }\r\n dispatch(logoutHandler());\r\n }}\r\n labels={logoutLabels}\r\n />\r\n \r\n );\r\n};\r\n\r\nconst getPrimaryLogoClasses = (headerType: HeaderType, address: SimplifiedAddress): string => {\r\n const addressVisibility = headerType === HeaderType.Other || address.street === '';\r\n\r\n if (addressVisibility) {\r\n return '';\r\n }\r\n\r\n return 'd-none d-lg-block';\r\n};\r\n\r\nconst getSmallLogoClasses = (headerType: HeaderType, address: SimplifiedAddress): string => {\r\n const addressVisibility = headerType === HeaderType.Other || address.street === '';\r\n\r\n if (addressVisibility) {\r\n return 'd-none';\r\n }\r\n\r\n return 'd-lg-none';\r\n};\r\n\r\nexport default MainHeader;\r\n","import React from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { ApplicationState, ProductsState } from '../store';\r\nimport { ProductsStaticContent } from '../store/static-content/products-static-content.reducer';\r\n\r\nconst AllergenInfo: React.FC = () => {\r\n const { activeCategory } = useSelector((state) => state.products);\r\n const { allergen } = useSelector((state) => state.productsStaticContent);\r\n const { allergenInfoText, allergenLinkText, allergenLinkFullText, allergenLinkUrl } = allergen;\r\n\r\n const canShowAllergens = activeCategory.toUpperCase() !== 'OFFERS';\r\n\r\n return (\r\n <>\r\n {canShowAllergens && (\r\n
\r\n
\r\n \r\n

\r\n {allergenInfoText}\r\n

\r\n \r\n

{allergenLinkText}

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

\r\n \r\n {allergenLinkFullText}\r\n \r\n

\r\n
\r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default AllergenInfo;\r\n","import React from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { NavLink } from 'react-router-dom';\r\nimport { ApplicationState, ProductsStaticContent } from '../store';\r\nimport { ProductsState } from '../store/products/products.reducer';\r\nimport AllergenInfo from './allergens-info.component';\r\nimport { Category } from '../types/dto.types';\r\n\r\nconst Categories: React.FC = () => {\r\n const { offers: labels } = useSelector((state) => state.productsStaticContent);\r\n const { categories } = useSelector((state) => state.products);\r\n\r\n return ;\r\n};\r\n\r\nexport default Categories;\r\n\r\ninterface CategoriesTemplateProps {\r\n categories: Category[];\r\n offersLabel: string;\r\n useNavlinks: boolean;\r\n}\r\n\r\nexport const CategoriesTemplate: React.FC = ({ categories, offersLabel, useNavlinks }) => {\r\n const linkClass = 'd-flex justify-content-center align-items-center h-100 w-100 px-3 py-2 px-lg-2 py-lg-3 text-capitalize';\r\n const offersTestId = 'products-categories__button--offers';\r\n\r\n return (\r\n \r\n
    \r\n
  • \r\n {useNavlinks ? (\r\n \r\n

    {offersLabel}

    \r\n
    {offersLabel}
    \r\n
    \r\n ) : (\r\n \r\n

    {offersLabel}

    \r\n
    {offersLabel}
    \r\n
    \r\n )}\r\n
  • \r\n {categories.map((category) => {\r\n return (\r\n
  • \r\n {useNavlinks ? (\r\n \r\n

    {category.title.toLowerCase()}

    \r\n
    {category.title.toLowerCase()}
    \r\n \r\n ) : (\r\n \r\n

    {category.title.toLowerCase()}

    \r\n
    {category.title.toLowerCase()}
    \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","import React, { useEffect } from 'react';\r\nimport { PaymentHelper } from 'shared/helpers';\r\nimport { CrossSellOffer } from '../types/basket.types';\r\n\r\ninterface UpsellProps {\r\n item: CrossSellOffer;\r\n onAddFn(): void;\r\n headerLabel: string;\r\n}\r\n\r\nconst Upsell: React.FC = ({ item, onAddFn, headerLabel }) => {\r\n useEffect(() => {\r\n gtm.promotionsModule.crossSellLoad(item);\r\n }, []);\r\n return (\r\n
\r\n \r\n {headerLabel}\r\n \r\n
\r\n \r\n
\r\n

\r\n {item.title}\r\n

\r\n

\r\n {item.sizeUnitName}\r\n

\r\n
\r\n
\r\n {item.price && (\r\n
\r\n

\r\n {PaymentHelper.formatToDisplay(item.price)}\r\n

\r\n {item.defaultCouponPrice && item.price < item.defaultCouponPrice && (\r\n

\r\n {PaymentHelper.formatToDisplay(item.defaultCouponPrice)}\r\n

\r\n )}\r\n
\r\n )}\r\n
\r\n {\r\n onAddFn();\r\n gtm.promotionsModule.crossSellClicked(item);\r\n }}\r\n data-testid=\"basket__button--add-upsell\"\r\n />\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default Upsell;\r\n","import React from 'react';\r\nimport { PaymentHelper } from 'shared/helpers';\r\nimport uuidGenerator from 'shared/tools/uuid-generator';\r\nimport { BasketItem, XTastyChoice } from '../types/basket.types';\r\nimport { Topping } from '../types/dto.types';\r\n\r\nexport function renderDetails(product: BasketItem, showPrice = false, extraChargeLabel = ''): JSX.Element {\r\n return (\r\n <>\r\n

{showPrice ? renderCrustLabel(product, extraChargeLabel) : product.sku.optionTitle}

\r\n {groupToppingsToDisplay(product.defaultToppings ?? [], product.addedToppings ?? [], product.removedToppings ?? [])}\r\n \r\n );\r\n}\r\n\r\nexport function renderOfferDetails(product: BasketItem, showPrice = false, extraChargeLabel: string): JSX.Element {\r\n return (\r\n <>\r\n
\r\n

{getProductName(product)}

\r\n {showPrice &&

{renderPrice(product)}

}\r\n
\r\n {product.optionsTotalCount > 1 &&

{renderCrustLabel(product, extraChargeLabel)}

}\r\n {groupToppingsToDisplay(product.defaultToppings ?? [], product.addedToppings ?? [], product.removedToppings ?? [])}\r\n \r\n );\r\n}\r\n\r\nexport function getProductName(item: BasketItem): string {\r\n // need to check here if product is pizza...\r\n if (item.categoryId === 'PIZ' && item.sku.optionSubTitle && item.sku.optionSubTitle.length > 0) {\r\n return `${item.sku.productTitle} (${item.sku.optionSubTitle})`;\r\n }\r\n return item.sku.productTitle;\r\n}\r\n\r\nexport function renderXtasty(item: BasketItem, firstHalfLabel: string, secondHalfLabel: string): JSX.Element {\r\n return (\r\n
\r\n {item.xTastyChoices &&\r\n item.xTastyChoices.length > 0 &&\r\n item.xTastyChoices.map((xTastySlice, index) => {\r\n return (\r\n
\r\n

\r\n {getXTastyProductName(\r\n (item.xTastyChoices as XTastyChoice[]).length,\r\n index + 1,\r\n xTastySlice.productName,\r\n firstHalfLabel,\r\n secondHalfLabel,\r\n )}\r\n

\r\n {renderDetails({\r\n ...item,\r\n defaultToppings: xTastySlice.defaultToppings,\r\n addedToppings: xTastySlice.addedToppings,\r\n removedToppings: xTastySlice.removedToppings,\r\n })}\r\n
\r\n );\r\n })}\r\n
\r\n );\r\n}\r\n\r\nexport const renderOfferXtastyDetails = (\r\n item: BasketItem,\r\n firstHalfLabel: string,\r\n secondHalfLabel: string,\r\n extraChargeLabel: string,\r\n showPrice = false,\r\n): JSX.Element => {\r\n return (\r\n
\r\n {item.xTastyChoices &&\r\n item.xTastyChoices.length > 0 &&\r\n item.xTastyChoices.map((xTastySlice, index) => {\r\n const detailsItem: BasketItem = {\r\n ...item,\r\n defaultToppings: xTastySlice.defaultToppings,\r\n addedToppings: xTastySlice.addedToppings,\r\n removedToppings: xTastySlice.removedToppings,\r\n };\r\n const showPriceInDetails = showPrice && index === 0;\r\n\r\n return (\r\n
\r\n
\r\n

\r\n {getXTastyProductName(\r\n (item.xTastyChoices as XTastyChoice[]).length,\r\n index + 1,\r\n xTastySlice.productName,\r\n firstHalfLabel,\r\n secondHalfLabel,\r\n )}\r\n

\r\n\r\n {showPriceInDetails &&

{renderPrice(item)}

}\r\n
\r\n {renderDetails(detailsItem, showPriceInDetails, extraChargeLabel)}\r\n
\r\n );\r\n })}\r\n
\r\n );\r\n};\r\n\r\nfunction renderPrice(product: BasketItem): string {\r\n const productPrice = product.discountedPrice ?? product.price;\r\n const toppingsPrice = product.addedToppings\r\n .map((topping) => topping.price)\r\n .reduce((acc, val) => {\r\n return acc + val;\r\n }, 0);\r\n const extraCharge = product.extraCharge ?? 0;\r\n const totalExtraCharge = extraCharge + toppingsPrice;\r\n const showAsterisk = (extraCharge && extraCharge === productPrice) || toppingsPrice > 0;\r\n\r\n if (productPrice > 0) {\r\n return showAsterisk ? `*${PaymentHelper.formatToDisplay(productPrice)}` : PaymentHelper.formatToDisplay(productPrice);\r\n }\r\n return showAsterisk ? `*${PaymentHelper.formatToDisplay(totalExtraCharge)}` : 'GRATIS';\r\n}\r\n\r\nfunction renderCrustLabel(product: BasketItem, extraChargeLabel: string) {\r\n const productPrice = product.discountedPrice ?? product.price;\r\n const extraCharge = product.extraCharge ?? 0;\r\n return extraCharge && extraCharge === productPrice\r\n ? extraChargeLabel\r\n .replace('{price}', PaymentHelper.formatToDisplay(extraCharge))\r\n .replace('{crustType}', product.sku.optionTitle)\r\n : product.sku.optionTitle;\r\n}\r\n\r\nfunction getXTastyProductName(\r\n slicesCount: number,\r\n sliceNumber: number,\r\n productName: string,\r\n firstHalfLabel: string,\r\n secondHalfLabel: string,\r\n): string {\r\n if (slicesCount === 2 && sliceNumber === 1) return `${firstHalfLabel} (${productName})`;\r\n if (slicesCount === 2 && sliceNumber === 2) return `${secondHalfLabel} (${productName})`;\r\n if (slicesCount > 2) return `Part ${sliceNumber} (${productName})`;\r\n return productName;\r\n}\r\n\r\nfunction groupToppingsToDisplay(defaultToppings: Topping[], addedToppings: Topping[], removedToppings: Topping[]): JSX.Element {\r\n const defaultSauce = defaultToppings.find((el) => el.categoryId === 'SAU');\r\n const defaultCheese = defaultToppings.find((el) => el.categoryId === 'RND');\r\n const selectedSauce = addedToppings.find((el) => el.categoryId === 'SAU');\r\n const selectedCheese = addedToppings.find((el) => el.categoryId === 'RND');\r\n\r\n const defToppingsWithoutSauceNCheese = [...defaultToppings].filter(\r\n (topping) => topping.categoryId !== 'SAU' && topping.categoryId !== 'RND',\r\n );\r\n const addedToppingsWithoutSauceNCheese = [...addedToppings].filter(\r\n (topping) => topping.categoryId !== 'SAU' && topping.categoryId !== 'RND',\r\n );\r\n\r\n const selectedToppings = defToppingsWithoutSauceNCheese.concat(addedToppingsWithoutSauceNCheese);\r\n removedToppings.forEach((removedTopping) => {\r\n const indexToRemove = selectedToppings.findIndex((el) => el.id === removedTopping.id);\r\n if (indexToRemove > -1) {\r\n selectedToppings.splice(indexToRemove, 1);\r\n }\r\n });\r\n\r\n const countedToppings: Array<{ topping: Topping; count: number }> = [];\r\n selectedToppings.forEach((selectedTopping) => {\r\n const index = countedToppings.findIndex((el) => el.topping.id === selectedTopping.id);\r\n if (index === -1) {\r\n countedToppings.push({ topping: selectedTopping, count: 1 });\r\n } else {\r\n countedToppings[index].count++;\r\n }\r\n });\r\n\r\n return (\r\n <>\r\n

{selectedSauce ? selectedSauce.title : defaultSauce ? defaultSauce.title : ''}

\r\n

{selectedCheese ? selectedCheese.title : defaultCheese ? defaultCheese.title : ''}

\r\n {countedToppings.map((ct) => (\r\n

\r\n {`${ct.topping.title} ${ct.count > 1 ? `x${ct.count}` : ''}`}\r\n

\r\n ))}\r\n \r\n );\r\n}\r\n","import { XTastyStaticContent } from 'apps/ProductsApp/store/static-content/products-static-content.reducer';\r\nimport React, { useState } from 'react';\r\nimport { PaymentHelper } from 'shared/helpers';\r\nimport { getProductName, renderDetails, renderXtasty } from '../helpers/basket-items.helper';\r\nimport { BasketItem } from '../types/basket.types';\r\n\r\ninterface BasketItemProps {\r\n item: BasketItem;\r\n onRemove(item: BasketItem): void;\r\n onEdit(): void;\r\n xTastyTranslations: XTastyStaticContent;\r\n}\r\n\r\nconst BasketItemComponent: React.FC = ({ item, onRemove, onEdit, xTastyTranslations }) => {\r\n const [expand, setExpand] = useState(false);\r\n const isPizza = item.categoryId === 'PIZ';\r\n const canCustomize = (!isPizza && item.optionsTotalCount > 1) || item.isCustomizable;\r\n const showOptions = isPizza || item.optionsTotalCount > 1;\r\n\r\n function handleBasketItemClicked(): void {\r\n if (canCustomize) {\r\n onEdit();\r\n }\r\n }\r\n\r\n return (\r\n
\r\n \r\n setExpand((prevState) => !prevState)}\r\n />\r\n\r\n \r\n {getProductName(item)}\r\n

\r\n {item.price && (\r\n

\r\n {PaymentHelper.formatToDisplay(item.price)}\r\n

\r\n )}\r\n {\r\n onRemove(item);\r\n gtm.productsModule.removeProductFromBasket(item);\r\n }}\r\n data-testid=\"basket__button--remove-item\"\r\n />\r\n
\r\n
\r\n {expand &&\r\n (item.xTastyChoices && item.xTastyChoices.length > 1\r\n ? renderXtasty(item, xTastyTranslations.firstHalfTabText, xTastyTranslations.secondHalfTabText)\r\n : showOptions\r\n ? renderDetails(item)\r\n : '')}\r\n
\r\n \r\n );\r\n};\r\n\r\nexport default BasketItemComponent;\r\n","import React from 'react';\r\nimport { AppliedCoupon } from '../types/basket.types';\r\n\r\ninterface OfferDiscountTagProps {\r\n coupon: AppliedCoupon;\r\n onRemove(): void;\r\n}\r\n\r\nconst OfferDiscountTag: React.FC = ({ coupon, onRemove }) => {\r\n return (\r\n
\r\n \r\n
\r\n \r\n {coupon.displayTitle}\r\n \r\n
\r\n {\r\n onRemove();\r\n gtm.productsModule.removeCouponFromBasket(coupon);\r\n }}\r\n data-testid=\"basket__button--remove-discount\"\r\n />\r\n
\r\n );\r\n};\r\n\r\nexport default OfferDiscountTag;\r\n","import React, { useEffect, useState } from 'react';\r\n\r\nexport interface FormControl {\r\n value: string;\r\n errorMessage?: string;\r\n isValid?: boolean;\r\n touched?: boolean;\r\n}\r\n\r\ninterface FormProps {\r\n id: string;\r\n name?: string;\r\n label?: string;\r\n placeholder?: string;\r\n testId: string;\r\n onChangeFn(e: React.ChangeEvent): void;\r\n onBlurFn?(e: React.ChangeEvent): void;\r\n control: FormControl;\r\n dirty?: boolean;\r\n type?: string;\r\n autocomplete?: string;\r\n readonly?: boolean;\r\n forceInvalid?: boolean;\r\n maxLength?: number;\r\n}\r\n\r\nconst FormInput: React.FC = ({\r\n id,\r\n placeholder,\r\n label,\r\n testId,\r\n onChangeFn,\r\n onBlurFn,\r\n control,\r\n name,\r\n dirty = false,\r\n type,\r\n autocomplete = 'off',\r\n readonly,\r\n forceInvalid = false,\r\n maxLength,\r\n}) => {\r\n const [isDirty, setIsDirty] = useState(false);\r\n const [passwordVisible, setPasswordVisibility] = useState(false);\r\n\r\n useEffect(() => {\r\n setIsDirty(dirty);\r\n }, [dirty]);\r\n\r\n const inputType = type !== 'password' ? 'text' : passwordVisible ? 'text' : 'password';\r\n const passwordIcon = passwordVisible ? 'icon-password-visible' : 'icon-password-invisible';\r\n\r\n return (\r\n <>\r\n {label && (\r\n \r\n )}\r\n
\r\n 0 ? 'password-padding' : ''\r\n }`}\r\n id={id}\r\n value={control.value || ''}\r\n placeholder={placeholder}\r\n data-testid={testId}\r\n onBlur={(sender): void => {\r\n setIsDirty(true);\r\n onChangeFn(sender);\r\n if (onBlurFn) onBlurFn(sender);\r\n }}\r\n onChange={(sender): void => {\r\n setIsDirty(false);\r\n onChangeFn(sender);\r\n }}\r\n readOnly={readonly}\r\n maxLength={maxLength}\r\n />\r\n\r\n {(control.errorMessage || forceInvalid) && isDirty && (\r\n <>\r\n 0 ? 'with-password' : ''\r\n }`}\r\n data-testid={`${testId}-error-icon`}\r\n />\r\n

\r\n {control.errorMessage}\r\n

\r\n \r\n )}\r\n\r\n {type === 'password' && control.value.length > 0 && (\r\n {\r\n setPasswordVisibility(!passwordVisible);\r\n }}\r\n className={`d-block position-absolute ${passwordIcon}`}\r\n data-testid={`${testId}-password-icon`}\r\n />\r\n )}\r\n
\r\n \r\n );\r\n};\r\n\r\nconst prepareInputClasses = (control: FormControl, dirty: boolean, forceInvalid: boolean): string => {\r\n if (!dirty) return '';\r\n\r\n return control.isValid ? 'border-success' : control.errorMessage || forceInvalid ? 'border-danger' : '';\r\n};\r\n\r\nexport default FormInput;\r\n","import React, { useEffect } from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { useHistory } from 'react-router';\r\nimport useKeyPress from 'hooks/useKeyPress';\r\nimport Backdrop from 'shared/components/modal.compontent';\r\nimport FormInput from 'shared/components/form-input.component';\r\nimport { ApplicationState, BasketState, ProductsStaticContent } from '../store';\r\nimport { addVoucher, updateVoucherInput } from '../store/basket/basket.actions';\r\nimport { BasketActions } from '../store/actions';\r\n\r\nconst VoucherModal: React.FC = () => {\r\n const { voucherModal: labels } = useSelector((state) => state.productsStaticContent);\r\n const { showVoucherModal, voucherControl } = useSelector((state) => state.basket);\r\n const dispatch = useDispatch();\r\n const history = useHistory();\r\n\r\n useEffect(() => {\r\n dispatch(updateVoucherInput(''));\r\n }, [showVoucherModal]);\r\n\r\n function onSubmit(): void {\r\n dispatch(updateVoucherInput(voucherControl.value, true));\r\n dispatch(\r\n addVoucher((code: string) =>\r\n history.push({\r\n pathname: '/deal',\r\n search: `?code=${code}`,\r\n }),\r\n ),\r\n );\r\n }\r\n\r\n useKeyPress('ENTER', onSubmit);\r\n\r\n return (\r\n {\r\n dispatch(updateVoucherInput(''));\r\n dispatch({ type: BasketActions.BasketActionTypes.SET_VOUCHER_MODAL_VISIBILITY });\r\n }}\r\n >\r\n
\r\n
\r\n \r\n {labels.heading}\r\n \r\n
\r\n

{labels.info}

\r\n
\r\n {\r\n dispatch(updateVoucherInput(e.target.value));\r\n }}\r\n dirty={voucherControl.touched}\r\n />\r\n
\r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default VoucherModal;\r\n","import React, { useState } from 'react';\r\nimport { PaymentHelper } from 'shared/helpers';\r\nimport { isTwoForOneOffer } from 'shared/helpers/coupons-helpers';\r\nimport { renderOfferDetails, renderOfferXtastyDetails } from '../helpers/basket-items.helper';\r\nimport { XTastyStaticContent } from '../store/static-content/products-static-content.reducer';\r\nimport { BasketOffer as BasketOfferType } from '../types/basket.types';\r\n\r\ninterface BasketOfferProps {\r\n offer: BasketOfferType;\r\n onRemove(): void;\r\n onEdit(): void;\r\n xTastyTranslations: XTastyStaticContent;\r\n extraChargeLabel: string;\r\n}\r\n\r\nconst BasketOffer: React.FC = ({ offer, onRemove, onEdit, xTastyTranslations, extraChargeLabel }) => {\r\n const [expand, setExpand] = useState(false);\r\n\r\n const isXthFree = isTwoForOneOffer(offer.type);\r\n\r\n // TODO update with proper data from basket item\r\n\r\n function renderItems(): JSX.Element {\r\n return (\r\n
\r\n {offer.choices.map((item, index) => {\r\n return (\r\n
\r\n {item.xTastyChoices && item.xTastyChoices.length > 1\r\n ? renderOfferXtastyDetails(\r\n item,\r\n xTastyTranslations.firstHalfTabText,\r\n xTastyTranslations.secondHalfTabText,\r\n extraChargeLabel,\r\n isXthFree,\r\n )\r\n : renderOfferDetails(item, isXthFree, extraChargeLabel)}\r\n
\r\n );\r\n })}\r\n
\r\n );\r\n }\r\n\r\n return (\r\n
\r\n
\r\n setExpand((prevState) => !prevState)}\r\n />\r\n

\r\n {offer.title}\r\n

\r\n

\r\n {!isXthFree && PaymentHelper.formatToDisplay(offer.price)}\r\n

\r\n {\r\n onRemove();\r\n gtm.productsModule.removeDealFromBasket(offer);\r\n }}\r\n data-testid=\"basket__button--remove-item\"\r\n />\r\n
\r\n
{expand && renderItems()}
\r\n
\r\n );\r\n};\r\n\r\nexport default BasketOffer;\r\n","import React, { useEffect, useRef } from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { useHistory } from 'react-router-dom';\r\nimport useShowDelay from 'hooks/useShowDelay';\r\nimport uuidGenerator from 'shared/tools/uuid-generator';\r\nimport { PaymentHelper } from 'shared/helpers';\r\nimport { LocalizationState } from 'apps/LocalizationApp/Store';\r\nimport SingleActionModal from 'shared/components/single-action-modal.component';\r\nimport { isOfferComplexType } from 'shared/helpers/coupons-helpers';\r\nimport { appCulture, redirectToURL } from 'shared/helpers/routing-helpers';\r\nimport { LocalizationActionTypes } from 'apps/LocalizationApp/Store/actions';\r\nimport StoreStatusInfo from 'apps/LocalizationApp/Containers/store-status-info.container';\r\nimport { getStoreStatus } from 'apps/LocalizationApp/helpers/store-status';\r\nimport { SimplifiedBasketItem } from '../types/basket.types';\r\nimport { BasketActions, ProductsActions, CustomizeProductActions, OffersActions } from '../store/actions';\r\nimport Upsell from '../components/upsell-product.component';\r\nimport { ApplicationState, BasketState, GlobalState, OffersState, ProductsStaticContent } from '../store';\r\nimport BasketItem from '../components/basket-item.component';\r\nimport OfferDiscountTag from '../components/offer-discount-tag.component';\r\nimport VoucherModal from './voucher-modal.container';\r\nimport BasketOffer from '../components/basket-offer.component';\r\nimport { continueRecalculateRequest } from '../store/basket/basket.actions';\r\n\r\nexport interface BasketProps {\r\n isVisible: boolean;\r\n onClose(): void;\r\n}\r\n\r\nconst Basket: React.FC = ({ isVisible, onClose }) => {\r\n const {\r\n basket: labels,\r\n xTastyPizza,\r\n invalidCombinationModal,\r\n invalidProductCompositionForOfferModal,\r\n extraSurcharge,\r\n } = useSelector((state) => state.productsStaticContent);\r\n const { language, basket, crossSell, pausedRecalculateRequest, basketTraceId } = useSelector(\r\n (state) => state.basket,\r\n );\r\n const localizationState = useSelector((state) => state.localization);\r\n const { currentStore, selectedOrderTime } = localizationState;\r\n const prevStoreIdRef = useRef(currentStore.id);\r\n useEffect(() => {\r\n prevStoreIdRef.current = currentStore.id;\r\n });\r\n const { customizationOffer, openDealConfiguration, invalidComboModal, invalidProductCompositionModal } = useSelector<\r\n ApplicationState,\r\n OffersState\r\n >((state) => state.offers);\r\n\r\n const { currentUser } = useSelector((state) => state.global);\r\n\r\n const { show } = useShowDelay(isVisible);\r\n const dispatch = useDispatch();\r\n const basketHasItems = basket.items.length > 0;\r\n const history = useHistory();\r\n\r\n const basketItems = basket.items.filter((item) => !item.isCompilationPart);\r\n const itemsQuantity = basketItems && basketItems.length + basket.compiledOffers.length;\r\n\r\n useEffect(() => {\r\n if (pausedRecalculateRequest && currentStore.id && selectedOrderTime) {\r\n const { items, coupons, params } = pausedRecalculateRequest;\r\n dispatch(continueRecalculateRequest(items, coupons, params));\r\n }\r\n }, [selectedOrderTime]);\r\n\r\n useEffect(() => {\r\n if (!currentStore.id) {\r\n if (!pausedRecalculateRequest) {\r\n dispatch(BasketActions.removeBasket());\r\n }\r\n } else if (currentStore.id !== prevStoreIdRef.current) {\r\n dispatch(BasketActions.refreshBasket());\r\n }\r\n }, [currentStore]);\r\n\r\n useEffect(() => {\r\n const pausedOffer = sessionStorage.getItem('pausedOffer');\r\n\r\n if (pausedOffer && currentStore.id) {\r\n const parsedPausedOffer: { couponCode: string; position: number } = JSON.parse(pausedOffer);\r\n dispatch(\r\n OffersActions.resumeAddingOffer(\r\n parsedPausedOffer.couponCode,\r\n () => {\r\n history.push({\r\n pathname: '/deal',\r\n search: `?code=${parsedPausedOffer}`,\r\n });\r\n },\r\n parsedPausedOffer.position,\r\n ),\r\n );\r\n }\r\n sessionStorage.removeItem('pausedOffer');\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (openDealConfiguration && customizationOffer) {\r\n history.push({\r\n pathname: '/deal',\r\n search: `?code=${customizationOffer.code}`,\r\n });\r\n }\r\n }, [customizationOffer, openDealConfiguration]);\r\n\r\n useEffect(() => {\r\n gtm.cartModule.cartRecalculated(basket, localizationState, basketTraceId);\r\n }, [basketTraceId]);\r\n\r\n useEffect(() => {\r\n if (appCulture() !== language) {\r\n dispatch(BasketActions.refreshBasket());\r\n }\r\n }, [language]);\r\n\r\n async function submitBasketHandler(): Promise {\r\n const storeStatus = await getStoreStatus(localizationState.currentStore.id, localizationState.distributionType);\r\n if (!storeStatus.canPlaceOrder) {\r\n dispatch({\r\n type: LocalizationActionTypes.SET_SELECTED_STORE_STATUS,\r\n payload: { ...storeStatus, storePhoneNumber: currentStore.phoneNumber },\r\n });\r\n dispatch({ type: LocalizationActionTypes.SHOW_MODAL, payload: true });\r\n return;\r\n }\r\n\r\n if (basketHasItems) {\r\n history ? history.push('/checkout') : redirectToURL('products/checkout');\r\n }\r\n }\r\n\r\n function goToOffersHandler(): void {\r\n dispatch({ type: ProductsActions.ProductActionTypes.SET_ACTIVE_CATEGORY, payload: 'offers' });\r\n history.push('/offers');\r\n onClose();\r\n }\r\n\r\n function replaceInBasket(itemToReplace: SimplifiedBasketItem, itemBeforeUpdate: SimplifiedBasketItem): void {\r\n dispatch(BasketActions.replaceProduct(itemToReplace, itemBeforeUpdate));\r\n }\r\n\r\n async function addUpsellHandler(): Promise {\r\n if (!crossSell) return;\r\n\r\n dispatch(\r\n OffersActions.checkOfferCombinationValidity(\r\n crossSell.code,\r\n () => {\r\n history.push({\r\n pathname: '/deal',\r\n search: `?code=${crossSell.code}`,\r\n });\r\n },\r\n 'upsell',\r\n ),\r\n );\r\n }\r\n\r\n return (\r\n <>\r\n
\r\n
\r\n
\r\n

\r\n {labels.backButton}\r\n

\r\n
\r\n \r\n {labels.header}\r\n \r\n
\r\n
\r\n {basket.items.length > 0 && (\r\n <>\r\n {basketItems.map((item, index) => (\r\n {\r\n dispatch(BasketActions.removeProduct(item));\r\n }}\r\n onEdit={(): void => {\r\n dispatch(\r\n CustomizeProductActions.editCustomizationProduct(item, (itemToReplace) =>\r\n replaceInBasket(itemToReplace, item),\r\n ),\r\n );\r\n }}\r\n />\r\n ))}\r\n {basket.compiledOffers.length > 0 &&\r\n basket.compiledOffers.map((offer) => (\r\n {\r\n dispatch(BasketActions.removeCompiledOffer(offer.appliedDealIdentifier, offer.code));\r\n }}\r\n onEdit={(): void => {\r\n dispatch(OffersActions.editCustomizationOffer(offer.appliedDealIdentifier));\r\n }}\r\n key={offer.appliedDealIdentifier}\r\n xTastyTranslations={xTastyPizza}\r\n extraChargeLabel={extraSurcharge}\r\n />\r\n ))}\r\n \r\n )}\r\n {basket.discounts &&\r\n basket.coupons.map(\r\n (coupon) =>\r\n !isOfferComplexType(coupon.type) && (\r\n {\r\n dispatch(BasketActions.removeCoupon(coupon.code));\r\n }}\r\n key={uuidGenerator()}\r\n />\r\n ),\r\n )}\r\n {basketHasItems && typeof(basket.totalPrice) === 'number' && (\r\n
\r\n

Total:

\r\n
\r\n {basket.originalTotalPrice &&\r\n basket.originalTotalPrice >\r\n +Number(basket.totalPrice - (basket.deliveryCharge ?? 0)).toFixed(2) && (\r\n \r\n

\r\n {PaymentHelper.formatToDisplay(basket.originalTotalPrice)}\r\n

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

\r\n {PaymentHelper.formatToDisplay(basket.totalPrice - (basket.deliveryCharge ?? 0))}\r\n

\r\n
\r\n
\r\n )}\r\n\r\n {basket.items.length > 0 ? (\r\n

\r\n {labels.dynamicTextItemsAddedPrefix}\r\n \r\n {labels.dynamicTextLinkItemsAdded}\r\n \r\n {labels.dynamicTextItemsAddedSuffix}\r\n

\r\n ) : (\r\n

\r\n {labels.dynamicText}\r\n \r\n {labels.dynamicTextLink}\r\n \r\n

\r\n )}\r\n
\r\n {currentUser && currentStore.id && (\r\n
\r\n \r\n {labels.promoCodeHeader}\r\n \r\n {\r\n dispatch({\r\n type: BasketActions.BasketActionTypes.SET_VOUCHER_MODAL_VISIBILITY,\r\n payload: true,\r\n });\r\n }}\r\n >\r\n \r\n

\r\n {labels.promoCodeLink}\r\n

\r\n
\r\n
\r\n )}\r\n
\r\n\r\n
\r\n {crossSell && basket.coupons.findIndex((coupon) => coupon.code === crossSell.code) < 0 && (\r\n
\r\n \r\n
\r\n )}\r\n \r\n {itemsQuantity > 0 && (\r\n
\r\n

{itemsQuantity}

\r\n
\r\n )}\r\n {labels.cta}\r\n {itemsQuantity > 0 && typeof(basket.totalPrice) === 'number' && (\r\n

\r\n {PaymentHelper.formatToDisplay(basket.totalPrice - (basket.deliveryCharge ?? 0))}\r\n

\r\n )}\r\n \r\n
\r\n
\r\n \r\n {\r\n invalidComboModal &&\r\n dispatch(\r\n OffersActions.getOfferDetails({\r\n couponCode: invalidComboModal.couponCode,\r\n redirectCallback: () => {\r\n history.push({\r\n pathname: '/deal',\r\n search: `?code=${invalidComboModal.couponCode}`,\r\n });\r\n },\r\n position: invalidComboModal.addedOfferPosition,\r\n }),\r\n );\r\n dispatch({ type: OffersActions.OffersActionTypes.SET_INVALID_COMBINATION_MODAL });\r\n }}\r\n isVisible={!!invalidComboModal}\r\n cancelCallbackFn={() => {\r\n dispatch({ type: OffersActions.OffersActionTypes.SET_INVALID_COMBINATION_MODAL });\r\n dispatch({ type: OffersActions.OffersActionTypes.SET_OFFERS_COMBINATION });\r\n }}\r\n testId=\"invalid-coupon-combination-modal\"\r\n />\r\n dispatch({ type: OffersActions.OffersActionTypes.SET_INVALID_PRODUCT_COMPOSITION_MODAL })}\r\n isVisible={!!invalidProductCompositionModal}\r\n cancelCallbackFn={() => {\r\n dispatch({ type: OffersActions.OffersActionTypes.SET_INVALID_PRODUCT_COMPOSITION_MODAL });\r\n }}\r\n testId=\"invalid-product-composition-modal\"\r\n />\r\n \r\n \r\n );\r\n};\r\n\r\nexport default Basket;\r\n","import React, { useState, ReactNode } from 'react';\r\nimport MainHeader from 'apps/NavigationApp/containers/main-header.container';\r\nimport Categories from 'apps/ProductsApp/components/categories.component';\r\nimport Basket from 'apps/ProductsApp/containers/basket.container';\r\nimport { useSelector } from 'react-redux';\r\nimport { PaymentHelper } from 'shared/helpers';\r\nimport { ApplicationState, BasketState, ProductsStaticContent } from '../store';\r\n\r\ninterface CatalogWrapperProps {\r\n children: ReactNode;\r\n externalCategories?: boolean;\r\n}\r\n\r\nconst CatalogWrapper: React.FC = ({ children, externalCategories = false }) => {\r\n const { basket } = useSelector((state) => state.basket);\r\n const { showBasket } = useSelector((state) => state.productsStaticContent);\r\n const [basketVisible, setBasketVisible] = useState(false);\r\n\r\n const basketItems = basket.items.filter((item) => !item.isCompilationPart);\r\n const itemsQuantity = basketItems && basketItems.length + basket.compiledOffers.length;\r\n\r\n return (\r\n <>\r\n
\r\n
\r\n \r\n
\r\n
\r\n
{!externalCategories && }
\r\n
\r\n
\r\n
\r\n setBasketVisible(true)}\r\n data-testid=\"products__button--show-basket\"\r\n >\r\n {itemsQuantity > 0 && (\r\n
\r\n

{itemsQuantity}

\r\n
\r\n )}\r\n {showBasket}\r\n {itemsQuantity > 0 && basket.totalPrice && (\r\n

\r\n {PaymentHelper.formatToDisplay(basket.totalPrice - (basket.deliveryCharge ?? 0))}\r\n

\r\n )}\r\n \r\n
\r\n
\r\n {children}\r\n
\r\n setBasketVisible(false)} />\r\n \r\n );\r\n};\r\n\r\nexport default CatalogWrapper;\r\n","import React, { useState } from 'react';\r\nimport { HistoryOrderCoupon, HistoryOrderProduct } from 'apps/AccountManagementApp/account-details.types';\r\nimport { LastUserOrderLabels } from 'apps/ProductsApp/store/static-content/products-static-content.reducer';\r\nimport { useDispatch } from 'react-redux';\r\nimport { BasketActions } from 'apps/ProductsApp/store/actions';\r\n\r\ninterface LastOrderProps {\r\n labels: LastUserOrderLabels;\r\n products: HistoryOrderProduct[];\r\n coupons: HistoryOrderCoupon[];\r\n}\r\n\r\nconst LastOrder = ({ labels, products, coupons }: LastOrderProps): JSX.Element => {\r\n const [expanded, setExpanded] = useState(false);\r\n const dispatch = useDispatch();\r\n const groupedProductsWithQuantity = groupProductsToQuantity(products);\r\n const allProductsQuantity = groupedProductsWithQuantity.reduce((a, b) => a + b.amount, 0);\r\n\r\n function renderCoupon(coupon: HistoryOrderCoupon): string {\r\n return coupon.title;\r\n }\r\n\r\n function renderProduct(product: HistoryOrderProduct): string {\r\n const productName = `${product.amount} x ${product.title}(${product.optionSubType !== '' ? `${product.optionSubType} ` : ''}${\r\n product.optionTitle\r\n })`;\r\n return productName;\r\n }\r\n\r\n function renderProductsNCoupons(histCoupons: HistoryOrderCoupon[], histProducts: HistoryOrderProduct[], isExpanded: boolean) {\r\n const couponsNames = histCoupons?.map((cp) => renderCoupon(cp));\r\n const productsNames = histProducts?.map((p) => renderProduct(p));\r\n const allNames = [...couponsNames, ...productsNames];\r\n if (!isExpanded) {\r\n return `${allNames[0]}${allNames.length === 1 ? '' : '...'}`;\r\n }\r\n\r\n return allNames.join(', ');\r\n }\r\n\r\n function groupProductsToQuantity(prods: HistoryOrderProduct[]): HistoryOrderProduct[] {\r\n const groupedProducts: HistoryOrderProduct[] = [];\r\n prods.forEach((product) => {\r\n const productIndex = groupedProducts.findIndex((el) => el.id === product.id && el.optionId === product.optionId);\r\n if (productIndex !== -1) {\r\n groupedProducts[productIndex].amount++;\r\n return;\r\n }\r\n groupedProducts.push({ ...product });\r\n });\r\n\r\n return groupedProducts;\r\n }\r\n\r\n const productsNCouponsLength = allProductsQuantity + coupons.length;\r\n\r\n return (\r\n
\r\n
\r\n

{labels.header}

\r\n

{renderProductsNCoupons(coupons, groupedProductsWithQuantity, expanded)}

\r\n
\r\n \r\n {productsNCouponsLength > 1 && (\r\n setExpanded((prev) => !prev)}\r\n >\r\n {expanded ? labels.hideDetails : labels.showDetails}\r\n

\r\n )}\r\n\r\n {\r\n dispatch(BasketActions.reorderFromHistoryProductsNCoupons(coupons, products));\r\n }}\r\n >\r\n {labels.ctaText}\r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default LastOrder;\r\n","import React from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { PaymentHelper } from 'shared/helpers';\r\nimport { StaticContent } from 'shared/types';\r\nimport { ApplicationState } from '../store';\r\n\r\nimport { Offer } from '../types/dto.types';\r\n\r\ninterface OfferCardProps {\r\n offer: Offer;\r\n onAdd(e: React.MouseEvent): void;\r\n ctaLabel: string;\r\n isLocalized: boolean;\r\n}\r\n\r\nconst OfferCard: React.FC = ({ offer, onAdd, ctaLabel, isLocalized }) => {\r\n const { hideCouponsScratchedPrices } = useSelector(\r\n state => state.staticContent.configuration,\r\n );\r\n\r\n function canShowScratchedCouponPrice() {\r\n if (hideCouponsScratchedPrices) return false;\r\n if (!offer || !offer.price || !offer.defaultCouponPrice) return false;\r\n if (offer.price > offer.defaultCouponPrice) return false;\r\n return true;\r\n }\r\n\r\n return (\r\n
\r\n {offer.altText}\r\n
\r\n
\r\n

\r\n {offer.title}\r\n

\r\n

\r\n {offer.description}\r\n

\r\n
\r\n
\r\n
\r\n \r\n {offer.price && isLocalized && PaymentHelper.formatToDisplay(offer.price)}\r\n \r\n {canShowScratchedCouponPrice() && (\r\n \r\n {isLocalized && PaymentHelper.formatToDisplay(offer.defaultCouponPrice as number)}\r\n \r\n )}\r\n
\r\n {\r\n gtm.promotionsModule.offerClicked(offer);\r\n onAdd(e);\r\n }}\r\n data-testid=\"offer-card__button--mainCTA\"\r\n >\r\n {ctaLabel}\r\n \r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default OfferCard;\r\n","import React from 'react';\r\nimport { PaymentHelper } from 'shared/helpers';\r\nimport { Offer } from '../types/dto.types';\r\n\r\ninterface PopularOfferCardProps {\r\n offer: Offer;\r\n onAddFn(e: React.MouseEvent): void;\r\n isLocalized: boolean;\r\n}\r\n\r\nconst PopularOfferCard: React.FC = ({ offer, onAddFn, isLocalized }) => {\r\n return (\r\n {\r\n gtm.promotionsModule.offerClicked(offer);\r\n onAddFn(e);\r\n }}\r\n data-testid={`special-offer-card__container-${offer.code}`}\r\n >\r\n
\r\n
\r\n

\r\n {offer.title}\r\n

\r\n

\r\n {offer.description}\r\n

\r\n
\r\n
\r\n \r\n {offer.price && isLocalized && PaymentHelper.formatToDisplay(offer.price)}\r\n \r\n
\r\n
\r\n \r\n );\r\n};\r\n\r\nexport default PopularOfferCard;\r\n","import React, { Dispatch } from 'react';\r\nimport { RouteComponentProps, match as Match, withRouter } from 'react-router-dom';\r\nimport { connect } from 'react-redux';\r\nimport { OrderDistributionType } from 'shared/types';\r\nimport CatalogWrapper from 'apps/ProductsApp/containers/catalog-wrapper.container';\r\nimport { AddressWizzardActions } from 'apps/NavigationApp/store/actions';\r\nimport { AddressWizzardSteps } from 'apps/NavigationApp/navigation.types';\r\nimport LastOrder from 'apps/ProductsApp/containers/last-order.container';\r\nimport { ApplicationState } from '../store';\r\nimport OfferCard from '../components/offer-card.component';\r\nimport { Offer } from '../types/dto.types';\r\nimport { OffersActions, ProductsActions } from '../store/actions';\r\nimport { pauseAddingOffer } from '../store/offers/offers.actions';\r\nimport PopularOfferCard from '../components/popular-offer-card.component';\r\n\r\nclass Offers extends React.Component {\r\n private dispatch: Dispatch;\r\n\r\n private regularOffers: Offer[];\r\n\r\n private popularOffers: Offer[];\r\n\r\n constructor(props: OffersPageProps) {\r\n super(props);\r\n const { dispatch } = props;\r\n this.dispatch = dispatch;\r\n\r\n this.regularOffers = [];\r\n this.popularOffers = [];\r\n }\r\n\r\n componentDidMount() {\r\n const seoText = document.getElementById('products-seo-text') as HTMLElement;\r\n const seoTextContainer = document.getElementById('offers-seo-text-container') as HTMLElement;\r\n\r\n const { products, offers } = this.props;\r\n products.categories.length < 1 && this.dispatch(ProductsActions.getProducts());\r\n offers.offers.length < 1 && this.dispatch(OffersActions.getOffers());\r\n seoText && seoTextContainer.appendChild(seoText);\r\n this.dispatch(ProductsActions.getSeoText('offers', seoTextContainer));\r\n gtm.screenLoad('product-list', 'product-list.offers');\r\n\r\n this.updateOffers();\r\n }\r\n\r\n componentDidUpdate(prevProps: OffersPageProps) {\r\n const {\r\n offers: { offers },\r\n } = this.props;\r\n\r\n if (!this.areOffersArraysEqual(offers, prevProps.offers.offers)) this.updateOffers();\r\n\r\n if (!this.areOffersArraysEqual(offers, prevProps.offers.offers) && offers.length > 0) {\r\n window.removeEventListener('scroll', this.boundScrollHandler);\r\n window.addEventListener('scroll', this.boundScrollHandler);\r\n }\r\n }\r\n\r\n componentWillUnmount() {\r\n window.removeEventListener('scroll', this.boundScrollHandler);\r\n }\r\n\r\n areOffersArraysEqual(a: Offer[], b: Offer[]): boolean {\r\n return JSON.stringify(a.sort(this.offersCompareFunction)) === JSON.stringify(b.sort(this.offersCompareFunction));\r\n }\r\n\r\n offersCompareFunction(a: Offer, b: Offer): number {\r\n if (a.code === b.code) {\r\n return 0;\r\n }\r\n\r\n return a.code > b.code ? 1 : 0;\r\n }\r\n\r\n filterOffers(): Offer[] {\r\n const {\r\n localization: { currentStore, distributionType },\r\n } = this.props;\r\n const {\r\n offers: { offers },\r\n } = this.props;\r\n\r\n if (currentStore.id) {\r\n if (distributionType === OrderDistributionType.Delivery) {\r\n return offers.filter((offer) => offer.forDelivery);\r\n }\r\n if (distributionType === OrderDistributionType.Pickup) {\r\n return offers.filter((offer) => offer.forPickup);\r\n }\r\n }\r\n return offers;\r\n }\r\n\r\n updateOffers(): void {\r\n const filteredOffers = this.filterOffers();\r\n this.regularOffers = filteredOffers.filter((offer) => !offer.isPopular);\r\n this.popularOffers = filteredOffers.filter((offer) => offer.isPopular);\r\n }\r\n\r\n async addOffer(e: React.MouseEvent, offer: Offer, position: number | string): Promise {\r\n e.stopPropagation();\r\n\r\n if (!this.props.localization.currentStore.id) {\r\n pauseAddingOffer(offer.code, position);\r\n this.dispatch(AddressWizzardActions.changeWizzardStep(AddressWizzardSteps.LocalizationModal));\r\n return;\r\n }\r\n\r\n this.dispatch(\r\n OffersActions.checkOfferCombinationValidity(\r\n offer.code,\r\n () => {\r\n this.props.history.push({\r\n pathname: '/deal',\r\n search: `?code=${offer.code}`,\r\n });\r\n },\r\n position,\r\n ),\r\n );\r\n }\r\n\r\n gtmScrollHandler() {\r\n let offersList = this.props.offers.offers;\r\n const { distributionType } = this.props.localization;\r\n\r\n if (distributionType === OrderDistributionType.Delivery) {\r\n offersList = offersList.filter((offer) => offer.forDelivery);\r\n } else if (distributionType === OrderDistributionType.Pickup) {\r\n offersList = offersList.filter((offer) => offer.forPickup);\r\n }\r\n\r\n gtm.productsModule.dealsScroll(this.regularOffers.concat(this.popularOffers));\r\n }\r\n\r\n boundScrollHandler = this.gtmScrollHandler.bind(this);\r\n\r\n render() {\r\n const {\r\n basket,\r\n productsStaticContent,\r\n localization,\r\n global: { signedin },\r\n } = this.props;\r\n const { offers: labels, lastUserOrder: lastUserOrderLabels } = productsStaticContent;\r\n const { currentStore } = localization;\r\n const { lastUserOrder } = basket;\r\n\r\n const showLastOrder = signedin && lastUserOrder;\r\n return (\r\n \r\n
\r\n {showLastOrder && (\r\n \r\n )}\r\n

{labels.offersCategory}

\r\n
\r\n {this.regularOffers.map((offer, idx) => (\r\n
\r\n => this.addOffer(e, offer, idx)}\r\n ctaLabel={labels.mainCta}\r\n isLocalized={!!currentStore.id}\r\n />\r\n
\r\n ))}\r\n
\r\n
\r\n {labels.popularOffers}\r\n
\r\n
\r\n {this.popularOffers.map((offer, idx) => (\r\n
\r\n => this.addOffer(e, offer, this.regularOffers.length + idx)}\r\n isLocalized={!!currentStore.id}\r\n />\r\n
\r\n ))}\r\n
\r\n
\r\n
\r\n \r\n );\r\n }\r\n}\r\n\r\ninterface RouterParameters {\r\n category: string;\r\n}\r\n\r\ninterface OffersPageProps extends RouteComponentProps, ApplicationState {\r\n dispatch: Dispatch;\r\n match: Match;\r\n}\r\n\r\nexport default withRouter(\r\n connect((state: OffersPageProps): OffersPageProps => {\r\n return {\r\n ...state,\r\n };\r\n })(Offers),\r\n);\r\n","/* eslint-disable jsx-a11y/no-noninteractive-element-interactions */\r\nimport { LocalizationState } from 'apps/LocalizationApp/Store';\r\nimport React, { useState } from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { PaymentHelper } from 'shared/helpers';\r\nimport { OrderDistributionType } from 'shared/types';\r\nimport { getOtherAppRedirectURL } from 'shared/helpers/routing-helpers';\r\nimport { ApplicationState } from '../store';\r\nimport { ProductsStaticContent } from '../store/static-content/products-static-content.reducer';\r\nimport { Option, Product, ProductDetails, StoreStockStatus } from '../types/dto.types';\r\n\r\ninterface ProductCardProps {\r\n product: Product;\r\n onAdd(currentOption: Option): void;\r\n onEdit(): void;\r\n simplified?: boolean;\r\n productDetails?: boolean;\r\n showPrice?: boolean;\r\n index?: number;\r\n categoryName?: string;\r\n}\r\n\r\nconst ProductCard: React.FC = ({\r\n product,\r\n onAdd,\r\n onEdit,\r\n simplified = false,\r\n productDetails = false,\r\n showPrice = true,\r\n index = 0,\r\n categoryName = '',\r\n}) => {\r\n if (product.options.length === 0) return null;\r\n\r\n const { productCard } = useSelector((state) => state.productsStaticContent);\r\n const { distributionType, currentStore } = useSelector((state) => state.localization);\r\n\r\n const productIsPizza = product.categoryId === 'PIZ';\r\n const productIsSpecialPizza = productIsPizza && (product.isXTasty || product.isCreateCustomPizza);\r\n const productHasMultipleOptions = product.options.length > 1;\r\n const isOutOfStock = product.stockStatus === StoreStockStatus.OutOfStock;\r\n // TODO API returns isRestrictedForDeliveryTime as true in some cases even if no time or store is selected. Needs to be fixed\r\n const notDisposable = !!currentStore.id && (isOutOfStock || product.isRestrictedForDeliveryTime); // From UI perspective those two conditions cause same card ui + flow\r\n const canEditProduct = product.isCustomizable && !notDisposable;\r\n const showEditButton = canEditProduct && !product.isXTasty && !product.isCreateCustomPizza;\r\n const canEditFromProductImage = canEditProduct && window.innerWidth < 960;\r\n\r\n const sortedOptions = product.options.sort((a, b) => Number(a.sortOrder) - Number(b.sortOrder));\r\n const [currentOption, setCurrentOption] = useState
\r\n );\r\n};\r\n\r\nexport default ProductCard;\r\n","import React from 'react';\r\nimport { InlineBannerStaticContent } from '../store/static-content/products-static-content.reducer';\r\n\r\ninterface BannerProps {\r\n bannerData: InlineBannerStaticContent;\r\n}\r\n\r\nconst Banner: React.FC = ({ bannerData }) => {\r\n const { inlineBannerImage, inlineBannerRow, inlineBannerUrl, inlineBannerVisibility } = bannerData;\r\n\r\n const bannerUrlCorrect = inlineBannerImage.length > 0;\r\n\r\n return (\r\n <>\r\n {inlineBannerVisibility === true && bannerUrlCorrect && (\r\n \r\n \r\n \"Promo\r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default Banner;\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport React, { Dispatch } from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { withRouter, RouteComponentProps, match as Match } from 'react-router-dom';\r\nimport { SimplifiedBasketItem } from 'apps/ProductsApp/types/basket.types';\r\nimport CatalogWrapper from 'apps/ProductsApp/containers/catalog-wrapper.container';\r\n\r\n// store\r\nimport { OrderDistributionType } from 'shared/types';\r\nimport { ApplicationState } from '../store';\r\nimport { BasketActions, CustomizeProductActions, ProductsActions } from '../store/actions';\r\nimport { getInlineBanner } from '../store/static-content/products-static-content.actions';\r\n\r\n// components\r\nimport AllergenInfo from '../components/allergens-info.component';\r\nimport ProductCard from '../components/product-card.component';\r\nimport Banner from '../components/banner.component';\r\n\r\n// types\r\nimport { Product } from '../types/dto.types';\r\nimport LastOrder from '../containers/last-order.container';\r\n\r\nclass CatalogPage extends React.Component {\r\n private dispatch: Dispatch;\r\n\r\n private currentCategory = '';\r\n\r\n constructor(props: CatalogPageProps) {\r\n super(props);\r\n const { dispatch } = props;\r\n this.dispatch = dispatch;\r\n }\r\n\r\n componentDidMount(): void {\r\n const { match } = this.props;\r\n const { category } = match.params;\r\n const seoText = document.getElementById('products-seo-text') as HTMLElement;\r\n const seoTextContainer = document.getElementById('products-seo-text-container') as HTMLElement;\r\n this.currentCategory = category;\r\n\r\n seoText && seoTextContainer.appendChild(seoText);\r\n this.dispatch(ProductsActions.getSeoText(category, seoTextContainer));\r\n this.dispatch(ProductsActions.getProducts(category));\r\n\r\n this.dispatch(getInlineBanner(category));\r\n gtm.screenLoad('product-list', `product-list.${this.currentCategory}`);\r\n }\r\n\r\n componentDidUpdate(prevProps: CatalogPageProps): void {\r\n const {\r\n match,\r\n location,\r\n localization,\r\n products: { activeCategory, items },\r\n } = this.props;\r\n\r\n if (prevProps.products.items !== items || prevProps.products.activeCategory !== activeCategory) {\r\n const prdList = items.filter((productsList) => productsList.id === activeCategory);\r\n prdList.length > 0 &&\r\n gtm.productsModule.productsLoad(\r\n prdList[0].products,\r\n localization.distributionType === OrderDistributionType.Delivery,\r\n localization.currentStore?.id !== '',\r\n );\r\n\r\n window.removeEventListener('scroll', this.boundScrollHandler);\r\n window.addEventListener('scroll', this.boundScrollHandler);\r\n }\r\n\r\n if (location.pathname === prevProps.location.pathname) {\r\n return;\r\n }\r\n\r\n const { category } = match.params;\r\n this.currentCategory = category;\r\n\r\n gtm.screenLoad('product-list', `product-list.${this.currentCategory}`);\r\n\r\n this.dispatch(ProductsActions.getProducts(category));\r\n const seoTextContainer = document.getElementById('products-seo-text-container') as HTMLElement;\r\n this.dispatch(ProductsActions.getSeoText(category, seoTextContainer));\r\n this.dispatch(getInlineBanner(category));\r\n }\r\n\r\n componentWillUnmount() {\r\n window.removeEventListener('scroll', this.boundScrollHandler);\r\n }\r\n\r\n gtmScrollHandler() {\r\n if (this.props.products.items[0]?.products) {\r\n gtm.productsModule.productsScroll(this.props.products.items[0]?.products);\r\n }\r\n }\r\n\r\n boundScrollHandler = this.gtmScrollHandler.bind(this);\r\n\r\n render(): JSX.Element {\r\n const {\r\n products,\r\n productsStaticContent,\r\n basket,\r\n global: { signedin },\r\n } = this.props;\r\n const { dispatch } = this;\r\n const { lastUserOrder } = basket;\r\n const { categories, activeCategory, header } = products;\r\n const { inlineBanner, lastUserOrder: lastUserOrderLabels } = productsStaticContent;\r\n const prdList = products.items.filter((productsList) => productsList.id === activeCategory);\r\n const showLastOrder = signedin && lastUserOrder && activeCategory.toUpperCase() === 'PIZ';\r\n\r\n function addToBasket(itemToAdd: SimplifiedBasketItem): void {\r\n dispatch(BasketActions.addProduct(itemToAdd));\r\n }\r\n\r\n let filteredProducts: Product[] = [];\r\n\r\n if (prdList.length > 0) {\r\n filteredProducts = prdList[0].products;\r\n }\r\n\r\n return (\r\n \r\n
\r\n
\r\n \r\n
\r\n {showLastOrder && (\r\n \r\n )}\r\n

\r\n {header || categories.find((cat) => cat.id === activeCategory)?.title.toLowerCase()}\r\n

\r\n
\r\n {filteredProducts.map((product, position) => (\r\n {\r\n dispatch(BasketActions.addProductBySKU(currentOption.sku));\r\n }}\r\n onEdit={(): void => {\r\n dispatch(\r\n CustomizeProductActions.setCustomizationProduct({\r\n productId: product.id,\r\n callbackFunction: addToBasket,\r\n position,\r\n }),\r\n );\r\n }}\r\n key={product.id}\r\n index={position}\r\n categoryName={this.currentCategory}\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 withRouter(\r\n connect((state: CatalogPageProps): CatalogPageProps => {\r\n return {\r\n ...state,\r\n };\r\n })(CatalogPage),\r\n);\r\ninterface RouterParameters {\r\n category: string;\r\n}\r\n\r\ninterface CatalogPageProps extends RouteComponentProps, ApplicationState {\r\n dispatch: Dispatch;\r\n match: Match;\r\n}\r\n","import { groupToppingsToDisplay } from 'apps/ProductsApp/helpers/customize-product.helper';\r\nimport { BasketState, ApplicationState } from 'apps/ProductsApp/store';\r\nimport { CheckoutState } from 'apps/ProductsApp/store/checkout/checkout.reducer';\r\nimport { CheckoutStaticContent } from 'apps/ProductsApp/store/static-content/checkout-static-content-reducer';\r\nimport { BasketItem } from 'apps/ProductsApp/types/basket.types';\r\nimport { OfferTypes } from 'apps/ProductsApp/types/dto.types';\r\nimport React, { useEffect, useState } from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { PaymentHelper } from 'shared/helpers';\r\n\r\nconst CheckoutBasket: React.FC = () => {\r\n const { basket } = useSelector((state) => state.basket);\r\n const { basket: basketStaticContent } = useSelector(\r\n (state) => state.checkoutStaticContent,\r\n );\r\n const { checkoutForm } = useSelector((state) => state.checkout);\r\n const [expanded, setExpanded] = useState(true);\r\n\r\n const originalDiscountedPrice =\r\n basket.originalTotalPrice !== undefined &&\r\n basket.totalPrice !== undefined &&\r\n basket.totalPrice.toFixed(2) < (basket.originalTotalPrice + (basket.deliveryCharge ?? 0)).toFixed(2)\r\n ? basket.originalTotalPrice + (basket.deliveryCharge ?? 0)\r\n : null;\r\n\r\n useEffect(() => {\r\n gtm.checkoutModule.checkoutScreenLoad(basket.items, checkoutForm.selectedPaymentMethod?.paymentMethod);\r\n }, []);\r\n\r\n return (\r\n
\r\n
\r\n
\r\n
\r\n
\r\n {basketStaticContent.headerText}\r\n
\r\n {\r\n setExpanded(!expanded);\r\n }}\r\n data-testid=\"checkout-basket__button--expand\"\r\n />\r\n
\r\n
\r\n

\r\n {renderDiscountedPrice(originalDiscountedPrice)}\r\n

\r\n

\r\n {basket.totalPrice && PaymentHelper.formatToDisplay(basket.totalPrice)}\r\n

\r\n
\r\n
\r\n
\r\n {expanded && (\r\n <>\r\n
\r\n {basket.items.map((basketItem, index) => {\r\n const hasFixedDiscount =\r\n !!basketItem.appliedDealId &&\r\n basket.coupons.find((coupon) => coupon.code === basketItem.appliedDealId)?.type === OfferTypes.FXD_DIS;\r\n\r\n return (\r\n
\r\n
\r\n
\r\n \r\n {getDescription(basketItem)}\r\n \r\n {basketItem.price >= 0 && !hasFixedDiscount && (\r\n \r\n {isDiscountedPriceValid(basketItem) && (\r\n {PaymentHelper.formatToDisplay(basketItem.price)}\r\n )}\r\n

\r\n )}\r\n
\r\n \r\n {getDetails(basketItem)}\r\n
\r\n
\r\n\r\n \r\n {renderFinalPrice(basketItem, hasFixedDiscount)}\r\n
\r\n
\r\n );\r\n })}\r\n {getDeliveryCharge(basketStaticContent.deliveryChargeText, basket.deliveryCharge)}\r\n
\r\n
\r\n
\r\n

Total:

\r\n
\r\n

\r\n {originalDiscountedPrice && {PaymentHelper.formatToDisplay(originalDiscountedPrice)}}\r\n

\r\n

\r\n {basket.totalPrice && PaymentHelper.formatToDisplay(basket.totalPrice)}\r\n

\r\n
\r\n
\r\n
\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default CheckoutBasket;\r\n\r\nfunction getDescription(item: BasketItem): string {\r\n const { sku } = item;\r\n if (item.categoryId.toUpperCase() === 'PIZ' && sku.optionSubTitle && sku.optionSubTitle.length > 0) {\r\n return `${sku.productTitle} ${sku.optionSubTitle}`;\r\n }\r\n return sku.productTitle;\r\n}\r\n\r\nfunction getDetails(item: BasketItem): JSX.Element {\r\n const { addedToppings, removedToppings, defaultToppings } = item;\r\n const showCrustExtraCharge = item.extraCharge && item.extraCharge === item.discountedPrice;\r\n\r\n const optionLabel = item.sku.optionTitle + (showCrustExtraCharge ? '* supplement - premium Crust included,' : ',');\r\n\r\n if (item.xTastyChoices && item.xTastyChoices.length > 1) {\r\n return (\r\n
\r\n {item.xTastyChoices.map((xTastySlice, index) => {\r\n return (\r\n

\r\n {xTastySlice.productName}\r\n {`${optionLabel} ${groupToppingsToDisplay(\r\n xTastySlice.defaultToppings,\r\n xTastySlice.addedToppings,\r\n xTastySlice.removedToppings,\r\n )\r\n .join(', ')\r\n .concat('.')}`}\r\n

\r\n );\r\n })}\r\n
\r\n );\r\n }\r\n if (\r\n (addedToppings && addedToppings.length > 0) ||\r\n (removedToppings && removedToppings?.length > 0) ||\r\n (defaultToppings && defaultToppings?.length > 0)\r\n ) {\r\n return (\r\n

\r\n {`${optionLabel} ${groupToppingsToDisplay(defaultToppings ?? [], addedToppings ?? [], removedToppings ?? [])\r\n .join(', ')\r\n .concat('.')}`}\r\n

\r\n );\r\n }\r\n return <>;\r\n}\r\n\r\nfunction getDeliveryCharge(text: string, deliveryCharge?: number): JSX.Element {\r\n if (!deliveryCharge || deliveryCharge === 0) return <>;\r\n return (\r\n
\r\n
\r\n
{text}
\r\n
\r\n
\r\n

\r\n {PaymentHelper.formatToDisplay(deliveryCharge)}\r\n

\r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction isDiscountedPriceValid(basketItem: BasketItem): boolean {\r\n if (!basketItem.discountedPrice && basketItem.discountedPrice !== 0) return false;\r\n if (!basketItem.price) return false;\r\n if (basketItem.discountedPrice >= basketItem.price) return false;\r\n\r\n return true;\r\n}\r\n\r\nfunction renderDiscountedPrice(originalDiscountedPrice: number | null): JSX.Element {\r\n if (originalDiscountedPrice && originalDiscountedPrice > 0) {\r\n return {PaymentHelper.formatToDisplay(originalDiscountedPrice)};\r\n }\r\n return <>;\r\n}\r\n\r\nfunction renderFinalPrice(basketItem: BasketItem, hasFixedDiscount: boolean) {\r\n if (basketItem.discountedPrice || basketItem.discountedPrice === 0) {\r\n if (!hasFixedDiscount && basketItem.discountedPrice === 0) {\r\n return

GRATIS

;\r\n }\r\n // TODO add check for toppings price when this info will be available\r\n if (!hasFixedDiscount && basketItem.extraCharge && basketItem.extraCharge === basketItem.discountedPrice) {\r\n return

*{PaymentHelper.formatToDisplay(basketItem.discountedPrice)}

;\r\n }\r\n return

{PaymentHelper.formatToDisplay(hasFixedDiscount ? basketItem.price : basketItem.discountedPrice)}

;\r\n }\r\n\r\n return <>;\r\n}\r\n","import React from 'react';\r\nimport { redirectToHomePage } from 'shared/helpers/routing-helpers';\r\n\r\nconst CenterNavbar = (): JSX.Element => {\r\n return (\r\n \r\n );\r\n};\r\n\r\nexport default CenterNavbar;\r\n","import React from 'react';\r\n\r\ninterface CheckoutSectionProps {\r\n headerText?: string;\r\n}\r\n\r\nconst CheckoutSection: React.FC = ({ headerText, children }) => {\r\n return (\r\n
\r\n
\r\n
\r\n {headerText && (\r\n <>\r\n \r\n {headerText}\r\n
\r\n
\r\n {headerText}\r\n
\r\n
\r\n \r\n )}\r\n
{children}
\r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default CheckoutSection;\r\n","import { PaymentHelper } from 'shared/helpers/index';\r\nimport { CheckoutForm } from 'apps/ProductsApp/store/checkout/checkout.reducer';\r\nimport { CheckoutStaticContent } from 'apps/ProductsApp/store/static-content/checkout-static-content-reducer';\r\nimport { UserMessageType, ValidationResult, ValidatorItem } from '../../../shared/types';\r\nimport { FormValidatorHandler, CommonValidators } from '../../../shared/validators';\r\n\r\nexport const ValidateOrderRemark = (remark: string, inputMaxLengthMessage: string): ValidationResult => {\r\n const validators: FormValidatorHandler[] = [\r\n new FormValidatorHandler({\r\n value: remark,\r\n validators: [\r\n CommonValidators.maxLength({\r\n message: inputMaxLengthMessage,\r\n messageType: UserMessageType.ERROR,\r\n length: 254,\r\n }),\r\n ],\r\n }),\r\n ];\r\n return validators[0].validate();\r\n};\r\n\r\nexport const ValidateAddressAddition = (addressAddition: string, inputMaxLengthMessage: string): ValidationResult => {\r\n const validators: FormValidatorHandler[] = [\r\n new FormValidatorHandler({\r\n value: addressAddition,\r\n validators: [\r\n CommonValidators.maxLength({\r\n message: inputMaxLengthMessage,\r\n messageType: UserMessageType.ERROR,\r\n // street number extension is stored in the same db column and takes additional 2 places :(\r\n length: 18,\r\n }),\r\n ],\r\n }),\r\n ];\r\n return validators[0].validate();\r\n};\r\n\r\nexport const ValidateAddressRemark = (addressRemark: string, inputMaxLengthMessage: string): ValidationResult => {\r\n const validators: FormValidatorHandler[] = [\r\n new FormValidatorHandler({\r\n value: addressRemark,\r\n validators: [\r\n CommonValidators.maxLength({\r\n message: inputMaxLengthMessage,\r\n messageType: UserMessageType.ERROR,\r\n length: 60,\r\n }),\r\n ],\r\n }),\r\n ];\r\n return validators[0].validate();\r\n};\r\n\r\nexport const ValidateFirstName = (firstName: string, messageRequired: string, maxLength: number | undefined): ValidationResult => {\r\n const validatorIems: ValidatorItem[] = [\r\n CommonValidators.required({ message: messageRequired, messageType: UserMessageType.ERROR }),\r\n ];\r\n if (maxLength) {\r\n validatorIems.push(\r\n CommonValidators.maxLength({ message: 'Max length exceeded', messageType: UserMessageType.ERROR, length: maxLength }),\r\n );\r\n }\r\n\r\n const validators: FormValidatorHandler[] = [\r\n new FormValidatorHandler({\r\n value: firstName,\r\n validators: validatorIems,\r\n }),\r\n ];\r\n\r\n return validators[0].validate();\r\n};\r\n\r\nexport const ValidateLastName = (lastName: string, messageRequired: string, maxLength: number | undefined): ValidationResult => {\r\n const validatorIems: ValidatorItem[] = [\r\n CommonValidators.required({ message: messageRequired, messageType: UserMessageType.ERROR }),\r\n ];\r\n if (maxLength) {\r\n validatorIems.push(\r\n CommonValidators.maxLength({ message: 'Max length exceeded', messageType: UserMessageType.ERROR, length: maxLength }),\r\n );\r\n }\r\n\r\n const validators: FormValidatorHandler[] = [\r\n new FormValidatorHandler({\r\n value: lastName,\r\n validators: validatorIems,\r\n }),\r\n ];\r\n\r\n return validators[0].validate();\r\n};\r\n\r\nexport const ValidatePhoneNumber = (phoneNumber: string, requiredMessage: string, invalidMessage: string): ValidationResult => {\r\n const validators: FormValidatorHandler[] = [\r\n new FormValidatorHandler({\r\n value: phoneNumber,\r\n validators: [\r\n CommonValidators.required({ message: requiredMessage, messageType: UserMessageType.ERROR }),\r\n CommonValidators.phoneNumber({ message: invalidMessage, messageType: UserMessageType.ERROR }),\r\n ],\r\n }),\r\n ];\r\n return validators[0].validate();\r\n};\r\n\r\nexport const ValidateEmail = (email: string, requiredMessage: string, invalidMessage: string): ValidationResult => {\r\n const validators: FormValidatorHandler[] = [\r\n new FormValidatorHandler({\r\n value: email,\r\n validators: [\r\n CommonValidators.required({ message: requiredMessage, messageType: UserMessageType.ERROR }),\r\n CommonValidators.email({ message: invalidMessage, messageType: UserMessageType.ERROR }),\r\n ],\r\n }),\r\n ];\r\n return validators[0].validate();\r\n};\r\n\r\nexport const ValidatePaymentCashAddition = (\r\n cash: string,\r\n requiredMessage: string,\r\n maximumReachedMessage: string,\r\n minimumNotReachedMessage: string,\r\n): ValidationResult => {\r\n const validators: FormValidatorHandler[] = [\r\n new FormValidatorHandler({\r\n value: cash,\r\n validators: [\r\n CommonValidators.required({ message: requiredMessage, messageType: UserMessageType.ERROR }),\r\n CommonValidators.maxValue({\r\n message: `${maximumReachedMessage} ${PaymentHelper.formatToDisplay(200)}`,\r\n messageType: UserMessageType.ERROR,\r\n maxValue: 200,\r\n }),\r\n CommonValidators.minValue({\r\n message: `${minimumNotReachedMessage} ${PaymentHelper.formatToDisplay(0)}`,\r\n messageType: UserMessageType.ERROR,\r\n minValue: 0,\r\n }),\r\n ],\r\n }),\r\n ];\r\n\r\n return validators[0].validate();\r\n};\r\nexport const ValidateInvoiceCIF = (cash: string, requiredMessage: string, invalidMessage: string): ValidationResult => {\r\n const validators: FormValidatorHandler[] = [\r\n new FormValidatorHandler({\r\n value: cash,\r\n validators: [\r\n CommonValidators.required({ message: requiredMessage, messageType: UserMessageType.ERROR }),\r\n CommonValidators.regex({\r\n message: invalidMessage,\r\n messageType: UserMessageType.ERROR,\r\n pattern: `^[A-Z]-\\\\d{8}$`,\r\n }),\r\n ],\r\n }),\r\n ];\r\n return validators[0].validate();\r\n};\r\nexport const ValidateInvoiceBusinessName = (cash: string, message: string): ValidationResult => {\r\n const validators: FormValidatorHandler[] = [\r\n new FormValidatorHandler({\r\n value: cash,\r\n validators: [CommonValidators.required({ message, messageType: UserMessageType.ERROR })],\r\n }),\r\n ];\r\n return validators[0].validate();\r\n};\r\nexport const ValidateInvoiceAddress = (cash: string, message: string): ValidationResult => {\r\n const validators: FormValidatorHandler[] = [\r\n new FormValidatorHandler({\r\n value: cash,\r\n validators: [CommonValidators.required({ message, messageType: UserMessageType.ERROR })],\r\n }),\r\n ];\r\n return validators[0].validate();\r\n};\r\n\r\nexport const ValidationSummary = (checkoutForm: CheckoutForm, staticContent: CheckoutStaticContent): boolean => {\r\n // this will be quite complex I assume\r\n const {\r\n addressAddition,\r\n addressRemark,\r\n email,\r\n phoneNumber,\r\n firstName,\r\n lastName,\r\n remark,\r\n usePaysWithCashAmount,\r\n paysWithCashAmount,\r\n invoice,\r\n invoiceCIF,\r\n invoiceBusinessName,\r\n invoiceAddress,\r\n } = checkoutForm;\r\n\r\n if (!ValidateEmail(email.value, staticContent.contact.emailRequiredError, staticContent.contact.emailInvalidError).success)\r\n return false;\r\n if (\r\n !ValidatePhoneNumber(\r\n phoneNumber.value,\r\n staticContent.contact.phoneNumberRequiredError,\r\n staticContent.contact.phoneNumberInvalidError,\r\n ).success\r\n )\r\n return false;\r\n if (staticContent.contact.firstLastNameVisible) {\r\n if (\r\n !ValidateFirstName(firstName.value, staticContent.contact.firstNameRequiredError, staticContent.contact.firstNameMaxLength)\r\n .success\r\n )\r\n return false;\r\n if (\r\n !ValidateLastName(lastName.value, staticContent.contact.lastNameRequiredError, staticContent.contact.lastNameMaxLength)\r\n .success\r\n )\r\n return false;\r\n }\r\n if (!ValidateOrderRemark(remark.value, staticContent.checkoutValidation.inputMaxLength).success) return false;\r\n if (!ValidateAddressAddition(addressAddition.value, staticContent.checkoutValidation.inputMaxLength).success) return false;\r\n if (!ValidateAddressRemark(addressRemark.value, staticContent.checkoutValidation.inputMaxLength).success) return false;\r\n if (\r\n usePaysWithCashAmount === true &&\r\n !ValidatePaymentCashAddition(\r\n paysWithCashAmount.value,\r\n staticContent.payment.paymentAdditionError,\r\n staticContent.payment.paymentAdditionMaxError,\r\n staticContent.payment.paymentAdditionMinError,\r\n ).success\r\n )\r\n return false;\r\n if (invoice === true) {\r\n if (\r\n !ValidateInvoiceCIF(\r\n invoiceCIF.value,\r\n staticContent.payment.invoiceCIFRequiredError,\r\n staticContent.payment.invoiceCIFInvalidError,\r\n ).success\r\n )\r\n return false;\r\n if (!ValidateInvoiceBusinessName(invoiceBusinessName.value, staticContent.payment.invoiceNameError).success) return false;\r\n if (!ValidateInvoiceAddress(invoiceAddress.value, staticContent.payment.invoiceAddressError).success) return false;\r\n }\r\n return ValidateCtaAvailability(checkoutForm);\r\n};\r\n\r\nexport const ValidateCtaAvailability = (checkoutForm: CheckoutForm): boolean => {\r\n if (checkoutForm.selectedPaymentMethod === undefined && checkoutForm.selectedQuickPaymentMethod === undefined) return false;\r\n if (checkoutForm.acceptPolicy !== true) return false;\r\n if (checkoutForm.acceptGeneralConditions !== true) return false;\r\n return true;\r\n};\r\n","import React from 'react';\r\nimport { ValidationResult, PropertyChangedEventArgs } from 'shared/types';\r\n\r\n/* eslint-disable import/prefer-default-export */\r\nexport const ToValidationMessage = (result: ValidationResult): string => {\r\n if (result.success) return '';\r\n\r\n return result.messages[0].message;\r\n};\r\n\r\ninterface OnChangeHandlerArgs {\r\n sender: PropertyChangedEventArgs;\r\n stateFn(value: React.SetStateAction): void;\r\n onPropertyChangedFn(sender: PropertyChangedEventArgs): void;\r\n value: boolean;\r\n}\r\n\r\nexport function OnChangeHandler({ sender, onPropertyChangedFn, stateFn, value }: OnChangeHandlerArgs): void {\r\n const { name } = sender.target;\r\n stateFn((prev) => {\r\n return {\r\n ...prev,\r\n [name]: value,\r\n };\r\n });\r\n\r\n onPropertyChangedFn(sender);\r\n}\r\n","import CheckoutSection from 'apps/ProductsApp/components/checkout/checkout-section.component';\r\nimport { ApplicationState } from 'apps/ProductsApp/store';\r\nimport { updateCheckoutFormControl } from 'apps/ProductsApp/store/checkout/checkout.actions';\r\nimport { CheckoutState } from 'apps/ProductsApp/store/checkout/checkout.reducer';\r\nimport { CheckoutStaticContent } from 'apps/ProductsApp/store/static-content/checkout-static-content-reducer';\r\nimport { ValidateOrderRemark } from 'apps/ProductsApp/validators/checkout.validators';\r\nimport React from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport FormInput from 'shared/components/form-input.component';\r\nimport { ToValidationMessage } from 'shared/helpers/formControl-helpers';\r\n\r\nconst CheckoutRemarks: React.FC = () => {\r\n const dispatch = useDispatch();\r\n const { checkoutForm } = useSelector((state) => state.checkout);\r\n const { remark, checkoutValidation } = useSelector(\r\n (state) => state.checkoutStaticContent,\r\n );\r\n\r\n return (\r\n \r\n

{remark.remarkLabel}

\r\n {\r\n dispatch(updateCheckoutFormControl(event));\r\n }}\r\n />\r\n
\r\n );\r\n};\r\n\r\nexport default CheckoutRemarks;\r\n","import React, { useEffect } from 'react';\r\nimport { LocalizationState } from 'apps/LocalizationApp/Store';\r\nimport CheckoutSection from 'apps/ProductsApp/components/checkout/checkout-section.component';\r\nimport { ApplicationState, GlobalState } from 'apps/ProductsApp/store';\r\nimport { updateCheckoutFormControl, updateCheckoutFormControlByName } from 'apps/ProductsApp/store/checkout/checkout.actions';\r\nimport { CheckoutState } from 'apps/ProductsApp/store/checkout/checkout.reducer';\r\nimport { CheckoutStaticContent } from 'apps/ProductsApp/store/static-content/checkout-static-content-reducer';\r\nimport { LocalizationStaticContent } from 'apps/LocalizationApp/Store/static-content/localization-static-content.reducer';\r\nimport { ValidateAddressAddition, ValidateAddressRemark } from 'apps/ProductsApp/validators/checkout.validators';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport FormInput from 'shared/components/form-input.component';\r\nimport { ToValidationMessage } from 'shared/helpers/formControl-helpers';\r\nimport { OrderDistributionType } from 'shared/types';\r\n\r\nconst CheckoutDeliveryData: React.FC = () => {\r\n const dispatch = useDispatch();\r\n const { checkoutForm } = useSelector((state) => state.checkout);\r\n const { selectedAddress, distributionType, selectedOrderTime, currentStore } = useSelector(\r\n (state) => state.localization,\r\n );\r\n const { delivery, checkoutValidation } = useSelector(\r\n (state) => state.checkoutStaticContent,\r\n );\r\n const { chooseTimeAsap } = useSelector((state) => state.localizationStaticContent);\r\n const { currentUser } = useSelector((state) => state.global);\r\n\r\n useEffect(() => {\r\n if (currentUser && selectedAddress) {\r\n dispatch(updateCheckoutFormControlByName('addressAddition', selectedAddress.addressAddition));\r\n dispatch(updateCheckoutFormControlByName('addressRemark', selectedAddress.remark));\r\n }\r\n }, []);\r\n\r\n const isDeliveryOrder = distributionType === OrderDistributionType.Delivery;\r\n\r\n function renderDateTimeFrame(): string {\r\n if (selectedOrderTime?.isAsap) return chooseTimeAsap;\r\n if (selectedOrderTime?.isFirstAvailableDateFrame) return `${chooseTimeAsap} ${selectedOrderTime.timeFrame}`;\r\n return selectedOrderTime?.timeFrame as string;\r\n }\r\n\r\n return (\r\n \r\n
\r\n \r\n
\r\n
\r\n

\r\n {isDeliveryOrder ? delivery.deliveryText : delivery.pickupText}\r\n \r\n {isDeliveryOrder\r\n ? `${selectedAddress.street} ${selectedAddress.streetNumber}, ${selectedAddress.city}.`\r\n : `${currentStore.street} ${currentStore.streetNumber}, ${currentStore.city}.`}\r\n \r\n

\r\n {!isDeliveryOrder && (\r\n

Teléfono: {currentStore.phoneNumber}

\r\n )}\r\n
\r\n {isDeliveryOrder && (\r\n <>\r\n
{delivery.exampleDeliveryText}
\r\n

{delivery.addressAdditionLabel}

\r\n {\r\n dispatch(updateCheckoutFormControl(e));\r\n }}\r\n />\r\n

{delivery.addressRemarkLabel}

\r\n
\r\n {\r\n dispatch(updateCheckoutFormControl(e));\r\n }}\r\n />\r\n
\r\n \r\n )}\r\n
\r\n
\r\n {selectedOrderTime && (\r\n
\r\n \r\n
\r\n

{delivery.orderTimeText}

{' '}\r\n

\r\n {renderDateTimeFrame()}\r\n

\r\n
\r\n
\r\n )}\r\n
\r\n );\r\n};\r\n\r\nexport default CheckoutDeliveryData;\r\n","import React, { useEffect, useState } from 'react';\r\n\r\nimport { PropertyChangedEventArgs } from '../types';\r\n\r\ninterface CheckboxInputProps {\r\n name: string;\r\n id?: string;\r\n onChangeFn(e: PropertyChangedEventArgs): void;\r\n checked: boolean;\r\n errorMessage?: string;\r\n dirty?: boolean;\r\n testId: string;\r\n children?: React.ReactNode;\r\n}\r\n\r\nconst CheckboxInput: React.FC = ({\r\n name,\r\n id,\r\n onChangeFn,\r\n checked,\r\n errorMessage,\r\n dirty = false,\r\n children,\r\n testId,\r\n}) => {\r\n const [isDirty, setIsDirty] = useState(false);\r\n\r\n useEffect(() => {\r\n setIsDirty(dirty);\r\n }, [dirty]);\r\n\r\n return (\r\n