{"version":3,"file":"navigationApp.js","mappings":"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","sources":["webpack://pizza-hut/webpack/runtime/chunk loaded","webpack://pizza-hut/./src/shared/utils.ts","webpack://pizza-hut/./src/shared/helpers/routing-helpers.ts","webpack://pizza-hut/./src/hooks/useEventListener.ts","webpack://pizza-hut/./src/hooks/useOutsideClick.ts","webpack://pizza-hut/./src/shared/components/radio.component.tsx","webpack://pizza-hut/./src/apps/NavigationApp/components/language-switch.component.tsx","webpack://pizza-hut/./src/shared/types.ts","webpack://pizza-hut/./src/shared/api/axios.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/NavigationApp/components/account-dropdown.tsx","webpack://pizza-hut/./src/apps/NavigationApp/store/address-wizzard/address-wizzard.actions.ts","webpack://pizza-hut/./src/apps/NavigationApp/navigation.types.ts","webpack://pizza-hut/./src/apps/NavigationApp/components/selected-address.component.tsx","webpack://pizza-hut/./src/shared/store/static-content/static-content.actions.ts","webpack://pizza-hut/./src/shared/helpers/index.ts","webpack://pizza-hut/./src/shared/components/loader.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/hooks/useShowDelay.ts","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/shared/validators/index.ts","webpack://pizza-hut/./src/apps/LocalizationApp/Validators/address.validator.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/LocalizationApp/Containers/localization-search.container.tsx","webpack://pizza-hut/./src/hooks/useVisible.ts","webpack://pizza-hut/./src/shared/components/modal.compontent.tsx","webpack://pizza-hut/./src/shared/components/select-time.component.tsx","webpack://pizza-hut/./src/shared/tools/uuid-generator.ts","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/hooks/useKeyPress.ts","webpack://pizza-hut/./src/shared/components/single-action-modal.component.tsx","webpack://pizza-hut/./src/apps/LocalizationApp/Containers/store-status-info.container.tsx","webpack://pizza-hut/./src/apps/LocalizationApp/Store/static-content/localization-static-content.actions.ts","webpack://pizza-hut/./src/apps/LocalizationApp/Containers/search-window.container.tsx","webpack://pizza-hut/./src/apps/ProductsApp/types/dto.types.ts","webpack://pizza-hut/./src/shared/helpers/coupons-helpers.ts","webpack://pizza-hut/./src/apps/NavigationApp/store/static-content/static-content.actions.ts","webpack://pizza-hut/./src/apps/ProductsApp/store/offers/offers.actions.ts","webpack://pizza-hut/./src/apps/NavigationApp/store/actions.ts","webpack://pizza-hut/./src/apps/ProductsApp/store/basket/basket.actions.ts","webpack://pizza-hut/./src/apps/ProductsApp/store/static-content/products-static-content.actions.ts","webpack://pizza-hut/./src/apps/ProductsApp/store/customize-product/customize-product.actions.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/checkout/checkout.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/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/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.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/NavigationApp/index.tsx","webpack://pizza-hut/./src/apps/NavigationApp/App.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 { 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 { 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 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, { 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 { 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","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","/* 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 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 { 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","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 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 { 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","/* 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 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 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 { 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","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 { 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 { 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","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","/* 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","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","/* 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","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 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 { 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 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, { 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 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 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 { 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 { 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 { 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","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 * 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","/* 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 { 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 { 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","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 { 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 { 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","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 { 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 { 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 React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport App from './App';\r\n\r\nReactDOM.render(, document.querySelector('#navigation-app-root'));\r\n","import React from 'react';\r\nimport { Provider } from 'react-redux';\r\nimport MainHeader from './containers/main-header.container';\r\nimport store from './store';\r\n\r\nexport default function App(): JSX.Element {\r\n return (\r\n \r\n \r\n \r\n );\r\n}\r\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.j = 58;","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t58: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkpizza_hut\"] = self[\"webpackChunkpizza_hut\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [96], () => (__webpack_require__(9708)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","LoadReduxFromCookie","state","key","cookieState","document","cookie","split","find","row","startsWith","decodedCookieState","decodeURIComponent","JSON","parse","ex","console","debug","log","capitalizeFirstLetter","value","charAt","toUpperCase","slice","redirectToHomePage","window","location","href","hostURL","logout","encodeURIComponent","url","getElementById","getRedirectURL","getElementsByTagName","getAttribute","getOtherAppRedirectURL","redirectToURL","redirectToNotFound","backToHistory","history","back","redirectToMainPage","parametersToObject","args","substring","length","obj","undefined","parameters","index","keyAndValueArray","openNewWindow","open","ref","handler","eventName","element","savedHandler","useRef","useEffect","targetElement","current","addEventListener","eventListener","event","removeEventListener","el","contains","target","onClick","selected","testId","className","cultures","useState","expand","setExpand","baseUrl","selectedCulture","clt","id","isDefault","createLink","culture","baseUrlWithCulture","URL","segments","pathname","concat","search","filter","shift","join","createBaseUrl","searchParams","append","fullName","map","OrderStatusEnum","AppReviewTarget","ApplicationType","OrderDistributionType","UserMessageType","Array","prototype","orderByAsc","propertyName","this","sort","a","b","orderByDesc","removeDuplicates","removedDuplicates","Set","from","baseURL","action","dispatch","errMessage","allowedErr","errorCallback","withoutGlobalNotification","message","type","GlobalActionTypes","CLEAR_MESSAGES","statusArr","includes","response","status","errorCodes","data","errorCode","ERROR","SET_MESSAGES","payload","error","SET_LOADER_STATE","SHOW_UNHANDLED_ERROR_MODAL","expirationTime","tooltipTimer","setTimeout","clearTimeout","result","validate","success","messages","SetLoader","singedIn","labels","showModal","currentPath","userIcon","src","login","newUserLabel","createAccount","myAccount","myOrders","AddressWizzardActionsTypes","HeaderType","AddressWizzardSteps","changeWizzardStep","step","SET_WIZZARD_STEP","headerType","address","onAddressClickFn","isDelivery","streetWidth","setStreetWidth","renderBtnStyle","containerWidth","clientWidth","iconWidth","prefixWidth","textEndWidth","Other","street","title","delivery","pickup","style","maxWidth","streetNumber","city","StaticContentActionTypes","RoutingHelpers","text","fullScreen","mobile","S4DWebBridge","show","setShowLoader","hideLoader","delayedLoader","showLoader","onClose","onSelect","onToggle","distanceUnit","localization","nearbyStores","selectedAddress","dropdownLabelPickupResults","localizationStaticContent","store","gtm","localizationModule","submitClickedOnCollection","isCompleteAddress","distance","toFixed","suggestions","selectedSuggestion","setSelectedSuggestion","suggestionsIds","suggestion","placeId","handleKeyboardNavigation","classList","add","e","preventDefault","moveDown","moveUp","currentSuggestion","currentSuggestionIndex","indexOf","nextSuggestion","remove","tabIndex","formattedSuggestion","mainText","toLowerCase","secondaryText","renderSuggestion","ShowOptions","useShowDelay","isVisible","none","setShow","hide","isPickup","onChangeFn","onClear","suggestionsHelper","showStreetNumberInput","localizationInputPlaceholder","showClear","autoComplete","name","placeholder","onChange","inputClickedOnCollection","inputClickedOnDelivery","getContainerClassByType","INFO","WARNING","getTextClassByType","getArrowClassByType","globalState","global","staticContent","offset","setOffset","firstElement","tooltipsFillStreetNumber","right","additionData","headerText","paragraphText","linkText","linkHref","onSelectAddressFn","onSelectStoreFn","lastAddresses","lastStores","distributionType","dropdownLabel","onToggleFn","showLastUsed","Delivery","Pickup","renderAddress","renderStore","ValidateDeliveryResponse","LocalizationRequestErrorType","PushNotificationsProvider","validators","bind","validator","fn","push","messageType","StoreState","LocalizationStrategy","LocalizationActionTypes","getStoreStatus","storeId","params","toDeliver","get","suggestionCancel","predictionsTimer","CancellationToken","prepareCoordsSuggestions","latitude","longitude","getState","errorMessagesImpossibleToLocateDelivery","language","apiResponse","SHOW_NUMBER_INPUT","SET_SELECTED_ADDRESS","tooltipsAdressConfirmation","getNearbyStores","selectedAddressDetails","limit","includeDistance","errorMessagesNoStores","clearCurrentStoreStatus","SET_NEARBY_STORES","getStoreAvailableHours","apiUrl","setCurrentStoreForPickup","storeStatus","dataReady","SET_SELECTED_STORE_STATUS","storePhoneNumber","phoneNumber","canPlaceOrder","CLEAR_STORE","SHOW_MODAL","availableHours","timeframes","CHANGE_ORDER_DISTRIBUTION","SET_CURRENT_STORE","isOpen","SHOW_TOAST","getCityBySelectedAddress","input","validateAddress","postalCode","region","addressForValidation","s","primaryAddress","alternateAddressForValidation","secondaryAddress","getAdditionalAddressInfo","storeExternalId","streetName","country","setStoreAndSave","currentStore","selectedOrderTime","updatedCurrentStore","json","stringify","expirationDate","isAsap","Date","minutes","utcDateTimeFrame","cookieValue","String","toUTCString","localizationSuccess","changeDistributionType","SET_FORCE_DELIVERY_DISTRIBUTION","clearStoreAndSave","sourceString","n","mainCTA","geolocationTextDelivery","geolocationTextPickup","signInLink","deliveryAddition","pickupAddition","dropdownDeliveryLabelRegisteredUser","dropdownPickupLabelRegisteredUser","storeDistanceUnit","signedin","initialIsVisible","setIsVisible","handleClickOutside","ev","showStores","setShowStores","setShowLastUsed","showNumberInput","showSuggestions","setFocusOnInput","focus","successMobileLocationRequestHandler","failedMobileLocationRequestHandler","tooltipsGeoDisabled","errorMessage","LOCALIZATION_DISABLED","goToTimeSlotSelect","validationResult","tooltipsFillAddress","errorMessagesWrongAddress","StreetErr","NumberErr","Valid","ValidateDeliveryAddress","errorMessagesWrongStreetNumber","validAddress","selectedAddressOriginalValue","storeToDeliveryResponse","storeToDelivery","isUsingS4DRegistry","localizationStrategy","PH_MX","externalStoreId","additionalAddressInfo","SET_ADDRESS_ADDITIONAL_INFO","localizationError","addresses","SET_LAST_USED_ADDRESSES","SET_LAST_USED_STORES","sender","ON_PROPERTY_CHANGED","cancelToken","cancelExecutor","SET_SUGGESTIONS","getSuggestions","suggestionClickedOnDelivery","suggestionClickedOnCollection","geolocationClickedOnDelivery","geolocationClickedOnCollection","navigator","geolocation","getCurrentPosition","position","coords","err","warning","code","requestLocation","submitClickedOnDelivery","prevState","words","StringHelper","prev","children","transparent","closeButton","closeButtonTestId","fullWidth","backdropButton","body","overflowY","showCloseButton","visible","fixedPosition","stopPropagation","backgroundColor","border","onSetTimeFn","modalLoad","selectedDateTimeFrame","setSelectedDateTimeFrame","onTimeSelected","baseDateTimeFrame","dateTimeFrame","timeFrame","isFirstAvailableDateFrame","renderHourDisplayValue","hour","isFirstOnList","chooseTimeAsap","chooseTimeHeading","findIndex","ah","replace","c","r","Math","random","toString","currentStoreId","onReturn","storeUnavailable","storesList","fontSize","outOfDeliveryRangeHeading","outOfDeliveryRangeText","distancePrefix","distanceSuffix","noStoreAvailable","returnButton","orderTime","SET_ORDER_TIME","orderTimeSelected","distributionChange","pickupIcon","pickupIconDisabled","deliveryIcon","deliveryIconDisabled","deliveryTabText","pickupTabText","deliveryTabClicked","background","collectionTabClicked","onConfirmFn","onCancelFn","informationText","confirmButton","cancelButton","onContinueFn","onChangeStoreFn","changeStore","addressAlertModal","showConfirm","setShowConfirm","changeDeliveryTitle","changePickupTitle","changeAddressClicked","basket","localStorage","getItem","parsedBasket","items","changeStoreButton","goToCatalogButton","useKeyPress","keyCode","callback","deps","keyPressHandler","cancelCallbackFn","header","subHeader","ctaText","selectedStoreStatus","storeStatusInfo","OPEN_BUT_NO_ONLINE_ORDERS","modalText","noOnlineOrdersModalText","noOnlineOrdersModalHeader","OPEN_BUT_NO_DELIVERY_ORDERS","noDeliveryOrdersModalHeader","noDeliveryOrdersModalText","OPEN_BUT_NO_PICKUP_ORDERS","noPickupOrdersModalHeader","noPickupOrdersModalText","CLOSED","subheader","storeStatusModalConfirmButtonText","renderModalSwitch","LocalizationStaticContentActionTypes","SET_STATIC_CONTENT","forceDeliveryDistributionType","showToast","storeIsClosedToast","loader","storeSelected","redirectToOffers","removeItem","StoreStockStatus","OfferTypes","redirectToOtherAppURL","NavigationStaticContentActionTypes","OffersActionTypes","BasketActionTypes","ProductsStaticContentActionTypes","CustomizeProductActionTypes","OrderError","CheckoutActionTypes","MetadataActionTypes","OFFERS_LOADER","ProductActionTypes","setActiveCategory","categories","categoryRoute","selectedCategory","w","route","SET_ACTIVE_CATEGORY","SetProductsLoader","on","SET_LOADER","addressWizzard","localizationModalVisibility","currentWizzardStep","None","isLastStep","LocalizationModal","cancelWizzardProcess","ChangeAddressModal","category","deliveryType","deliveryDateTime","SET_OFFERS","productsModule","dealsLoad","LOADER_NAME","localizationState","products","some","p","cp","SET_CATEGORIES","SET_PRODUCTS","renderWizzardContent","submitCallbackFn","getPrimaryLogoClasses","getSmallLogoClasses","isErrorPage","logoutModal","showLogoutModal","navigation","currentUser","supportedCultures","navigationStaticContent","logoutLabels","selectedAddressLabels","trackOrder","SET_SUPPORTED_CULTURES","lastActiveOrder","confirmed","deviceTokens","parsedDeviceTokens","post","deviceId","installationId","provider","userLoggedOut","SET_USER_STATUS","SET_APP_CONFIGURATION","host","showErrorModal","appConfiguration","maxChangeableToppingsForEditPizza","maxExtraToppingsForEditPizza","maxToppingsForCustomPizza","appReviewsEnabled","positiveReviewsTarget","NATIVE_STORE","negativeReviewsTarget","DB","authCookies","i","email","Email","phone","Phone","firstName","FirstName","lastName","LastName","LastActiveOrder","errorMessagesImpossibleToLocatePickup","errorModalTitle","errorModalDescription","apiKey","simplifiedFooter","configuration","hideCouponsScratchedPrices","emptySelectedAddress","addressAddition","remark","additionalInfo","fetched","stateDescription","reason","timestamp","customStoreUnavailabilityModalHeader","customStoreUnavailabilityModalText","localizationReducers","updatedSelectedAddress","addressDetails","displayValue","accAddress","district","SET_SIMPLIFIED_FOOTER","SET_CONFIGURATION","rootReducer","middlewares","enhancer","LocalizationReducers","addressWizzardInitState","dropdownMenu","navigationReducers","querySelector","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","m","O","chunkIds","priority","notFulfilled","Infinity","fulfilled","j","Object","keys","every","splice","getter","__esModule","d","definition","o","defineProperty","enumerable","g","globalThis","Function","prop","hasOwnProperty","call","Symbol","toStringTag","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","chunkLoadingGlobal","self","forEach","__webpack_exports__"],"sourceRoot":""}