{"version":3,"sources":["webpack:///./scripts/Server/render-wrapper.js","webpack:///./scripts/Actions/Error.action.js","webpack:///./scripts/Actions/Checkout.action.js","webpack:///./scripts/Actions/Cart.action.js","webpack:///./scripts/Services/translation.ts","webpack:///./scripts/Actions/Overlay.action.js","webpack:///./scripts/Components/SideMenu/SideMenu.tsx","webpack:///./scripts/Components/Inputs/Input.tsx","webpack:///./scripts/Hooks/useTypedSelector.ts","webpack:///./scripts/Hooks/useCartError.ts","webpack:///./scripts/Components/QuantityInput/QuantityInput.tsx","webpack:///./scripts/Components/StockStatus/StockStatus.tsx","webpack:///./scripts/Components/OrderRowProductCard/OrderRowProductCard.tsx","webpack:///./scripts/Components/MiniCart/MiniCart.tsx","webpack:///./scripts/Components/Checkout/utils/Checkout.SectionHeader.tsx","webpack:///./scripts/Components/Checkout/utils/Checkout.Section.tsx","webpack:///./scripts/Components/Checkout/utils/Checkout.SectionContent.tsx","webpack:///./scripts/Components/Inputs/TextArea.tsx","webpack:///./scripts/Components/Checkout/Checkout.AdditionalOrderInfo.tsx","webpack:///./scripts/Components/Checkout/Checkout.OrderSummary.tsx","webpack:///./scripts/Components/Chip.tsx","webpack:///./scripts/Components/Checkout/Checkout.Discount.tsx","webpack:///./scripts/Components/Checkout/Checkout.Collapsible.tsx","webpack:///./scripts/Components/Checkout/Checkout.Cart.tsx","webpack:///./scripts/Components/Ingrid/IngridDeliveryCheckout.service.ts","webpack:///./scripts/Components/Ingrid/IngridDeliveryCheckout.tsx","webpack:///./scripts/Components/Checkout/Checkout.DeliveryMethods.tsx","webpack:///./scripts/Components/Checkout/utils/Checkout.ValidationSchema.ts","webpack:///./scripts/Components/Dropdown.tsx","webpack:///./scripts/Components/Checkout/utils/Checkout.SectionFooter.tsx","webpack:///./scripts/Components/Inputs/Checkbox.tsx","webpack:///./scripts/Components/Checkout/Checkout.ConfirmOrder.tsx","webpack:///./scripts/Components/Checkout/Checkout.PrivateCustomerInfo.tsx","webpack:///./scripts/Components/Checkout/Checkout.EmptyCart.tsx","webpack:///./scripts/Components/DynamicComponent.js","webpack:///./scripts/Components/Payments/PaymentWidget.js","webpack:///./scripts/Components/Inputs/Radiobutton.tsx","webpack:///./scripts/Components/Checkout/utils/Checkout.Radio.tsx","webpack:///./scripts/Components/Checkout/Checkout.SelectCheckoutMode.tsx","webpack:///./scripts/Components/Checkout/Checkout.Newsletter.tsx","webpack:///./scripts/Components/Checkout/Checkout.tsx","webpack:///./scripts/Components/Collapsible.tsx","webpack:///./scripts/Components/ProductFiltering/FilterOptions/FilterCheckbox.tsx","webpack:///./scripts/Components/ProductFiltering/FilterOptions/FilterRangeSlider.tsx","webpack:///./scripts/Utils/FormatPrice.tsx","webpack:///./scripts/Components/ProductFiltering/FilterOptions/FilterPriceRangeSlider.tsx","webpack:///./scripts/Components/ProductFiltering/FilterSearchInput.tsx","webpack:///./scripts/Components/ProductFiltering/FilterGroupElement.tsx","webpack:///./scripts/Components/ProductFiltering/ProductFiltering.tsx","webpack:///./scripts/Components/ProductSorting/ProductSorting.tsx","webpack:///./scripts/Hooks/useHeaderHeight.ts","webpack:///./scripts/Components/ProductInformationTabs/CollapsibleWithStickyHeader.tsx","webpack:///./scripts/Components/EditorString/EditorString.tsx","webpack:///./scripts/styling/variables/grid.ts","webpack:///./scripts/Components/ResponsiveImage/ResponsiveImage.tsx","webpack:///./scripts/Components/ProductTags/ProductTag.tsx","webpack:///./scripts/Services/Cart.service.js","webpack:///./icons/refresh.svg","webpack:///./scripts/Components/LoadingSpinner.tsx","webpack:///./scripts/Actions/BuyButton.action.ts","webpack:///./scripts/Components/BuyButton/BuyButton.tsx","webpack:///./scripts/Components/ProductCards/ProductCardBuyButton.tsx","webpack:///./scripts/Components/ProductPrice/ProductPrice.tsx","webpack:///./scripts/Components/ProductCards/ProductCardRelation.tsx","webpack:///./scripts/Components/ProductInformationTabs/ProductInformationTabContents.tsx","webpack:///./scripts/Components/ProductInformationTabs/ProductInformationTabs.tsx","webpack:///./scripts/Components/ProductPrice/ProductPriceFloating.tsx","webpack:///./scripts/Components/BuyButton/FloatingBuyButton.tsx","webpack:///./scripts/Components/FilterBar/ProductSortingRadios.tsx","webpack:///./scripts/Components/ProductListing/CategoryNavigation.tsx","webpack:///./scripts/Components/FilterBar/CategoriesMenu.tsx","webpack:///./scripts/Components/FilterBar/FilterMenu.tsx","webpack:///./scripts/Components/FilterBar/FilterBarButtons.tsx","webpack:///./scripts/Components/FilterBar/FilterBar.tsx","webpack:///./scripts/Actions/Login.action.ts","webpack:///./scripts/Components/MyPages/MyPagesMobileMenu.tsx","webpack:///./scripts/Components/MyPages/MyPagesDesktopMenu.tsx","webpack:///./scripts/Actions/UserInfo.action.ts","webpack:///./scripts/Hooks/useTypedDispatch.ts","webpack:///./scripts/Components/MyPages/MyPagesSettings.tsx","webpack:///./scripts/Actions/Order.action.ts","webpack:///./scripts/Components/MyPages/ui/OrderListItemMobile.tsx","webpack:///./scripts/Components/MyPages/ui/OrderListItemDesktop.tsx","webpack:///./scripts/Services/Pagination.service.ts","webpack:///./scripts/Components/Pagination.tsx","webpack:///./scripts/Components/MyPages/ui/SkeletonListItemDesktop.tsx","webpack:///./scripts/Components/MyPages/ui/SkeletonListItemMobile.tsx","webpack:///./scripts/Components/MyPages/MyPagesOrderHistory.tsx","webpack:///./scripts/Components/OrderDetail/ui/ProductCard.tsx","webpack:///./scripts/Components/OrderDetail/OrderDetail.tsx","webpack:///./scripts/Components/MyPages/MyPagesOrderDetail.tsx","webpack:///./scripts/Actions/Person.action.ts","webpack:///./scripts/Components/MyPages/ui/UserListItemMobile.tsx","webpack:///./scripts/Components/MyPages/ui/UserListItemDesktop.tsx","webpack:///./scripts/Components/MyPages/MyPagesUsers.tsx","webpack:///./scripts/Components/MyPages/MyPagesAddUser.tsx","webpack:///./scripts/Components/MyPages/MyPagesEditUser.tsx","webpack:///./scripts/Actions/Address.action.js","webpack:///./scripts/Components/MyPages/ui/AddressListItemDesktop.tsx","webpack:///./scripts/Components/MyPages/ui/AddressListItemMobile.tsx","webpack:///./scripts/Components/MyPages/MyPagesAddresses.tsx","webpack:///./scripts/Components/MyPages/MyPagesAddAddress.tsx","webpack:///./scripts/Components/MyPages/MyPagesEditAddress.tsx","webpack:///./scripts/Components/MyPages/ui/ScrollToTop.tsx","webpack:///./scripts/Components/MyPages/MyPagesContainer.tsx","webpack:///./scripts/Components/FullscreenImageSlider/FullscreenImageSlider.tsx","webpack:///./scripts/Components/ProductPageImageSlider/ProductPage.ImageSlider.tsx","webpack:///./scripts/Components/News/NewsPage.ImageSlider.tsx","webpack:///./scripts/Components/AdminEditButton.tsx","webpack:///./scripts/Components/ProductCampaignDescription/ProductCampaignDescription.tsx","webpack:///./scripts/Components/ProductTags/ProductAttributeTag.tsx","webpack:///./scripts/Actions/PriceHistory.actions.ts","webpack:///./scripts/Components/ProductPriceHistory/PriceHistoryModalTrigger.tsx","webpack:///./scripts/Actions/NotPriced.actions.ts","webpack:///./scripts/Components/NotPricedProduct/NotPricedModalTrigger.tsx","webpack:///./scripts/Components/ProductPrice/ProductPagePrice.tsx","webpack:///./scripts/Components/UsedProduct/UsedProduct.tsx","webpack:///./scripts/Components/VariantPicker/VariantPicker.Links.tsx","webpack:///./scripts/styling/variables/breakpoints.ts","webpack:///./scripts/Hooks/useBreakpoint.ts","webpack:///./scripts/Hooks/useWindowSize.js","webpack:///./scripts/Components/ProductCards/ProductCardForSlider.tsx","webpack:///./scripts/Components/ProductSliderHeader.tsx","webpack:///./scripts/Components/ProductPageProductSlider/ProductPageProductSlider.tsx","webpack:///./scripts/Components/ProductPage/KlarnaPlacement.tsx","webpack:///./scripts/Components/ProductPage/ProductPageInformationUsps.tsx","webpack:///./scripts/Components/ProductPage/ProductPageItemTags.tsx","webpack:///./scripts/Components/ProductPage/ProductPageTierPrices.tsx","webpack:///./scripts/Components/ProductPage/UpSellItems/UpSellItem.tsx","webpack:///./scripts/Components/ProductPage/UpSellItems/UpSellItems.tsx","webpack:///./scripts/Components/ProductPage/VideolyVideoboxPlaceholder.tsx","webpack:///./scripts/Components/DemoProduct/DemoProduct.tsx","webpack:///./scripts/Components/ProductPage/ProductPage.tsx","webpack:///./scripts/Blocks/BannerBlock/BannerBlockItem.tsx","webpack:///./scripts/Blocks/BlockHeader.tsx","webpack:///./scripts/Blocks/BannerBlock/BannerBlock.tsx","webpack:///./scripts/Blocks/BannerBlock/BannerSliderBlock.tsx","webpack:///./scripts/Blocks/CategoryLinkBlock.tsx","webpack:///./scripts/Components/ProductCards/ProductCard.tsx","webpack:///./scripts/Blocks/ProductBlockNoSlider.tsx","webpack:///./scripts/Blocks/ProductSlider.tsx","webpack:///./scripts/Components/ProductList.HeaderText.tsx","webpack:///./scripts/Components/ActiveFilterChips/FilterGroupChips.tsx","webpack:///./scripts/Components/ActiveFilterChips/ActiveFilterChips.tsx","webpack:///./scripts/Components/ProgressBar/ProgressBar.tsx","webpack:///./scripts/Components/LoadMoreButton/LoadMoreButton.tsx","webpack:///./scripts/Components/ProductListing/ProductListingResizeObserver.js","webpack:///./scripts/Components/ProductCards/ProductCardPlaceholder.tsx","webpack:///./scripts/Components/ProductCards/ProductCardLandscape.tsx","webpack:///./scripts/Components/ProductCards/ProductCardLandscapePlaceholder.tsx","webpack:///./scripts/Components/ProductListing/ProductListing.tsx","webpack:///./scripts/Components/SearchResult/SearchResultLinkTab.tsx","webpack:///./scripts/Components/SearchResult/SearchResult.tsx","webpack:///./scripts/Actions/Search.action.js","webpack:///./scripts/Components/SearchResult/SearchNavigationItem.tsx","webpack:///./scripts/Components/SearchResult/SearchNavigation.tsx","webpack:///./scripts/Actions/Navigation.action.js","webpack:///./scripts/Components/Navigation/ui/MobileNavigationItem.tsx","webpack:///./scripts/Components/Navigation/NavigationMobile.tsx","webpack:///./scripts/Components/Overlay.tsx","webpack:///./scripts/Components/VariantPicker/VariantPicker.Dropdown.tsx","webpack:///./scripts/Components/VariantPicker/VariantPicker.Buttons.tsx","webpack:///./scripts/Components/Login/ui/LoginChangePassword.tsx","webpack:///./scripts/Components/Login/ui/LoginForgotPassword.tsx","webpack:///./scripts/Components/Login/ui/LoginForm.tsx","webpack:///./scripts/Components/Login/ui/LoginSelectOrganization.tsx","webpack:///./scripts/Components/Login/LoginContainer.tsx","webpack:///./scripts/Components/Login/LoginModal.tsx","webpack:///./scripts/Components/Login/LoginPage.tsx","webpack:///./scripts/Blocks/LinkBlock/LinkBlock.tsx","webpack:///./scripts/Blocks/NewsBlock.tsx","webpack:///./scripts/Blocks/BannerBlock/ResponsiveBannerBlockItem.tsx","webpack:///./scripts/Hooks/useScrollShadow.ts","webpack:///./scripts/Hooks/useIsMobile.ts","webpack:///./scripts/Blocks/BannerBlock/ResponsiveBannerBlock.tsx","webpack:///./scripts/Blocks/StartPageBlock.tsx","webpack:///./scripts/Components/OrderConfirmation/OrderConfirmation.tsx","webpack:///./scripts/Blocks/BrandsBlock.tsx","webpack:///./scripts/Blocks/RichTextBlock.tsx","webpack:///./scripts/Blocks/FaqAccordion.tsx","webpack:///./scripts/Blocks/UspBlock.tsx","webpack:///./scripts/Components/ProductPageVariantList/ProductPage.VariantList.tsx","webpack:///./scripts/Components/ScrollToElementButton/ScrollToElementButton.tsx","webpack:///./scripts/Components/SubNavigationContainer/SubNavigationCollapsible.tsx","webpack:///./scripts/Components/SubNavigationContainer/SubNavigation.tsx","webpack:///./scripts/Components/SubNavigationContainer/SubNavigationContainer.tsx","webpack:///./scripts/Blocks/BannerBlock/ProductsBannerBlockItem.tsx","webpack:///./scripts/Blocks/ProductsAndBannerBlock.tsx","webpack:///./scripts/Components/ProductPriceHistory/PriceHistoryModal.tsx","webpack:///./scripts/Components/TopMenuUsps/TopMenuUsps.tsx","webpack:///./scripts/Components/NewsletterRegistration/NewsletterRegistration.tsx","webpack:///./scripts/Blocks/NewsletterFormBlock.tsx","webpack:///./scripts/Actions/News.action.js","webpack:///./scripts/Components/News/NewsList.tsx","webpack:///./scripts/Components/Navigation/NavigationMobileTrigger.tsx","webpack:///./scripts/Components/QuickSearch/QuickSearchMobileTrigger.tsx","webpack:///./scripts/Components/QuickSearch/QuickSearch.NoHit.tsx","webpack:///./scripts/Components/ProductCards/ProductCardQuickSearch.tsx","webpack:///./scripts/Components/QuickSearch/QuickSearch.LinkItem.tsx","webpack:///./scripts/Components/QuickSearch/QuickSearchResultTab.tsx","webpack:///./scripts/Actions/QuickSearch.action.js","webpack:///./scripts/Components/QuickSearch/utils/QuickSearchResult.TabItem.tsx","webpack:///./scripts/Components/QuickSearch/QuickSearchResult.tsx","webpack:///./scripts/Components/QuickSearch/QuickSearch.InitialTab.tsx","webpack:///./scripts/Components/QuickSearch/QuickSearch.tsx","webpack:///./scripts/Components/DropdownMenu.tsx","webpack:///./scripts/Components/Login/LoginModalTrigger.tsx","webpack:///./scripts/Components/MiniCart/MiniCartIcon.tsx","webpack:///./scripts/Components/MiniCart/MiniCartButton.tsx","webpack:///./scripts/Components/MegaMenu/MegaMenu.tsx","webpack:///./scripts/Components/Navigation/NavigationLink.tsx","webpack:///./scripts/Components/Navigation/Navigation.tsx","webpack:///./scripts/Components/TopMessage/TopMessage.tsx","webpack:///./scripts/Components/Header/Header.tsx","webpack:///./scripts/Components/Toast/Toast.tsx","webpack:///./scripts/Blocks/ContactForm.tsx","webpack:///./scripts/Services/Toast.service.tsx","webpack:///./scripts/Components/Klevu/KlevuMain.tsx","webpack:///./scripts/Components/NotPricedProduct/NotPricedModal.tsx","webpack:///./scripts/Server/expose-components.ts"],"names":["renderWrapper","Component","props","global","window","React","Provider","store","LitiumReduxStore","catchError","ex","onError","dispatch","response","json","then","error","setCheckoutIsSubmitting","checkoutIsSubmitting","type","CHECKOUT_SET_IS_SUBMITTING","payload","setCheckoutMode","mode","getState","CHECKOUT_SET_SELECTED_CHECKOUT_MODE","selectedCheckoutMode","checkout","post","catch","submitError","setPaymentWidget","paymentWidget","CHECKOUT_SET_PAYMENT_WIDGET","setAdditionalInfo","key","value","CHECKOUT_SET_ORDER_NOTE","saveAdditionalInfo","put","setDiscountCode","discountCode","CHECKOUT_SET_DISCOUNT_CODE","setUsedDiscountCodes","usedDiscountCodes","CHECKOUT_SET_USED_DISCOUNT_CODE","_submit","url","model","result","submitDone","redirectUrl","location","href","loadCart","CHECKOUT_SUBMIT","CHECKOUT_SUBMIT_ERROR","setValidationErrors","validationErrors","CHECKOUT_SET_VALIDATION_ERRORS","setStatusSubmitButton","CHECKOUT_SET_STATUS_SUBMIT_BUTTON","enableConfirmButton","load","loadPayment","paymentMethods","get","cart","receive","method","ingridShippingMethod","length","filter","x","id","toLowerCase","includes","CHECKOUT_SET_PAYMENT","selectedPaymentMethod","modelState","payment","loadError","CART_LOAD_ERROR","clearCartUpdateError","CART_UPDATE_ERROR","quantity","triggerAddToCartAnimation","CART_RECEIVE","setShowMiniCart","showMiniCart","CART_SHOW_MINI_CART","update","articleNumber","purchaseComment","freeGiftDiscountSystemId","abortController","cartUpdateError","addToCartAnimationTimeoutId","addToCartAnimating","clearTimeout","setAddToCartAnimating","setTimeout","CART_ADD_TO_CART_ANIMATION","translate","addOverlay","componentName","onOverlayClick","OVERLAY_ADD_OVERLAY","removeOverlay","OVERLAY_REMOVE_OVERLAY","SideMenu","forwardRef","duration","from","className","open","onClosed","showCloseButton","children","title","disableClosing","closeButton","components","ref","ready","setReady","useState","slideIn","setSlideIn","renderSideMenu","setRenderSideMenu","timeoutId","setTimeoutId","useDispatch","Error","useEffect","close","useCallback","updateOverlay","OVERLAY_UPDATE_OVERLAY","newTimeoutId","undefined","parseFloat","CloseIcon","Icon","name","onClick","ReactDOM","clsx","style","transitionDuration","Header","cloneElement","Content","Footer","document","body","displayName","inputSize","inputState","icon","wrapperClassName","label","helperText","message","showMessageIcon","showAnimatedLabel","messageIcon","useMemo","sizeClass","stateClass","animatedClass","htmlFor","_extends","required","useTypedSelector","useSelector","useCartError","cartErrorId","setCartErrorId","cartErrorMessage","setCartErrorMessage","isCartError","state","cartErrors","errorid","general","onChange","showButtons","min","max","step","disabled","resetOnCartError","cartError","internalValue","setInternalValue","debounceTimer","setDebounceTimer","onInputChanged","parsedValue","Math","ceil","Input","e","target","role","StockExceededWarning","orderRowQuantity","ProductAvailabilityItem","stockStatus","inStock","itemProp","StockStatus","description","color","additionalInformation","isDropShipment","OrderRowProductCard","row","onRemoveClick","setAbortController","AbortController","onQuantityChange","image","src","brand","extraInfo","items","map","item","index","QuantityInput","isFreeGift","totalCampaignPrice","totalPrice","orderRows","reduce","prev","current","closeMiniCart","emptyCartLink","hasOrderRows","removeRow","rowSystemId","orderTotal","checkoutUrl","paymentLogos","logoUrl","idx","MiniCart","CheckoutSectionHeader","CheckoutSection","titleRight","headerClassName","CheckoutSectionContent","AdditionalOrderInfo","customerServiceMessage","dangerouslySetInnerHTML","__html","TextArea","placeholder","onBlur","CheckoutOrderSummary","discount","deliveryCost","paymentCost","grandTotal","vatWithoutShipping","showDelete","chipProps","onDeleteClick","trimEnd","cursor","Discount","errors","inputDiscountCode","setInputDiscountCode","showDiscountInput","setShowDiscountInput","isLoading","setIsLoading","submitDiscount","async","code","onKeyDown","Chip","remove","Collapsible","isOpen","externalIsOpen","setIsOpen","Collapse","isOpened","Cart","Object","keys","values","replaceScriptNode","node","onLoad","tagName","isScriptNode","isExternalScript","parentNode","replaceChild","script","createElement","text","innerHTML","i","attributes","setAttribute","addEventListener","cloneScriptNode","childNodes","IngridDeliveryCheckout","ingridDeliveryMethodId","uniqueContainerId","updateDependencies","selectedDeliveryMethodId","onShippingOptionChanged","htmlSnippet","setHtmlSnippet","ingridWidgetLoaded","setIngridWidgetLoaded","previousUpdateDeps","setPreviousUpdateDeps","wrapperRef","useRef","anyDepsHasChanged","some","isEqual","updateIngridSession","initIngrid","handleApiError","errorMessage","err","console","onShippingMethodChanged","_sw","api","suspend","data","ok","resume","querySelector","on","meta","price_changed","shipping_method_changed","pickup_location_changed","external_method_id_changed","search_address_changed","category_name_changed","delivery_type_changed","session","getSession","debounce","ingridSession","status","updateSession","DeliveryMethods","setHasSelectedDelivery","hasSelectedMode","hasSelectedDelivery","deliveryMethods","selectedDeliveryMethod","requiredTranslation","alwaysRequiredSchema","object","shape","acceptTermsOfCondition","boolean","oneOf","privateCustomerAddressSchema","lastName","string","nullable","firstName","address","zipCode","city","country","mixed","notOneOf","phoneNumber","email","businessCustomerDetailsSchema","companyName","Dropdown","options","selectedValue","size","dropdownOpen","setDropdownOpen","selectedOption","find","o","onOptionSelected","selectClasses","iconClasses","option","tabIndex","CheckoutSectionFooter","Checkbox","checked","setChecked","ConfirmOrder","customerDetails","alternativeAddress","selectedDeliveryAddressId","selectedBillingAddressId","showAlternativeAddress","isBusinessCustomer","onSubmit","placeOrder","notCustomerDetailFields","validate","abortEarly","stateKey","inner","onValidationFailed","path","newValidationErrors","acceptTermsError","CHECKOUT_ACCEPT_TERMS_OF_CONDITION","setAcceptTermsOfCondition","termsUrl","CustomerInfoInput","validationSchema","onCustomerDetailsChange","validateOnBlur","schema","errorKey","validateAt","validationErrorsCopy","event","PrivateCustomerInfo","setCustomerDetails","propName","CHECKOUT_SET_CUSTOMER_INFO","autoComplete","countries","EmptyCart","emptyCartMessage","DynamicComponent","loader","loading","lazy","Suspense","fallback","scriptPattern","scriptFilePattern","extractScripts","domString","matches","html","scripts","scriptFiles","exec","replace","trim","push","executeScript","domId","scriptContent","appendChild","createTextNode","getElementById","includeScript","srciptUrl","responseString","paymentSession","CheckoutWidget","args","renderWidget","RadioButton","CheckoutRadio","cost","logo","SelectCheckoutMode","setHasSelectedMode","authenticated","loginUrl","Radio","Newsletter","acceptNewsletter","newsletterText","CHECKOUT_SET_NEWSLETTER","Checkout","numProducts","paymentWidgetVisibility","setPaymentWidgetVisibility","checkIntegrationTypeExist","integrationTypeCheck","integrationType","resetVisibilityValues","PaymentIntegrationType","CHECKOUT_SET_DELIVERY","updateKey","_force_update","hasSelected","PaymentWidget","onStateChange","externalStateChange","hideBorder","FilterCheckbox","singleSelect","selectedOptions","indexOf","FilterRangeSlider","setValues","parseInt","onChangeTimer","setOnChangeTimer","minValue","maxValue","safeValues","Range","renderThumb","renderTrack","onMouseDown","onTouchStart","background","getTrackBackground","colors","FormatPrice","currencyFormat","countryId","currencyId","Intl","NumberFormat","currency","minimumFractionDigits","maximumFractionDigits","format","FilterPriceRangeSlider","safeMinValue","safeMaxValue","FilterSearchInput","onSearch","setValue","matchingOptions","opt","FilterGroupElement","showAll","showAllButtonVisible","onShowHideAllClick","onOptionChanged","filterId","optionId","onOptionChangedAction","queryProductFiltering","onRangeChanged","onRangeChangedAction","renderFilterOptions","filterGroupType","FilterGroupType","showSearch","ProductFiltering","productFiltering","filters","updatePending","showAllForFilters","setShowMoreForFilters","filterSearchResults","setFilterSearchResults","listCopy","splice","shouldShowAllFilters","filterSearchResultsCopy","hasOwnProperty","getFilterOptions","getFilterGroupLabel","slice","ProductSorting","sortCriteria","selectedSortItem","sortItems","s","selected","query","onSortItemSelected","useHeaderHeight","headerHeight","setHeaderHeight","handleScroll","headerTotalHeight","getBoundingClientRect","height","top","removeEventListener","CollapsibleWithStickyHeader","container","scrollBy","position","zIndex","EditorString","breakpointValues","xsmall","small","medium","large","xlarge","xxlarge","ResponsiveImage","sizeDefinitions","alt","lazyLoad","smallestImage","sort","a","b","width","orderedSizeDefinitions","fromWidth","fromBreakpoint","img","srcSet","media","ProductTag","tagSize","isCampaign","add","upSellIds","isNaN","addToDataLayer","log","products","responseProducts","call","findIndex","gtmEcommerceItem","gtmEcommerceItems","p","dataLayerAddToCart","_path","_g","assign","bind","arguments","source","prototype","apply","this","viewBox","xmlns","maskType","maskUnits","y","d","mask","Refresh","fill","setBuyButtonArticleNumber","BUY_BUTTON_SET_ARTICLE_NUMBER","localArticleNumber","showQuantityInput","customOnClick","initialQuantity","disabledProp","showCartIcon","smallLoadingIcon","reducerArticleNumber","buyButton","setQuantity","showLoadingSpinner","setShowLoadingSpinner","BUY_BUTTON_SET_LOADING","setBuyButtonLoading","loadingSpinnerTimeout","addToCart","receiveCart","alert","LoadingComponent","LoadingSpinner","_label","ProductCardBuyButton","product","isVariantListing","hasMultipleVariants","BuyButton","ProductPrice","price","discountPercentage","isQuickSearch","alignRight","notPricedString","lowestVariantPrice","showCampaignPrice","formattedCampaignPrice","campaignPrice","priceWithVat","formattedPrice","ProductCardRelation","lazyLoadImage","setSelectedOption","variantOptions","images","tags","tag","tabRelationships","relations","j","tabBrand","responsiveImageModel","link","tabSpecifications","activeTab","setActiveTab","desktopActiveTab","showWhenPassed","fixHeaderDesktop","setFixHeaderDesktop","passed","ProductInformationTabContents","left","right","classList","behavior","setActiveTabAndScrollToTop","ProductPriceFloating","showButton","setShowButton","ProductSortingRadios","CategoryNavigation","subNavigation","foundCategory","currentCategory","subCategories","links","l","isSelected","CategoriesMenu","FilterMenu","currentMenu","setCurrentMenu","totalProductsCount","productListing","hasAnyOptionSelected","f","clearAllFilters","buttonStyle","FilterBarButtons","numberOfSelectedOptions","count","FilterBar","productListingType","ProductListingType","setProductListingType","sortItem","setUsername","username","LOGIN_SET_USERNAME_PASSWORD","setLoginModalOpen","modalOpen","LOGIN_SET_MODAL_OPEN","setLoginMode","loginMode","LOGIN_SET_LOGIN_MODE","signOut","setMagicLinkModel","magicLinkModel","LOGIN_SET_MAGIC_LINK_MODEL","handleErrorResponse","setLoginFormLoading","LOGIN_ERROR","LOGIN_SET_IS_LOADING","handleLoginResponse","organizations","success","requestToken","localStorage","setItem","setRedirectUrl","mustChangePassword","LoginMode","LOGIN_SET_ORGANIZATIONS","onSuccessfulLogin","LOGIN_SET_REDIRECT_URL","reload","MyPagesMobileMenu","navigation","navigate","useNavigate","pathname","useLocation","userInfo","currentOrganizationName","defaultValue","MyPagesDesktopMenu","NavLink","to","end","BASE_ROUTE","res","isJson","headers","userInfoActions","useTypedDispatch","MyPagesSettings","successMessage","setAddress","deliveryAddress","setDeliveryAddress","userInfoForm","setUserInfoForm","password","setPassword","confirmPassword","setConfirmPassword","confirmPasswordError","setConfirmPasswordError","countriesList","globalThis","LitiumConstants","setUserInfoValue","userInfoCopy","setAddressValue","_address","setDeliveryAddressValue","hasErrors","getErrorMessages","scrollTo","myPageUserInfoText","isCompanyUser","phone","preventDefault","saveUserInfo","finally","careOf","address1","saveAddress","saveDeliveryAddress","mayEditLogin","savePassword","rootRoute","ORDER_SET_IS_LOADING","pageIndex","showOnlyMyOrders","pageSize","PaginationOptions","orderId","showOrderDetail","orders","totalCount","ViewMode","order","setOrder","setError","list","currentPage","ORDER_RECEIVE","ORDER_ERROR","ORDER_SET_ORDER","OrderListItemMobile","externalOrderID","orderGrandTotal","orderDate","OrderListItemDesktop","calculatePager","displayedEntries","edgeEntries","pageCount","interval","getInterval","currentPageIndex","intervalStart","intervalEnd","internalPageIndex","half","upperLimit","PaginationItem","RenderFirstHalfItems","renderItems","publicPageIndex","RenderMiddleItems","RenderSecondHalfItems","Pagination","SkeletonListItemDesktop","cells","Array","SkeletonListItemMobile","MyPagesOrderHistory","myPage","orderList","pager","setPager","setCurrentPageIndex","generalError","searchParams","useSearchParams","fetchDataAndSetLoading","queryOrders","newPageIndex","fetchDataAndUpdatePageIndex","toString","onOrderClick","ProductCard","isOrderRowItem","imageUrl","orderRowDescription","quantityString","quantityDelivered","quantityReserved","orderRowStatusText","quantityOutOfStock","priceInfo","OrderDetailAddress","addressCountry","organizationName","address2","OrderDetail","isConfirmation","confirmationTitle","confirmationText","confirmationExtraText","deliveries","pickUpLocation","postalCode","addressLines","deliveryLink","deliveryName","rel","orderTotalDiscountAmount","orderTotalDeliveryCost","orderTotalVat","billingAddress","paymentMethod","deliveryMethod","MyPagesOrderDetail","useParams","componentRef","handlePrint","useReactToPrint","content","reorder","personSystemId","httpRemove","PERSON_RECEIVE","PERSON_ERROR","UserListItemMobile","person","systemId","removeUser","UserListItemDesktop","MyPagesUsers","persons","personsList","queryPersons","MyPagesAddUser","setFirstName","setLastName","setEmail","setPhone","setRole","submitForm","MyPagesEditUser","setPerson","fetchUser","setPersonValue","personCopy","editPerson","addressSystemId","ADDRESS_RECEIVE","ADDRESS_ERROR","AddressListItemDesktop","removeAddress","AddressListItemMobile","addresses","addressList","queryAddresses","MyPagesAddAddress","setZipCode","setCity","setCountry","setPhoneNumber","addAddress","MyPagesEditAddress","fetchAddress","addressCopy","editAddress","ScrollToTop","isB2bOnly","MyPagesContainer","filteredNav","HashRouter","Routes","Route","element","MyPagesAddresses","FullscreenImageSlider","initialSlide","contentRef","createRef","setOpen","isZoomed","setIsZoomed","zoomInfoVisible","setZoomInfoVisible","hasLoadedOriginalImage","setHasLoadedOriginalImage","onMouseOut","Swiper","loop","slidesPerView","zoom","toggle","modules","Thumbs","FreeMode","Zoom","onZoomChange","swiper","scale","onZoom","slideIndex","realIndex","pagination","bulletClass","bulletActiveClass","clickable","SwiperSlide","hdSrc","originalSrc","ProductPageImageSlider","splashImages","setSwiper","fullscreenOpen","setFullscreenOpen","activeSlideIndex","setActiveSlideIndex","rendered","setRendered","imageCount","splashImage","dynamicBullets","dynamicMainBullets","onSlideChange","onSwiper","thumbnailSrc","slideTo","NewsPageImageSlider","margin","mayEditPage","IconTag","ProductAttributeTag","setPriceHistoryModalOpen","previouslyLowestPrice","numberOfDays","PRICE_HISTORY_SET_MODAL_OPEN","productPriceHistory","setNotPricedModalOpen","NOT_PRICED_SET_MODAL_OPEN","NotPricedModalTrigger","ProductPagePrice","PriceHistoryModalTrigger","shortDescription","includedAccessories","numberOfExposures","usedListing","VariantPickerLinks","breakpoints","sm","md","lg","xl","useBreakpoint","windowWidth","initialWidth","innerWidth","initialHeight","innerHeight","setSize","updateSize","useWindowSize","currentBreakpoint","setCurrentBreakpoint","setBreakpointValues","setBreakpoints","_breakpoints","breakpointVars","obj","sortedValues","keyArray","sortedValue","nextValue","ProductCardForSlider","breakpoint","productTagsSize","attributeTag","usps","ProductSliderHeader","slideNext","slidePrev","canSlideNext","canSlidePrev","IconChevronLeft","IconChevronRight","ProductPageProductSlider","numberOfSlidesMobile","numberOfSlidesDesktop","renderSlider","setRenderSlider","isBeginning","setIsBeginning","isEnd","setIsEnd","swiperRef","spaceBetween","slidesPerGroup","Navigation","onAfterInit","onBeforeInit","KlarnaPlacement","priceInMinorUnits","isMounted","setIsMounted","Klarna","OnsiteMessaging","refresh","toLocaleString","useGrouping","ProductPageInformationUsps","productListInformationUsps","usp","imageAlt","ProductPageItemTags","ProductPageTierPrices","tierPriceItems","minimumQuantityFormatted","unitOfMeasurementTitle","nextMinimumQuantity","minimumQuantity","nextMinimumQuantityFormatted","activeItemId","setActiveItemId","upSellItem","handleSetOpenIndex","openIndex","setOpenIndex","selectedItems","setSelectedItems","upSellItems","prevState","newItems","BUY_BUTTON_SET_UPSELL_ARTICLE_NUMBERS","UpSellItem","VideolyVideoboxPlaceholder","CanBuy","ProductPage","productItem","itemPropPrice","itemPropPriceCurrency","sliderImages","productInformationTabs","usedProduct","isDemoProduct","campaignDescriptions","otherVariants","accessoriesProducts","recommendAccessory","similarProducts","mostSoldProducts","uSPBlock","customerPurchaseCommentActive","customerPurchaseCommentTitle","setPurchaseComment","itemScope","itemType","AdminEditButton","mpn","urlToPage","ProductInformationTabs","purchasePriceWithoutVatFormatted","DemoProduct","UsedProduct","campaignDescription","ProductCampaignDescription","additionalStockInformation","UpSellItems","maxLength","FloatingBuyButton","tierPrices","BannerBlockItem","imageHeight","imageWidth","mobileImageUrl","mobileImageHeight","mobileImageWidth","linkText","overlay","cardLink","bodyText","hasLinkButton","DivOrAnchor","rest","BlockHeader","bannerCellClass","BannerBlock","banners","numPerRow","banner","BannerSliderBlock","slides","slide","CategoryLinkBlock","showThumbnail","backgroundColor","variantsLabel","textColor","ProductSlider","ProductBlockNoSlider","MAX_LEN","ProductListHeaderText","showMore","setShowMore","wordLength","trimmedText","substring","display","filterGroup","chipText","selectedId","matchingOption","join","clearFilterGroup","ActiveFilterChips","g","FilterGroupChips","ProgressBar","progress","maxProgress","showLabel","progressPercent","LoadMoreButton","productsPerLoad","pageNumberForCrawler","canLoadMore","crawlerCount","setCrawlerCount","ProductListingResizeObserver","isMedium","getProductsPerRowForBreakpoint","setProductsPerRow","setProductCardHeight","getGridCardHeight","ProductCardPlaceholder","ProductCardLandscape","LandscapeProductCardPlaceholder","cache","CellMeasurerCache","defaultWidth","minWidth","defaultHeight","fixedWidth","fixedHeight","oneColRowClass","ProductListing","useLayoutEffect","delay","clearAll","listRef","recomputeRowHeights","isLoadingMore","isLoadingReverse","productsPerRow","productCardHeight","gtmViewModel","rowCount","RowComponent","ProductComponent","ProductPlaceholderComponent","pushEcommerce","isRowLoaded","loadMoreRows","startIndex","stopIndex","Promise","resolve","endIndex","setIsLoadingReverse","fetchProducts","clear","rowRenderer","parent","productsForRow","CellMeasurer","rowIndex","columnIndex","WindowScroller","isScrolling","onChildScroll","scrollTop","AutoSizer","disableHeight","InfiniteLoader","minimumBatchSize","threshold","onRowsRendered","registerChild","List","autoHeight","onScroll","rowHeight","loadMoreClick","addPlaceholderProducts","setIsLoadingMore","SearchResultLinkTab","search","brandListing","total","pagesListing","categoryListing","SEARCH_ACTIVE_TAB","SearchNavigationItem","resultKey","active","productListingHits","categoryListingHits","pagesListingHits","brandListingHits","setActiveTabAction","totalHits","setMobileMenuOpen","mobileMenuOpen","NAVIGATION_RECEIVE","MobileNavigationItem","isParentLink","onLinkClick","showAllText","NavigationMobile","mobileContentLinks","socialMediaLinks","currentLink","setCurrentLink","previousLink","setPreviousLink","onBackClick","rightAligned","footer","iconUrl","OVERLAY_CLASS","Overlay","activeOverlays","disableOverlayClick","overlayClasses","c","classesToRemove","startsWith","component","removeOverlayAction","VariantPickerDropdown","VariantPickerButtons","LoginChangePassword","login","newPassword","setNewPassword","passwordConfirmation","setPasswordConfirmation","submitChangePassword","oldPassword","LoginForgotPassword","isSuccessful","setIsSuccessful","submitMagicLink","submitForgotPassword","LoginForm","performLogin","URLSearchParams","performLoginAction","LoginSelectOrganization","selectedOrganizationId","setSelectedOrganizationId","org","selectOrganization","LoginContainer","LoginModal","LoginPage","linkCellClass","LinkBlock","Link","thumbnailUrl","NewsBlock","newsDate","ResponsiveBannerBlockItem","responsiveImage","responsiveMobileImage","useScrollShadow","defaultHasBottomShadow","defaultHasTopShadow","hasBottomShadow","setHasBottomShadow","hasTopShadow","setHasTopShadow","updateScrolling","clientHeight","scrollHeight","useIsMobile","isMobile","setIsMobile","updateIsMobile","ResponsiveBannerBlock","StartPageBlock","blogHeader","allLinksUrl","blogPostsContainer","linkUrl","OrderConfirmation","extraText","BrandsBlock","brands","RichTextBlockColumn","column","textMobile","columnCountMobile","columnCount","RichTextBlock","rowLayout","columns","slimContainerMaxWidth","verticalAlignment","reverseColumnOrderForMobile","styles","maxWidth","faqList","faqItems","faq","UspBlock","ProductPageVariantList","variants","ScrollToElementButton","btnType","btnSize","selector","fullwidth","iconBefore","iconAfter","SubNavigation","SubNavigationCollapsible","secondLevelLink","SubNavigationContainer","ProductsBannerBlockItem","ProductsAndBannerBlock","productsBlock","bannersBlock","showBannerToTheRight","bannerBlockItem","firstTwoProducts","remainingProducts","customModalStyles","padding","border","PriceHistoryModal","priceHistory","Modal","ariaHideApp","preventScroll","onRequestClose","shouldCloseOnOverlayClick","TopMenuUsps","uspList","hasLoaded","setHasLoaded","uspLink","uspText","Autoplay","direction","autoplay","disableOnInteraction","NewsletterRegistrationForm","buttonClassName","registrationError","setRegistrationError","isTryingToSubscribe","setIsTryingToSubscribe","registrationSuccessful","setRegistrationSuccessful","IconCheck","IconReload","NewsletterRegistration","NewsletterFormBlock","updateQueryStringParameter","uri","re","RegExp","separator","match","getNews","year","month","page","newsList","news","selectedType","selectedYear","selectedMonth","selectedPage","parameter","urlparts","split","prefix","encodeURIComponent","pars","lastIndexOf","removeURLParameter","NewsList","introduction","newsTypes","years","months","entries","Number","charAt","toUpperCase","newsPage","NavigationMobileTrigger","QuickSearchMobileTrigger","mobileSearch","quicksearchMobileTrigger","ProductCardQuickSearch","hasImage","imageSource","QuickSearchLinkItem","QuickSearchResultItem","modelKey","QuickSearchResultTab","results","setSearchQuery","QUICK_SEARCH_QUERY","searchError","QUICK_SEARCH_ERROR","toggleInputActive","quickSearch","QUICK_SEARCH_INPUT_ACTIVE","inputActive","QUICK_SEARCH_RECEIVE","showResult","selectItem","selectedItem","QUICK_SEARCH_SELECT_ITEM","QuickSearchResultTabItem","translation","QUICK_SEARCH_ACTIVE_TAB","QuickSearchResult","searchUrl","noHitHeader","noHitDescription","totalNumResults","curr","QuickSearchNoHit","QuickSearchInitialTab","sectionList","listItem","sectionTitle","sectionLinkList","subListItem","sectionSearchText","debouncedQuery","q","abort","quickSearchModel","uniqueId","searchContainer","searchInput","action","WebkitBorderRadius","klevuEnabled","decodeURIComponent","handleKeyDown","clip","keyCode","selectedObject","DropdownMenu","menuItems","containerRef","contains","relatedTarget","menuItem","LoggedInLink","myPagesLink","navigationItems","logOutMenuItems","loggedInMenuItems","concat","LoginModalTrigger","isLoggedIn","MiniCartIcon","MiniCartButton","MegaMenu","onMegaMenuClose","onMouseOverMegaMenu","onMouseLeaveMegaMenu","blocks","blockContainerRef","activeSubMegaMenuLink","setActiveSubMegaMenuLink","activeHooverLink","setActiveHooverLink","subMegaMenuTimer","setSubMegaMenuTimer","handleSetActiveHooverLink","hooverLink","megaMenuImage","onSubLinkHover","block","showLeftContainer","showRightContainer","onMouseLeave","onMouseOver","subLink","subSubLink","megaMenuLink","NavigationLink","isActive","onLinkHover","onMouseLeaveLink","contentLinks","rightContentLinks","activeMegaMenuLink","setActiveMegaMenuLink","megaMenuTimer","setMegaMenuTimer","blockElements","setBlockElements","blockElementsContainer","blockSystemIds","dataset","topMessage","topMessageTextColor","topMessageBackgroundColor","topMenuUspList","startPageUrl","QuickSearch","certificateList","certificate","certificateImageUrl","certificateLink","certificateHoverText","TopMessage","Toast","iconName","iconColor","ContactForm","receiverEmail","register","handleSubmit","formState","reset","useForm","emailHasBeenSent","setEmailHasBeenSent","triggerToast","toast","autoClose","subject","KlevuMain","klevuAddToCart","detail","qty","NotPricedModal","notPriced","SearchResult","SearchNavigation","FaqAccordion"],"mappings":"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","file":"284.9f4af22e3201d16104d7.js","sourcesContent":["import React from 'react';\nimport { Provider } from 'react-redux';\nimport store from '../store';\n\nconst renderWrapper = (Component, props) =>\n global.window ? (\n <Provider store={store}>\n <Component {...props} />\n </Provider>\n ) : (\n <Provider store={global.LitiumReduxStore}>\n <Component {...props} />\n </Provider>\n );\n\nexport default renderWrapper;\n","export const catchError = (ex, onError) => (dispatch) => {\n if (ex.response) {\n ex.response.json().then((error) => dispatch(onError(error)));\n } else {\n dispatch(onError(ex));\n }\n};\n","import { post, put, remove } from '../Services/http';\nimport { load as loadCart } from './Cart.action';\nimport { catchError } from './Error.action';\n\nimport {\n CHECKOUT_SET_SELECTED_COMPANY_ADDRESS,\n CHECKOUT_SET_SELECTED_BILLING_ADDRESS,\n CHECKOUT_SET_SELECTED_DELIVERY_ADDRESS,\n CHECKOUT_SET_PRIVATE_CUSTOMER,\n CHECKOUT_SET_SIGN_UP,\n CHECKOUT_SET_DELIVERY,\n CHECKOUT_SET_COUNTRY,\n CHECKOUT_SET_PAYMENT,\n CHECKOUT_SET_NEWSLETTER,\n CHECKOUT_SET_SELECTED_CHECKOUT_MODE,\n CHECKOUT_SET_DISCOUNT_CODE,\n CHECKOUT_SET_ORDER_NOTE,\n CHECKOUT_ACCEPT_TERMS_OF_CONDITION,\n CHECKOUT_SUBMIT,\n CHECKOUT_SUBMIT_ERROR,\n CHECKOUT_SET_PAYMENT_WIDGET,\n CHECKOUT_SET_USED_DISCOUNT_CODE,\n CHECKOUT_UPDATE_CUSTOMER_INFO,\n CHECKOUT_SET_SHOW_ALTERNATIVE_ADDRESS,\n CLEAR_ERROR,\n CHECKOUT_SET_STATUS_SUBMIT_BUTTON,\n CHECKOUT_VALIDATE_ADDRESS,\n CHECKOUT_SET_CUSTOMER_INFO,\n CHECKOUT_SET_VALIDATION_ERRORS,\n CHECKOUT_SET_IS_SUBMITTING,\n} from '../constants';\n\nexport const setBusinessCustomer = (isBusinessCustomer) => ({\n type: CHECKOUT_SET_PRIVATE_CUSTOMER,\n payload: {\n isBusinessCustomer,\n },\n});\n\nexport const setSignUp = (signUp) => ({\n type: CHECKOUT_SET_SIGN_UP,\n payload: {\n signUp,\n },\n});\n\nexport const updateCustomerDetails = (key, data) => ({\n type: CHECKOUT_UPDATE_CUSTOMER_INFO,\n payload: {\n key,\n data,\n },\n});\n\nexport const setSelectedBillingAddress = (selectedBillingAddressId) => ({\n type: CHECKOUT_SET_SELECTED_BILLING_ADDRESS,\n payload: {\n selectedBillingAddressId,\n },\n});\n\nexport const setSelectedDeliveryAddress = (selectedDeliveryAddressId) => ({\n type: CHECKOUT_SET_SELECTED_DELIVERY_ADDRESS,\n payload: {\n selectedDeliveryAddressId,\n },\n});\n\nexport const setCheckoutIsSubmitting = (checkoutIsSubmitting) => ({\n type: CHECKOUT_SET_IS_SUBMITTING,\n payload: {\n checkoutIsSubmitting,\n },\n});\n\nexport const setDelivery = (method) => (dispatch, getState) => {\n dispatch({\n type: CHECKOUT_SET_DELIVERY,\n payload: {\n selectedDeliveryMethod: method,\n },\n });\n const { payload } = getState().checkout;\n return put('/api/checkout/setDeliveryProvider', payload)\n .then((response) => response.json())\n .then((result) => {\n if (result !== null && result.paymentWidget) {\n dispatch(setPaymentWidget(result.paymentWidget));\n }\n })\n .catch((ex) =>\n dispatch(catchError(ex, (error) => submitError(error)))\n );\n};\n\nexport const setCountry = (systemId) => (dispatch, getState) => {\n dispatch({\n type: CHECKOUT_SET_COUNTRY,\n payload: {\n selectedCountry: systemId,\n },\n });\n const { payload } = getState().checkout;\n\n // reset paymentWidget to null to avoid sending unnecessary request to payment provider\n dispatch(setPaymentWidget(null));\n\n return put('/api/checkout/setCountry', payload)\n .then((response) => response.json())\n .then((result) => {\n dispatch(loadCart());\n dispatch(setPaymentWidget(result.paymentWidget));\n dispatch({\n type: CHECKOUT_SET_DELIVERY,\n payload: {\n deliveryMethods: result.deliveryMethods,\n selectedDeliveryMethod: result.selectedDeliveryMethod,\n },\n });\n dispatch({\n type: CHECKOUT_SET_PAYMENT,\n payload: {\n paymentMethods: result.paymentMethods,\n selectedPaymentMethod: result.selectedPaymentMethod,\n },\n });\n })\n .catch((ex) =>\n dispatch(catchError(ex, (error) => submitError(error)))\n );\n};\n\nexport const setNewsletter = (checked) => (dispatch, getState) => {\n dispatch({\n type: CHECKOUT_SET_NEWSLETTER,\n payload: {\n acceptNewsletter: checked,\n },\n });\n\n dispatch(saveAdditionalInfo());\n};\n\nexport const setCheckoutMode = (mode) => (dispatch, getState) => {\n dispatch({\n type: CHECKOUT_SET_SELECTED_CHECKOUT_MODE,\n payload: {\n selectedCheckoutMode: mode,\n },\n });\n\n const { payload } = getState().checkout;\n return post('/api/checkout/setCheckoutMode', payload).catch((ex) =>\n dispatch(catchError(ex, (error) => submitError(error)))\n );\n};\n\nexport const setPayment = (method) => (dispatch, getState) => {\n dispatch({\n type: CHECKOUT_SET_PAYMENT,\n payload: {\n selectedPaymentMethod: method,\n },\n });\n\n const { payload } = getState().checkout;\n // reset paymentWidget to null to avoid sending unnecessary request to payment provider\n dispatch(setPaymentWidget(null));\n // reset payment error on the checkout\n dispatch(\n submitError({\n modelState: {\n payment: [],\n },\n })\n );\n\n return put('/api/checkout/setPaymentProvider', payload)\n .then((response) => response.json())\n .then((result) => {\n dispatch(loadCart());\n dispatch(setPaymentWidget(result.paymentWidget));\n })\n .catch((ex) =>\n dispatch(catchError(ex, (error) => submitError(error)))\n );\n};\n\nexport const reloadPayment = () => (dispatch, getState) => {\n const { payload } = getState().checkout;\n return put('/api/checkout/reloadPaymentWidget', payload)\n .then((response) => response.json())\n .then((result) => {\n dispatch(loadCart());\n if (result && result.paymentWidget) {\n dispatch(setPaymentWidget(result.paymentWidget));\n }\n })\n .catch((ex) =>\n dispatch(catchError(ex, (error) => submitError(error)))\n );\n};\n\nconst setPaymentWidget = (paymentWidget) => ({\n type: CHECKOUT_SET_PAYMENT_WIDGET,\n payload: {\n paymentWidget,\n },\n});\n\nexport const setAdditionalInfo = (key, value) => ({\n type: CHECKOUT_SET_ORDER_NOTE,\n payload: {\n [key]: value,\n },\n});\n\nexport const saveAdditionalInfo = () => (dispatch, getState) => {\n const { payload } = getState().checkout;\n return put('/api/checkout/saveAdditionalInfo', payload).catch((ex) =>\n dispatch(catchError(ex, (error) => submitError(error)))\n );\n};\n\nexport const acceptTermsOfCondition = (acceptTermsOfCondition) => ({\n type: CHECKOUT_ACCEPT_TERMS_OF_CONDITION,\n payload: {\n acceptTermsOfCondition,\n },\n});\n\nexport const setDiscountCode = (discountCode) => ({\n type: CHECKOUT_SET_DISCOUNT_CODE,\n payload: {\n discountCode,\n },\n});\n\nexport const submitDiscountCode = () => (dispatch, getState) => {\n const { payload } = getState().checkout;\n return put('/api/checkout/setDiscountCode', payload)\n .then((response) => response.json())\n .then((result) => {\n dispatch(setUsedDiscountCodes(result.usedDiscountCodes));\n dispatch(loadCart());\n dispatch(setPaymentWidget(result.paymentWidget));\n // reset error of campaign code\n dispatch(\n submitError({\n modelState: {\n discountCode: [],\n },\n })\n );\n })\n .catch((ex) => {\n dispatch(catchError(ex, (error) => submitError(error)));\n // restore the initial cart\n dispatch(loadCart());\n });\n};\n\nexport const deleteDiscountCode =\n (discountCode) => (dispatch, getState) => {\n const { payload } = getState().checkout;\n payload.discountCode = discountCode;\n return remove('/api/checkout/deleteDiscountCode', payload)\n .then((response) => response.json())\n .then((result) => {\n dispatch(setUsedDiscountCodes(result.usedDiscountCodes));\n dispatch(loadCart());\n dispatch(setPaymentWidget(result.paymentWidget));\n dispatch(setDiscountCode(''));\n // reset error of campaign code\n dispatch(\n submitError({\n modelState: {\n discountCode: [],\n },\n })\n );\n })\n .catch((ex) => {\n dispatch(catchError(ex, (error) => submitError(error)));\n // restore the initial cart\n dispatch(loadCart());\n });\n };\n\nconst setUsedDiscountCodes = (usedDiscountCodes) => ({\n type: CHECKOUT_SET_USED_DISCOUNT_CODE,\n payload: {\n usedDiscountCodes,\n },\n});\n\nexport const setAlternativeAddress = (propName, value) => ({\n type: CHECKOUT_SET_CUSTOMER_INFO,\n payload: {\n key: 'alternativeAddress',\n data: {\n [propName]: value,\n },\n },\n});\n\nexport const setCustomerDetails = (propName, value) => ({\n type: CHECKOUT_SET_CUSTOMER_INFO,\n payload: {\n key: 'customerDetails',\n data: {\n [propName]: value,\n },\n },\n});\n\nexport const submit = () => (dispatch, getState) => {\n const { payload } = getState().checkout;\n return _submit('/api/checkout', payload, dispatch);\n};\n\nconst _submit = (url, model, dispatch) => {\n return post(url, model)\n .then((response) => response.json())\n .then((result) => {\n dispatch(submitDone(result));\n if (result.redirectUrl) {\n location.href = result.redirectUrl;\n } else {\n dispatch(setCheckoutIsSubmitting(false));\n }\n })\n .catch((ex) => {\n dispatch(setCheckoutIsSubmitting(false));\n if (ex.response) {\n ex.response.json().then((error) => {\n dispatch(submitError(error));\n dispatch(submitDone(null));\n // reload the cart, it might be changed after validation\n dispatch(loadCart());\n });\n } else {\n dispatch(submitError(ex));\n }\n });\n};\n\nexport const saveCustomerDetail = () => (dispatch, getState) => {\n const { payload } = getState().checkout;\n return put('api/checkout/setCustomerDetail', payload)\n .then((response) => response.json())\n .catch((ex) => {\n if (ex.response) {\n ex.response.json().then((error) => {\n dispatch(submitError(error));\n });\n } else {\n dispatch(submitError(ex));\n }\n throw ex;\n });\n};\n\nexport const clearError = () => ({\n type: CLEAR_ERROR,\n payload: {\n errors: [],\n },\n});\n\nexport const submitDone = (result) => ({\n type: CHECKOUT_SUBMIT,\n payload: {\n result,\n },\n});\n\nexport const submitError = (error) => ({\n type: CHECKOUT_SUBMIT_ERROR,\n payload: {\n error,\n },\n});\n\nexport const setValidationErrors = (validationErrors) => ({\n type: CHECKOUT_SET_VALIDATION_ERRORS,\n payload: {\n validationErrors,\n },\n});\n\nexport const setStatusSubmitButton = (value) => ({\n type: CHECKOUT_SET_STATUS_SUBMIT_BUTTON,\n payload: {\n enableConfirmButton: value,\n },\n});\n\nexport const setShowAlternativeAddress = (showAlternativeAddress) => ({\n type: CHECKOUT_SET_SHOW_ALTERNATIVE_ADDRESS,\n payload: {\n showAlternativeAddress,\n },\n});\nexport const setValidateStatus = (isValidating) => ({\n type: CHECKOUT_VALIDATE_ADDRESS,\n payload: {\n isValidating,\n },\n});\n","import { get, put } from '../Services/http';\nimport { catchError } from './Error.action';\nimport {\n CART_LOAD_ERROR,\n CART_UPDATE_ERROR,\n CART_RECEIVE,\n CART_SHOW_MINI_CART,\n CART_ADD_TO_CART_ANIMATION,\n} from '../constants';\nimport { setPayment } from './Checkout.action';\n\nexport const load =\n (loadPayment = false) =>\n (dispatch, getState) => {\n var paymentMethods = getState().checkout.payload.paymentMethods;\n\n return get('/api/cart')\n .then((response) => response.json())\n .then((cart) => {\n dispatch(receive(cart));\n return cart;\n })\n .then((cart) => {\n if (\n loadPayment &&\n cart?.ingridShippingMethod &&\n cart.ingridShippingMethod.length > 0\n ) {\n dispatch(\n setPayment(\n cart.ingridShippingMethod === 'ics-cyberphoto'\n ? paymentMethods.filter(\n (x) =>\n x.id &&\n x.id !== '' &&\n !x.id.toLowerCase().includes('klarna')\n )[0]\n : paymentMethods.filter(\n (x) =>\n x.id &&\n x.id !== '' &&\n x.id.toLowerCase().includes('klarna')\n )[0]\n )\n );\n }\n })\n .catch((ex) =>\n dispatch(catchError(ex, (error) => loadError(error)))\n );\n };\n\nexport const loadError = (error) => ({\n type: CART_LOAD_ERROR,\n payload: {\n error,\n },\n});\n\nexport const cartUpdateError = (error) => ({\n type: CART_UPDATE_ERROR,\n payload: {\n error,\n },\n});\n\nexport const clearCartUpdateError = () => ({\n type: CART_UPDATE_ERROR,\n payload: {\n error: {},\n },\n});\n\nexport const receive = (cart) => (dispatch, getState) => {\n if (getState().cart.quantity != cart.quantity) {\n dispatch(triggerAddToCartAnimation());\n }\n\n return dispatch({\n type: CART_RECEIVE,\n payload: cart,\n });\n};\n\nexport const toggle = () => (dispatch, getState) => {\n dispatch(show(!getState().cart.showMiniCart));\n};\n\nexport const setShowMiniCart = (showMiniCart) => ({\n type: CART_SHOW_MINI_CART,\n payload: {\n showMiniCart,\n },\n});\n\nexport const update =\n (\n articleNumber,\n quantity,\n purchaseComment,\n freeGiftDiscountSystemId,\n abortController = null\n ) =>\n (dispatch) => {\n return put(\n `/api/cart/update`,\n {\n articleNumber,\n quantity,\n purchaseComment,\n freeGiftDiscountSystemId,\n },\n abortController\n )\n .then((response) => response.json())\n .then((cart) => {\n dispatch(receive(cart));\n dispatch(clearCartUpdateError());\n })\n .catch((ex) =>\n dispatch(catchError(ex, (error) => cartUpdateError(error)))\n );\n };\n\nlet addToCartAnimationTimeoutId;\nexport const triggerAddToCartAnimation = () => (dispatch, getState) => {\n const addToCartAnimating = getState().cart.addToCartAnimating;\n if (!addToCartAnimating) {\n if (addToCartAnimationTimeoutId) {\n clearTimeout(addToCartAnimationTimeoutId);\n }\n\n dispatch(setAddToCartAnimating(true));\n addToCartAnimationTimeoutId = setTimeout(\n () => dispatch(setAddToCartAnimating(false)),\n 500\n );\n }\n};\n\nconst setAddToCartAnimating = (addToCartAnimating) => ({\n type: CART_ADD_TO_CART_ANIMATION,\n payload: {\n addToCartAnimating,\n },\n});\n","export const translate = (key: string) =>\n (global['LitiumTexts'] && global['LitiumTexts'][key]) || key;\n","import {\n OVERLAY_ADD_OVERLAY,\n OVERLAY_CLOSE_OVERLAY,\n OVERLAY_REMOVE_OVERLAY,\n OVERLAY_UPDATE_OVERLAY,\n} from '../constants';\n\nexport const addOverlay = (componentName, onOverlayClick) => ({\n type: OVERLAY_ADD_OVERLAY,\n payload: {\n componentName,\n onOverlayClick,\n },\n});\n\nexport const updateOverlay = (componentName, onOverlayClick) => ({\n type: OVERLAY_UPDATE_OVERLAY,\n payload: {\n componentName,\n onOverlayClick,\n },\n});\n\nexport const removeOverlay = (componentName) => ({\n type: OVERLAY_REMOVE_OVERLAY,\n payload: {\n componentName,\n },\n});\n\nexport const closeOverlay = () => ({\n type: OVERLAY_CLOSE_OVERLAY,\n payload: {\n activeOverlays: [],\n },\n});\n","import React, {\n cloneElement,\n forwardRef,\n useCallback,\n useEffect,\n useState,\n} from 'react';\nimport ReactDOM from 'react-dom';\nimport { useDispatch } from 'react-redux';\nimport {\n addOverlay,\n removeOverlay,\n updateOverlay,\n} from '../../Actions/Overlay.action';\nimport Icon from '../Icon';\nimport clsx from 'clsx';\n\ninterface SideMenuProps {\n id: string;\n duration?: string;\n from?: string;\n className?: string;\n open?: boolean;\n onClosed: () => void;\n showCloseButton?: boolean;\n children?: React.ReactNode;\n title?: string;\n disableClosing?: boolean;\n closeButton?: any;\n components?: {\n Header?: React.FC;\n Footer?: React.FC;\n Content?: React.FC;\n };\n}\n\nconst SideMenu = forwardRef<HTMLDivElement, SideMenuProps>(\n (\n {\n id,\n duration = '0.2s',\n from = 'right',\n className,\n open = false,\n onClosed,\n showCloseButton = true,\n children,\n title,\n disableClosing = false,\n closeButton = null,\n components = {},\n }: SideMenuProps,\n ref\n ) => {\n const [ready, setReady] = useState<boolean>(false);\n const [slideIn, setSlideIn] = useState<boolean>(open);\n const [renderSideMenu, setRenderSideMenu] = useState<boolean>(open);\n const [timeoutId, setTimeoutId] = useState<NodeJS.Timeout>();\n const dispatch = useDispatch();\n\n if (!id || id == '') {\n throw new Error(\n 'A unique side-menu \"id\" must be passed to side menu component'\n );\n }\n\n useEffect(() => {\n setReady(true);\n }, []);\n\n const close = useCallback(() => {\n if (!disableClosing) {\n // Just sets \"slideIn\" to false, which triggers the animation to close it\n setSlideIn(false);\n return true;\n }\n\n // False disables overlay click\n return false;\n }, [disableClosing]);\n\n useEffect(() => {\n dispatch(updateOverlay(id, close));\n }, [dispatch, close, id]);\n\n useEffect(() => {\n if (!ready) return;\n if (!slideIn && ready) {\n // If not slide in, slide out :^)\n if (timeoutId) {\n // Clear previous timeout to avoid animation delay bug\n clearTimeout(timeoutId);\n }\n\n var newTimeoutId = setTimeout(() => {\n setTimeoutId(undefined);\n onClosed && onClosed();\n setRenderSideMenu(false);\n }, parseFloat(duration) * 1000);\n\n setTimeoutId(newTimeoutId);\n dispatch(removeOverlay(id));\n }\n }, [slideIn]);\n\n useEffect(() => {\n if (!ready) return;\n\n // Triggered every time \"open\" is changed, initially as well\n // Timeout to not trigger on the same frame as the render, to enable the slide-in\n setTimeout(() => setSlideIn(open), 1);\n\n if (open) {\n setRenderSideMenu(true);\n dispatch(addOverlay(id, close));\n }\n }, [open, close]);\n\n const CloseIcon = () => (\n <Icon\n className=\"absolute right-4 top-4 h-5 w-5 cursor-pointer md:h-6 md:w-6\"\n name=\"close\"\n onClick={close}\n />\n );\n\n return renderSideMenu\n ? ReactDOM.createPortal(\n <div\n className={clsx(\n className,\n 'fixed top-0 z-50 flex h-full w-full flex-col bg-white transition-all duration-[400ms] ease-in-out',\n slideIn ? 'open' : 'closing',\n // from == 'left' && '-left-full',\n // from == 'right' && '-right-full',\n slideIn\n ? from == 'left' && 'left-0'\n : from == 'left' && '-left-full',\n slideIn\n ? from == 'right' && 'right-0'\n : from == 'right' && '-right-full'\n )}\n ref={ref}\n style={{ transitionDuration: duration }}\n >\n {components.Header && (\n <div\n className={clsx(\n 'relative flex max-h-14 items-center border-b border-solid border-gray-300 px-4 py-[1.125rem] capitalize',\n from == 'left' && 'bg-primary-gradient'\n )}\n >\n {showCloseButton &&\n !disableClosing &&\n (!closeButton ? (\n <CloseIcon />\n ) : (\n cloneElement(closeButton, {\n onClick: close,\n })\n ))}\n <components.Header />\n </div>\n )}\n {!components.Header &&\n showCloseButton &&\n !disableClosing &&\n (!closeButton ? (\n <CloseIcon />\n ) : (\n cloneElement(closeButton, {\n onClick: close,\n })\n ))}\n {title && <h3 className=\"title\">{title}</h3>}\n {components?.Content && (\n <components.Content>{children}</components.Content>\n )}\n {!components?.Content && (\n <div className=\"gap-4 pl-4 pr-4\">{children}</div>\n )}\n {components.Footer != null && (\n <div className=\"flex justify-center gap-4 px-4\">\n <components.Footer />\n </div>\n )}\n </div>,\n document.body\n )\n : null;\n }\n);\n\nSideMenu.displayName = 'SideMenu';\n\nexport default SideMenu;\n","import React, { forwardRef } from 'react';\nimport { useMemo } from 'react';\nimport Icon from '../Icon';\nimport { InputProps } from './types/Input.types';\nimport clsx from 'clsx';\n\nconst Input: React.FC<\n InputProps & React.InputHTMLAttributes<HTMLInputElement>\n> = forwardRef<\n HTMLInputElement,\n InputProps & React.InputHTMLAttributes<HTMLInputElement>\n>(\n (\n {\n inputSize = 'medium',\n inputState = 'default',\n icon,\n className,\n wrapperClassName,\n label,\n helperText,\n message,\n showMessageIcon = true,\n showAnimatedLabel = false,\n ...props\n },\n ref\n ) => {\n const messageIcon = useMemo(() => {\n switch (inputState) {\n case 'default':\n default:\n return null;\n\n case 'success':\n return <Icon name=\"check-circle\" />;\n\n case 'error':\n case 'warning':\n return <Icon name=\"warning\" />;\n }\n }, [inputState]);\n\n const sizeClass = useMemo(() => {\n switch (inputSize) {\n case 'small':\n case 'xsmall':\n return 'input-wrapper--sm';\n case 'large':\n return 'input-wrapper--lg';\n case 'xlarge':\n return 'input-wrapper--xl';\n case 'medium':\n default:\n return 'input-wrapper--md';\n }\n }, [inputSize]);\n\n const stateClass = useMemo(() => {\n switch (inputState) {\n case 'error':\n return 'input-wrapper--error';\n case 'warning':\n return 'input-wrapper--warning';\n case 'success':\n return 'input-wrapper--success';\n default:\n return undefined;\n }\n }, [inputState]);\n\n const animatedClass = useMemo(() => {\n switch (inputSize) {\n case 'medium':\n return 'input-with-animated-label-medium';\n default:\n return 'input-with-animated-label';\n }\n }, [inputSize]);\n\n return (\n <div\n className={clsx(\n wrapperClassName,\n 'input-wrapper',\n sizeClass,\n stateClass,\n !!icon && 'input-wrapper--has-icon'\n )}\n >\n {label && !showAnimatedLabel && (\n <label htmlFor={props.id}>{label}</label>\n )}\n <div className=\"relative flex\">\n <input\n {...props}\n className={clsx(\n className,\n 'input',\n showAnimatedLabel ? animatedClass : ''\n )}\n ref={ref}\n />\n {typeof icon == 'string' && <Icon name={icon} />}\n {typeof icon == 'object' && icon}\n {label && showAnimatedLabel && (\n <label htmlFor={props.id}>\n {label}\n {props.required && '*'}\n </label>\n )}\n </div>\n {helperText && <span className=\"helper-text\">{helperText}</span>}\n {message && (\n <span className=\"message\">\n {showMessageIcon && messageIcon}\n <span>{message}</span>\n </span>\n )}\n </div>\n );\n }\n);\n\nexport default Input;\n","import { TypedUseSelectorHook, useSelector } from 'react-redux';\nimport { RootState } from '../reducers';\n\nexport const useTypedSelector: TypedUseSelectorHook<RootState> = useSelector;\n","import { useEffect, useState } from 'react';\nimport { useTypedSelector } from './useTypedSelector';\n\ninterface CartError {\n isCartError: boolean;\n cartErrorId: string;\n cartErrorMessage: string;\n}\n\nconst useCartError = (): CartError => {\n const [cartErrorId, setCartErrorId] = useState('');\n const [cartErrorMessage, setCartErrorMessage] = useState('');\n const isCartError = cartErrorId != '';\n const { error } = useTypedSelector((state) => state.cartErrors);\n\n useEffect(() => {\n setCartErrorId(error?.errorid ?? '');\n setCartErrorMessage(error?.general ?? '');\n }, [error]);\n\n return { isCartError, cartErrorId, cartErrorMessage };\n};\n\nexport default useCartError;\n","import React, { useEffect, useState } from 'react';\nimport Icon from '../Icon';\nimport Input from '../Inputs/Input';\nimport clsx from 'clsx';\nimport useCartError from '../../Hooks/useCartError';\n\ninterface QuantityInputAttributes {\n className?: string;\n wrapperClassName?: string;\n onChange?: (quantity: number) => void;\n quantity?: number;\n showButtons?: boolean;\n min?: number;\n max?: number;\n step?: number;\n disabled?: boolean;\n resetOnCartError?: boolean;\n}\n\nconst QuantityInput = (props: QuantityInputAttributes) => {\n const {\n className = '',\n wrapperClassName = '',\n onChange,\n quantity,\n showButtons = false,\n min,\n max,\n step,\n disabled = false,\n resetOnCartError = false,\n } = props;\n\n const cartError = useCartError();\n const [internalValue, setInternalValue] = useState<number>(\n quantity ?? 1\n );\n const [debounceTimer, setDebounceTimer] = useState<NodeJS.Timeout>();\n\n const onInputChanged = (value) => {\n let parsedValue: number | undefined = parseFloat(value);\n if (!parsedValue) {\n parsedValue = 0;\n }\n parsedValue = Math.ceil(parsedValue);\n if (parsedValue <= 0) return;\n setInternalValue(parsedValue);\n\n if (onChange) {\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n }\n\n // Debounce onChange\n setDebounceTimer(\n setTimeout(() => {\n onChange(value);\n }, 350)\n );\n }\n };\n\n useEffect(() => {\n if (resetOnCartError && cartError.isCartError) {\n setInternalValue(quantity ?? 1);\n }\n }, [cartError.cartErrorId]);\n\n return (\n <div\n className={clsx(\n wrapperClassName,\n 'quantity-input',\n 'relative flex flex-col'\n )}\n >\n <Input\n className={clsx(className, 'text-center text-lg')}\n type=\"number\"\n value={internalValue ?? ''}\n onChange={(e) => onInputChanged(e.target.value)}\n min={min}\n max={max}\n step={step}\n disabled={disabled}\n inputSize=\"small\"\n />\n {showButtons && (\n <>\n <div\n className=\"absolute bottom-0 left-0 top-0 w-8 cursor-pointer\"\n role=\"button\"\n onClick={() => onInputChanged(internalValue - 1)}\n >\n <Icon\n name=\"minus\"\n className={clsx(\n 'color-gray-900 absolute left-1/2 top-1/2 h-4 w-4 -translate-x-1/2 -translate-y-1/2',\n internalValue <= 1 || disabled\n ? 'opacity-[0.24]'\n : 'opacity-1'\n )}\n />\n </div>\n <div\n className=\"absolute bottom-0 right-0 top-0 w-8\"\n role=\"button\"\n onClick={() => onInputChanged(internalValue + 1)}\n >\n <Icon\n name=\"plus\"\n className=\"color-gray-900 absolute left-1/2 top-1/2 h-4 w-4 -translate-x-1/2 -translate-y-1/2\"\n />\n </div>\n </>\n )}\n </div>\n );\n};\n\nexport default QuantityInput;\n","import React from 'react';\nimport Icon from '../Icon';\nimport clsx from 'clsx';\nimport { translate } from '../../Services/translation';\n\ninterface StockExceededWarningProps {\n quantity: number;\n orderRowQuantity: number;\n}\n\nexport const StockExceededWarning: React.FC<\n StockExceededWarningProps & React.HTMLAttributes<HTMLDivElement>\n> = ({ quantity, orderRowQuantity, className }) => {\n return (\n <>\n {orderRowQuantity > quantity && (\n <div\n className={clsx(className, 'flex items-center leading-[1.2]')}\n >\n <Icon name=\"info\" className=\"mr-1 h-4 w-4\" />\n <span className=\"text-sm leading-[1.2]\">\n {translate('cart.quantity-exceeded-warning')}\n </span>\n </div>\n )}\n </>\n );\n};\n\ninterface StockStatusProps {\n inStock: boolean;\n description: string;\n color: string;\n additionalInformation?: string;\n isDropShipment: boolean;\n}\n\ninterface ProductAvailabilityItemProps {\n stockStatus: StockStatusProps | undefined;\n}\n\nexport const ProductAvailabilityItem = ({\n stockStatus,\n}: ProductAvailabilityItemProps) => {\n return (\n stockStatus?.inStock && (\n <link itemProp=\"availability\" href={'https://schema.org/InStock'} />\n )\n );\n};\n\nconst StockStatus: React.FC<\n StockStatusProps & React.HTMLAttributes<HTMLDivElement>\n> = ({\n inStock,\n description,\n color,\n className,\n additionalInformation,\n isDropShipment,\n ...props\n}) => {\n return (\n <div\n {...props}\n className={clsx(className, 'flex items-center leading-[1.2]')}\n >\n <Icon name={`stock-box-${color}`} className={clsx('mr-1 h-4 w-4')} />\n <span className=\"stock-status-description overflow-hidden overflow-ellipsis whitespace-nowrap text-sm leading-[1.2]\">\n {description}\n {additionalInformation && !isDropShipment && (\n <span>. {additionalInformation}</span>\n )}\n </span>\n </div>\n );\n};\nexport default StockStatus;\n","import React, { useCallback, useEffect, useState } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { update } from '../../Actions/Cart.action';\nimport { OrderRow } from '../../Types/OrderRow';\nimport QuantityInput from '../QuantityInput/QuantityInput';\nimport StockStatus, {\n StockExceededWarning,\n} from '../StockStatus/StockStatus';\nimport clsx from 'clsx';\nimport Icon from '../Icon';\n\ninterface OrderRowProductCardProps {\n row: OrderRow;\n onRemoveClick?: (row: OrderRow) => void;\n className?: string;\n}\n\nconst OrderRowProductCard = ({\n row,\n onRemoveClick,\n className = '',\n}: OrderRowProductCardProps) => {\n const dispatch = useDispatch();\n\n const [abortController, setAbortController] = useState<\n AbortController | undefined\n >();\n\n useEffect(() => setAbortController(new AbortController()), []);\n\n const onQuantityChange = useCallback(\n (row: OrderRow, quantity: number) => {\n dispatch(\n update(\n row.articleNumber,\n quantity,\n row.purchaseComment,\n row.freeGiftDiscountSystemId,\n abortController\n )\n );\n },\n [abortController, dispatch]\n );\n\n return (\n <div\n className={clsx(\n className,\n 'flex gap-x-4 rounded-sm border border-solid bg-white p-3 shadow-mc'\n )}\n >\n <div className=\"h-16 w-16\">\n {row.image && (\n <a href={row.url}>\n <img\n className=\"aspect-square w-full object-cover\"\n src={row.image}\n />\n </a>\n )}\n </div>\n <div className=\"flex flex-1 flex-col\">\n <div className=\"flex flex-1 justify-between\">\n {row.brand && row.brand.length > 0 && (\n <div className=\"mb-1 text-md font-bold leading-tight text-gray-900\">\n {row.brand}\n </div>\n )}\n <div className=\"mb-1 text-md font-bold leading-tight text-gray-900\">\n <a href={row.url}>{row.name}</a>\n </div>\n {onRemoveClick && (\n <button\n className=\"flex\"\n onClick={() => onRemoveClick && onRemoveClick(row)}\n >\n <Icon name=\"cross\" className=\"h-5 w-5\" role=\"button\" />\n </button>\n )}\n </div>\n {row.extraInfo && (\n <div className=\"mb-1 flex\">\n {row.extraInfo.items.map((item, index) => (\n <div\n className=\"text-sm leading-tight text-gray-600\"\n key={'mini-cart' + item.key}\n >\n {index > 0 && <>, </>}\n {item.key}: {item.value}\n </div>\n ))}\n </div>\n )}\n {row.purchaseComment && (\n <div className=\"mb-1 flex\">\n <div className=\"text-sm leading-tight text-gray-600\">\n {row.purchaseComment}\n </div>\n </div>\n )}\n <StockStatus {...row.stockStatus} className=\"mb-2\" />\n {row.stockStatus.color == 'green' && (\n <StockExceededWarning\n className=\"mb-2\"\n quantity={row.stockStatus.quantity}\n orderRowQuantity={row.quantity}\n />\n )}\n <div className=\"flex items-center justify-between\">\n <QuantityInput\n quantity={row.quantity}\n showButtons={!row.isFreeGift}\n disabled={row.isFreeGift}\n wrapperClassName=\"max-w-[112px]\"\n onChange={(quantity) => onQuantityChange(row, quantity)}\n resetOnCartError={true}\n />\n <div className=\"text-md font-bold\">\n {row.totalCampaignPrice ? (\n <div className=\"text-brand-red\">\n {row.totalCampaignPrice}\n </div>\n ) : (\n <div className=\"text-gray-900\">{row.totalPrice}</div>\n )}\n {row.totalCampaignPrice && (\n <div className=\"text-right text-sm text-gray-600 line-through\">\n {row.totalPrice}\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport default OrderRowProductCard;\n","import React from 'react';\nimport { useMemo } from 'react';\nimport { useDispatch } from 'react-redux';\nimport {\n setShowMiniCart,\n update,\n clearCartUpdateError,\n} from '../../Actions/Cart.action';\nimport { translate } from '../../Services/translation';\nimport SideMenu from '../SideMenu/SideMenu';\nimport OrderRowProductCard from '../OrderRowProductCard/OrderRowProductCard';\nimport Icon from '../Icon';\nimport { useTypedSelector } from '../../Hooks/useTypedSelector';\nimport { OrderRow } from '../../Types/OrderRow';\nimport clsx from 'clsx';\nimport useCartError from '../../Hooks/useCartError';\n\nconst Header: React.FC<{}> = () => {\n const dispatch = useDispatch();\n const { orderRows } = useTypedSelector((state) => state.cart);\n const closeMiniCart = () => dispatch(setShowMiniCart(false));\n\n const quantity = useMemo(\n () => orderRows.reduce((prev, current) => prev + current.quantity, 0),\n [orderRows]\n );\n\n return (\n <div className=\"flex flex-1 items-center justify-between\">\n <h4 className=\"normal-case\">\n {translate('general.cart')} {quantity > 0 ? `(${quantity})` : ''}\n </h4>\n <Icon\n role=\"button\"\n className=\"close h-6 w-6 cursor-pointer\"\n name=\"close\"\n onClick={closeMiniCart}\n />\n </div>\n );\n};\n\nconst Content: React.FC<{}> = () => {\n const dispatch = useDispatch();\n const cartError = useCartError();\n const { orderRows, emptyCartLink } = useTypedSelector(\n (state) => state.cart\n );\n const hasOrderRows = useMemo(() => orderRows?.length > 0, [orderRows]);\n\n const removeRow = (row: OrderRow) => {\n dispatch(\n update(\n row.articleNumber,\n 0,\n row.purchaseComment,\n row.freeGiftDiscountSystemId\n )\n );\n };\n\n const clearGeneralErrors = () => {\n dispatch(clearCartUpdateError());\n };\n\n return (\n <div\n className={clsx(\n 'flex flex-1 flex-col gap-0.5 overflow-x-auto p-3',\n !hasOrderRows && 'm-auto',\n hasOrderRows && 'bg-gray-100'\n )}\n >\n {cartError.isCartError && (\n <div className=\"sticky left-0 right-0 top-0 z-[99] flex justify-between border border-error-500 bg-gray-50 p-3 text-md text-error-500\">\n {cartError.cartErrorMessage}\n <button className=\"flex\" onClick={() => clearGeneralErrors()}>\n <Icon name=\"cross\" className=\"h-5 w-5\" role=\"button\" />\n </button>\n </div>\n )}\n {hasOrderRows ? (\n orderRows.map((row) => (\n <OrderRowProductCard\n key={row.rowSystemId + 'mini-cart'}\n row={row}\n onRemoveClick={removeRow}\n />\n ))\n ) : (\n <div className=\"m-auto flex flex-col items-center text-center\">\n <h4 className=\"mx-0 my-4\">{translate('cart.empty')}</h4>\n {emptyCartLink && (\n <a\n href={emptyCartLink}\n className=\"btn btn--inverted-outline btn--large w-full\"\n >\n {translate('cart.empty-cart-link')}\n </a>\n )}\n </div>\n )}\n </div>\n );\n};\n\nconst Footer: React.FC<{}> = () => {\n const { orderRows, orderTotal, checkoutUrl, paymentLogos } =\n useTypedSelector((state) => state.cart);\n const hasOrderRows = useMemo(() => orderRows?.length > 0, [orderRows]);\n\n return hasOrderRows ? (\n <div className=\"flex-1\">\n <div className=\"mb-1 mt-3 flex items-center justify-between\">\n <h4>{translate('general.total')}</h4>\n <h4>{orderTotal}</h4>\n </div>\n <div className=\"mb-2 flex items-center justify-between\">\n <p className=\"text-sm leading-3 text-gray-900\">\n {translate('minicart.delivery.cost.title')}\n </p>\n <p className=\"text-sm leading-3 text-gray-900\">\n {translate('minicart.delivery.cost')}\n </p>\n </div>\n <a\n href={checkoutUrl}\n className=\"btn btn--addtocart btn--large w-full text-lg font-medium\"\n >\n {translate('cart.to-checkout')}\n </a>\n {paymentLogos && paymentLogos.length > 0 && (\n <div className=\"mb-2.5 mt-2 flex flex-row justify-center gap-x-3\">\n {paymentLogos.map((logoUrl, idx) => (\n <a href={logoUrl} key={idx}>\n <img className=\"h-3\" src={logoUrl} />\n </a>\n ))}\n </div>\n )}\n </div>\n ) : null;\n};\n\nconst MiniCart = () => {\n const dispatch = useDispatch();\n const { showMiniCart } = useTypedSelector((state) => state.cart);\n const closeMiniCart = () => dispatch(setShowMiniCart(false));\n\n return (\n <SideMenu\n className=\"z-[60] overflow-y-auto border-l border-solid border-gray-300 scrollbar-none md:max-w-[640px] md:border-l-0\"\n id=\"mini-cart\"\n open={showMiniCart}\n onClosed={closeMiniCart}\n components={{ Header, Footer, Content }}\n showCloseButton={false}\n />\n );\n};\n\nexport default MiniCart;\n","import clsx from 'clsx';\nimport React from 'react';\n\nconst CheckoutSectionHeader = ({ children, className = '' }) => {\n return (\n <div\n className={clsx(\n className,\n 'flex',\n 'justify-between',\n 'items-center',\n 'mb-4'\n )}\n >\n {children}\n </div>\n );\n};\n\nexport default CheckoutSectionHeader;\n","import React from 'react';\nimport CheckoutSectionHeader from './Checkout.SectionHeader';\nimport clsx from 'clsx';\n\ninterface CheckoutSectionProps {\n children?: any;\n className?: string;\n headerClassName?: string;\n title?: string;\n titleRight?: JSX.Element | string;\n}\n\nconst CheckoutSection = ({\n children,\n className = '',\n title,\n titleRight,\n headerClassName,\n}: CheckoutSectionProps) => {\n return (\n <div\n className={clsx(\n className,\n 'mb-4',\n 'bg-white',\n 'md:border-x',\n 'rounded-sm',\n 'border-x-0',\n 'border-y',\n 'border-gray-200'\n )}\n >\n {title && (\n <CheckoutSectionHeader className={headerClassName}>\n <h5>{title}</h5>\n {titleRight}\n </CheckoutSectionHeader>\n )}\n {children}\n </div>\n );\n};\n\nexport default CheckoutSection;\n","import React from 'react';\n\ninterface CheckoutSectionContentProps {\n children?: any;\n className?: string;\n}\n\nconst CheckoutSectionContent = ({\n children,\n className,\n}: CheckoutSectionContentProps) => (\n <div className={className}>{children}</div>\n);\n\nexport default CheckoutSectionContent;\n","import React, { forwardRef } from 'react';\nimport { useMemo } from 'react';\nimport Icon from '../Icon';\nimport { InputProps } from './types/Input.types';\nimport clsx from 'clsx';\n\nconst TextArea: React.FC<\n InputProps & React.InputHTMLAttributes<HTMLInputElement>\n> = forwardRef<\n HTMLInputElement,\n InputProps & React.InputHTMLAttributes<HTMLInputElement>\n>(\n (\n {\n inputSize = 'medium',\n inputState = 'default',\n icon,\n wrapperClassName,\n label,\n helperText,\n message,\n showMessageIcon = true,\n showAnimatedLabel = false,\n ...props\n },\n ref\n ) => {\n const messageIcon = useMemo(() => {\n switch (inputState) {\n case 'default':\n default:\n return null;\n\n case 'success':\n return <Icon name=\"check-circle\" />;\n\n case 'error':\n case 'warning':\n return <Icon name=\"warning\" />;\n }\n }, [inputState]);\n\n const sizeClass = useMemo(() => {\n switch (inputSize) {\n case 'small':\n case 'xsmall':\n return 'input-wrapper--sm';\n case 'large':\n return 'input-wrapper--lg';\n case 'xlarge':\n return 'input-wrapper--xl';\n case 'medium':\n default:\n return 'input-wrapper--md';\n }\n }, [inputSize]);\n\n const stateClass = useMemo(() => {\n switch (inputState) {\n case 'error':\n return 'input-wrapper--error';\n case 'warning':\n return 'input-wrapper--warning';\n case 'success':\n return 'input-wrapper--success';\n default:\n return undefined;\n }\n }, [inputState]);\n\n const animatedClass = useMemo(() => {\n switch (inputSize) {\n case 'medium':\n return 'input-with-animated-label-medium';\n default:\n return 'input-with-animated-label';\n }\n }, [inputSize]);\n\n return (\n <div\n className={clsx(\n wrapperClassName,\n 'input-wrapper--textarea',\n 'input-wrapper',\n sizeClass,\n stateClass,\n !!icon && 'input-wrapper--has-icon'\n )}\n >\n {label && !showAnimatedLabel && (\n <label htmlFor={props.id}>\n {label}\n {props.required && '*'}\n </label>\n )}\n <div className=\"relative flex\">\n <textarea\n {...props}\n className={clsx(\n 'textarea',\n 'input',\n showAnimatedLabel ? animatedClass : ''\n )}\n ref={ref}\n />\n {typeof icon == 'string' && <Icon name={icon} />}\n {typeof icon == 'object' && icon}\n {label && showAnimatedLabel && (\n <label htmlFor={props.id}>\n {label}\n {props.required && '*'}\n </label>\n )}\n </div>\n {helperText && <span className=\"helper-text\">{helperText}</span>}\n {message && (\n <span className=\"message\">\n {showMessageIcon && messageIcon}\n <span>{message}</span>\n </span>\n )}\n </div>\n );\n }\n);\n\nexport default TextArea;\n","import React from 'react';\nimport { useDispatch } from 'react-redux';\nimport CheckoutSection from './utils/Checkout.Section';\nimport CheckoutSectionContent from './utils/Checkout.SectionContent';\nimport { translate } from '../../Services/translation';\nimport {\n setAdditionalInfo,\n saveAdditionalInfo,\n} from '../../Actions/Checkout.action';\nimport { useTypedSelector } from '../../Hooks/useTypedSelector';\nimport TextArea from '../Inputs/TextArea';\nimport Input from '../Inputs/Input';\nimport clsx from 'clsx';\n\nconst AdditionalOrderInfo = () => {\n const dispatch = useDispatch();\n const checkout = useTypedSelector((state) => state.checkout);\n const { customerServiceMessage, selectedCheckoutMode } =\n checkout.payload;\n\n return (\n <CheckoutSection\n title={\n selectedCheckoutMode === 'b2b'\n ? translate('checkout.additionalinfo.title.b2b')\n : translate('checkout.additionalinfo.title.b2c')\n }\n className=\"p-4\"\n >\n <CheckoutSectionContent>\n {customerServiceMessage && (\n <div\n className=\"mb-2 text-md\"\n dangerouslySetInnerHTML={{\n __html: customerServiceMessage.value,\n }}\n ></div>\n )}\n <div className={clsx('flex', 'flex-col', 'gap-4')}>\n <TextArea\n inputSize=\"xlarge\"\n id=\"additional-info__orderNote\"\n placeholder={translate('checkout.ordernote.placeholder')}\n onChange={(e) =>\n dispatch(setAdditionalInfo('orderNote', e.target.value))\n }\n onBlur={() => dispatch(saveAdditionalInfo())}\n />\n {selectedCheckoutMode === 'b2b' && (\n <>\n <div\n className={clsx(\n 'flex',\n 'flex-col',\n 'lg:flex-row',\n 'gap-4'\n )}\n >\n <Input\n type=\"text\"\n id=\"additional-info__referenceNumber\"\n className=\"rounded-sm text-lg\"\n inputSize=\"large\"\n placeholder={translate('checkout.reference.number')}\n onChange={(e) =>\n dispatch(\n setAdditionalInfo('referenceNumber', e.target.value)\n )\n }\n onBlur={() => dispatch(saveAdditionalInfo())}\n />\n <Input\n type=\"text\"\n id=\"additional-info__invoiceReference\"\n className=\"rounded-sm text-lg\"\n inputSize=\"large\"\n placeholder={translate('checkout.invoice.reference')}\n onChange={(e) =>\n dispatch(\n setAdditionalInfo('invoiceReference', e.target.value)\n )\n }\n onBlur={() => dispatch(saveAdditionalInfo())}\n />\n </div>\n <div\n className={clsx(\n 'flex',\n 'flex-col',\n 'lg:flex-row',\n 'gap-4'\n )}\n >\n <Input\n type=\"text\"\n id=\"additional-info__costCenter\"\n className=\"rounded-sm text-lg\"\n inputSize=\"large\"\n placeholder={translate('checkout.cost.center')}\n onChange={(e) =>\n dispatch(\n setAdditionalInfo('costCenter', e.target.value)\n )\n }\n onBlur={() => dispatch(saveAdditionalInfo())}\n />\n <Input\n type=\"text\"\n id=\"additional-info__goodsMark\"\n className=\"rounded-sm text-lg\"\n inputSize=\"large\"\n placeholder={translate('checkout.goods.mark')}\n onChange={(e) =>\n dispatch(\n setAdditionalInfo('goodsMark', e.target.value)\n )\n }\n onBlur={() => dispatch(saveAdditionalInfo())}\n />\n </div>\n </>\n )}\n </div>\n </CheckoutSectionContent>\n </CheckoutSection>\n );\n};\n\nexport default AdditionalOrderInfo;\n","import { translate } from '../../Services/translation';\nimport React from 'react';\nimport { useTypedSelector } from '../../Hooks/useTypedSelector';\nimport clsx from 'clsx';\n\nconst CheckoutOrderSummary = () => {\n const cart = useTypedSelector((state) => state.cart);\n\n return (\n <div className=\"bg-white px-4 py-2\">\n <div className=\"flex flex-col py-0.5\">\n <div className=\"checkout-order-summary-row\">\n <span>{translate('checkout.order.sum')}</span>\n <span>{cart.orderTotal}</span>\n </div>\n {cart.discount && (\n <div\n className={clsx(\n 'checkout-order-summary-row',\n 'text-brand-red'\n )}\n >\n <span>{translate('checkout.order.saved')}</span>\n <span>{cart.discount}</span>\n </div>\n )}\n {cart.deliveryCost && (\n <div className=\"checkout-order-summary-row\">\n <span>{translate('checkout.order.shipping')}</span>\n <span>{translate('checkout.order.shipping.cost')}</span>\n </div>\n )}\n {cart.paymentCost && (\n <div className=\"checkout-order-summary-row\">\n <span>{translate('checkout.order.fee')}</span>\n <span>{cart.paymentCost}</span>\n </div>\n )}\n <div className=\"checkout-order-summary-row font-bold\">\n <span>{translate('checkout.order.grand.total.sum')}</span>\n <span>{cart.grandTotal}</span>\n </div>\n <div className=\"checkout-order-summary-row\">\n <span>{translate('checkout.order.vat')}</span>\n <span>{cart.vatWithoutShipping}</span>\n </div>\n </div>\n </div>\n );\n};\n\nexport default CheckoutOrderSummary;\n","import React, { HTMLAttributes } from 'react';\nimport Icon from './Icon';\nimport clsx from 'clsx';\n\ninterface ChipAttributes {\n children?: any;\n showDelete?: boolean;\n onDeleteClick?: Function;\n chipProps?: HTMLAttributes<HTMLDivElement>;\n}\n\nconst Chip = (props: ChipAttributes) => {\n const {\n children,\n showDelete = true,\n chipProps = {},\n onDeleteClick,\n } = props;\n\n return (\n <div\n {...chipProps}\n className={clsx(\n 'text-sm',\n 'flex',\n 'items-center',\n 'text-center',\n 'justify-center',\n 'rounded-sm',\n 'py-1.5',\n 'px-3',\n 'border',\n 'border-solid',\n 'border-gray-400',\n 'gap-2',\n `${chipProps.className ?? ''}`.trimEnd()\n )}\n >\n {children}\n {showDelete && (\n <Icon\n name=\"close\"\n cursor=\"pointer\"\n className=\"h-4 w-4\"\n onClick={() => onDeleteClick && onDeleteClick()}\n />\n )}\n </div>\n );\n};\n\nexport default Chip;\n","import React, { useEffect, useState } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { translate } from '../../Services/translation';\nimport {\n submitDiscountCode,\n deleteDiscountCode,\n setDiscountCode,\n submitError,\n} from '../../Actions/Checkout.action';\nimport { useTypedSelector } from '../../Hooks/useTypedSelector';\nimport Chip from '../Chip';\nimport Input from '../Inputs/Input';\nimport clsx from 'clsx';\n\nconst Discount = () => {\n const dispatch = useDispatch();\n const { payload, errors = {} } = useTypedSelector(\n (state) => state.checkout\n );\n const { usedDiscountCodes } = payload;\n const [inputDiscountCode, setInputDiscountCode] = useState('');\n const [showDiscountInput, setShowDiscountInput] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n\n useEffect(() => {\n if (errors && !errors['discountCode']?.length) {\n setInputDiscountCode('');\n }\n }, [errors]);\n\n const submitDiscount = async (code) => {\n setIsLoading(true);\n await dispatch(setDiscountCode(code));\n await dispatch(submitDiscountCode());\n setIsLoading(false);\n };\n\n const onChange = (code) => {\n setInputDiscountCode(code);\n if (errors['discountCode']?.length > 0 && !code.length) {\n dispatch(\n submitError({\n modelState: {\n discountCode: [],\n },\n })\n );\n }\n };\n return (\n <div className=\"flex flex-col justify-center border-b border-b-gray-200 bg-white\">\n <div className=\"p-4\">\n <a\n className={clsx(\n 'text-md',\n 'leading-tight',\n 'underline',\n !showDiscountInput && 'cursor-pointer',\n showDiscountInput && 'cursor-default'\n )}\n onClick={() => setShowDiscountInput(true)}\n >\n {translate('checkout.usecampaigncode')}\n </a>\n </div>\n <div\n className={clsx(\n showDiscountInput || usedDiscountCodes.length > 0\n ? 'flex flex-col px-4 pb-4 pt-0'\n : 'hidden'\n )}\n >\n {showDiscountInput && (\n <div className={clsx('flex', 'gap-2', 'items-center', 'mb-2')}>\n <label className=\"flex-1\" htmlFor=\"checkout__discount\">\n <Input\n type=\"text\"\n id=\"checkout__discount\"\n className=\"rounded-sm border border-solid border-gray-400 text-lg\"\n inputSize=\"large\"\n onBlur={() => !inputDiscountCode}\n value={inputDiscountCode}\n onKeyDown={(e) =>\n e.key == 'Enter' && submitDiscount(inputDiscountCode)\n }\n placeholder={translate('checkout.fillcampaigncode')}\n onChange={(e) => onChange(e.target.value)}\n disabled={isLoading}\n message={\n errors['discountCode']?.length > 0\n ? errors['discountCode'][0]\n : null\n }\n inputState={\n errors['discountCode']?.length > 0 ? 'error' : 'default'\n }\n />\n </label>\n <button\n className=\"btn btn--addtocart btn--large text-lg\"\n onClick={() => submitDiscount(inputDiscountCode)}\n disabled={!inputDiscountCode || isLoading}\n >\n {translate('general.use')}\n </button>\n </div>\n )}\n {usedDiscountCodes && (\n <div className={clsx('flex', 'flex-wrap', 'gap-2')}>\n {usedDiscountCodes.map((code) => (\n <Chip\n key={'used-discount-code-' + code}\n onDeleteClick={() => dispatch(deleteDiscountCode(code))}\n chipProps={{ className: 'bg-gray-100' }}\n >\n {code}\n </Chip>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport default Discount;\n","import React, { useEffect, useState } from 'react';\nimport { Collapse } from 'react-collapse';\nimport clsx from 'clsx';\nimport Icon from '../Icon';\nimport { translate } from '../../Services/translation';\n\ninterface CollapsibleAttributes {\n label?: string | JSX.Element;\n isOpen?: boolean;\n children?: any;\n}\n\nconst Collapsible = ({\n children,\n label,\n isOpen: externalIsOpen,\n}: CollapsibleAttributes) => {\n const [isOpen, setIsOpen] = useState<boolean>(externalIsOpen ?? false);\n\n const onStateChange = (open: boolean) => {\n setIsOpen(open);\n };\n\n useEffect(() => {\n setIsOpen(externalIsOpen ?? false);\n }, [externalIsOpen]);\n\n return (\n <div className={'collapsible'}>\n <div\n className=\"flex cursor-pointer items-center justify-between border-b border-b-gray-200 bg-white p-4\"\n onClick={() => onStateChange(!isOpen)}\n >\n <h5>{label}</h5>\n <div className=\"flex flex-row items-center justify-between\">\n <div className=\"mr-1 text-md\">\n {isOpen\n ? translate('checkout.cart.hide.products')\n : translate('checkout.cart.show.products')}\n </div>\n <Icon\n className={clsx(isOpen ? 'rotate-180' : 'rotate-0', 'h-4 w-4')}\n style={{ transitionDuration: '0.2s' }}\n name=\"caret-down\"\n />\n </div>\n </div>\n <div\n id=\"cart-content\"\n className={clsx(\n 'collapsible__content bg-gray-50',\n isOpen && 'border-b border-b-gray-200 '\n )}\n >\n <Collapse isOpened={isOpen}>\n <div className=\"p-3\">{children}</div>\n </Collapse>\n </div>\n </div>\n );\n};\n\nexport default Collapsible;\n","import React from 'react';\nimport { useDispatch } from 'react-redux';\nimport OrderRowProductCard from '../OrderRowProductCard/OrderRowProductCard';\nimport CheckoutSection from './utils/Checkout.Section';\nimport { translate } from '../../Services/translation';\nimport CheckoutOrderSummary from './Checkout.OrderSummary';\nimport Discount from './Checkout.Discount';\nimport { update, clearCartUpdateError } from '../../Actions/Cart.action';\nimport { useTypedSelector } from '../../Hooks/useTypedSelector';\nimport clsx from 'clsx';\nimport Collapsible from './Checkout.Collapsible';\nimport useCartError from '../../Hooks/useCartError';\nimport Icon from '../Icon';\n\nconst Cart = () => {\n const dispatch = useDispatch();\n const cartError = useCartError();\n const cart = useTypedSelector((state) => state.cart);\n const hasOrderRows =\n cart.orderRows && Object.keys(cart.orderRows).length > 0;\n const removeRow = (row) => {\n dispatch(\n update(\n row.articleNumber,\n 0,\n row.purchaseComment,\n row.freeGiftDiscountSystemId\n )\n );\n };\n\n const clearGeneralErrors = () => {\n dispatch(clearCartUpdateError());\n };\n\n return (\n <CheckoutSection>\n <Collapsible\n label={\n translate('checkout.cart.title') + ' (' + cart.quantity + ')'\n }\n isOpen={false}\n >\n {cartError.isCartError && (\n <div className=\"sticky left-0 right-0 top-0 z-[99] flex justify-between border border-error-500 bg-gray-50 p-3 text-md text-error-500\">\n {cartError.cartErrorMessage}\n <button className=\"flex\" onClick={() => clearGeneralErrors()}>\n <Icon name=\"cross\" className=\"h-5 w-5\" role=\"button\" />\n </button>\n </div>\n )}\n {hasOrderRows &&\n Object.values(cart.orderRows).map((row: any) => (\n <OrderRowProductCard\n className={clsx('mb-0.5', '[&:last-child]:mb-0')}\n key={row.rowSystemId}\n row={row}\n onRemoveClick={() => removeRow(row)}\n />\n ))}\n </Collapsible>\n <Discount />\n <CheckoutOrderSummary />\n </CheckoutSection>\n );\n};\n\nexport default Cart;\n","import { get, post } from '../../Services/http';\nimport { IngridSession } from './Types/IngridSession';\n\nexport const getSession: () => Promise<IngridSession> = async () => {\n const response = await get('/api/ingrid');\n return response.json();\n};\n\nexport const updateSession: () => Promise<\n IngridSession | undefined\n> = async () => {\n const response = await post('/api/ingrid', {});\n return response.status == 200 ? response.json() : undefined;\n};\n\nfunction isScriptNode(node) {\n return node.tagName === 'SCRIPT';\n}\n\nfunction isExternalScript(node) {\n return !!node.src && node.src !== '';\n}\n\nfunction cloneScriptNode(node, onLoad) {\n var script = document.createElement('script');\n script.text = node.innerHTML;\n for (var i = node.attributes.length - 1; i >= 0; i--) {\n script.setAttribute(node.attributes[i].name, node.attributes[i].value);\n if (onLoad) {\n script.addEventListener('load', onLoad);\n }\n }\n return script;\n}\n\nexport function replaceScriptNode(node, onLoad: any = undefined) {\n if (isScriptNode(node) && !isExternalScript(node)) {\n node.parentNode.replaceChild(cloneScriptNode(node, onLoad), node);\n } else {\n var i = 0,\n children = node.childNodes;\n while (i < children.length) {\n replaceScriptNode(children[i++], onLoad);\n }\n }\n return node;\n}\n","import { debounce } from 'lodash-es';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { post } from '../../Services/http';\nimport isEqual from 'deep-equal';\nimport { IngridDeliveryCheckoutProps } from './Types/IngridDeliveryCheckoutProps';\nimport { ShippingOptionChangedData } from './Types/ShippingOptionChangedData';\nimport {\n getSession,\n replaceScriptNode,\n updateSession,\n} from './IngridDeliveryCheckout.service';\n\n// To use window._sw in TypeScript\ndeclare global {\n interface Window {\n _sw: any;\n }\n}\n\nconst IngridDeliveryCheckout = ({\n className,\n ingridDeliveryMethodId,\n uniqueContainerId = 'shipwallet-container',\n updateDependencies,\n selectedDeliveryMethodId,\n onShippingOptionChanged,\n onError,\n}: IngridDeliveryCheckoutProps) => {\n const [htmlSnippet, setHtmlSnippet] = useState<string>('');\n const [ingridWidgetLoaded, setIngridWidgetLoaded] = useState(false);\n const [previousUpdateDeps, setPreviousUpdateDeps] =\n useState<any[]>(updateDependencies);\n const wrapperRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const anyDepsHasChanged = updateDependencies.some(\n (current, idx) =>\n !isEqual(\n current,\n previousUpdateDeps.length > idx\n ? previousUpdateDeps[idx]\n : undefined\n )\n );\n\n if (\n ingridWidgetLoaded &&\n updateDependencies.length > 0 &&\n anyDepsHasChanged\n ) {\n setPreviousUpdateDeps(updateDependencies);\n updateIngridSession();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [updateDependencies]);\n\n // Load ingrid if selected delivery method is ingrid\n useEffect(() => {\n selectedDeliveryMethodId == ingridDeliveryMethodId\n ? initIngrid()\n : setHtmlSnippet('');\n }, [selectedDeliveryMethodId, ingridDeliveryMethodId]);\n\n const handleApiError = useCallback(\n async (err) => {\n let errorMessage;\n if (err.response) {\n const data = await err.response.json();\n errorMessage = data.error;\n } else {\n errorMessage = err;\n }\n\n if (typeof onError === 'function') {\n onError(errorMessage);\n } else {\n console.error(errorMessage);\n }\n },\n [onError]\n );\n\n const onShippingMethodChanged = useCallback(\n async (data) => {\n try {\n window._sw((api) => api.suspend());\n const response = await post('/api/ingrid/shippingoption', data);\n if (response.ok && typeof onShippingOptionChanged === 'function') {\n onShippingOptionChanged(data as ShippingOptionChangedData);\n }\n\n window._sw((api) => api.resume());\n } catch (err) {\n await handleApiError(err);\n }\n },\n [handleApiError, onShippingOptionChanged]\n );\n\n const registerIngridEvents = () => {\n window._sw((api) => {\n api.on('loaded', () => setIngridWidgetLoaded(true));\n api.on('data_changed', async (data, meta) => {\n if (\n meta.price_changed ||\n meta.shipping_method_changed ||\n meta.pickup_location_changed ||\n meta.external_method_id_changed ||\n meta.search_address_changed ||\n meta.category_name_changed ||\n meta.delivery_type_changed\n ) {\n await onShippingMethodChanged(data);\n }\n });\n });\n };\n\n // Initialize ingrid scripts after setting html snippet\n useEffect(() => {\n if (wrapperRef?.current && !!htmlSnippet && !ingridWidgetLoaded) {\n replaceScriptNode(\n wrapperRef.current.querySelector(`#${uniqueContainerId}`)\n );\n registerIngridEvents();\n }\n }, [htmlSnippet]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const initIngrid = async () => {\n try {\n const session = await getSession();\n if (session) {\n setHtmlSnippet(session.htmlSnippet);\n }\n } catch (err) {\n await handleApiError(err);\n }\n };\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const updateIngridSession = useCallback(\n debounce(async () => {\n try {\n window._sw((api) => api.suspend());\n const ingridSession = await updateSession();\n if (ingridSession?.htmlSnippet) {\n setHtmlSnippet(ingridSession.htmlSnippet);\n }\n } catch (err) {\n await handleApiError(err);\n } finally {\n window._sw((api) => api.resume());\n }\n }, 500),\n []\n );\n\n return (\n <div\n dangerouslySetInnerHTML={{ __html: htmlSnippet }}\n className={className}\n ref={wrapperRef}\n ></div>\n );\n};\n\nexport default IngridDeliveryCheckout;\n","import React, { useEffect } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { useTypedSelector } from '../../Hooks/useTypedSelector';\nimport CheckoutSection from './utils/Checkout.Section';\nimport clsx from 'clsx';\nimport IngridDeliveryCheckout from '../Ingrid/IngridDeliveryCheckout';\nimport { load as loadCart } from '../../Actions/Cart.action';\nimport { translate } from '../../Services/translation';\n\ninterface DeliveryType {\n setHasSelectedDelivery: any;\n hasSelectedMode: boolean;\n hasSelectedDelivery: boolean;\n}\n\nconst DeliveryMethods = ({\n setHasSelectedDelivery,\n hasSelectedMode,\n hasSelectedDelivery,\n}: DeliveryType) => {\n const dispatch = useDispatch();\n const checkout = useTypedSelector((state) => state.checkout);\n const cart = useTypedSelector((state) => state.cart);\n const { orderRows, ingridShippingMethod } = cart;\n const { deliveryMethods, selectedDeliveryMethod, selectedCheckoutMode } =\n checkout.payload;\n\n useEffect(() => {\n if (\n ingridShippingMethod &&\n ingridShippingMethod.length > 0 &&\n !hasSelectedDelivery\n ) {\n setHasSelectedDelivery(true);\n }\n }, [ingridShippingMethod, hasSelectedDelivery]);\n\n return (\n <CheckoutSection\n title={translate('checkout.delivery.title')}\n className={clsx(\n 'overflow-hidden',\n 'px-4',\n 'opacity-0',\n hasSelectedMode && 'h-0 animate-mode-select-fade-in-ingrid',\n !hasSelectedMode &&\n 'h-full animate-mode-select-fade-out-ingrid !border-gray-100'\n )}\n >\n <IngridDeliveryCheckout\n ingridDeliveryMethodId=\"IngridDeliveryCheckout:V2\"\n updateDependencies={[orderRows, selectedCheckoutMode]}\n selectedDeliveryMethodId={selectedDeliveryMethod?.id}\n onShippingOptionChanged={() => dispatch(loadCart(true))}\n />\n </CheckoutSection>\n );\n};\n\nexport default DeliveryMethods;\n","import { translate } from '../../../Services/translation';\nimport { string, object, boolean, mixed } from 'yup';\n\nconst requiredTranslation = translate('validation.required');\n\nexport const alwaysRequiredSchema = object().shape({\n acceptTermsOfCondition: boolean()\n .required(translate('validation.checkrequired'))\n .oneOf([true]),\n selectedDeliveryMethod: object().required(requiredTranslation),\n selectedPaymentMethod: object().required(requiredTranslation),\n});\n\nexport const privateCustomerAddressSchema = object().shape({\n lastName: string().nullable().required(requiredTranslation),\n firstName: string().nullable().required(requiredTranslation),\n address: string().nullable().required(requiredTranslation),\n zipCode: string().nullable().required(requiredTranslation),\n city: string().nullable().required(requiredTranslation),\n country: mixed()\n .nullable()\n .required(requiredTranslation)\n .notOneOf([''], requiredTranslation),\n phoneNumber: string().nullable().required(requiredTranslation),\n email: string()\n .nullable()\n .required(requiredTranslation)\n .email(translate(`validation.email`)),\n});\n\nexport const privateCustomerAlternativeAddressSchema = object().shape({\n city: string().nullable().required(requiredTranslation),\n zipCode: string().nullable().required(requiredTranslation),\n address: string().nullable().required(requiredTranslation),\n lastName: string().nullable().required(requiredTranslation),\n firstName: string().nullable().required(requiredTranslation),\n});\n\nexport const businessCustomerDetailsSchema = object().shape({\n companyName: string().nullable().required(requiredTranslation),\n});\n","import React, { useMemo, useState } from 'react';\nimport Icon from './Icon';\nimport clsx from 'clsx';\n\nexport interface DropdownOption {\n value: string;\n label?: string;\n disabled?: boolean;\n}\n\ninterface DropdownAttributes {\n options: DropdownOption[];\n onChange: (option: DropdownOption) => void;\n selectedValue?: any;\n className?: string;\n size?: 'small' | 'large';\n placeholder?: string;\n disabled?: boolean;\n label?: string;\n}\n\nconst Dropdown = ({\n options,\n selectedValue,\n onChange,\n className = '',\n size = 'large',\n placeholder,\n disabled = false,\n label = '',\n}: DropdownAttributes) => {\n const [dropdownOpen, setDropdownOpen] = useState<boolean>(false);\n\n const selectedOption = useMemo(\n () =>\n options?.find(\n (o) => o?.value?.toLowerCase() == selectedValue?.toLowerCase()\n ),\n [selectedValue, options]\n );\n\n const onOptionSelected = (value: string | undefined) => {\n const selectedOption = options?.find((o) => o.value == value);\n if (selectedOption) {\n onChange(selectedOption);\n }\n setDropdownOpen(false);\n };\n\n const selectClasses = useMemo(\n () =>\n clsx(\n 'dropdown-selecter rounded-sm flex w-full cursor-pointer appearance-none items-center text-lg focus:outline-none',\n size == 'large' ? 'p-4' : 'p-3',\n !disabled && 'bg-white',\n disabled && 'bg-gray-200'\n ),\n [size, disabled]\n );\n\n const iconClasses = useMemo(\n () =>\n clsx(\n 'h-5 w-5 transition-[transform] duration-300',\n dropdownOpen ? 'rotate-180' : 'rotate-0'\n ),\n [dropdownOpen]\n );\n\n return (\n <>\n {label && <label className=\"mb-2 text-md font-bold\">{label}</label>}\n <div\n className={clsx(\n 'relative rounded-sm border border-gray-400 lg:hidden',\n className\n )}\n >\n <select\n className={selectClasses}\n value={selectedValue ?? placeholder}\n onChange={(e) => onOptionSelected(e.target.value)}\n onClick={() => setDropdownOpen(!dropdownOpen)}\n onBlur={() => setDropdownOpen(false)}\n disabled={disabled}\n >\n {placeholder && (\n <option disabled value={placeholder} className=\"text-md\">\n {placeholder}\n </option>\n )}\n {options.map((option, index) => (\n <option\n className=\"text-md\"\n disabled={option.disabled}\n value={option.value}\n key={option.value + index + 'mobile'}\n >\n {option.label ?? option.value}\n </option>\n ))}\n </select>\n <Icon\n className={clsx(\n iconClasses,\n 'absolute right-3 top-1/2 -translate-y-1/2'\n )}\n name=\"caret-down\"\n />\n </div>\n <div\n className={clsx(\n className,\n 'relative hidden rounded-sm border border-gray-400 text-gray-900 lg:block',\n disabled && 'pointer-events-none bg-gray-200'\n )}\n onBlur={() => setDropdownOpen(false)}\n tabIndex={1}\n >\n <div\n onClick={() => setDropdownOpen(!dropdownOpen)}\n className={selectClasses}\n >\n <div className={clsx('flex-1', 'text-gray-900')}>\n {selectedOption?.label ?? selectedOption?.value ?? placeholder}\n </div>\n <Icon className={iconClasses} name=\"caret-down\" />\n </div>\n {dropdownOpen && (\n <ul className=\"absolute top-full z-10 mt-1 w-full rounded border border-solid border-gray-300 bg-white\">\n {options.map((option, index) => (\n <li\n className={clsx(\n 'cursor-pointer border-b border-solid border-gray-300 px-3 py-2.5 text-md [&:last-child]:border-b-0',\n option.value == selectedValue && 'font-bold',\n (option.value == selectedValue || option.disabled) &&\n 'pointer-events-none'\n )}\n onClick={() => {\n onOptionSelected(option.value);\n setDropdownOpen(false);\n }}\n key={option.value + index + 'desktop'}\n >\n {option.label ?? option.value}\n </li>\n ))}\n </ul>\n )}\n </div>\n </>\n );\n};\n\nexport default Dropdown;\n","import React from 'react';\n\ninterface CheckoutSectionFooterProps {\n children?: any;\n className?: string;\n}\n\nconst CheckoutSectionFooter = ({\n children,\n className,\n}: CheckoutSectionFooterProps) => (\n <div className={className}>{children}</div>\n);\n\nexport default CheckoutSectionFooter;\n","import React, { useState, useMemo } from 'react';\nimport Icon from '../Icon';\nimport { InputProps } from './types/Input.types';\nimport clsx from 'clsx';\n\nconst Checkbox: React.FC<\n InputProps & React.InputHTMLAttributes<HTMLInputElement>\n> = ({\n inputSize = 'medium',\n inputState = 'default',\n wrapperClassName,\n label,\n message,\n helperText,\n showMessageIcon = true,\n ...props\n}) => {\n const [checked, setChecked] = useState<boolean>(\n props.checked ?? props.value == 'on'\n );\n const onChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n props.onChange && props.onChange(e);\n setChecked(e.target.checked);\n };\n\n const messageIcon = useMemo(() => {\n switch (inputState) {\n case 'default':\n default:\n return null;\n\n case 'success':\n return <Icon name=\"check-circle\" />;\n\n case 'error':\n case 'warning':\n return <Icon name=\"warning\" />;\n }\n }, [inputState]);\n\n const sizeClass = useMemo(() => {\n switch (inputSize) {\n case 'small':\n case 'xsmall':\n return 'checkbox-wrapper--sm';\n case 'large':\n case 'xlarge':\n return 'checkbox-wrapper--lg';\n case 'medium':\n default:\n return 'checkbox-wrapper--md';\n }\n }, [inputSize]);\n\n const stateClass = useMemo(() => {\n switch (inputState) {\n case 'error':\n return 'checkbox-wrapper--error';\n case 'warning':\n return 'checkbox-wrapper--warning';\n case 'success':\n return 'checkbox-wrapper--success';\n default:\n return undefined;\n }\n }, [inputState]);\n\n return (\n <div\n className={clsx(\n wrapperClassName,\n 'checkbox-wrapper',\n sizeClass,\n stateClass\n )}\n >\n <label htmlFor={props.id} className=\"items-start\">\n <div className=\"wrapper relative\">\n <input\n type=\"checkbox\"\n className=\"checkbox\"\n {...props}\n onChange={onChange}\n />\n <Icon\n name=\"check\"\n color=\"white\"\n className={clsx(\n 'pointer-events-none absolute left-0 top-0 h-full w-full text-white transition-[opacity] duration-[125ms] ease-linear',\n checked ? 'opacity-100' : 'opacity-0'\n )}\n />\n </div>\n {label && <span>{label}</span>}\n </label>\n {helperText && <span className=\"helper-text\">{helperText}</span>}\n {message && (\n <div className=\"message\">\n {showMessageIcon && messageIcon}\n <span>{message}</span>\n </div>\n )}\n </div>\n );\n};\n\nexport default Checkbox;\n","import React, { useCallback, useMemo } from 'react';\nimport { useDispatch } from 'react-redux';\nimport CheckoutSection from './utils/Checkout.Section';\nimport CheckoutSectionContent from './utils/Checkout.SectionContent';\nimport CheckoutSectionFooter from './utils/Checkout.SectionFooter';\nimport {\n acceptTermsOfCondition as setAcceptTermsOfCondition,\n setStatusSubmitButton,\n setValidationErrors,\n submit,\n submitDone,\n setCheckoutIsSubmitting,\n saveCustomerDetail,\n} from '../../Actions/Checkout.action';\nimport {\n alwaysRequiredSchema,\n businessCustomerDetailsSchema,\n privateCustomerAddressSchema,\n privateCustomerAlternativeAddressSchema,\n} from './utils/Checkout.ValidationSchema';\nimport { translate } from '../../Services/translation';\nimport { useTypedSelector } from '../../Hooks/useTypedSelector';\nimport Checkbox from '../Inputs/Checkbox';\nimport clsx from 'clsx';\n\nconst ConfirmOrder = () => {\n const dispatch = useDispatch();\n const checkout = useTypedSelector((state) => state.checkout);\n const {\n payload,\n validationErrors = {},\n checkoutIsSubmitting,\n } = checkout;\n const {\n customerDetails,\n alternativeAddress,\n selectedDeliveryAddressId,\n selectedBillingAddressId,\n selectedDeliveryMethod,\n selectedPaymentMethod,\n showAlternativeAddress,\n isBusinessCustomer,\n acceptTermsOfCondition,\n selectedCheckoutMode,\n } = payload;\n\n const onSubmit = useCallback(() => dispatch(submit()), [dispatch]);\n\n const placeOrder = useCallback(async () => {\n dispatch(setCheckoutIsSubmitting(true));\n const notCustomerDetailFields = [\n 'selectedDeliveryAddressId',\n 'selectedBillingAddressId',\n 'selectedPaymentMethod',\n 'selectedDeliveryMethod',\n 'acceptTermsOfCondition',\n ];\n\n const onValidationFailed = (stateKey: string, errors: any[]) => {\n const key = (err: any) =>\n stateKey && !notCustomerDetailFields.includes(err.path)\n ? `${stateKey}-${err.path}`\n : err.path;\n\n const newValidationErrors = errors.reduce(\n (prev, err) => ({\n ...prev,\n [key(err)]: err.errors,\n }),\n {}\n );\n dispatch(\n setValidationErrors({\n ...validationErrors,\n ...newValidationErrors,\n })\n );\n dispatch(setStatusSubmitButton(true));\n dispatch(submitDone(null));\n };\n\n dispatch(setStatusSubmitButton(false));\n\n // Validate, then submit. Not proud of this validation, but better than Litium default\n try {\n try {\n await privateCustomerAddressSchema.validate(\n {\n ...customerDetails,\n },\n { abortEarly: false }\n );\n if (selectedCheckoutMode === 'b2b') {\n await businessCustomerDetailsSchema.validate(\n {\n ...customerDetails,\n },\n { abortEarly: false }\n );\n }\n } catch (ex) {\n // re-throw the error with the scheme's state key\n throw {\n stateKey: 'customerDetails',\n error: ex.inner,\n };\n }\n\n // Always required\n try {\n await alwaysRequiredSchema.validate(\n {\n acceptTermsOfCondition,\n selectedPaymentMethod,\n selectedDeliveryMethod,\n },\n { abortEarly: false }\n );\n } catch (ex) {\n // re-throw the error with the scheme's state key\n throw { stateKey: null, error: ex.inner };\n }\n\n // Will not be reached if any validation failed\n dispatch(saveCustomerDetail()).then(() => onSubmit());\n } catch (err) {\n dispatch(setCheckoutIsSubmitting(false));\n onValidationFailed(err.stateKey, err.error);\n }\n }, [\n dispatch,\n validationErrors,\n isBusinessCustomer,\n customerDetails,\n selectedDeliveryAddressId,\n selectedBillingAddressId,\n showAlternativeAddress,\n alternativeAddress,\n acceptTermsOfCondition,\n selectedPaymentMethod,\n selectedDeliveryMethod,\n onSubmit,\n ]);\n\n const acceptTermsError = useMemo(\n () =>\n validationErrors['acceptTermsOfCondition']\n ? translate('checkout.terms.validation-error')\n : null,\n [validationErrors]\n );\n\n return (\n <>\n <CheckoutSectionContent>\n <Checkbox\n inputSize=\"large\"\n wrapperClassName=\"mt-6\"\n id=\"terms-acceptterms\"\n checked={acceptTermsOfCondition}\n onChange={(e) =>\n dispatch(setAcceptTermsOfCondition(e.target.checked))\n }\n inputState={acceptTermsError ? 'error' : 'default'}\n label={\n <>\n {translate(`checkout.terms.acceptterms`)}{' '}\n <a href={payload.termsUrl} className=\"link underline\">\n {translate(`checkout.terms.link`)}\n </a>\n </>\n }\n message={acceptTermsError}\n />\n </CheckoutSectionContent>\n <CheckoutSectionFooter className={clsx('flex', 'mt-6')}>\n <button\n className={clsx(\n 'btn',\n 'btn--xlarge',\n 'btn--addtocart',\n 'flex-1',\n 'flex',\n 'items-center',\n 'justify-center',\n 'rounded-sm'\n )}\n disabled={checkoutIsSubmitting}\n onClick={() => placeOrder()}\n type=\"submit\"\n >\n {!checkoutIsSubmitting && translate('checkout.placeorder')}\n {\n checkoutIsSubmitting && (\n <>{translate('general.loading')}...</>\n ) /* TODO Loading spinner or similar */\n }\n </button>\n </CheckoutSectionFooter>\n </>\n );\n};\n\nexport default ConfirmOrder;\n","import React, { useCallback, useMemo } from 'react';\nimport { useDispatch } from 'react-redux';\nimport CheckoutSectionContent from './utils/Checkout.SectionContent';\nimport { translate } from '../../Services/translation';\nimport {\n setCustomerDetails,\n setValidationErrors,\n} from '../../Actions/Checkout.action';\nimport {\n privateCustomerAddressSchema,\n businessCustomerDetailsSchema,\n} from './utils/Checkout.ValidationSchema';\nimport { useTypedSelector } from '../../Hooks/useTypedSelector';\nimport Dropdown from '../Dropdown';\nimport Input from '../Inputs/Input';\nimport { InputProps } from '../Inputs/types/Input.types';\nimport clsx from 'clsx';\nimport CheckoutSection from './utils/Checkout.Section';\nimport ConfirmOrder from './Checkout.ConfirmOrder';\nimport CheckoutSectionHeader from './utils/Checkout.SectionHeader';\nimport Icon from '../Icon';\n\ninterface CustomerInfoInputProps {\n validationSchema: any;\n stateKey: string;\n id: string;\n onCustomerDetailsChange?: (\n stateKey: string,\n id: string,\n value: string\n ) => void;\n}\n\nconst CustomerInfoInput: React.FC<\n CustomerInfoInputProps &\n InputProps &\n React.InputHTMLAttributes<HTMLInputElement>\n> = ({\n validationSchema,\n stateKey,\n onCustomerDetailsChange,\n id,\n wrapperClassName,\n ...props\n}) => {\n const dispatch = useDispatch();\n const { validationErrors = {}, payload } = useTypedSelector(\n (state) => state.checkout\n );\n\n const errorMessage = useMemo(\n () =>\n validationErrors[`${stateKey}-${id}`]\n ? validationErrors[`${stateKey}-${id}`][0]\n : null,\n [id, stateKey, validationErrors]\n );\n\n const validateOnBlur = useCallback(\n async (schema, stateKey, id, value) => {\n const errorKey = `${stateKey}-${id}`;\n try {\n await schema.validateAt(id, { [id]: value });\n const validationErrorsCopy = { ...validationErrors };\n delete validationErrorsCopy[errorKey];\n dispatch(setValidationErrors(validationErrorsCopy));\n } catch (err) {\n dispatch(\n setValidationErrors({\n ...validationErrors,\n [errorKey]: err.errors,\n })\n );\n }\n },\n [dispatch, validationErrors]\n );\n\n return (\n <Input\n {...props}\n wrapperClassName={wrapperClassName}\n id={id}\n type=\"text\"\n label={translate(`checkout.customerinfo.${id.toLowerCase()}`)}\n inputState={errorMessage ? 'error' : 'default'}\n message={errorMessage}\n onChange={(event) =>\n onCustomerDetailsChange &&\n onCustomerDetailsChange(stateKey, id, event.target.value)\n }\n onBlur={(e) =>\n validateOnBlur(validationSchema, stateKey, id, e.target.value)\n }\n inputSize=\"large\"\n value={(payload[stateKey] && payload[stateKey][id]) ?? ''}\n />\n );\n};\n\nconst PrivateCustomerInfo = () => {\n const dispatch = useDispatch();\n const { payload } = useTypedSelector((state) => state.checkout);\n const { customerDetails = {}, selectedCheckoutMode } = payload;\n const classes: any = {};\n\n const onCustomerDetailsChange = useCallback(\n (stateKey, id, value) => {\n switch (stateKey) {\n case 'customerDetails':\n dispatch(setCustomerDetails(id, value));\n break;\n }\n },\n [dispatch]\n );\n\n return (\n <CheckoutSection\n title={translate('checkout.customerinfo.title')}\n className=\"p-4\"\n >\n <div className=\"mb-6\">\n <p className=\"mb-2 font-bold\">Du hittar oss pÃ¥ följande adress:</p>\n <div className=\"flex rounded-sm border border-gray-900 bg-gray-100 p-4\">\n <Icon className=\"mr-2 h-6 w-6\" color=\"#171717\" name=\"find-us\" />\n <div>\n <p className=\"mb-1 font-bold text-warning-900\">\n {translate('checkout.customerinfo.find.us.title')}\n </p>\n <p className=\"mb-1 text-success-850\">\n {translate('checkout.customerinfo.find.us.adress')}\n </p>\n <p className=\"text-success-850\">\n {translate('checkout.customerinfo.find.us.open')}\n </p>\n </div>\n </div>\n </div>\n <CheckoutSectionHeader>\n <h5>{translate('checkout.customerinfo.info')}</h5>\n </CheckoutSectionHeader>\n <CheckoutSectionContent>\n <form className={clsx('grid', 'gap-4', 'grid-cols-2')}>\n {selectedCheckoutMode === 'b2b' && (\n <CustomerInfoInput\n wrapperClassName=\"col-span-2\"\n stateKey=\"customerDetails\"\n id=\"companyName\"\n autoComplete=\"organization\"\n name=\"companyName\"\n validationSchema={businessCustomerDetailsSchema}\n onCustomerDetailsChange={onCustomerDetailsChange}\n required={true}\n />\n )}\n <CustomerInfoInput\n wrapperClassName=\"col-span-2 lg:col-span-1\"\n stateKey=\"customerDetails\"\n id=\"firstName\"\n autoComplete=\"given-name\"\n name=\"fname\"\n validationSchema={privateCustomerAddressSchema}\n onCustomerDetailsChange={onCustomerDetailsChange}\n required={true}\n />\n <CustomerInfoInput\n wrapperClassName=\"col-span-2 lg:col-span-1\"\n stateKey=\"customerDetails\"\n id=\"lastName\"\n autoComplete=\"family-name\"\n name=\"lname\"\n validationSchema={privateCustomerAddressSchema}\n onCustomerDetailsChange={onCustomerDetailsChange}\n required={true}\n />\n <CustomerInfoInput\n wrapperClassName=\"col-span-2\"\n stateKey=\"customerDetails\"\n id=\"address\"\n autoComplete=\"address-line1\"\n validationSchema={privateCustomerAddressSchema}\n onCustomerDetailsChange={onCustomerDetailsChange}\n required={true}\n />\n <CustomerInfoInput\n wrapperClassName=\"col-span-2\"\n stateKey=\"customerDetails\"\n id=\"careOf\"\n validationSchema={privateCustomerAddressSchema}\n onCustomerDetailsChange={onCustomerDetailsChange}\n />\n <CustomerInfoInput\n wrapperClassName=\"col-span-2 lg:col-span-1\"\n stateKey=\"customerDetails\"\n id=\"zipCode\"\n validationSchema={privateCustomerAddressSchema}\n onCustomerDetailsChange={onCustomerDetailsChange}\n required={true}\n />\n <CustomerInfoInput\n wrapperClassName=\"col-span-2 lg:col-span-1\"\n stateKey=\"customerDetails\"\n id=\"city\"\n validationSchema={privateCustomerAddressSchema}\n onCustomerDetailsChange={onCustomerDetailsChange}\n required={true}\n />\n <div className=\"col-span-2\">\n <label className=\"form__label text-md\" htmlFor=\"country\">\n <b>{translate('checkout.customerinfo.country')}*</b>\n </label>\n <Dropdown\n className=\"mt-2 rounded-sm border border-gray-400 text-lg\"\n selectedValue={customerDetails.country}\n options={global['LitiumConstants'].countries.map(\n ({ text, value }) => ({ label: text, value })\n )}\n onChange={(value) => {\n onCustomerDetailsChange(\n 'customerDetails',\n 'country',\n value\n );\n }}\n />\n </div>\n <CustomerInfoInput\n wrapperClassName=\"col-span-2 lg:col-span-1\"\n stateKey=\"customerDetails\"\n id=\"phoneNumber\"\n validationSchema={privateCustomerAddressSchema}\n onCustomerDetailsChange={onCustomerDetailsChange}\n required={true}\n />\n <CustomerInfoInput\n wrapperClassName=\"col-span-2 lg:col-span-1\"\n stateKey=\"customerDetails\"\n id=\"email\"\n validationSchema={privateCustomerAddressSchema}\n onCustomerDetailsChange={onCustomerDetailsChange}\n required={true}\n />\n </form>\n </CheckoutSectionContent>\n <ConfirmOrder />\n </CheckoutSection>\n );\n};\n\nexport default PrivateCustomerInfo;\n","import React from 'react';\nimport { translate } from '../../Services/translation';\nimport { useTypedSelector } from '../../Hooks/useTypedSelector';\nimport clsx from 'clsx';\n\nconst EmptyCart = () => {\n const checkout = useTypedSelector((state) => state.checkout);\n const { emptyCartMessage, emptyCartLink } = checkout.payload;\n\n return (\n <div\n className={clsx(\n 'bg-gray-100',\n 'container',\n 'justify-center',\n 'items-center',\n 'flex',\n 'flex-col',\n 'max-w-[768px]',\n 'h-[80vh]'\n )}\n >\n <h1 className={clsx('mb-2', 'text-center')}>\n {translate('checkout.empty.title')}\n </h1>\n {emptyCartMessage && (\n <div\n className={clsx('text-lg', 'text-center', 'mb-6')}\n dangerouslySetInnerHTML={{\n __html: emptyCartMessage,\n }}\n />\n )}\n {emptyCartLink && (\n <a href={emptyCartLink}>\n <button className={clsx('btn', 'btn--large', 'btn--outline')}>\n {translate('checkout.startshopping')}\n </button>\n </a>\n )}\n </div>\n );\n};\n\nexport default EmptyCart;\n","import React, { lazy, Suspense } from 'react';\n\nconst DynamicComponent = ({ loader, loading = <div></div> }) => {\n const Component = lazy(loader);\n return (props) => (\n <Suspense fallback={loading}>\n <Component {...props} />\n </Suspense>\n );\n};\n\nexport default DynamicComponent;\n","import React from 'react';\nimport DynamicComponent from '../DynamicComponent';\nimport CheckoutSection from '../Checkout/utils/Checkout.Section';\nimport CheckoutSectionContent from '../Checkout/utils/Checkout.SectionContent';\nimport { translate } from '../../Services/translation';\n\nconst scriptPattern = /<script\\b[^>]*>([\\s\\S]*?)<\\/script>/gi;\nconst scriptFilePattern = /<script.*?src=[\"'](.*?)[\"']/gi;\n\nconst extractScripts = (domString) => {\n let matches,\n html = domString;\n const scripts = [],\n scriptFiles = [];\n while ((matches = scriptPattern.exec(domString)) !== null) {\n html = html.replace(matches[0], '');\n matches[1] && matches[1].trim() !== '' && scripts.push(matches[1]);\n }\n while ((matches = scriptFilePattern.exec(domString)) !== null) {\n matches[1] && matches[1].trim() !== '' && scriptFiles.push(matches[1]);\n }\n\n return {\n html,\n scripts,\n scriptFiles,\n };\n};\n\nconst executeScript = (domId, scriptContent) => {\n const script = document.createElement('script');\n script.type = 'text/javascript';\n try {\n script.appendChild(document.createTextNode(scriptContent));\n } catch (e) {\n // to support IE\n script.text = scriptContent;\n }\n document.getElementById(domId).appendChild(script);\n};\n\nconst includeScript = (domId, srciptUrl) => {\n const script = document.createElement('script');\n script.type = 'text/javascript';\n script.src = srciptUrl;\n document.getElementById(domId).appendChild(script);\n};\n\nconst PaymentWidget = React.memo(function PaymentWidget({\n responseString,\n}) {\n const renderWidget = (paymentSession) => {\n const CheckoutWidget = DynamicComponent({\n loader: () => import('./CheckoutWidget'),\n });\n const args = {\n paymentSession,\n extractScripts,\n executeScript,\n includeScript,\n };\n return <CheckoutWidget {...args} />;\n };\n\n return (\n <CheckoutSection\n title={translate('checkout.payment')}\n className=\"pt-4\"\n headerClassName=\"px-4 !mb-0\"\n >\n <CheckoutSectionContent>\n {renderWidget(responseString)}\n </CheckoutSectionContent>\n </CheckoutSection>\n );\n});\n\nexport default PaymentWidget;\n","import React, {\n useCallback,\n useState,\n useMemo,\n} from 'react';\nimport { InputProps } from './types/Input.types';\nimport clsx from 'clsx';\n\nconst RadioButton: React.FC<\n InputProps & React.InputHTMLAttributes<HTMLInputElement>\n> = ({\n inputSize = 'medium',\n inputState = 'default',\n wrapperClassName,\n label,\n ...props\n}) => {\n const [checked, setChecked] = useState<boolean>(\n props.checked ?? props.value == 'on'\n );\n const onChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n props.onChange && props.onChange(e);\n setChecked(e.target.checked);\n },\n [props]\n );\n\n const sizeClass = useMemo(() => {\n switch (inputSize) {\n case 'small':\n case 'xsmall':\n return 'checkbox-wrapper--sm';\n case 'large':\n return 'checkbox-wrapper--lg';\n case 'xlarge':\n return 'checkbox-wrapper--xl';\n case 'medium':\n default:\n return 'checkbox-wrapper--md';\n }\n }, [inputSize]);\n\n return (\n <div\n className={clsx(\n wrapperClassName,\n 'checkbox-wrapper',\n sizeClass\n )}\n >\n <label htmlFor={props.id}>\n <input\n type=\"radio\"\n className=\"radio\"\n checked={checked}\n {...props}\n onChange={onChange}\n />\n {label && <span>{label}</span>}\n </label>\n </div>\n );\n};\n\nexport default RadioButton;\n","import React from 'react';\nimport RadioButton from '../../Inputs/Radiobutton';\nimport clsx from 'clsx';\n\ninterface CheckoutRadioProps {\n className?: string;\n title?: string;\n titleRight?: JSX.Element | string;\n description?: string;\n cost?: string;\n logo?: JSX.Element | string;\n stateKey?: string;\n id?: string;\n onChange?: React.ChangeEventHandler<HTMLInputElement>;\n checked?: boolean;\n}\n\nconst CheckoutRadio = ({\n className,\n title,\n titleRight,\n description,\n cost,\n logo,\n stateKey,\n id,\n onChange,\n checked = false,\n}: CheckoutRadioProps) => {\n return (\n <label\n htmlFor={`${stateKey}-${id}`}\n className={clsx(\n className,\n 'flex',\n 'w-6/12',\n 'cursor-pointer',\n 'py-3',\n 'px-4',\n 'border',\n 'border-solid',\n 'border-gray-250',\n 'rounded-md',\n 'items-center',\n '[&:last-child]:ml-1',\n checked && 'border-2 border-gray-900'\n )}\n >\n <RadioButton\n checked={checked}\n name={stateKey}\n type=\"radio\"\n id={`${stateKey}-${id}`}\n onChange={onChange}\n />\n <div className={clsx('flex', 'flex-1', 'flex-col', 'ml-4', 'gap-2')}>\n <span className=\"font-semibold\">{title}</span>\n {description && (\n <span className=\"leading-[150%]\">{description}</span>\n )}\n </div>\n <div className={clsx('flex', 'items-center', 'justify-center')}>\n <span>{cost}</span>\n {logo && (\n <span className={clsx('flex', 'items-center', 'ml-4')}>\n {logo}\n </span>\n )}\n </div>\n {titleRight && titleRight != '' && (\n <div className={clsx('flex')}>{titleRight}</div>\n )}\n </label>\n );\n};\n\nexport default CheckoutRadio;\n","import React from 'react';\nimport { useDispatch } from 'react-redux';\nimport CheckoutSection from './utils/Checkout.Section';\nimport CheckoutSectionContent from './utils/Checkout.SectionContent';\nimport { setCheckoutMode } from '../../Actions/Checkout.action';\nimport Radio from './utils/Checkout.Radio';\nimport { translate } from '../../Services/translation';\nimport { useTypedSelector } from '../../Hooks/useTypedSelector';\nimport clsx from 'clsx';\nimport Icon from '../Icon';\n\ninterface CheckoutMode {\n setHasSelectedMode: any;\n hasSelectedMode: boolean;\n}\n\nconst SelectCheckoutMode = ({\n setHasSelectedMode,\n hasSelectedMode,\n}: CheckoutMode) => {\n const dispatch = useDispatch();\n const checkout = useTypedSelector((state) => state.checkout);\n const { selectedCheckoutMode, authenticated, loginUrl } =\n checkout.payload;\n\n return (\n <CheckoutSection\n title={translate('checkout.mode.title')}\n titleRight={\n !authenticated ? (\n <a href={loginUrl} className=\"text-md leading-tight underline\">\n {translate('checkout.mode.log.in')}\n </a>\n ) : (\n ''\n )\n }\n className=\"pl-4 pr-4 pt-4\"\n >\n <CheckoutSectionContent className=\"flex flex-col\">\n <div className=\"mb-4 flex\">\n <Radio\n key={'b2c'}\n title={translate('checkout.mode.private')}\n stateKey={'checkout-mode'}\n id={'b2c'}\n onChange={() => dispatch(setCheckoutMode('b2c'))}\n checked={selectedCheckoutMode === 'b2c'}\n className={clsx(\n 'animate-mode-selected-full-width',\n selectedCheckoutMode === 'b2c' &&\n hasSelectedMode &&\n 'w-6/12 animate-mode-selected-full-width',\n selectedCheckoutMode !== 'b2c' &&\n hasSelectedMode &&\n '!m-0 animate-mode-selected-zero-width !overflow-hidden !border-0 !p-0'\n )}\n titleRight={\n selectedCheckoutMode === 'b2c' && hasSelectedMode ? (\n <p\n onClick={() => setHasSelectedMode(false)}\n className={clsx(\n 'text-md',\n 'font-bold',\n 'text-accent-500',\n 'underline'\n )}\n >\n {translate('checkout.mode.change')}\n </p>\n ) : (\n ''\n )\n }\n />\n <Radio\n key={'b2b'}\n title={translate('checkout.mode.company')}\n stateKey={'checkout-mode'}\n id={'b2b'}\n onChange={() => dispatch(setCheckoutMode('b2b'))}\n checked={selectedCheckoutMode === 'b2b'}\n className={clsx(\n 'animate-mode-selected-full-width',\n selectedCheckoutMode === 'b2b' &&\n hasSelectedMode &&\n '!ml-0 w-6/12 animate-mode-selected-full-width',\n selectedCheckoutMode !== 'b2b' &&\n hasSelectedMode &&\n '!m-0 animate-mode-selected-zero-width !overflow-hidden !border-0 !p-0'\n )}\n titleRight={\n selectedCheckoutMode === 'b2b' && hasSelectedMode ? (\n <p\n onClick={() => setHasSelectedMode(false)}\n className={clsx(\n 'text-md',\n 'font-bold',\n 'text-accent-500',\n 'underline'\n )}\n >\n {translate('checkout.mode.change')}\n </p>\n ) : (\n ''\n )\n }\n />\n </div>\n <button\n className={clsx(\n 'btn',\n 'btn--addtocart',\n 'border-0',\n 'w-full',\n 'rounded-sm',\n !hasSelectedMode && 'mb-0 h-0 animate-mode-select-fade-in',\n hasSelectedMode && 'mb-4 h-14 animate-mode-select-fade-out'\n )}\n onClick={() => setHasSelectedMode(true)}\n type=\"submit\"\n >\n {translate('checkout.mode.select')}\n <Icon className={clsx('w-6', 'h-6', 'ml-4')} name=\"caret-down\" />\n </button>\n </CheckoutSectionContent>\n </CheckoutSection>\n );\n};\n\nexport default SelectCheckoutMode;\n","import React, { useEffect } from 'react';\nimport { useDispatch } from 'react-redux';\nimport CheckoutSection from './utils/Checkout.Section';\nimport CheckoutSectionContent from './utils/Checkout.SectionContent';\nimport { setNewsletter } from '../../Actions/Checkout.action';\nimport { translate } from '../../Services/translation';\nimport { useTypedSelector } from '../../Hooks/useTypedSelector';\nimport Checkbox from '../Inputs/Checkbox';\n\nconst Newsletter = () => {\n const dispatch = useDispatch();\n const checkout = useTypedSelector((state) => state.checkout);\n const { acceptNewsletter, newsletterText } = checkout.payload;\n\n return (\n <CheckoutSection\n title={translate('checkout.newsletter.title')}\n className=\"p-4\"\n >\n <CheckoutSectionContent className=\"flex h-12 lg:h-7\">\n <Checkbox\n inputSize=\"large\"\n id=\"newsletter\"\n checked={acceptNewsletter}\n onChange={(e) => dispatch(setNewsletter(e.target.checked))}\n label={\n <div\n dangerouslySetInnerHTML={{\n __html: newsletterText?.value ?? '',\n }}\n ></div>\n }\n />\n </CheckoutSectionContent>\n </CheckoutSection>\n );\n};\n\nexport default Newsletter;\n","import React, { useCallback, useState, useEffect } from 'react';\nimport Icon from '../Icon';\nimport AdditionalOrderInfo from './Checkout.AdditionalOrderInfo';\nimport Cart from './Checkout.Cart';\nimport DeliveryMethods from './Checkout.DeliveryMethods';\nimport PrivateCustomerInfo from './Checkout.PrivateCustomerInfo';\nimport EmptyCart from './Checkout.EmptyCart';\nimport { useTypedSelector } from '../../Hooks/useTypedSelector';\nimport { setDelivery } from '../../Actions/Checkout.action';\nimport PaymentWidget from '../Payments/PaymentWidget';\nimport { PaymentIntegrationType } from '../../constants';\nimport {\n setAdditionalInfo,\n saveAdditionalInfo,\n} from '../../Actions/Checkout.action';\nimport clsx from 'clsx';\nimport SelectCheckoutMode from './Checkout.SelectCheckoutMode';\nimport Newsletter from './Checkout.Newsletter';\nimport { useDispatch } from 'react-redux';\nimport { load as loadCart } from '../../Actions/Cart.action';\n\nconst Checkout = () => {\n const dispatch = useDispatch();\n const { payload } = useTypedSelector((state) => state.checkout);\n const cart = useTypedSelector<any>((state) => state.cart);\n const [orderRows] = useState(cart?.orderRows);\n const hasOrderRows = orderRows && Object.keys(orderRows).length > 0;\n const numProducts = hasOrderRows\n ? Object.values(cart.orderRows).length\n : 0;\n const {\n message,\n paymentWidget,\n deliveryMethods,\n selectedDeliveryMethod,\n selectedPaymentMethod,\n paymentMethods,\n } = payload;\n\n const [paymentWidgetVisibility, setPaymentWidgetVisibility] =\n useState(true);\n const [hasSelectedMode, setHasSelectedMode] = useState(false);\n const [hasSelectedDelivery, setHasSelectedDelivery] = useState(false);\n\n function setHasSelectedDeliveryHandler(hasSelected) {\n setHasSelectedDelivery(hasSelected);\n }\n\n function setHasSelectedModeHandler(hasSelected) {\n setHasSelectedMode(hasSelected);\n dispatch(loadCart(true));\n\n if (!hasSelected) {\n setHasSelectedDelivery(false);\n dispatch(setAdditionalInfo('orderNote', ''));\n dispatch(setAdditionalInfo('referenceNumber', ''));\n dispatch(setAdditionalInfo('invoiceReference', ''));\n dispatch(setAdditionalInfo('costCenter', ''));\n dispatch(setAdditionalInfo('goodsMark', ''));\n dispatch(saveAdditionalInfo());\n }\n }\n\n const checkIntegrationTypeExist = useCallback(\n (integrationTypeCheck) => {\n return deliveryMethods.find(\n (method) => method.integrationType === integrationTypeCheck\n );\n },\n [DeliveryMethods]\n );\n\n const resetVisibilityValues = useCallback(() => {\n setPaymentWidgetVisibility(true);\n }, []);\n\n // Show or hide different sections depending on payment and delivery methods.\n useEffect(() => {\n resetVisibilityValues();\n switch (selectedPaymentMethod?.integrationType) {\n case PaymentIntegrationType.DirectPayment:\n setPaymentWidgetVisibility(false);\n break;\n }\n }, [\n selectedDeliveryMethod,\n selectedPaymentMethod,\n deliveryMethods,\n paymentMethods,\n resetVisibilityValues,\n checkIntegrationTypeExist,\n ]);\n\n useEffect(() => {\n if (!selectedDeliveryMethod) return;\n\n dispatch(setDelivery(selectedDeliveryMethod));\n }, []);\n\n const responseString = paymentWidget\n ? paymentWidget.responseString\n : null;\n const updateKey = paymentWidget ? paymentWidget._force_update : null;\n\n if (numProducts <= 0) {\n return <EmptyCart />;\n }\n\n return (\n <div className={clsx('pb-4', 'xl:pb-8', 'xl:py-2')}>\n <div className={clsx('max-w-[660px]', 'px-0', 'mx-auto')}>\n {message && (\n <div\n className={clsx(\n 'flex',\n 'flex-row',\n 'items-center',\n 'p-3',\n 'bg-white',\n 'border',\n 'border-solid',\n 'border-gray-900',\n 'rounded',\n 'mx-4',\n 'mb-6',\n 'text-md',\n 'lg:m-0',\n 'lg:mb-6'\n )}\n >\n <Icon className={clsx('w-6', 'h-6', 'mr-2')} name=\"info\" />\n <span>{message}</span>\n </div>\n )}\n <div className={clsx('grid', 'gap-0', 'grid-cols-1')}>\n <div className={clsx('col-span-1')}>\n <Cart />\n </div>\n <div className={clsx('col-span-2', 'md:col-span-1')}>\n <SelectCheckoutMode\n setHasSelectedMode={setHasSelectedModeHandler}\n hasSelectedMode={hasSelectedMode}\n />\n </div>\n <div className={clsx('col-span-2', 'md:col-span-1')}>\n <DeliveryMethods\n hasSelectedMode={hasSelectedMode}\n hasSelectedDelivery={hasSelectedDelivery}\n setHasSelectedDelivery={setHasSelectedDeliveryHandler}\n />\n {hasSelectedMode && hasSelectedDelivery && <Newsletter />}\n {hasSelectedMode && hasSelectedDelivery && (\n <AdditionalOrderInfo />\n )}\n {hasSelectedMode &&\n hasSelectedDelivery &&\n selectedPaymentMethod &&\n !selectedPaymentMethod.id\n .toLowerCase()\n .includes('klarna') && <PrivateCustomerInfo />}\n {hasSelectedMode &&\n hasSelectedDelivery &&\n paymentWidget &&\n paymentWidgetVisibility && (\n <PaymentWidget\n key={updateKey}\n responseString={responseString}\n />\n )}\n </div>\n </div>\n </div>\n </div>\n );\n};\nexport default Checkout;\n","import React, { useEffect, useState } from 'react';\nimport { Collapse } from 'react-collapse';\nimport Icon from './Icon';\nimport clsx from 'clsx';\n\ninterface CollapsibleAttributes {\n label?: string | JSX.Element;\n className?: string;\n transitionDuration?: string;\n onStateChange?: Function;\n isOpen?: boolean;\n hideBorder?: boolean;\n children?: any;\n}\n\nconst Collapsible = ({\n children,\n label,\n className = '',\n transitionDuration = '0.2s',\n onStateChange: externalStateChange,\n isOpen: externalIsOpen,\n hideBorder,\n}: CollapsibleAttributes) => {\n const [isOpen, setIsOpen] = useState<boolean>(externalIsOpen ?? false);\n\n const onStateChange = (open: boolean) => {\n externalStateChange && externalStateChange(open);\n setIsOpen(open);\n };\n\n useEffect(() => {\n setIsOpen(externalIsOpen ?? false);\n }, [externalIsOpen]);\n\n return (\n <div\n className={`collapsible ${className ?? ''} ${\n hideBorder ? 'collapsible--no-border' : ''\n }`}\n >\n <label\n className=\"!mb-0 flex items-center justify-between text-lg\"\n onClick={() => onStateChange(!isOpen)}\n >\n {label}\n <Icon\n className={clsx(isOpen ? 'rotate-180' : 'rotate-0', 'h-5 w-5')}\n style={{ transitionDuration: transitionDuration }}\n name=\"caret-down\"\n />\n </label>\n <div className=\"collapsible__content\">\n <Collapse isOpened={isOpen}>{children}</Collapse>\n </div>\n </div>\n );\n};\n\nexport default Collapsible;\n","import React from 'react';\nimport Checkbox from '../../Inputs/Checkbox';\nimport RadioButton from '../../Inputs/Radiobutton';\nimport { FilterElementAttributes } from '../types/FilterElementAttributes';\n\nconst FilterCheckbox = ({\n filter,\n option,\n onChange,\n}: FilterElementAttributes) => {\n return option ? (\n <label\n className=\"flex items-center justify-between py-1\"\n key={option.id}\n >\n <span className=\"text-md\">{option.label}</span>\n <span className=\"flex items-center text-md text-gray-900\">\n {filter.id != 'stockStatus' && (\n <span className=\"mr-1.5 text-sm text-gray-500\">\n ({option.quantity})\n </span>\n )}\n {!filter.singleSelect && (\n <Checkbox\n inputSize=\"small\"\n checked={filter.selectedOptions.indexOf(option.id) != -1}\n onChange={() => onChange && onChange(filter.id, option.id)}\n />\n )}\n {filter.singleSelect && (\n <RadioButton\n inputSize=\"small\"\n checked={filter.selectedOptions.indexOf(option.id) != -1}\n onChange={() => onChange && onChange(filter.id, option.id)}\n />\n )}\n </span>\n </label>\n ) : null;\n};\n\nexport default FilterCheckbox;\n","import React, { useState, useMemo, useEffect } from 'react';\nimport { FilterElementAttributes } from '../types/FilterElementAttributes';\nimport { Range, getTrackBackground } from 'react-range';\nimport {\n IRenderThumbParams,\n IRenderTrackParams,\n} from 'react-range/lib/types';\nimport Icon from '../../Icon';\n\nconst FilterRangeSlider = ({\n filter,\n onChange,\n}: FilterElementAttributes) => {\n const [values, setValues] = useState<number[]>([\n parseInt(\n (filter.options.length == 4\n ? filter.options[2]?.id\n : filter.options[0]?.id) ?? '0'\n ),\n parseInt(\n (filter.options.length == 4\n ? filter.options[3]?.id\n : filter.options[1]?.id) ?? '0'\n ),\n ]);\n const [onChangeTimer, setOnChangeTimer] = useState<NodeJS.Timeout>();\n\n // Store the initial min and max value\n const minValue = useMemo(\n () => parseInt(filter.options[0]?.id ?? '0'),\n [filter]\n );\n const maxValue = useMemo(\n () => parseInt(filter.options[1]?.id ?? '0'),\n [filter]\n );\n\n useEffect(() => {\n if (filter.selectedOptions.length < 1) {\n setValues([minValue, maxValue]);\n }\n }, [filter, minValue, maxValue]);\n\n const onRangeChanged = (values: number[]) => {\n setValues(values);\n\n if (onChange) {\n if (onChangeTimer) {\n clearTimeout(onChangeTimer);\n }\n\n // Debounce onChange\n setOnChangeTimer(\n setTimeout(() => {\n onChange(filter.id, values);\n }, 350)\n );\n }\n };\n\n const renderThumb = ({ props }: IRenderThumbParams) => {\n return (\n <div\n {...props}\n className=\"flex h-3 w-3 items-center justify-center rounded-[100%] bg-gray-900 text-gray-900\"\n style={{ ...props.style }}\n >\n <Icon name=\"toggle\" className=\"h-3 w-3\" />\n </div>\n );\n };\n\n const renderTrack = ({ props, children }: IRenderTrackParams) => (\n <div\n className=\"flex h-7 w-full px-2\"\n onMouseDown={props.onMouseDown}\n onTouchStart={props.onTouchStart}\n style={{ ...props.style }}\n >\n <div\n className=\"h-[5px] w-full self-center rounded\"\n style={{\n background: getTrackBackground({\n values: values,\n colors: ['#ccc', '#171717', '#ccc'],\n min: minValue,\n max: maxValue,\n }),\n }}\n ref={props.ref}\n >\n {children}\n </div>\n </div>\n );\n\n // Range will throw error if values are out of min/max ranges\n const safeValues = [\n values[0] === undefined ? minValue : Math.max(values[0], minValue),\n values[1] === undefined ? maxValue : Math.min(values[1], maxValue),\n ];\n\n if (minValue >= maxValue) return null;\n\n return (\n <div>\n <div className=\"flex justify-between text-md leading-tight text-gray-900\">\n {safeValues.map((value, i) => (\n <div key={i}>{value}</div>\n ))}\n </div>\n <Range\n values={safeValues}\n min={minValue}\n max={maxValue}\n onChange={onRangeChanged}\n renderThumb={renderThumb}\n renderTrack={renderTrack}\n />\n </div>\n );\n};\n\nexport default FilterRangeSlider;\n","import { CurrencyFormatState } from '../Reducers/CurrencyFormat.reducer';\n\nconst FormatPrice = (\n value: number,\n currencyFormat: CurrencyFormatState\n) => {\n if (currencyFormat?.countryId && currencyFormat?.currencyId) {\n const formatter = new Intl.NumberFormat(currencyFormat.countryId, {\n style: 'currency',\n currency: currencyFormat.currencyId,\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n });\n\n return formatter.format(value);\n }\n\n return value;\n};\n\nexport default FormatPrice;\n","import React, { useState, useMemo, useEffect } from 'react';\nimport { FilterElementAttributes } from '../types/FilterElementAttributes';\nimport { Range, getTrackBackground } from 'react-range';\nimport {\n IRenderThumbParams,\n IRenderTrackParams,\n} from 'react-range/lib/types';\nimport Icon from '../../Icon';\nimport FormatPrice from '../../../Utils/FormatPrice';\nimport { useTypedSelector } from '../../../Hooks/useTypedSelector';\n\nconst FilterPriceRangeSlider = ({\n filter,\n onChange,\n}: FilterElementAttributes) => {\n const [values, setValues] = useState<number[]>([\n parseInt(\n filter.selectedOptions[0] !== undefined\n ? filter.selectedOptions[0]\n : filter.options[0]?.id ?? '0'\n ),\n parseInt(\n filter.selectedOptions[1] !== undefined\n ? filter.selectedOptions[1]\n : filter.options[1]?.id ?? '0'\n ),\n ]);\n const [onChangeTimer, setOnChangeTimer] = useState<NodeJS.Timeout>();\n const currencyFormat = useTypedSelector((state) => state.currencyFormat);\n\n // Store the initial min and max value\n const minValue = useMemo(\n () => parseInt(filter.options[0]?.id ?? '0'),\n [filter]\n );\n const maxValue = useMemo(\n () => parseInt(filter.options[1]?.id ?? '0'),\n [filter]\n );\n\n useEffect(() => {\n if (filter.selectedOptions.length < 1) {\n setValues([minValue, maxValue]);\n }\n }, [filter, minValue, maxValue]);\n\n const onRangeChanged = (values: number[]) => {\n setValues(values);\n\n if (onChange) {\n if (onChangeTimer) {\n clearTimeout(onChangeTimer);\n }\n\n // Debounce onChange\n setOnChangeTimer(\n setTimeout(() => {\n onChange(filter.id, values);\n }, 350)\n );\n }\n };\n\n const renderThumb = ({ props }: IRenderThumbParams) => {\n return (\n <div\n {...props}\n className=\"flex h-3 w-3 items-center justify-center rounded-[100%] bg-gray-900 text-gray-900\"\n style={{ ...props.style }}\n >\n <Icon name=\"toggle\" className=\"h-3 w-3\" />\n </div>\n );\n };\n\n const renderTrack = ({ props, children }: IRenderTrackParams) => (\n <div\n className=\"flex h-7 w-full px-2\"\n onMouseDown={props.onMouseDown}\n onTouchStart={props.onTouchStart}\n style={{ ...props.style }}\n >\n <div\n className=\"h-[5px] w-full self-center rounded\"\n style={{\n background: getTrackBackground({\n values: values,\n colors: ['#ccc', '#171717', '#ccc'],\n min: minValue,\n max: maxValue,\n }),\n }}\n ref={props.ref}\n >\n {children}\n </div>\n </div>\n );\n\n // Range will throw error if values are out of min/max ranges\n var safeMinValue =\n values[0] === undefined ? minValue : Math.max(values[0], minValue);\n var safeMaxValue =\n values[1] === undefined ? maxValue : Math.min(values[1], maxValue);\n const safeValues = [safeMinValue, safeMaxValue];\n\n if (minValue >= maxValue || safeMinValue > safeMaxValue) return null;\n\n return (\n <div>\n <div className=\"flex justify-between text-md leading-tight text-gray-900\">\n {safeValues.map((value, i) => (\n <div key={i}>{FormatPrice(value, currencyFormat)}</div>\n ))}\n </div>\n <Range\n values={safeValues}\n min={minValue}\n max={maxValue}\n onChange={onRangeChanged}\n renderThumb={renderThumb}\n renderTrack={renderTrack}\n />\n </div>\n );\n};\n\nexport default FilterPriceRangeSlider;\n","import React from 'react';\nimport { useEffect } from 'react';\nimport { useState } from 'react';\nimport { useMemo } from 'react';\nimport { translate } from '../../Services/translation';\nimport Input from '../Inputs/Input';\nimport { FilterGroup } from './types/FilterGroup';\n\ninterface FilterSearchInputAttributes {\n filter: FilterGroup;\n onSearch?: Function;\n}\n\nconst FilterSearchInput = ({\n filter,\n onSearch,\n}: FilterSearchInputAttributes) => {\n const [value, setValue] = useState('');\n\n const matchingOptions = useMemo(\n () =>\n value != ''\n ? filter.options.filter(\n (opt) =>\n filter.selectedOptions.includes(opt.id) ||\n opt.label.toLowerCase().includes(value.toLowerCase())\n )\n : null,\n [value, filter]\n );\n\n useEffect(() => {\n onSearch && onSearch(filter, matchingOptions);\n }, [filter, onSearch, matchingOptions]);\n\n return (\n <div className=\"mb-2\">\n <Input\n className=\"rounded-sm border-gray-400 bg-gray-100\"\n inputSize=\"small\"\n icon=\"magnifier\"\n value={value}\n onChange={(e) => setValue(e.target.value)}\n placeholder={translate('general.search')}\n />\n </div>\n );\n};\n\nexport default FilterSearchInput;\n","import React from 'react';\nimport { useCallback } from 'react';\nimport { useDispatch } from 'react-redux';\nimport {\n onOptionChanged as onOptionChangedAction,\n onRangeChanged as onRangeChangedAction,\n queryProductFiltering,\n} from '../../Actions/ProductFiltering.action';\nimport { translate } from '../../Services/translation';\nimport FilterCheckbox from './FilterOptions/FilterCheckbox';\nimport FilterRangeSlider from './FilterOptions/FilterRangeSlider';\nimport FilterPriceRangeSlider from './FilterOptions/FilterPriceRangeSlider';\nimport FilterSearchInput from './FilterSearchInput';\nimport { FilterGroup } from './types/FilterGroup';\nimport { FilterGroupOption } from './types/FilterGroupOption';\nimport { FilterGroupType } from './types/FilterGroupType';\n\ninterface FilterGroupFactoryAttributes {\n filter: FilterGroup;\n options: FilterGroupOption[];\n showAll?: boolean;\n showAllButtonVisible?: boolean;\n onShowHideAllClick?: Function;\n onSearch?: Function;\n onChange?: Function;\n}\n\nconst FilterGroupElement = ({\n filter,\n options,\n showAll,\n showAllButtonVisible,\n onShowHideAllClick,\n onSearch,\n}: FilterGroupFactoryAttributes) => {\n const dispatch = useDispatch();\n\n // When a filter checkbox/radiobutton is changed, this is called, which triggers a filter query\n const onOptionChanged = useCallback(\n async (filterId: string, optionId: string) => {\n dispatch(onOptionChangedAction(filterId, optionId));\n dispatch(queryProductFiltering());\n },\n [dispatch]\n );\n\n // When a filter range is changed, this is called, which triggers a filter query\n const onRangeChanged = useCallback(\n async (filterId: string, values: number[]) => {\n dispatch(onRangeChangedAction(filterId, values));\n dispatch(queryProductFiltering());\n },\n [dispatch]\n );\n\n // Renders each filter group depending on the filter group type\n const renderFilterOptions = useCallback(\n (filter: FilterGroup) => {\n switch (filter.filterGroupType) {\n case FilterGroupType.Checkbox:\n return options.map((opt) => (\n <FilterCheckbox\n filter={filter}\n option={opt}\n onChange={onOptionChanged}\n key={filter.id + opt.id}\n />\n ));\n case FilterGroupType.PriceRange:\n return (\n <FilterPriceRangeSlider\n filter={filter}\n onChange={onRangeChanged}\n />\n );\n case FilterGroupType.Range:\n return (\n <FilterRangeSlider filter={filter} onChange={onRangeChanged} />\n );\n default:\n return null;\n }\n },\n [onRangeChanged, onOptionChanged, options]\n );\n\n return (\n <>\n {filter.showSearch && filter.options.length > 5 && (\n <FilterSearchInput filter={filter} onSearch={onSearch} />\n )}\n {renderFilterOptions(filter)}\n {onShowHideAllClick && showAllButtonVisible == true && (\n <button\n className=\"btn btn--inverted-outline btn--small mt-2 w-full text-sm font-medium\"\n onClick={() =>\n onShowHideAllClick && onShowHideAllClick(filter.id)\n }\n >\n {showAll\n ? translate('general.show-less')\n : translate('general.show-more')}\n </button>\n )}\n </>\n );\n};\n\nexport default FilterGroupElement;\n","import React, { useState, useCallback, useEffect } from 'react';\nimport Collapsible from '../Collapsible';\nimport { FilterGroup } from './types/FilterGroup';\nimport { useTypedSelector } from '../../Hooks/useTypedSelector';\nimport { FilterGroupType } from './types/FilterGroupType';\nimport { FilterGroupOption } from './types/FilterGroupOption';\nimport FilterGroupElement from './FilterGroupElement';\nimport { useDispatch } from 'react-redux';\nimport { queryProductFiltering } from '../../Actions/ProductFiltering.action';\n\nconst MAX_FILTERS_BEFORE_SHOW_MORE = 5;\n\nconst ProductFiltering = () => {\n const productFiltering = useTypedSelector(\n (state) => state.productFiltering\n );\n const { filters, updatePending } = productFiltering;\n const dispatch = useDispatch();\n\n const [showAllForFilters, setShowMoreForFilters] = useState<string[]>(\n []\n );\n const [filterSearchResults, setFilterSearchResults] = useState<{\n [filterId: string]: FilterGroupOption[];\n }>({});\n\n useEffect(() => {\n if (filters?.length > 0 || updatePending) return;\n\n dispatch(queryProductFiltering(null, true));\n }, []);\n\n const onShowHideAllClick = (filterId: string) => {\n const listCopy = [...showAllForFilters];\n const index = listCopy.indexOf(filterId);\n if (index == -1) {\n listCopy.push(filterId);\n } else {\n listCopy.splice(index, 1);\n }\n setShowMoreForFilters(listCopy);\n };\n\n // Returns true if the filter has \"show all\" selected\n const shouldShowAllFilters = useCallback(\n (filterId: string) => showAllForFilters.indexOf(filterId) != -1,\n [showAllForFilters]\n );\n\n // Called when the search input was changed for the specified filter\n const onSearch = useCallback(\n (filter: FilterGroup, options: FilterGroupOption[]) => {\n setFilterSearchResults((current) => {\n const filterSearchResultsCopy = { ...current };\n if (!options) {\n if (filterSearchResultsCopy.hasOwnProperty(filter.id)) {\n delete filterSearchResultsCopy[filter.id];\n }\n } else {\n filterSearchResultsCopy[filter.id] = options;\n }\n return filterSearchResultsCopy ?? {};\n });\n },\n []\n );\n\n // Get options from the specified filter, with regard to the search value for the filter\n const getFilterOptions = useCallback(\n (filter: FilterGroup) =>\n filterSearchResults.hasOwnProperty(filter.id) &&\n filterSearchResults[filter.id] != undefined\n ? filterSearchResults[filter.id] ?? filter.options\n : filter.options,\n [filterSearchResults]\n );\n\n const getFilterGroupLabel = useCallback(\n (filter: FilterGroup) =>\n `${\n filter.filterGroupType != FilterGroupType.Range &&\n filter.filterGroupType != FilterGroupType.PriceRange &&\n filter.selectedOptions.length > 0\n ? `(${filter.selectedOptions.length})`\n : ''\n } ${filter.label}`.trim(),\n []\n );\n\n return (\n <div className=\"rounded-sm bg-white\">\n {filters?.length > 0\n ? filters.map((filter, index) => (\n <Collapsible\n className=\"product-filtering-collapsible px-4 py-3\"\n key={filter.id}\n label={getFilterGroupLabel(filter)}\n isOpen={index < 4 ? true : false}\n >\n <div className=\"pt-3\">\n <FilterGroupElement\n filter={filter}\n options={getFilterOptions(filter).slice(\n 0,\n shouldShowAllFilters(filter.id)\n ? undefined\n : MAX_FILTERS_BEFORE_SHOW_MORE\n )}\n showAll={shouldShowAllFilters(filter.id)}\n onSearch={onSearch}\n onShowHideAllClick={onShowHideAllClick}\n showAllButtonVisible={\n getFilterOptions(filter).length >\n MAX_FILTERS_BEFORE_SHOW_MORE\n }\n />\n </div>\n </Collapsible>\n ))\n : null}\n </div>\n );\n};\n\nexport default ProductFiltering;\n","import React from 'react';\nimport { useDispatch } from 'react-redux';\nimport { onSortItemSelected } from '../../Actions/ProductFiltering.action';\nimport { useTypedSelector } from '../../Hooks/useTypedSelector';\n\nconst ProductSorting = () => {\n const dispatch = useDispatch();\n const { sortCriteria } =\n useTypedSelector((state) => state.productFiltering) ?? {};\n\n const selectedSortItem = sortCriteria?.sortItems.find((s) => s.selected);\n\n return sortCriteria ? (\n <select\n value={selectedSortItem?.query}\n onChange={(e) =>\n dispatch(\n onSortItemSelected(\n sortCriteria?.sortItems.find((s) => s.query == e.target.value)\n )\n )\n }\n >\n {sortCriteria.sortItems.map((item) => (\n <option value={item.query} key={item.query}>\n {item.name}\n </option>\n ))}\n </select>\n ) : null;\n};\n\nexport default ProductSorting;\n","import { useState, useEffect } from 'react';\n\nexport default function useHeaderHeight() {\n const [headerHeight, setHeaderHeight] = useState(0);\n\n useEffect(() => {\n function handleScroll() {\n const scrolledHeaderHeight =\n document.getElementById('header')?.getBoundingClientRect()\n .height ?? 0;\n const scrolledHeaderTop =\n document.getElementById('header')?.getBoundingClientRect().top ??\n 0;\n const headerTotalHeight = scrolledHeaderHeight + scrolledHeaderTop;\n\n if (headerTotalHeight != headerHeight) {\n setHeaderHeight(headerTotalHeight);\n }\n }\n\n window.addEventListener('scroll', handleScroll);\n\n return () => {\n window.removeEventListener('scroll', handleScroll);\n };\n }, []);\n\n return headerHeight;\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport Icon from '../Icon';\nimport clsx from 'clsx';\nimport useHeaderHeight from '../../Hooks/useHeaderHeight';\n\ninterface CollapsibleWithStickyHeaderAttributes {\n label?: string | JSX.Element;\n className?: string;\n transitionDuration?: string;\n onStateChange?: Function;\n isOpen?: boolean;\n hideBorder?: boolean;\n children?: any;\n}\n\nconst CollapsibleWithStickyHeader = ({\n children,\n label,\n className = '',\n transitionDuration = '0.2s',\n onStateChange: externalStateChange,\n isOpen: externalIsOpen,\n hideBorder,\n}: CollapsibleWithStickyHeaderAttributes) => {\n const [isOpen, setIsOpen] = useState<boolean>(externalIsOpen ?? false);\n const headerHeight = useHeaderHeight();\n const maxHeaderHeight = 130;\n const container = useRef(null);\n\n const onStateChange = (open: boolean) => {\n externalStateChange && externalStateChange(open);\n setIsOpen(open);\n setTimeout(() => {\n window.scrollBy({\n top:\n container.current?.getBoundingClientRect().top - maxHeaderHeight,\n });\n }, 50);\n };\n\n useEffect(() => {\n setIsOpen(externalIsOpen ?? false);\n }, [externalIsOpen]);\n\n return (\n <div\n className={clsx(\n 'first:border-t',\n hideBorder ? 'collapsible--no-border' : ''\n )}\n >\n <div className=\"invisible\" ref={container}></div>\n <label\n className={clsx(\n 'flex items-center justify-between border-b border-gray-300 bg-white p-4 text-lg font-bold'\n )}\n onClick={() => onStateChange(!isOpen)}\n style={\n isOpen\n ? {\n position: 'sticky',\n top: headerHeight + 'px',\n zIndex: '10',\n }\n : {}\n }\n >\n {label}\n <Icon\n className={clsx(isOpen ? 'rotate-180' : 'rotate-0', 'h-5 w-5')}\n style={{ transitionDuration: transitionDuration }}\n name=\"caret-down\"\n />\n </label>\n {isOpen && <div>{children}</div>}\n </div>\n );\n};\n\nexport default CollapsibleWithStickyHeader;\n","import React from 'react';\nimport { EditorStringModel } from '../../Types/EditorString';\nimport clsx from 'clsx';\n\nconst EditorString = ({ value, className }: EditorStringModel) => {\n return value ? (\n <div\n className={clsx('editor-string', className)}\n dangerouslySetInnerHTML={{ __html: value }}\n ></div>\n ) : null;\n};\n\nexport default EditorString;\n","export const breakpointValues = {\n xsmall: 0,\n small: 480,\n medium: 768,\n large: 1024,\n xlarge: 1440,\n xxlarge: 1920,\n};\n\n// Must be in correct order from smallest first to largest last\nexport const breakpoints = {\n xsmall: breakpointValues.xsmall + \"px\",\n small: breakpointValues.small + \"px\",\n medium: breakpointValues.medium + \"px\",\n large: breakpointValues.large + \"px\",\n xlarge: breakpointValues.xlarge + \"px\",\n xxlarge: breakpointValues.xxlarge + \"px\",\n};\n\nexport const breakpointClasses = [\n 'xsmall',\n 'small',\n 'medium',\n 'large',\n 'xlarge',\n];\n\nexport const rowMaxWidth = '1656px';\n\nexport const gridRowGutter = {\n xsmall: '1.6rem',\n large: '2.4rem',\n};\n\nexport const gridRowPadding = {\n xsmall: '1.6rem',\n medium: '2.4rem',\n large: '3.2rem',\n xlarge: '4.8rem',\n};\n","import React, { useMemo } from 'react';\nimport { ResponsiveImageModel } from '../../Types/ResponsiveImageModel';\nimport { breakpointValues } from '../../styling/variables/grid';\n\nconst ResponsiveImage = ({\n sizeDefinitions,\n alt,\n lazyLoad = false,\n onClick,\n}: ResponsiveImageModel) => {\n const smallestImage = useMemo(\n () => sizeDefinitions?.slice().sort((a, b) => a.width - b.width)[0],\n [sizeDefinitions]\n );\n\n const orderedSizeDefinitions = useMemo(\n () =>\n sizeDefinitions\n ?.slice()\n .sort(\n (a, b) =>\n (b.fromWidth ?? breakpointValues[b.fromBreakpoint ?? '']) -\n (a.fromWidth ?? breakpointValues[a.fromBreakpoint ?? ''])\n ),\n [sizeDefinitions]\n );\n\n return (\n <picture>\n {orderedSizeDefinitions &&\n orderedSizeDefinitions.length > 1 &&\n orderedSizeDefinitions.map((img, idx) => (\n <source\n key={img.url + idx + 'source'}\n srcSet={img.url}\n media={`(min-width: ${\n img.fromWidth ?? breakpointValues[img.fromBreakpoint ?? '']\n }px)`}\n />\n ))}\n <img\n src={smallestImage?.url}\n loading={lazyLoad ? 'lazy' : undefined}\n alt={alt}\n width={!!smallestImage?.width ? smallestImage?.width : undefined}\n itemProp=\"image\"\n height={\n !!smallestImage?.height ? smallestImage?.height : undefined\n }\n onClick={onClick}\n />\n </picture>\n );\n};\n\nexport default ResponsiveImage;\n","import React from 'react';\nimport clsx from 'clsx';\nimport ProductTagModel from '../../Types/ProductTagModel';\n\nexport interface TagProps {\n tagSize?: 'xs' | 's' | 'l' | 'xl';\n isCampaign: boolean;\n}\n\nconst ProductTag: React.FC<\n TagProps & React.HTMLAttributes<HTMLDivElement> & ProductTagModel\n> = ({ tagSize = 's', id, isCampaign, className, ...props }) => {\n return (\n <div\n {...props}\n className={clsx(\n 'product-tag',\n 'product-tag--' + tagSize,\n isCampaign ? 'bg-brand-red' : 'bg-primary-900',\n className\n )}\n />\n );\n};\n\nexport default ProductTag;\n","import { post } from './http';\nimport { dataLayerAddToCart } from '../Services/Gtm.service';\nimport { useTypedSelector } from '../Hooks/useTypedSelector';\n\nexport const add = async ({\n articleNumber,\n quantity = 1,\n upSellIds = null,\n purchaseComment = '',\n}) => {\n if (!quantity || isNaN(quantity) || parseFloat(quantity) <= 0) {\n throw 'Invalid quantity';\n }\n\n const response = await post('/api/cart/add', {\n articleNumber,\n quantity: parseFloat(quantity),\n upSellIds,\n purchaseComment,\n });\n\n var result = await response.json();\n\n try {\n addToDataLayer([{ articleNumber, quantity }], result.orderRows);\n } catch (err) {\n console.log(err);\n }\n\n return result;\n};\n\nexport const reorder = async (orderId) => {\n const response = await post('/api/cart/reorder', { orderId });\n return response.json();\n};\n\nconst addToDataLayer = (products, orderRows) => {\n let responseProducts = [];\n orderRows.map((row) => {\n for (const i in products) {\n if (Object.hasOwnProperty.call(products, i)) {\n if (products[i].articleNumber === row.articleNumber) {\n const index = responseProducts.findIndex(\n (e) => e.articleNumber === row.articleNumber\n );\n if (index === -1) {\n row.gtmEcommerceItem.quantity = products[i].quantity;\n row.gtmEcommerceItem.index = responseProducts.length;\n responseProducts.push(row);\n }\n }\n }\n }\n });\n\n const gtmEcommerceItems = responseProducts.map(\n (p) => p.gtmEcommerceItem\n );\n if (gtmEcommerceItems) {\n dataLayerAddToCart(gtmEcommerceItems);\n }\n};\n","var _path, _g;\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nimport * as React from \"react\";\nconst SvgRefresh = props => /*#__PURE__*/React.createElement(\"svg\", _extends({\n width: \"1em\",\n height: \"1em\",\n viewBox: \"0 0 24 24\",\n xmlns: \"http://www.w3.org/2000/svg\"\n}, props), /*#__PURE__*/React.createElement(\"mask\", {\n id: \"refresh_svg__a\",\n style: {\n maskType: \"alpha\"\n },\n maskUnits: \"userSpaceOnUse\",\n x: 0,\n y: 0,\n width: 24,\n height: 24\n}, _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M0 0h24v24H0z\"\n}))), _g || (_g = /*#__PURE__*/React.createElement(\"g\", {\n mask: \"url(#refresh_svg__a)\"\n}, /*#__PURE__*/React.createElement(\"path\", {\n d: \"M12 20c-2.233 0-4.125-.775-5.675-2.325C4.775 16.125 4 14.233 4 12c0-2.233.775-4.125 2.325-5.675C7.875 4.775 9.767 4 12 4c1.15 0 2.25.238 3.3.713A7.617 7.617 0 0 1 18 6.75V4h2v7h-7V9h4.2a5.837 5.837 0 0 0-2.187-2.2A5.93 5.93 0 0 0 12 6c-1.667 0-3.083.583-4.25 1.75C6.583 8.917 6 10.333 6 12c0 1.667.583 3.083 1.75 4.25C8.917 17.417 10.333 18 12 18a5.863 5.863 0 0 0 3.475-1.1A5.81 5.81 0 0 0 17.65 14h2.1c-.467 1.767-1.417 3.208-2.85 4.325S13.833 20 12 20Z\"\n}))));\nexport default SvgRefresh;","import React from 'react';\nimport Refresh from '../../icons/refresh.svg';\n\ninterface LoadingSpinnerAttributes {\n className?: string;\n}\n\nconst LoadingSpinner = (props: LoadingSpinnerAttributes) => {\n const { className = '' } = props;\n return (\n <Refresh\n className={`icon spin ${className}`}\n style={{ fill: 'currentColor' }}\n />\n );\n};\n\nexport default LoadingSpinner;\n","import {\n BUY_BUTTON_SET_ARTICLE_NUMBER,\n BUY_BUTTON_SET_LOADING,\n BUY_BUTTON_SET_UPSELL_ARTICLE_NUMBERS,\n} from '../constants';\n\nexport const setBuyButtonArticleNumber = (articleNumber: string) => ({\n type: BUY_BUTTON_SET_ARTICLE_NUMBER,\n payload: {\n articleNumber,\n },\n});\n\nexport const setBuyButtonLoading = (isLoading: boolean) => ({\n type: BUY_BUTTON_SET_LOADING,\n payload: {\n isLoading,\n },\n});\n\nexport const setBuyButtonUpSellArticleNumbers = (upSellIds: string[]) => ({\n type: BUY_BUTTON_SET_UPSELL_ARTICLE_NUMBERS,\n payload: {\n upSellIds,\n },\n});\n","import React, { useState, useMemo } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { add as addToCart } from '../../Services/Cart.service';\nimport {\n receive as receiveCart,\n triggerAddToCartAnimation,\n} from '../../Actions/Cart.action';\nimport { translate } from '../../Services/translation';\nimport QuantityInput from '../QuantityInput/QuantityInput';\nimport LoadingSpinner from '../LoadingSpinner';\nimport { useCallback } from 'react';\nimport { useTypedSelector } from '../../Hooks/useTypedSelector';\nimport { setBuyButtonLoading } from '../../Actions/BuyButton.action';\nimport clsx from 'clsx';\nimport Icon from '../Icon';\n\nexport interface BuyButtonAttributes {\n articleNumber?: string;\n disabled?: boolean;\n showQuantityInput?: boolean;\n onClick?: Function;\n className?: string;\n label?: string;\n quantity?: number;\n href?: string;\n showCartIcon: boolean;\n smallLoadingIcon?: boolean;\n purchaseComment?: string;\n}\n\nconst BuyButton = (props: BuyButtonAttributes) => {\n const {\n articleNumber: localArticleNumber,\n showQuantityInput = true,\n className = '',\n onClick: customOnClick,\n label,\n quantity: initialQuantity,\n purchaseComment = '',\n href,\n disabled: disabledProp,\n showCartIcon,\n smallLoadingIcon = false,\n } = props;\n const {\n articleNumber: reducerArticleNumber,\n disabled = false,\n isLoading = false,\n upSellIds,\n } = useTypedSelector((state) => state.buyButton);\n const dispatch = useDispatch();\n const [quantity, setQuantity] = useState<number | undefined>(\n initialQuantity ?? 1\n );\n const [showLoadingSpinner, setShowLoadingSpinner] =\n useState<boolean>(false);\n const articleNumber = useMemo(\n () => localArticleNumber ?? reducerArticleNumber,\n [localArticleNumber, reducerArticleNumber]\n );\n const setIsLoading = (isLoading: boolean) => {\n dispatch(setBuyButtonLoading(isLoading));\n };\n\n const onClick = async () => {\n if (customOnClick) {\n customOnClick(articleNumber, quantity);\n } else if (!href) {\n setIsLoading(true);\n const loadingSpinnerTimeout = setTimeout(\n () => setShowLoadingSpinner(true),\n 150\n );\n\n try {\n const cart = await addToCart({\n articleNumber,\n quantity,\n purchaseComment,\n upSellIds,\n });\n dispatch(receiveCart(cart));\n dispatch(triggerAddToCartAnimation());\n } catch (err) {\n if (err.response) {\n err.response.json().then((error) => {\n if ('general' in error && error.general.length > 0) {\n alert(error.general[0]);\n } else {\n alert('Kunde inte lägga i varukorgen');\n }\n });\n } else {\n alert('Kunde inte lägga i varukorgen');\n }\n } finally {\n clearTimeout(loadingSpinnerTimeout);\n setShowLoadingSpinner(false);\n setIsLoading(false);\n }\n }\n };\n\n const LoadingComponent = useCallback(\n (smallLoadingIcon) => (\n <>\n <span\n className={clsx(\n 'align-center absolute left-2/4 top-2/4 mx-auto my-0 flex -translate-x-2/4 -translate-y-2/4 justify-center',\n smallLoadingIcon\n ? '[&_svg]:h-4 [&_svg]:w-4'\n : '[&_svg]:h-6 [&_svg]:w-6'\n )}\n >\n <LoadingSpinner />\n </span>\n </>\n ),\n []\n );\n\n const _label = useMemo(\n () =>\n label ??\n (href\n ? translate('general.show')\n : translate('general.add-to-cart')),\n [href, label]\n );\n\n return (\n <div\n className={clsx(`${className ?? ''} buy-button`, 'flex', 'gap-2')}\n >\n {showQuantityInput && (\n <QuantityInput\n quantity={quantity}\n showButtons={false}\n onChange={(value: number) => setQuantity(value)}\n className={clsx('flex-1')}\n />\n )}\n {href && (\n <a\n onClick={onClick}\n className={clsx(\n 'btn',\n 'btn--addtocart',\n 'p-2',\n 'text-sm',\n 'w-full',\n 'flex-1',\n 'self-stretch',\n 'relative'\n )}\n href={!disabled ? href : undefined}\n >\n {showLoadingSpinner && <LoadingComponent smallLoadingIcon />}\n {!showLoadingSpinner && _label}\n </a>\n )}\n {!href && (\n <button\n onClick={onClick}\n className={clsx(\n 'btn',\n 'btn--addtocart',\n 'p-2',\n 'w-full',\n 'flex-1',\n 'self-stretch',\n 'relative'\n )}\n disabled={\n disabled ||\n disabledProp ||\n isLoading ||\n !articleNumber ||\n (showQuantityInput && (!quantity || quantity <= 0))\n }\n >\n {showLoadingSpinner && <LoadingComponent smallLoadingIcon />}\n <span className={clsx(showLoadingSpinner && 'invisible')}>\n {showCartIcon && (\n <Icon\n name=\"shopping-cart\"\n className=\"mr-3 !h-[24px] !w-[24px]\"\n />\n )}\n {_label}\n </span>\n </button>\n )}\n </div>\n );\n};\n\nexport default BuyButton;\n","import React from 'react';\nimport BuyButton from '../BuyButton/BuyButton';\nimport ProductCardProps from './types/ProductCardProps';\nimport clsx from 'clsx';\nimport { translate } from '../../Services/translation';\n\nconst ProductCardBuyButton = ({\n product,\n isVariantListing,\n className,\n showQuantityInput,\n}: ProductCardProps) => {\n return (\n <>\n {product.hasMultipleVariants ? (\n <div\n className={clsx(\n `${className ?? ''} buy-button`,\n 'flex',\n 'gap-2'\n )}\n >\n <a\n className={clsx(\n 'btn',\n 'btn--addtocart',\n 'p-2',\n 'text-sm',\n 'w-full',\n 'flex-1',\n 'self-stretch',\n 'relative'\n )}\n href={product.url}\n >\n {translate('general.show-more-variants')}\n </a>\n </div>\n ) : (\n <BuyButton\n articleNumber={product.id}\n quantity={product.quantity}\n showQuantityInput={showQuantityInput}\n className={className}\n href={\n !product.stockStatus.inStock && !isVariantListing\n ? product.url\n : undefined\n }\n disabled={isVariantListing && !product.stockStatus.inStock}\n />\n )}\n </>\n );\n};\n\nexport default ProductCardBuyButton;\n","import clsx from 'clsx';\nimport React from 'react';\nimport PriceModel from '../../Types/PriceModel';\n\ninterface ProductPriceProps {\n price: PriceModel;\n discountPercentage?: string;\n isQuickSearch: boolean;\n alignRight?: boolean;\n notPricedString?: string;\n lowestVariantPrice: number;\n hasMultipleVariants: boolean;\n}\n\nconst ProductPrice = ({\n price,\n discountPercentage,\n isQuickSearch,\n alignRight,\n notPricedString,\n lowestVariantPrice,\n hasMultipleVariants,\n}: ProductPriceProps) => {\n const shouldShowCampainPrice = () => {\n if (!hasMultipleVariants && price.formattedCampaignPrice) return true;\n\n return (\n price.formattedCampaignPrice &&\n lowestVariantPrice > 0 &&\n price?.campaignPrice?.priceWithVat <= lowestVariantPrice\n );\n };\n\n const showCampaignPrice = shouldShowCampainPrice();\n\n return (\n <div className=\"flex flex-col leading-tight\">\n {showCampaignPrice ? (\n <div\n className={clsx('flex flex-col', alignRight ? 'items-end' : '')}\n >\n <span\n className={clsx(\n 'flex font-bold text-brand-red',\n isQuickSearch ? 'justify-end text-sm' : 'text-md lg:text-lg'\n )}\n >\n {price.formattedCampaignPrice}{' '}\n </span>\n <div className={clsx('flex', isQuickSearch && 'justify-end')}>\n <span\n className={clsx('line-through', 'text-sm', 'text-gray-600')}\n >\n {price.formattedPrice}\n </span>\n {discountPercentage && (\n <span className=\"ml-[2px] text-sm text-brand-red\">\n {discountPercentage}\n </span>\n )}\n </div>\n </div>\n ) : (\n (price.formattedPrice || price.price?.price == '0') && (\n <>\n {price.price?.price == '0' ? (\n <div\n className={clsx(\n 'font-bold text-gray-900',\n isQuickSearch ? 'text-sm' : 'text-md lg:text-lg'\n )}\n >\n {notPricedString}\n </div>\n ) : (\n <div\n className={clsx(\n 'font-bold text-gray-900',\n isQuickSearch ? 'text-sm' : 'text-md lg:text-lg'\n )}\n >\n {price.formattedPrice}\n </div>\n )}\n </>\n )\n )}\n </div>\n );\n};\n\nexport default ProductPrice;\n","import React, { useMemo, useState } from 'react';\nimport { translate } from '../../Services/translation';\nimport { DropdownOption } from '../Dropdown';\nimport StockStatus from '../StockStatus/StockStatus';\nimport ProductCardProps from './types/ProductCardProps';\nimport ResponsiveImage from '../ResponsiveImage/ResponsiveImage';\nimport ProductTag from '../ProductTags/ProductTag';\nimport ProductCardBuyButton from './ProductCardBuyButton';\nimport clsx from 'clsx';\nimport ProductPrice from '../ProductPrice/ProductPrice';\nimport Icon from '../Icon';\nimport { notPriced } from '../../Reducers/NotPriced.reducer';\n\nconst ProductCardRelation = ({\n product,\n isVariantListing = false,\n lazyLoadImage,\n}: ProductCardProps) => {\n const [selectedOption, setSelectedOption] = useState<DropdownOption>();\n\n const articleNumber = useMemo(\n () =>\n product.variantOptions?.length ? selectedOption?.value : product.id,\n [product.id, product.variantOptions?.length, selectedOption?.value]\n );\n\n return (\n <div className=\"flex gap-3 rounded border-b border-gray-200 bg-white pb-3 last:border-b-0\">\n <div\n className={clsx(\n 'w-14',\n '[&_img]:aspect-square [&_img]:w-full [&_img]:object-cover'\n )}\n >\n {product.images && product.images.length > 0 && (\n <a href={product.url}>\n <ResponsiveImage\n {...product.images[0]}\n lazyLoad={lazyLoadImage}\n />\n </a>\n )}\n </div>\n <div className={clsx('flex-1')}>\n <div className={clsx('flex', 'flex-row', 'justify-between')}>\n <div className={clsx('flex', 'flex-col')}>\n <a\n className={clsx('text-md', 'font-bold', 'mb-[2.5px]')}\n href={product.url}\n >\n {product.brand\n ? product.brand + ' ' + product.name\n : product.name}\n </a>\n <div className={clsx('text-sm', 'text-gray-600')}>\n {product.variantOptions?.length && (\n <>\n <Icon\n name=\"multiple-variants\"\n className={clsx('mr-1 h-4 w-4')}\n />\n <span>{translate('available.in.several.variants')}</span>\n </>\n )}\n </div>\n </div>\n {product.tags?.length ? (\n <div className={clsx('flex', 'flex-col', 'mb-1', 'items-end')}>\n {product.tags.map((tag) => (\n <ProductTag\n tagSize=\"s\"\n id={tag.id}\n key={tag.id}\n isCampaign={tag.isCampaign}\n >\n {tag.name}\n </ProductTag>\n ))}\n </div>\n ) : null}\n </div>\n <div className=\"flex flex-1 flex-col justify-between md:flex-row\">\n <div className=\"flex items-center\">\n <StockStatus {...product.stockStatus} />\n </div>\n <div className=\"flex items-end justify-between\">\n <div className=\"mr-2 self-center\">\n <ProductPrice\n price={product.price}\n discountPercentage={product.discountPercentage}\n isQuickSearch={false}\n notPricedString={product.notPricedString}\n />\n </div>\n <ProductCardBuyButton\n product={{ ...product, id: articleNumber }}\n isVariantListing={isVariantListing}\n showQuantityInput={false}\n className={clsx(\n '[&_button]:flex-1 [&_button]:text-sm',\n '[&_div]:flex-1',\n '[&_input]:text-sm'\n )}\n />\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport default ProductCardRelation;\n","import React from 'react';\nimport EditorString from '../EditorString/EditorString';\nimport ProductCardRelation from '../ProductCards/ProductCardRelation';\nimport ResponsiveImage from '../ResponsiveImage/ResponsiveImage';\nimport { ProductInformationTabContentsProps } from './types/ProductInformationTabProps';\nimport clsx from 'clsx';\n\nconst ProductInformationTabContents = (\n props: ProductInformationTabContentsProps\n) => {\n const item = props.item;\n\n return (\n <div className=\"p-4 [&_iframe]:max-w-full\">\n <EditorString value={item.text?.value} className=\"text-md\" />\n {item.tabRelationships?.length && (\n <div className=\"flex flex-col gap-6\">\n {item.tabRelationships.map((relations, i) => (\n <div key={i} className=\"flex flex-col gap-3\">\n <p className=\"border-b border-gray-200 pb-3 text-lg font-bold text-gray-900\">\n {relations.url ? (\n <a\n href={relations.url}\n className=\"underline transition-opacity hover:opacity-70\"\n >\n {relations.title}\n </a>\n ) : (\n <span>{relations.title}</span>\n )}\n </p>\n {relations.items?.length && (\n <div className=\"flex flex-col gap-3\">\n {relations.items.map((product, j) => (\n <ProductCardRelation\n product={product}\n key={i + '-' + j}\n lazyLoadImage={true}\n />\n ))}\n </div>\n )}\n </div>\n ))}\n </div>\n )}\n {item.tabBrand && (\n <div className=\"flex flex-col gap-4 md:flex-row\">\n <div>\n <ResponsiveImage {...item.tabBrand.responsiveImageModel} />\n </div>\n <div className=\"flex flex-col gap-2\">\n <h4>{item.tabBrand.title}</h4>\n <EditorString\n value={item.tabBrand.text?.value}\n className=\"text-sm md:text-md\"\n />\n {item.tabBrand.link && (\n <a\n href={item.tabBrand.link.href}\n className=\"text-sm text-primary-500 underline md:text-md\"\n >\n {item.tabBrand.link.text}\n </a>\n )}\n </div>\n </div>\n )}\n {item.tabSpecifications?.length && (\n <table className=\"w-full border border-gray-300\">\n <tbody>\n {item.tabSpecifications.map((item, i) => (\n <tr\n key={i}\n className={clsx(\n 'flex flex-col border-b border-gray-300 last:border-0 xl:table-row',\n i % 2 == 0 ? 'bg-gray-100' : 'bg-white'\n )}\n >\n <th className=\"px-4 pt-[9px] text-left text-md font-bold text-gray-900 xl:pb-2.5\">\n {item.title}\n </th>\n <td className=\"px-4 pb-2.5 pt-[9px] text-left text-md text-gray-900\">\n {item.value}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n )}\n </div>\n );\n};\n\nexport default ProductInformationTabContents;\n","import React, { useEffect, useRef, useState } from 'react';\nimport CollapsibleWithStickyHeader from './CollapsibleWithStickyHeader';\nimport ProductInformationTabContents from './ProductInformationTabContents';\nimport { ProductInformationTabsProps } from './types/ProductInformationTabProps';\nimport clsx from 'clsx';\nimport useHeaderHeight from '../../Hooks/useHeaderHeight';\n\nconst ProductInformationTabs = (props: ProductInformationTabsProps) => {\n const items = props.items;\n const [activeTab, setActiveTab] = useState(-1);\n const headerHeight = useHeaderHeight();\n const minHeaderHeight = 75;\n const maxHeaderHeight = 150;\n\n const desktopActiveTab = activeTab == -1 ? 0 : activeTab;\n const showWhenPassed = useRef(null);\n const [fixHeaderDesktop, setFixHeaderDesktop] = useState(false);\n\n const setActiveTabAndScrollToTop = (activeTab) => {\n setActiveTab(activeTab);\n\n document.body.classList.add('disable-mega-menu');\n window.setTimeout(\n () => document.body.classList.remove('disable-mega-menu'),\n 1200\n );\n\n window.scrollBy({\n behavior: 'smooth',\n top:\n showWhenPassed.current?.getBoundingClientRect().top -\n maxHeaderHeight,\n });\n };\n\n useEffect(() => {\n function handleScroll() {\n const passed =\n showWhenPassed.current?.getBoundingClientRect().top <\n minHeaderHeight;\n\n setFixHeaderDesktop(passed);\n }\n\n window.addEventListener('scroll', handleScroll);\n\n return () => {\n window.removeEventListener('scroll', handleScroll);\n };\n }, []);\n\n return (\n <div>\n <div className=\"flex flex-col bg-white lg:hidden\">\n {items.map((item, i) => (\n <CollapsibleWithStickyHeader\n key={item.title}\n label={item.title}\n isOpen={i == activeTab}\n onStateChange={(isOpen) =>\n isOpen ? setActiveTab(i) : setActiveTab(-1)\n }\n >\n <ProductInformationTabContents item={item} />\n </CollapsibleWithStickyHeader>\n ))}\n </div>\n <div\n className=\"hidden flex-col rounded-sm border border-gray-200 bg-white lg:flex\"\n ref={showWhenPassed}\n >\n <div className={clsx('flex w-full bg-white')}>\n <div className={clsx('flex flex-row border-gray-200')}>\n {items.map((item, i) => (\n <div\n key={i}\n className={clsx(\n 'cursor-pointer px-1.5 py-2 text-sm font-bold text-gray-500',\n desktopActiveTab == i\n ? 'border-b-4 border-gray-900 text-gray-900'\n : ''\n )}\n onClick={() => setActiveTab(i)}\n >\n {item.title}\n </div>\n ))}\n </div>\n </div>\n <div\n className={clsx(\n 'container w-full',\n fixHeaderDesktop ? 'flex' : 'hidden'\n )}\n style={\n fixHeaderDesktop\n ? {\n position: 'fixed',\n top: headerHeight + 'px',\n zIndex: '10',\n left: '0px',\n right: '0px',\n }\n : {}\n }\n >\n <div\n className={clsx(\n 'flex w-full flex-row border-gray-200 bg-white shadow-xs',\n fixHeaderDesktop ? 'pl-6' : 'border-b'\n )}\n >\n {items.map((item, i) => (\n <div\n key={i}\n className={clsx(\n 'cursor-pointer px-1.5 py-2 text-sm font-bold text-gray-500',\n desktopActiveTab == i\n ? 'border-b-4 border-gray-900 text-gray-900'\n : ''\n )}\n onClick={() => setActiveTabAndScrollToTop(i)}\n >\n {item.title}\n </div>\n ))}\n </div>\n </div>\n <div>\n {items.map((item, i) => (\n <div key={i}>\n {i == desktopActiveTab && (\n <ProductInformationTabContents item={item} />\n )}\n </div>\n ))}\n </div>\n </div>\n </div>\n );\n};\n\nexport default ProductInformationTabs;\n","import clsx from 'clsx';\nimport React from 'react';\nimport PriceModel from '../../Types/PriceModel';\n\ninterface ProductPriceFloatingProps {\n price: PriceModel;\n discountPercentage?: string;\n}\n\nconst ProductPriceFloating = ({\n price,\n discountPercentage,\n}: ProductPriceFloatingProps) => {\n return (\n <div className=\"flex flex-col leading-tight\">\n {price.formattedCampaignPrice ? (\n <div className={clsx('flex flex-col items-end')}>\n <span className={clsx('flex text-md font-bold text-brand-red')}>\n {price.formattedCampaignPrice}{' '}\n </span>\n <div className={clsx('flex')}>\n <span\n className={clsx('line-through', 'text-sm', 'text-gray-600')}\n >\n {price.formattedPrice}\n </span>\n {discountPercentage && (\n <span className=\"ml-[2px] text-sm text-brand-red\">\n {discountPercentage}\n </span>\n )}\n </div>\n </div>\n ) : (\n price.formattedPrice && (\n <div className={clsx('text-md font-bold text-gray-900')}>\n {price.formattedPrice}\n </div>\n )\n )}\n </div>\n );\n};\n\nexport default ProductPriceFloating;\n","import React, { useEffect, useRef, useState } from 'react';\nimport BuyButton, { BuyButtonAttributes } from './BuyButton';\nimport clsx from 'clsx';\nimport PriceModel from '../../Types/PriceModel';\nimport ProductPriceFloating from '../ProductPrice/ProductPriceFloating';\n\nexport interface FloatingBuyButtonAttributes extends BuyButtonAttributes {\n name?: string;\n brand?: string;\n price: PriceModel;\n discountPercentage?: string;\n purchaseComment?: string;\n}\n\nconst FloatingBuyButton = (props: FloatingBuyButtonAttributes) => {\n const { articleNumber, name, brand, price, discountPercentage } = props;\n const showWhenPassed = useRef(null);\n const [showButton, setShowButton] = useState(false);\n\n useEffect(() => {\n function handleScroll() {\n const passed =\n showWhenPassed.current?.getBoundingClientRect().top < 0;\n\n if (showButton != passed) {\n setShowButton(passed);\n }\n }\n\n window.addEventListener('scroll', handleScroll);\n\n return () => {\n window.removeEventListener('scroll', handleScroll);\n };\n }, [showButton]);\n\n return (\n <>\n <div className=\"invisible\" ref={showWhenPassed}></div>\n <div\n className={clsx(\n 'transition-bottom fixed -bottom-16 left-0 right-0 z-10 max-h-16 justify-center bg-white py-1.5 shadow-xs-reverse duration-500 ease-in-out',\n showButton ? 'bottom-0' : ''\n )}\n >\n <div className=\"container flex items-center justify-center gap-2 lg:gap-4\">\n <div className=\"flex flex-1 flex-col lg:flex-initial\">\n <div className=\"text-md font-bold leading-tight text-gray-900\">\n {name}\n </div>\n <div className=\"text-sm leading-tight text-gray-500\">\n {brand} {articleNumber}\n </div>\n </div>\n <div>\n <ProductPriceFloating\n price={price}\n discountPercentage={discountPercentage}\n />\n </div>\n <div>\n <BuyButton {...props} />\n </div>\n </div>\n </div>\n </>\n );\n};\n\nexport default FloatingBuyButton;\n","import React from 'react';\nimport { useDispatch } from 'react-redux';\nimport { onSortItemSelected } from '../../Actions/ProductFiltering.action';\nimport { useTypedSelector } from '../../Hooks/useTypedSelector';\nimport RadioButton from '../Inputs/Radiobutton';\n\nconst ProductSortingRadios = () => {\n const dispatch = useDispatch();\n const { sortCriteria } =\n useTypedSelector((state) => state.productFiltering) ?? {};\n const selectedSortItem = sortCriteria?.sortItems.find((s) => s.selected);\n\n return (\n <ul className=\"px-4 py-6\">\n {sortCriteria?.sortItems.map((item) => (\n <li\n className=\"flex cursor-pointer items-center justify-between text-lg hover:[&.sort-radio-button]:shadow-[0_0_0_1px_primary-600] [&:not(:last-child)]:mb-4 [&_div]:m-0\"\n key={item.query}\n onClick={() => {\n dispatch(\n onSortItemSelected(\n sortCriteria?.sortItems.find((s) => s.query == item.query)\n )\n );\n }}\n >\n {item.name}{' '}\n <RadioButton\n name=\"sort-radio\"\n checked={selectedSortItem?.query == item.query}\n className=\"sort-radio-button mr-0\"\n />\n </li>\n ))}\n </ul>\n );\n};\n\nexport default ProductSortingRadios;\n","import React from 'react';\nimport { useTypedSelector } from '../../Hooks/useTypedSelector';\nimport clsx from 'clsx';\n\nconst CategoryNavigation = () => {\n const { subNavigation } = useTypedSelector(\n (state) => state.productFiltering\n );\n\n let currentCategory = subNavigation;\n let subCategories = subNavigation.links;\n let foundCategory;\n\n while (currentCategory.links.length > 0) {\n subCategories = currentCategory.links;\n foundCategory = currentCategory.links.find(\n (l) => l.isSelected == true\n );\n if (!foundCategory || foundCategory.links.length === 0) {\n break;\n } else {\n currentCategory = foundCategory;\n }\n }\n return (\n <div className=\"mb-4 hidden flex-col rounded-sm bg-white p-4 pt-3 text-md lg:block\">\n <div className=\"mb-3 text-lg font-bold text-gray-900\">\n {foundCategory ? (\n <a href={currentCategory.url}>{currentCategory.name}</a>\n ) : (\n currentCategory.name\n )}\n </div>\n <ul className=\"flex flex-col\">\n {subCategories.map((link, idx) => (\n <li\n className={clsx(\n foundCategory &&\n foundCategory.url == link.url &&\n 'pointer-events-none font-bold',\n 'flex',\n 'text-gray-900',\n 'mb-2'\n )}\n key={link.url + idx}\n >\n <a className=\"flex-1\" href={link.url}>\n {link.name}\n </a>{' '}\n </li>\n ))}\n </ul>\n </div>\n );\n};\n\nexport default CategoryNavigation;\n","import React from 'react';\nimport CategoryNavigation from '../ProductListing/CategoryNavigation';\n\nconst CategoriesMenu = () => {\n return (\n <div className=\"[&_.current-category]:text-large px-4 py-6 [&_.category_navigation-container]:!flex [&_.category_navigation-container]:text-md [&_.current-category]:pt-0 [&_.current-category]:font-bold [&_ul]:gap-4 [&_ul]:border-b-0 [&_ul]:pb-0\">\n <CategoryNavigation />\n </div>\n );\n};\n\nexport default CategoriesMenu;\n","import React, { useMemo } from 'react';\nimport ProductFiltering from '../ProductFiltering/ProductFiltering';\nimport SideMenu from '../SideMenu/SideMenu';\nimport { translate } from '../../Services/translation';\nimport ProductSortingRadios from './ProductSortingRadios';\nimport { clearAllFilters } from '../../Actions/ProductFiltering.action';\nimport { useDispatch } from 'react-redux';\nimport { useTypedSelector } from '../../Hooks/useTypedSelector';\nimport CategoriesMenu from './CategoriesMenu';\n\nconst FilterMenu = ({ currentMenu, setCurrentMenu }) => {\n const dispatch = useDispatch();\n const { totalProductsCount } = useTypedSelector(\n (state) => state.productListing\n );\n const filters = useTypedSelector(\n (state) => state.productFiltering.filters\n );\n const hasAnyOptionSelected = useMemo(\n () => filters?.some((f) => f.selectedOptions.length > 0),\n [filters]\n );\n\n const Header = () => (\n <>\n {currentMenu == 'categories' ? (\n <h4>{translate('filter.categories')}</h4>\n ) : null}\n {currentMenu == 'filters' ? (\n <h4>{translate('filter.filter')}</h4>\n ) : null}\n {currentMenu == 'sorting' ? (\n <h4>{translate('filter.sort')}</h4>\n ) : null}\n </>\n );\n\n const Content = () => (\n <>\n {currentMenu == 'categories' ? <CategoriesMenu /> : null}\n {currentMenu == 'filters' ? (\n <div className=\"overflow-y-auto [&_.ReactCollapse--collapse[aria-hidden='false']_.ReactCollapse--content_button]:mt-4 [&_.ReactCollapse--collapse[aria-hidden='false']_.ReactCollapse--content_label]:px-0 [&_.ReactCollapse--collapse[aria-hidden='false']_.ReactCollapse--content_label]:py-1 [&_.collapsible(:last-child)]:border-0 [&_.collapsible]:border-b [&_.collapsible]:border-t-0 [&_.collapsible]:border-gray-300\">\n <ProductFiltering />\n </div>\n ) : null}\n {currentMenu == 'sorting' ? <ProductSortingRadios /> : null}\n </>\n );\n\n const Footer = () => (\n <>\n {currentMenu == 'filters' ? (\n <div className=\"my-2 flex flex-1 gap-2\">\n <button\n className=\"btn btn--inverted-outline btn--large w-full font-medium\"\n disabled={!hasAnyOptionSelected}\n onClick={() => dispatch(clearAllFilters())}\n >\n {translate('filter.clear')}\n </button>\n <button\n className=\"btn btn--addtocart btn--large w-full font-medium\"\n onClick={() => setCurrentMenu(undefined)}\n >\n {translate('filter.view')} ( {totalProductsCount} )\n </button>\n </div>\n ) : null}\n </>\n );\n\n return (\n <>\n <SideMenu\n from=\"right\"\n id=\"filter-menu\"\n open={!!currentMenu}\n onClosed={() => setCurrentMenu(undefined)}\n components={{ Header, Content, Footer }}\n className=\"z-[60] max-w-[320px] overflow-y-auto border-gray-300 scrollbar-none sm:border-l md:max-w-[360px]\"\n ></SideMenu>\n </>\n );\n};\n\nexport default FilterMenu;\n","import React, { useMemo, useState } from 'react';\nimport { translate } from '../../Services/translation';\nimport FilterMenu from './FilterMenu';\nimport Icon from '../Icon';\nimport clsx from 'clsx';\nimport { useTypedSelector } from '../../Hooks/useTypedSelector';\n\nconst buttonStyle = clsx(\n 'btn',\n 'btn--small',\n 'btn--white',\n 'text-md',\n 'text-gray-900',\n 'font-medium',\n 'flex',\n 'flex-1',\n 'flex-row',\n 'justify-between',\n 'border-gray-200',\n 'px-4',\n 'py-2',\n 'rounded-none',\n 'relative'\n);\n\ntype CurrentMenuType = 'categories' | 'filters' | 'sorting';\n\nconst FilterBarButtons = () => {\n const [currentMenu, setCurrentMenu] = useState<\n CurrentMenuType | undefined\n >();\n const filters = useTypedSelector(\n (state) => state.productFiltering.filters\n );\n\n const numberOfSelectedOptions = useMemo(() => {\n if (filters) {\n var count = 0;\n for (var i = 0; i < filters.length; i++) {\n var filter = filters[i];\n if (filter && filter.selectedOptions.length > 0) {\n count += filter.selectedOptions.length;\n }\n }\n\n return count;\n }\n\n return 0;\n }, [filters]);\n\n return (\n <>\n <div className=\"mb-3.5 flex lg:hidden\">\n <button\n className={buttonStyle}\n onClick={() => setCurrentMenu('filters')}\n >\n {translate('filter.filter')}\n <Icon className={clsx('h-5 w-5')} name=\"filter\" />\n {numberOfSelectedOptions > 0 && (\n <div\n className={clsx(\n 'top-[9px]',\n 'absolute',\n 'right-[12px]',\n 'flex',\n 'h-4',\n 'w-4',\n 'items-center',\n 'justify-center',\n 'rounded-[100%]',\n 'text-center',\n 'text-xs',\n 'leading-tight',\n 'text-white',\n 'bg-gray-900',\n 'border-white',\n 'border-2'\n )}\n >\n {numberOfSelectedOptions}\n </div>\n )}\n </button>\n <button\n className={buttonStyle}\n onClick={() => setCurrentMenu('sorting')}\n >\n {translate('filter.sort')}\n <Icon className={clsx('h-5 w-5')} name=\"caret-down\" />\n </button>\n </div>\n\n <FilterMenu\n currentMenu={currentMenu}\n setCurrentMenu={setCurrentMenu}\n />\n </>\n );\n};\n\nexport default FilterBarButtons;\n","import React from 'react';\nimport { useDispatch } from 'react-redux';\nimport { useTypedSelector } from '../../Hooks/useTypedSelector';\nimport { translate } from '../../Services/translation';\nimport Dropdown, { DropdownOption } from '../Dropdown';\nimport { onSortItemSelected } from '../../Actions/ProductFiltering.action';\nimport { setProductListingType } from '../../Actions/ProductListing.action';\nimport Icon from '../Icon';\nimport { ProductListingType } from '../../Reducers/ProductListing.reducer';\nimport FilterBarButtons from './FilterBarButtons';\nimport clsx from 'clsx';\n\nconst FilterBar = () => {\n const dispatch = useDispatch();\n const { totalProductsCount, productListingType } = useTypedSelector(\n (state) => state.productListing\n );\n const sortItems = useTypedSelector(\n (state) => state.productFiltering.sortCriteria?.sortItems\n );\n\n const onSortingChanged = (selectedOption: DropdownOption) => {\n const sortItem = sortItems?.find(\n (s) => s.query == selectedOption.value\n );\n if (!sortItem) return;\n\n dispatch(onSortItemSelected(sortItem));\n };\n\n return (\n <>\n <FilterBarButtons />\n <div className=\"mb-4 flex items-center justify-between px-4 md:px-6 lg:mb-6 lg:rounded-sm lg:bg-white lg:pl-3 lg:pr-0\">\n <div className=\"text-md text-gray-500\">\n {translate('general.products').replace(\n '{COUNT}',\n totalProductsCount\n )}\n </div>\n <div className=\"flex items-center gap-6\">\n <div className=\"flex gap-6\">\n <Icon\n name={\n productListingType == ProductListingType.Grid\n ? 'grid-view-active'\n : 'grid-view'\n }\n className={clsx(\n 'grid-icon h-[1.5rem] w-[1.5rem] cursor-pointer'\n )}\n onClick={() =>\n dispatch(setProductListingType(ProductListingType.Grid))\n }\n />\n <Icon\n name={\n productListingType == ProductListingType.List\n ? 'view-agenda-active'\n : 'view-agenda'\n }\n className={clsx(\n 'grid-icon block h-[1.5rem] w-[1.5rem] cursor-pointer'\n )}\n onClick={() =>\n dispatch(setProductListingType(ProductListingType.List))\n }\n />\n <Icon\n name=\"square\"\n className={clsx(\n 'grid-icon hidden h-[1.5rem] w-[1.5rem] cursor-pointer md:hidden',\n productListingType == ProductListingType.Grid\n ? 'text-black'\n : 'text-gray-500'\n )}\n onClick={() =>\n dispatch(\n setProductListingType(ProductListingType.SingleCard)\n )\n }\n />\n </div>\n {sortItems && (\n <div className=\"hidden w-[200px] bg-gray-100 pl-2 lg:block\">\n <Dropdown\n options={sortItems.map((item) => ({\n value: item.query,\n label: item.name,\n }))}\n selectedValue={sortItems.find((s) => s.selected)?.query}\n onChange={onSortingChanged}\n size=\"small\"\n className=\"border-0\"\n />\n </div>\n )}\n </div>\n </div>\n </>\n );\n};\n\nexport default FilterBar;\n","import {\n LOGIN_SET_IS_LOADING,\n LOGIN_SET_ORGANIZATIONS,\n LOGIN_SET_USERNAME_PASSWORD,\n LOGIN_SET_MODAL_OPEN,\n LOGIN_SET_LOGIN_MODE,\n LOGIN_ERROR,\n LOGIN_SET_REDIRECT_URL,\n LOGIN_SET_MAGIC_LINK_MODEL,\n} from '../constants';\nimport { RootState } from '../reducers';\nimport { post } from '../Services/http';\nimport { translate } from '../Services/translation';\nimport LoginMode from '../Types/LoginMode';\nimport LoginOrganization from '../Types/LoginOrganization';\nimport LoginResponse from '../Types/LoginResponse';\nimport { MagicLinkModel } from '../Types/MagicLinkModel';\n\nexport const performLogin = (username: string, password: string) => (\n dispatch\n) => {\n dispatch(setLoginFormLoading(true));\n const redirectUrl = new URLSearchParams(location.search.toLowerCase()).get(\n 'redirecturl'\n );\n\n post(`/api/login${redirectUrl ? `?redirectUrl=${redirectUrl}` : ''}`, {\n username,\n password,\n redirectUrl,\n })\n .then((res) => res.json())\n .then((response: LoginResponse) => dispatch(handleLoginResponse(response)))\n .catch((err) => dispatch(handleErrorResponse(err)));\n};\n\nexport const selectOrganization = (selectedOrganizationId: string) => (\n dispatch,\n getState: () => RootState\n) => {\n dispatch(setLoginFormLoading(true));\n const redirectUrl = getState().login.redirectUrl;\n post(\n `/api/login/organizations/${selectedOrganizationId}${\n redirectUrl ? `?redirectUrl=${redirectUrl}` : ''\n }`,\n {}\n )\n .then((res) => res.json())\n .then((response: LoginResponse) => {\n dispatch(onError(response.error));\n if (response.success) {\n onSuccessfulLogin(response);\n } else {\n dispatch(setLoginFormLoading(false));\n }\n })\n .catch((err) => dispatch(handleErrorResponse(err)));\n};\n\nexport const submitChangePassword = (\n username,\n oldPassword,\n newPassword,\n passwordConfirmation\n) => (dispatch, getState: () => RootState) => {\n if (newPassword !== passwordConfirmation) {\n dispatch(onError(translate('login.password-mismatch')));\n return;\n }\n\n const { redirectUrl, magicLinkModel } = getState().login;\n dispatch(setLoginFormLoading(true));\n post(\n `/api/login/changepassword${\n redirectUrl ? `?redirectUrl=${redirectUrl}` : ''\n }`,\n {\n username,\n oldPassword,\n newPassword,\n magicLinkModel,\n }\n )\n .then((res) => res.json())\n .then((response: LoginResponse) => {\n if (response.success) {\n dispatch(handleLoginResponse(response));\n } else {\n dispatch(onError(response.error));\n dispatch(setLoginFormLoading(false));\n }\n })\n .catch((err) => dispatch(handleErrorResponse(err)));\n};\n\nexport const submitForgotPassword = (username: string): any => (\n dispatch\n): Promise<boolean> => {\n return post('/api/login/forgotpassword', { username })\n .then((res) => res.json())\n .then((response: ForgotPasswordResponse) => {\n dispatch(onError(response.error));\n return response.success;\n })\n .catch((err) => dispatch(handleErrorResponse(err)))\n .finally(() => dispatch(setLoginFormLoading(false)));\n};\n\nexport const setOrganizations = (organizations: LoginOrganization[]) => ({\n type: LOGIN_SET_ORGANIZATIONS,\n payload: {\n organizations,\n },\n});\n\nexport const setUsername = (username: string) => ({\n type: LOGIN_SET_USERNAME_PASSWORD,\n payload: {\n username,\n },\n});\n\nexport const setPassword = (password: string) => ({\n type: LOGIN_SET_USERNAME_PASSWORD,\n payload: {\n password,\n },\n});\n\nexport const setLoginModalOpen = (modalOpen: boolean) => ({\n type: LOGIN_SET_MODAL_OPEN,\n payload: {\n modalOpen,\n },\n});\n\nexport const setLoginMode = (loginMode: LoginMode) => ({\n type: LOGIN_SET_LOGIN_MODE,\n payload: {\n loginMode,\n },\n});\n\nexport const signOut = () => {\n post('/api/mypages/logout', null).then(() => (location.href = '/'));\n};\n\nexport const submitMagicLink = (magicLinkModel: MagicLinkModel) => (\n dispatch\n) => {\n dispatch(setLoginFormLoading(true));\n return post('/api/login/magiclink', magicLinkModel)\n .then((res) => res.json())\n .then((response: LoginResponse) => {\n dispatch(handleLoginResponse(response));\n })\n .catch((err) => {\n dispatch(setLoginMode(LoginMode.Login));\n dispatch(setMagicLinkModel(undefined));\n return dispatch(handleErrorResponse(err));\n })\n .finally(() => dispatch(setLoginFormLoading(false)));\n};\n\nconst setMagicLinkModel = (magicLinkModel?: MagicLinkModel) => ({\n type: LOGIN_SET_MAGIC_LINK_MODEL,\n payload: {\n magicLinkModel,\n },\n});\n\nconst handleErrorResponse = (err) => (dispatch) => {\n err.response.json().then((data) => dispatch(onError(data.error)));\n dispatch(setLoginFormLoading(false));\n};\n\nconst onError = (error?: string) => ({\n type: LOGIN_ERROR,\n payload: {\n error,\n },\n});\n\nconst setLoginFormLoading = (isLoading: boolean) => ({\n type: LOGIN_SET_IS_LOADING,\n payload: {\n isLoading,\n },\n});\n\nconst handleLoginResponse = (response: LoginResponse) => (dispatch) => {\n dispatch(onError(response.error));\n\n if (response.success) {\n if (response.requestToken) {\n localStorage.setItem('requestVerificationToken', response.requestToken);\n }\n\n dispatch(setRedirectUrl(response.redirectUrl));\n\n if (response.mustChangePassword) {\n dispatch(setLoginMode(LoginMode.ChangePassword));\n dispatch(setLoginFormLoading(false));\n } else if (!response.organizations && !response.mustChangePassword) {\n onSuccessfulLogin(response);\n } else if (response.organizations) {\n dispatch(setOrganizations(response.organizations));\n dispatch(setLoginMode(LoginMode.SelectOrganization));\n dispatch(setLoginFormLoading(false));\n }\n } else {\n dispatch(setLoginFormLoading(false));\n }\n};\n\nconst setRedirectUrl = (redirectUrl?: string) => ({\n type: LOGIN_SET_REDIRECT_URL,\n payload: {\n redirectUrl,\n },\n});\n\nconst onSuccessfulLogin = (response: LoginResponse) => {\n if (response.redirectUrl) {\n location.href = response.redirectUrl;\n } else {\n location.reload();\n }\n};\n\ninterface ForgotPasswordResponse {\n success: boolean;\n error?: string;\n}\n","import React from 'react';\nimport { useNavigate, useLocation } from 'react-router-dom';\nimport Icon from '../Icon';\nimport { signOut } from '../../Actions/Login.action';\nimport { translate } from '../../Services/translation';\nimport { useTypedSelector } from '../../Hooks/useTypedSelector';\n\nconst MyPagesMobileMenu = ({ navigation }) => {\n const navigate = useNavigate();\n const { pathname } = useLocation();\n const { current: userInfo } = useTypedSelector(\n (state) => state.userInfo\n );\n\n return (\n <div className=\"relative mb-4 h-14 overflow-hidden rounded border border-solid border-gray-300 lg:hidden\">\n <label\n htmlFor=\"menu\"\n className=\"pointer-events-none absolute flex h-full w-full items-center justify-between px-4 capitalize\"\n >\n <div className=\"flex flex-col justify-center\">\n <span className=\"color-gray-600 text-md\">\n {userInfo?.currentOrganizationName ??\n translate('mypage.site.title')}\n </span>\n <h5 className=\"name\">\n {userInfo?.firstName} {userInfo?.lastName}\n </h5>\n </div>\n <Icon name=\"caret-down\" className=\"h-6 w-6 text-gray-900\" />\n </label>\n <select\n id=\"menu\"\n defaultValue={pathname}\n onChange={(e) => {\n e.target.value == 'log-out'\n ? signOut()\n : navigate(e.target.value);\n }}\n className=\"mb-4 h-full w-full border-0 text-transparent focus:outline-none\"\n >\n {navigation.map((option) => (\n <option\n value={option.url}\n key={option.url + 'mobile'}\n className=\"text-md text-gray-900\"\n >\n {option.name}\n </option>\n ))}\n <option value=\"log-out\" className=\"text-md text-gray-900\">\n {translate('general.sign-out')}\n </option>\n </select>\n </div>\n );\n};\n\nexport default MyPagesMobileMenu;\n","import React from 'react';\nimport { NavLink } from 'react-router-dom';\nimport Icon from '../Icon';\nimport { signOut } from '../../Actions/Login.action';\nimport { translate } from '../../Services/translation';\nimport { useTypedSelector } from '../../Hooks/useTypedSelector';\n\nconst MyPagesDesktopMenu = ({ navigation }) => {\n const { current: userInfo } = useTypedSelector(\n (state) => state.userInfo\n );\n\n return (\n <div className=\"hidden lg:block\">\n <div className=\"mb-3 flex flex-col capitalize\">\n <span className=\"color-gray-600 text-md\">\n {userInfo?.currentOrganizationName ??\n translate('mypage.site.title')}\n </span>\n <h5 className=\"name\">\n {userInfo?.firstName} {userInfo?.lastName}\n </h5>\n </div>\n <ul className=\"overflow-hidden rounded border border-solid border-gray-300\">\n {navigation.map((option) => (\n <li\n className=\"flex border-b border-solid border-gray-300 [&_.active]:bg-gray-100 [&_.active]:font-bold\"\n key={option.url + 'desktop'}\n >\n <NavLink\n className=\"flex-1 px-3 py-2 text-md hover:bg-gray-100 [&_:last-child]:border-b-0\"\n to={option.url}\n end={option.url == '/'}\n >\n {option.name}\n </NavLink>\n </li>\n ))}\n <li\n className=\"flex flex-1 cursor-pointer items-center p-2 px-3 text-md hover:bg-gray-100\"\n onClick={signOut}\n >\n <Icon name=\"logout\" className=\"mr-2 h-5 w-5 text-error-500\" />\n {translate('general.sign-out')}\n </li>\n </ul>\n </div>\n );\n};\n\nexport default MyPagesDesktopMenu;\n","import { USER_INFO_UPDATE, USER_INFO_SET_ERRORS } from '../constants';\nimport { userInfoActions } from '../Reducers/UserInfo.reducer';\nimport { post } from '../Services/http';\nimport { translate } from '../Services/translation';\nimport Address from '../Types/Address';\nimport { UserInfoModel } from '../Types/UserInfoModel';\n\nconst BASE_ROUTE = '/api/userinfo';\n\ninterface ResponseError extends Error {\n response?: Response;\n}\n\nconst handleErrorResponse = (error: ResponseError) => async (dispatch) => {\n if (error.response) {\n const res = error.response;\n const isJson = res.headers\n .get('content-type')\n ?.includes('application/json');\n const data = isJson ? await res.json() : { general: await res.text() };\n\n dispatch(userInfoActions.setErrors(data));\n dispatch(userInfoActions.setSuccessMessage(undefined));\n }\n};\n\nexport const setUserInfoErrors = (errors: {\n [key: string]: string[];\n}) => ({\n type: USER_INFO_SET_ERRORS,\n payload: {\n errors,\n },\n});\n\nexport const saveUserInfo =\n (userInfo: UserInfoModel): any =>\n (dispatch) => {\n return post(`${BASE_ROUTE}/details`, userInfo)\n .then(() => {\n dispatch(userInfoActions.updateUserInfo(userInfo));\n dispatch(userInfoActions.resetErrors());\n dispatch(\n userInfoActions.setSuccessMessage(\n translate('general.changes-saved')\n )\n );\n })\n .catch((err) => dispatch(handleErrorResponse(err)));\n };\n\nexport const savePassword =\n (password: string): any =>\n (dispatch) => {\n return post(`${BASE_ROUTE}/password`, { password })\n .then(() => {\n dispatch(userInfoActions.resetErrors());\n dispatch(\n userInfoActions.setSuccessMessage(\n translate('general.changes-saved')\n )\n );\n })\n .catch((err) => dispatch(handleErrorResponse(err)));\n };\n\nexport const saveAddress =\n (address: Address): any =>\n (dispatch) => {\n return post(`${BASE_ROUTE}/address`, address)\n .then(() => {\n dispatch(userInfoActions.updateAddress(address));\n dispatch(userInfoActions.resetErrors());\n dispatch(\n userInfoActions.setSuccessMessage(\n translate('general.changes-saved')\n )\n );\n })\n .catch((err) => dispatch(handleErrorResponse(err)));\n };\n\nexport const saveDeliveryAddress =\n (address: Address): any =>\n (dispatch) => {\n return post(`${BASE_ROUTE}/deliveryaddress`, address)\n .then(() => {\n dispatch(userInfoActions.updateDeliveryAddress(address));\n dispatch(userInfoActions.resetErrors());\n dispatch(\n userInfoActions.setSuccessMessage(\n translate('general.changes-saved')\n )\n );\n })\n .catch((err) => dispatch(handleErrorResponse(err)));\n };\n\nexport const setUserInfo = (userInfo: UserInfoModel) => ({\n type: USER_INFO_UPDATE,\n payload: userInfo,\n});\n","import { useDispatch } from 'react-redux';\nimport { AppDispatch } from '../store';\n\nexport const useTypedDispatch: () => AppDispatch = useDispatch;\n","import React, { useCallback, useEffect, useState } from 'react';\nimport { translate } from '../../Services/translation';\nimport Input from '../Inputs/Input';\nimport { useTypedSelector } from '../../Hooks/useTypedSelector';\nimport {\n saveAddress,\n saveDeliveryAddress,\n savePassword,\n saveUserInfo,\n} from '../../Actions/UserInfo.action';\nimport { useTypedDispatch } from '../../Hooks/useTypedDispatch';\nimport Icon from '../Icon';\nimport Dropdown from '../Dropdown';\n\nconst MyPagesSettings = () => {\n const {\n current: userInfo,\n errors = {},\n successMessage,\n } = useTypedSelector((state) => state.userInfo);\n const [address, setAddress] = useState(userInfo?.address);\n const [deliveryAddress, setDeliveryAddress] = useState(\n userInfo?.deliveryAddress\n );\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [userInfoForm, setUserInfoForm] = useState(userInfo);\n const [password, setPassword] = useState('');\n const [confirmPassword, setConfirmPassword] = useState('');\n const [confirmPasswordError, setConfirmPasswordError] = useState();\n const dispatch = useTypedDispatch();\n const countriesList = globalThis.LitiumConstants.countries;\n\n const setUserInfoValue = (key: string, value: any) => {\n if (!userInfoForm) return;\n\n const userInfoCopy = Object.assign({}, userInfoForm);\n userInfoCopy[key] = value;\n setUserInfoForm(userInfoCopy);\n };\n\n const setAddressValue = (key: string, value: string) => {\n if (!userInfo) return;\n const _address = { ...(address ?? userInfo.address) };\n _address[key] = value;\n setAddress(_address);\n };\n\n const setDeliveryAddressValue = (key: string, value: string) => {\n if (!userInfo) return;\n const _address = { ...(deliveryAddress ?? userInfo.deliveryAddress) };\n _address[key] = value;\n setDeliveryAddress(_address);\n };\n\n const submitChangePassword = (e: any) => {\n e.preventDefault();\n if (!password || !confirmPassword) {\n return;\n }\n\n if (password !== confirmPassword) {\n setConfirmPasswordError(\n translate('login.confirm-password.must-match')\n );\n return;\n } else {\n setConfirmPasswordError(undefined);\n }\n\n setIsLoading(true);\n dispatch(savePassword(password)).finally(() => setIsLoading(false));\n };\n\n const submitCustomerInfo = (e: any) => {\n e.preventDefault();\n if (userInfoForm) {\n setIsLoading(true);\n dispatch(saveUserInfo(userInfoForm)).finally(() =>\n setIsLoading(false));\n }\n };\n\n const submitAddress = (e: any) => {\n e.preventDefault();\n if(address) {\n setIsLoading(true);\n dispatch(saveAddress(address)).finally(() => \n setIsLoading(false));\n }\n };\n\n const submitDeliveryAddress = (e: any) => {\n e.preventDefault();\n if(deliveryAddress) {\n setIsLoading(true);\n dispatch(saveDeliveryAddress(deliveryAddress)).finally(() =>\n setIsLoading(false));\n }\n };\n\n const hasErrors = useCallback(\n (key: string) => errors[key] && errors[key]?.length,\n [errors]\n );\n const getErrorMessages = useCallback(\n (key: string) =>\n errors[key]?.map((err, idx) => <p key={key + err + idx}>{err}</p>),\n [errors]\n );\n\n useEffect(() => {\n if (errors['general']?.length || !!successMessage) {\n window.scrollTo({ top: 0, behavior: 'smooth' });\n }\n }, [errors, successMessage]);\n\n return (\n <div className=\"col-span-2\">\n <h1 className=\"mb-2\">{translate('mypage.info.title')}</h1>\n {userInfo?.myPageUserInfoText && (\n <p\n className=\"mb-4 max-w-3xl text-md lg:mb-6\"\n dangerouslySetInnerHTML={{\n __html: userInfo.myPageUserInfoText ?? '',\n }}\n ></p>\n )}\n {hasErrors('general') ? (\n <div className=\"mb-4 flex items-center gap-1 text-md text-error-500\">\n <Icon name=\"warning\" />\n <span>{errors['general'] && errors['general'][0]}</span>\n </div>\n ) : null}\n {successMessage ? (\n <div className=\"mb-4 flex items-center gap-1 text-md font-bold text-success-500\">\n <Icon name=\"check\" />\n <span>{successMessage}</span>\n </div>\n ) : null}\n <form className=\"mb-8 flex flex-col\">\n {userInfo?.isCompanyUser && (\n <Input\n inputSize=\"large\"\n label={translate('mypage.person.companyname')}\n wrapperClassName=\"mb-4 [&_.input]:text-lg\"\n placeholder={translate('general.placeholder.companyname')}\n onChange={(e) =>\n setUserInfoValue('companyName', e.target.value)\n }\n type=\"text\"\n id=\"companyName\"\n value={userInfoForm?.companyName ?? ''}\n disabled={isLoading}\n inputState={hasErrors('CompanyName') ? 'error' : 'default'}\n message={getErrorMessages('CompanyName')}\n required\n />\n )}\n <Input\n inputSize=\"large\"\n label={translate('mypage.person.firstname')}\n wrapperClassName=\"mb-4 [&_.input]:text-lg\"\n placeholder={translate('general.placeholder.firstname')}\n onChange={(e) => setUserInfoValue('firstName', e.target.value)}\n type=\"text\"\n id=\"fname\"\n value={userInfoForm?.firstName ?? ''}\n disabled={isLoading}\n inputState={hasErrors('FirstName') ? 'error' : 'default'}\n message={getErrorMessages('FirstName')}\n required\n />\n <Input\n inputSize=\"large\"\n label={translate('mypage.person.lastname')}\n wrapperClassName=\"mb-4 [&_.input]:text-lg\"\n placeholder={translate('general.placeholder.lastname')}\n onChange={(e) => setUserInfoValue('lastName', e.target.value)}\n type=\"text\"\n id=\"lname\"\n value={userInfoForm?.lastName ?? ''}\n disabled={isLoading}\n required\n />\n <Input\n inputSize=\"large\"\n label={translate('mypage.person.email')}\n wrapperClassName=\"mb-4 [&_.input]:text-lg\"\n placeholder={translate('general.placeholder.email')}\n onChange={(e) => setUserInfoValue('email', e.target.value)}\n type=\"email\"\n id=\"email\"\n value={userInfoForm?.email ?? ''}\n disabled={isLoading}\n inputState={\n hasErrors('Email')\n ? 'error'\n : hasErrors('username')\n ? 'error'\n : 'default'\n }\n message={\n getErrorMessages('Email') || getErrorMessages('username')\n }\n />\n <Input\n inputSize=\"large\"\n label={translate('mypage.person.phone')}\n wrapperClassName=\"mb-4 [&_.input]:text-lg\"\n placeholder={translate('general.placeholder.phone')}\n onChange={(e) => setUserInfoValue('phone', e.target.value)}\n type=\"tel\"\n id=\"tel\"\n value={userInfoForm?.phone ?? ''}\n disabled={isLoading}\n inputState={hasErrors('Phone') ? 'error' : 'default'}\n message={getErrorMessages('Phone')}\n />\n <button\n className=\"btn btn--large btn--primary mt-2 mb-8 w-full lg:mt-4\"\n disabled={isLoading}\n onClick={submitCustomerInfo}\n >\n {translate('mypage.customer-info.save')}\n </button>\n <h4 className=\"mb-4 mt-2 text-[20.25px]\">\n {translate('mypage.address.delivery.address')}\n </h4>\n <Input\n inputSize=\"large\"\n label={translate('mypage.address.careof')}\n wrapperClassName=\"mb-4 [&_.input]:text-lg\"\n placeholder={translate('general.placeholder.careof')}\n type=\"text\"\n id=\"careOf\"\n disabled={isLoading}\n value={address?.careOf ?? ''}\n onChange={(e) => setAddressValue('careOf', e.target.value)}\n inputState={hasErrors('CareOf') ? 'error' : 'default'}\n message={getErrorMessages('CareOf')}\n />\n <Input\n inputSize=\"large\"\n label={translate('mypage.address.address')}\n wrapperClassName=\"mb-4 [&_.input]:text-lg\"\n placeholder={translate('general.placeholder.address')}\n type=\"text\"\n id=\"address\"\n disabled={isLoading}\n value={address?.address1 ?? ''}\n onChange={(e) => setAddressValue('address1', e.target.value)}\n inputState={hasErrors('address') ? 'error' : 'default'}\n message={getErrorMessages('address')}\n required\n />\n <Input\n inputSize=\"large\"\n label={translate('mypage.address.zipcode')}\n wrapperClassName=\"mb-4 [&_.input]:text-lg\"\n placeholder={translate('general.placeholder.zipcode')}\n type=\"text\"\n id=\"zipCode\"\n disabled={isLoading}\n value={address?.zipCode ?? ''}\n onChange={(e) => setAddressValue('zipCode', e.target.value)}\n inputState={hasErrors('ZipCode') ? 'error' : 'default'}\n message={getErrorMessages('ZipCode')}\n required\n />\n <Input\n inputSize=\"large\"\n label={translate('mypage.address.city')}\n wrapperClassName=\"mb-4 [&_.input]:text-lg\"\n placeholder={translate('general.placeholder.city')}\n type=\"text\"\n id=\"city\"\n disabled={isLoading}\n value={address?.city ?? ''}\n onChange={(e) => setAddressValue('city', e.target.value)}\n inputState={hasErrors('City') ? 'error' : 'default'}\n message={getErrorMessages('City')}\n required\n />\n <Dropdown\n selectedValue={address?.country}\n className=\"mb-4 [&_.dropdown-select]:p-3\"\n options={countriesList.map((country) => ({\n value: country.value,\n label: country.text,\n }))}\n size=\"small\"\n placeholder={translate('general.placeholder.country')}\n onChange={({ value }) => setAddressValue('country', value)}\n disabled={isLoading}\n label={translate('mypage.address.country')}\n />\n <button\n className=\"btn btn--large btn--primary mt-2 mb-8 w-full lg:mt-4\"\n disabled={isLoading}\n onClick={submitAddress}\n >\n {translate('mypage.address.save')}\n </button>\n <h4 className=\"mb-4 mt-2 text-[20.25px]\">\n {translate('mypage.address.delivery.alternative.address')}\n </h4>\n <Input\n inputSize=\"large\"\n label={translate('mypage.address.careof')}\n wrapperClassName=\"mb-4 [&_.input]:text-lg\"\n placeholder={translate('general.placeholder.careof')}\n type=\"text\"\n id=\"altCareOf\"\n disabled={isLoading}\n value={deliveryAddress?.careOf ?? ''}\n onChange={(e) =>\n setDeliveryAddressValue('careOf', e.target.value)\n }\n inputState={hasErrors('CareOf') ? 'error' : 'default'}\n message={getErrorMessages('CareOf')}\n />\n <Input\n inputSize=\"large\"\n label={translate('mypage.address.address')}\n wrapperClassName=\"mb-4 [&_.input]:text-lg\"\n placeholder={translate('general.placeholder.address')}\n type=\"text\"\n id=\"altAddress\"\n disabled={isLoading}\n value={deliveryAddress?.address1 ?? ''}\n onChange={(e) =>\n setDeliveryAddressValue('address1', e.target.value)\n }\n inputState={hasErrors('address') ? 'error' : 'default'}\n message={getErrorMessages('address')}\n required\n />\n <Input\n inputSize=\"large\"\n label={translate('mypage.address.zipcode')}\n wrapperClassName=\"mb-4 [&_.input]:text-lg\"\n placeholder={translate('general.placeholder.zipcode')}\n type=\"text\"\n id=\"altZipCode\"\n disabled={isLoading}\n value={deliveryAddress?.zipCode ?? ''}\n onChange={(e) =>\n setDeliveryAddressValue('zipCode', e.target.value)\n }\n inputState={hasErrors('ZipCode') ? 'error' : 'default'}\n message={getErrorMessages('ZipCode')}\n required\n />\n <Input\n inputSize=\"large\"\n label={translate('mypage.address.city')}\n wrapperClassName=\"mb-4 [&_.input]:text-lg\"\n placeholder={translate('general.placeholder.city')}\n type=\"text\"\n id=\"altCity\"\n disabled={isLoading}\n value={deliveryAddress?.city ?? ''}\n onChange={(e) => setDeliveryAddressValue('city', e.target.value)}\n inputState={hasErrors('City') ? 'error' : 'default'}\n message={getErrorMessages('City')}\n required\n />\n <Dropdown\n selectedValue={deliveryAddress?.country}\n className=\"mb-4 [&_.dropdown-select]:p-3\"\n options={countriesList.map((country) => ({\n value: country.value,\n label: country.text,\n }))}\n size=\"small\"\n placeholder={translate('general.placeholder.country')}\n onChange={({ value }) =>\n setDeliveryAddressValue('country', value)\n }\n disabled={isLoading}\n label={translate('mypage.address.country')}\n />\n <button\n className=\"btn btn--large btn--primary mt-2 w-full lg:mt-4\"\n disabled={isLoading}\n onClick={submitDeliveryAddress}\n >\n {translate('mypage.alternative-address.save')}\n </button>\n </form>\n {userInfo?.mayEditLogin && (\n <form className=\"flex flex-col\">\n <Input\n inputSize=\"large\"\n label={translate('form.new-password')}\n wrapperClassName=\"mb-4 [&_.input]:text-lg\"\n placeholder={translate('general.placeholder.password')}\n type=\"password\"\n id=\"password\"\n disabled={isLoading}\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n inputState={hasErrors('password') ? 'error' : 'default'}\n message={getErrorMessages('password')}\n required\n />\n <Input\n inputSize=\"large\"\n label={translate('login.confirm-password')}\n wrapperClassName=\"mb-4 [&_.input]:text-lg\"\n placeholder={translate('general.placeholder.password')}\n type=\"password\"\n id=\"confirmpassword\"\n disabled={isLoading}\n onChange={(e) => setConfirmPassword(e.target.value)}\n inputState={confirmPasswordError ? 'error' : 'default'}\n message={confirmPasswordError}\n required\n />\n <button\n className=\"btn btn--large btn--primary mt-2 w-full lg:mt-4\"\n disabled={isLoading || !password || !confirmPassword}\n onClick={submitChangePassword}\n >\n {translate('form.update-password')}\n </button>\n </form>\n )}\n </div>\n );\n};\n\nexport default MyPagesSettings;\n","import { ViewMode, PaginationOptions } from '../constants';\nimport { get, post } from '../Services/http';\nimport { catchError } from './Error.action';\n\nimport {\n ORDER_RECEIVE,\n ORDER_ERROR,\n ORDER_CHANGE_MODE,\n ORDER_CHANGE_CURRENTPAGE,\n ORDER_SET_ORDER,\n ORDER_SET_IS_LOADING,\n} from '../constants';\n\nconst rootRoute = '/api/order';\n\nexport const changeMode = (mode) => ({\n type: ORDER_CHANGE_MODE,\n payload: {\n mode,\n },\n});\n\nconst setIsLoading = (isLoading) => ({\n type: ORDER_SET_IS_LOADING,\n payload: {\n isLoading,\n },\n});\n\nexport const query = (\n pageIndex = 1,\n showOnlyMyOrders = false,\n pageSize = PaginationOptions.PageSize,\n orderId = null,\n showOrderDetail = false\n) => (dispatch) => {\n dispatch(setIsLoading(true));\n return get(\n `${rootRoute}?pageIndex=${pageIndex}&showMyOrders=${showOnlyMyOrders}&pageSize=${pageSize}`\n )\n .then((response) => response.json())\n .then((result) => {\n dispatch(\n receive(\n result.orders,\n result.totalCount,\n pageIndex,\n showOnlyMyOrders,\n showOrderDetail ? ViewMode.Detail : ViewMode.List\n )\n );\n if (orderId && showOrderDetail) {\n const order = result.orders.find((order) => order.orderId === orderId);\n dispatch(setOrder(order || {}));\n }\n })\n .catch((ex) => dispatch(catchError(ex, (error) => setError(error))))\n .finally(() => dispatch(setIsLoading(false)));\n};\n\nexport const approveOrder = (orderId, callback) => (dispatch) => {\n return post(`${rootRoute}/approveOrder`, {\n id: orderId,\n })\n .then((response) => response.json())\n .then((result) => {\n callback && callback(result);\n })\n .catch((ex) => dispatch(catchError(ex, (error) => setError(error))));\n};\n\nexport const getOrder = (orderId) => (dispatch) => {\n return get(`${rootRoute}/${orderId}`)\n .then((response) => response.json())\n .then((result) => {\n dispatch(setOrder(result));\n })\n .catch((ex) => dispatch(catchError(ex, (error) => setError(error))));\n};\n\nconst receive = (\n list,\n totalCount,\n currentPage,\n showOnlyMyOrders,\n mode = ViewMode.List\n) => ({\n type: ORDER_RECEIVE,\n payload: {\n list,\n mode,\n totalCount,\n currentPage,\n showOnlyMyOrders,\n },\n});\n\nexport const changeCurrentPage = (currentPage) => ({\n type: ORDER_CHANGE_CURRENTPAGE,\n payload: {\n currentPage,\n },\n});\n\nexport const setError = (error) => ({\n type: ORDER_ERROR,\n payload: {\n error,\n },\n});\n\nexport const setOrder = (order) => ({\n type: ORDER_SET_ORDER,\n payload: {\n order,\n },\n});\n","import React from 'react';\nimport { translate } from '../../../Services/translation';\nimport clsx from 'clsx';\n\nconst OrderListItemMobile = ({ order, onClick }) => {\n return (\n <li\n className={clsx(\n 'p-4',\n 'border',\n 'border-solid',\n 'border-gray-300',\n 'rounded',\n 'mb-4'\n )}\n >\n <p className={clsx('text-md', 'font-bold', 'mb-3')}>\n {translate('orderlist.column.ordernumber')}:{' '}\n {order.externalOrderID}\n </p>\n <div className={clsx('grid', 'grid-cols-2', 'md:grid-cols-5')}>\n <div className={clsx('flex', 'flex-col')}>\n <p className={clsx('text-sm', 'uppercase', 'text-gray-600')}>\n {translate('orderlist.column.quantity')}\n </p>\n <p className={clsx('text-md')}>{order.orderRows.length}</p>\n </div>\n <div className={clsx('flex', 'flex-col')}>\n <p className={clsx('text-sm', 'uppercase', 'text-gray-600')}>\n {translate('orderlist.column.grandtotal')}\n </p>\n <p className={clsx('text-md')}>{order.orderGrandTotal}</p>\n </div>\n <div className={clsx('flex', 'flex-col')}>\n <p className={clsx('text-sm', 'uppercase', 'text-gray-600')}>\n {translate('orderlist.column.orderdate')}\n </p>\n <p className={clsx('text-md')}>{order.orderDate}</p>\n </div>\n <div className={clsx('flex', 'flex-col')}>\n <p className={clsx('text-sm', 'uppercase', 'text-gray-600')}>\n {translate('orderlist.column.status')}\n </p>\n <p className={clsx('text-md')}>{order.status}</p>\n </div>\n <button\n onClick={() => onClick && onClick(order)}\n className={clsx(\n 'btn',\n 'btn--outline',\n 'btn--small',\n 'col-span-2',\n 'mt-3',\n 'font-bold',\n 'md:col-span-1',\n 'md:mt-0'\n )}\n >\n {translate('orderlist.column.readmore')}\n </button>\n </div>\n </li>\n );\n};\n\nexport default OrderListItemMobile;\n","import React from 'react';\nimport { translate } from '../../../Services/translation';\nimport clsx from 'clsx';\n\nconst OrderListItemDesktop = ({ order, onClick }) => {\n return (\n <li\n className={clsx(\n 'grid',\n 'grid-cols-6',\n 'p-2',\n 'gap-4',\n 'border',\n 'border-solid',\n 'border-gray-300',\n '[&:nth-child(even)]:bg-gray-100',\n '[&:last-child]:border-b-0'\n )}\n >\n <span className={clsx('text-md')}>{order.externalOrderID}</span>\n <span className={clsx('text-md')}>{order.orderRows.length}</span>\n <span className={clsx('text-md')}>{order.orderGrandTotal}</span>\n <span className={clsx('text-md')}>{order.orderDate}</span>\n <span className={clsx('text-md')}>{order.status}</span>\n <a\n className={clsx(\n 'text-md',\n 'text-primary-500',\n 'cursor-pointer',\n 'underline',\n 'text-right'\n )}\n onClick={() => onClick && onClick(order)}\n >\n {translate('orderlist.column.readmore')}\n </a>\n </li>\n );\n};\n\nexport default OrderListItemDesktop;\n","import { PaginationOptions } from '../constants';\n\nexport interface Pager {\n pageCount?: number;\n pageSize?: number;\n displayedEntries?: number;\n edgeEntries?: number;\n}\n\nexport const calculatePager = (\n totalCount = 0,\n currentPage = 1,\n options: Pager = {}\n) => {\n const {\n pageSize = PaginationOptions.PageSize,\n displayedEntries = PaginationOptions.DisplayedEntries,\n edgeEntries = PaginationOptions.EdgeEntries,\n } = options;\n\n const pageCount =\n pageSize && pageSize > 0 ? Math.ceil(totalCount / pageSize) : 0;\n const interval = getInterval(pageCount, currentPage, displayedEntries);\n\n return {\n totalCount,\n pageSize,\n currentPageIndex: currentPage,\n pageCount,\n edgeEntries,\n intervalStart: interval[0],\n intervalEnd: interval[1],\n };\n};\n\nconst getInterval = (\n pageCount: number,\n currentPageIndex: number,\n displayedEntries: number\n) => {\n const internalPageIndex = currentPageIndex - 1;\n const half = Math.ceil(displayedEntries / 2);\n const upperLimit = pageCount - displayedEntries;\n const start =\n internalPageIndex > half\n ? Math.max(Math.min(internalPageIndex - half, upperLimit), 0)\n : 0;\n const end =\n internalPageIndex > half\n ? Math.min(internalPageIndex + half, pageCount)\n : Math.min(displayedEntries, pageCount);\n\n return [start, end];\n};\n","import React from 'react';\nimport Icon from './Icon';\nimport clsx from 'clsx';\n\ninterface PaginationItemProps {\n name?: string | number;\n icon?: string;\n current?: boolean;\n disabled?: boolean;\n onChange?: () => void;\n}\n\nconst PaginationItem = ({\n name = '',\n icon = '',\n current = false,\n disabled = false,\n onChange,\n}: PaginationItemProps) => {\n return (\n <li\n className={clsx(\n 'pagination-item',\n 'border-t-[1px]',\n 'border-b-[1px]',\n 'border-l-[1px]',\n 'rounded-sm',\n 'border-gray-200',\n 'first-of-type:border-r-0',\n 'last-of-type:border-r-[1px]'\n )}\n >\n <a\n className={clsx(\n current\n ? 'cursor-default bg-gray-100'\n : 'cursor-pointer bg-white',\n disabled && 'pointer-events-none',\n 'text-md',\n 'font-bold',\n 'w-10',\n 'h-10',\n 'flex',\n 'justify-center',\n 'items-center'\n )}\n onClick={() => onChange && onChange()}\n >\n {name ? name : null}\n {icon ? <Icon name={icon} className=\"h-5 w-5\" /> : null}\n </a>\n </li>\n );\n};\n\nconst RenderFirstHalfItems = ({\n intervalStart,\n edgeEntries,\n currentPageIndex,\n onChange,\n}) => {\n const renderItems: JSX.Element[] = [];\n const end = Math.min(edgeEntries, intervalStart);\n for (let i = 0; i < end; i++) {\n const publicPageIndex = i + 1;\n renderItems.push(\n <PaginationItem\n key={publicPageIndex}\n name={publicPageIndex}\n current={i === currentPageIndex}\n onChange={() => onChange(publicPageIndex)}\n />\n );\n }\n if (edgeEntries < intervalStart) {\n renderItems.push(\n <PaginationItem key=\"first_indicator\" name=\"...\" disabled={true} />\n );\n }\n return <>{renderItems}</>;\n};\n\nconst RenderMiddleItems = ({\n intervalStart,\n intervalEnd,\n currentPageIndex,\n onChange,\n}) => {\n const renderItems: JSX.Element[] = [];\n for (let i = intervalStart; i < intervalEnd; i++) {\n const publicPageIndex = i + 1;\n renderItems.push(\n <PaginationItem\n key={publicPageIndex}\n name={publicPageIndex}\n current={\n currentPageIndex == 0 && i == 0\n ? true\n : publicPageIndex === currentPageIndex\n }\n onChange={() => onChange(publicPageIndex)}\n />\n );\n }\n return <>{renderItems}</>;\n};\n\nconst RenderSecondHalfItems = ({\n intervalEnd,\n edgeEntries,\n pageCount,\n currentPageIndex,\n onChange,\n}) => {\n const renderItems: JSX.Element[] = [];\n if (pageCount - edgeEntries > intervalEnd) {\n renderItems.push(\n <PaginationItem key=\"second_indicator\" name=\"...\" disabled={true} />\n );\n }\n const begin = Math.max(pageCount - edgeEntries, intervalEnd);\n for (let i = begin; i < pageCount; i++) {\n const publicPageIndex = i + 1;\n renderItems.push(\n <PaginationItem\n key={publicPageIndex}\n name={publicPageIndex}\n current={i === currentPageIndex}\n onChange={() => onChange(publicPageIndex)}\n />\n );\n }\n return <>{renderItems}</>;\n};\n\nconst Pagination = ({ model, onChange }) => {\n const {\n currentPageIndex,\n pageCount,\n intervalStart,\n intervalEnd,\n edgeEntries,\n } = model;\n\n return (\n <>\n {pageCount > 1 && (\n <ul className=\"mb-6 flex items-center justify-center pt-6 lg:mb-10 lg:pt-12\">\n {currentPageIndex > 1 && (\n <PaginationItem\n icon=\"chevron-left\"\n current={false}\n disabled={false}\n onChange={() => onChange(currentPageIndex - 1)}\n />\n )}\n {intervalStart > 0 && edgeEntries > 0 && (\n <RenderFirstHalfItems\n intervalStart={intervalStart}\n edgeEntries={edgeEntries}\n currentPageIndex={currentPageIndex}\n onChange={onChange}\n />\n )}\n <RenderMiddleItems\n intervalStart={intervalStart}\n intervalEnd={intervalEnd}\n currentPageIndex={currentPageIndex}\n onChange={onChange}\n />\n {intervalEnd < pageCount && edgeEntries > 0 && (\n <RenderSecondHalfItems\n intervalEnd={intervalEnd}\n pageCount={pageCount}\n edgeEntries={edgeEntries}\n currentPageIndex={currentPageIndex}\n onChange={onChange}\n />\n )}\n {currentPageIndex < pageCount && (\n <PaginationItem\n icon=\"chevron-right\"\n current={false}\n disabled={false}\n onChange={() => onChange(currentPageIndex + 1)}\n />\n )}\n </ul>\n )}\n </>\n );\n};\n\nexport default Pagination;\n","import React from 'react';\nimport clsx from 'clsx';\n\nconst SkeletonListItemDesktop = ({ items, cells, loading }) => {\n return (\n <>\n {loading &&\n [...Array(items)].map((e, index) => (\n <li\n className={clsx(\n 'skeleton',\n 'grid',\n `grid-cols-${cells}`,\n 'py-3',\n 'px-2',\n 'gap-4',\n 'border-b',\n 'border-solid',\n 'border-gray-300',\n '[&_:nth-child(even)]:bg-gray-100',\n '[&_:last-child]:border-b-0'\n )}\n key={index}\n >\n {[...Array(cells - 1)].map((e, index) => (\n <span\n className={clsx('skeleton', 'max-w-[100px]')}\n key={index}\n >\n \n </span>\n ))}\n </li>\n ))}\n </>\n );\n};\n\nexport default SkeletonListItemDesktop;\n","import React from 'react';\nimport clsx from 'clsx';\n\nconst SkeletonListItemMobile = ({ items, cells, loading }) => {\n return (\n <>\n {loading &&\n [...Array(items)].map((e, index) => (\n <li\n className={clsx(\n 'flex',\n 'flex-col',\n 'gap-2',\n 'p-4',\n 'border',\n 'border-solid',\n 'border-gray-300',\n 'rounded',\n 'mb-4'\n )}\n key={index}\n >\n <span\n className=\"skeleton max-w-[40%] rounded-sm bg-gray-200\"\n key={index}\n >\n \n </span>\n <div\n className={clsx(\n 'grid',\n `grid-cols-${cells - 3}`,\n `md:grid-cols-${cells}`\n )}\n >\n {[...Array(cells - 1)].map((e, index) => (\n <div\n className=\"flex max-w-[40%] flex-col gap-[2px]\"\n key={index}\n >\n <span className=\"skeleton rounded-sm bg-gray-200\">\n \n </span>\n <span className=\"skeleton rounded-sm bg-gray-200\">\n \n </span>\n </div>\n ))}\n </div>\n </li>\n ))}\n </>\n );\n};\n\nexport default SkeletonListItemMobile;\n","import React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { translate } from '../../Services/translation';\nimport { query as queryOrders } from '../../Actions/Order.action';\nimport { useDispatch } from 'react-redux';\nimport OrderListItemMobile from './ui/OrderListItemMobile';\nimport OrderListItemDesktop from './ui/OrderListItemDesktop';\nimport { useTypedSelector } from '../../Hooks/useTypedSelector';\nimport { calculatePager, Pager } from '../../Services/Pagination.service';\nimport Pagination from '../Pagination';\nimport { setOrder } from '../../Actions/Order.action';\nimport { Order } from '../../Types/Order';\nimport { useNavigate, useSearchParams } from 'react-router-dom';\nimport SkeletonListItemDesktop from './ui/SkeletonListItemDesktop';\nimport SkeletonListItemMobile from './ui/SkeletonListItemMobile';\n\nconst MyPagesOrderHistory = () => {\n const dispatch = useDispatch();\n const navigate = useNavigate();\n const orders = useTypedSelector((state) => state.myPage.orders);\n const { list: orderList, totalCount, errors } = orders;\n const [pager, setPager] = useState<Pager>({});\n const [currentPageIndex, setCurrentPageIndex] = useState(1);\n const [isLoading, setIsLoading] = useState(true);\n const generalError = useMemo(\n () =>\n errors && errors['general']?.length ? errors['general'][0] : null,\n [errors]\n );\n const [searchParams] = useSearchParams();\n const currentPage = searchParams.get('currentPage');\n\n const fetchDataAndSetLoading = useCallback(\n async (pageIndex) => {\n setIsLoading(true);\n try {\n await dispatch(queryOrders(pageIndex));\n } catch (error) {\n console.log(error);\n } finally {\n setIsLoading(false);\n }\n },\n [dispatch]\n );\n\n useEffect(() => {\n const fetchDataAndUpdatePageIndex = async () => {\n let newPageIndex = 1;\n\n if (currentPage) {\n newPageIndex = parseInt(currentPage, 10) || 1;\n }\n\n setCurrentPageIndex(newPageIndex);\n await fetchDataAndSetLoading(newPageIndex);\n };\n\n fetchDataAndUpdatePageIndex();\n }, [currentPage, dispatch, fetchDataAndSetLoading]);\n\n useEffect(() => {\n if (\n currentPageIndex.toString() !== currentPage &&\n currentPageIndex !== 1\n ) {\n navigate(`?currentPage=${currentPageIndex}`);\n }\n setPager(calculatePager(totalCount, currentPageIndex));\n }, [totalCount, currentPageIndex, currentPage, navigate]);\n\n const onOrderClick = (order: Order) => {\n dispatch(setOrder(order));\n navigate(order.orderId);\n };\n\n return (\n <div className=\"col-span-3\">\n <h1 className=\"mb-2\">{translate('mypage.order.title')}</h1>\n <p className=\"mb-4 max-w-3xl text-md lg:mb-6\">\n {translate('mypage.order.text') !== 'mypage.order.text' &&\n translate('mypage.order.text')}\n </p>\n {isLoading ? (\n <p className=\"mb-4 max-w-3xl text-md lg:mb-6\">\n {translate('mypage.order.loading')}\n </p>\n ) : (\n <>\n {generalError && <p className=\"error\">{generalError}</p>}\n {(!orderList || orderList.length == 0) && (\n <p className=\"mb-4 max-w-3xl text-md lg:mb-6\">\n {translate('mypage.order.no-orders')}\n </p>\n )}\n </>\n )}\n <ul className=\"lg:hidden\">\n <SkeletonListItemMobile items={3} cells={5} loading={!orderList} />\n {orderList &&\n orderList.map((order) => (\n <OrderListItemMobile\n order={order}\n key={order.externalOrderID + 'mobile'}\n onClick={onOrderClick}\n />\n ))}\n </ul>\n <ul className=\"hidden rounded border border-solid border-gray-300 lg:block\">\n <div className=\"grid grid-cols-6 gap-4 border-b border-solid border-gray-300 p-2\">\n <p className=\"overflow-hidden text-ellipsis whitespace-nowrap text-md font-bold\">\n {translate('general.ordernumber')}\n </p>\n <p className=\"overflow-hidden text-ellipsis whitespace-nowrap text-md font-bold\">\n {translate('general.quantity')}\n </p>\n <p className=\"overflow-hidden text-ellipsis whitespace-nowrap text-md font-bold\">\n {translate('orderdetail.grandtotal')}\n </p>\n <p className=\"overflow-hidden text-ellipsis whitespace-nowrap text-md font-bold\">\n {translate('orderdetail.orderdate')}\n </p>\n <p className=\"overflow-hidden text-ellipsis whitespace-nowrap text-md font-bold\">\n {translate('orderdetail.orderstatus')}\n </p>\n </div>\n <SkeletonListItemDesktop\n items={5}\n cells={6}\n loading={!orderList}\n />\n {orderList &&\n orderList.map((order) => (\n <OrderListItemDesktop\n order={order}\n key={order.externalOrderID + 'desktop'}\n onClick={onOrderClick}\n />\n ))}\n </ul>\n <div className=\"mt-4\">\n <Pagination\n model={pager}\n onChange={(index) => {\n if (index !== currentPageIndex) {\n setCurrentPageIndex(index);\n navigate(`?currentPage=${index}`);\n }\n }}\n />\n </div>\n </div>\n );\n};\n\nexport default MyPagesOrderHistory;\n","import React from 'react';\nimport { translate } from '../../../Services/translation';\nimport { OrderRow } from '../../../Types/OrderRow';\n\ninterface OrderDetailProductCardProps {\n product: OrderRow;\n isOrderRowItem?: boolean;\n}\n\nconst ProductCard = ({\n product,\n isOrderRowItem = false,\n}: OrderDetailProductCardProps) => {\n return (\n <div className=\"flex gap-4 border-b-2 border-gray-100 p-4 text-md lg:p-6 [&_span:not(:last-child)]:mb-1 \">\n {product.imageUrl == null ? (\n <div className=\"h-16 w-16 object-cover\"></div>\n ) : (\n <a href={product.link?.href}>\n <img src={product.imageUrl} className=\"h-16 w-16 object-cover\" />\n </a>\n )}\n <div className=\"flex flex-col text-md\">\n <a href={product.link?.href}>\n <span className=\"title text-lg font-bold\">\n {isOrderRowItem ? product.orderRowDescription : product.name}\n </span>\n </a>\n <span>\n {translate('product.articleno')}: {product.articleNumber}\n </span>\n {product.extraInfo &&\n product.extraInfo.items.map((item) => (\n <span key={'order-detail' + item.key}>\n {item.key}: {item.value}\n </span>\n ))}\n <span>\n {translate('product.quantity')}: {product.quantityString}\n </span>\n {product.quantityDelivered && (\n <span>\n {translate('product.quantityDelivered')}:{' '}\n {product.quantityDelivered}\n </span>\n )}\n {product.quantityReserved &&\n product.quantityReserved.trim() !== '0' && (\n <span>\n {translate('product.quantityReserved')}:{' '}\n {product.quantityReserved}\n </span>\n )}\n {product.orderRowStatusText && (\n <span>\n {translate('product.quantityReservedStatus')}:{' '}\n {product.quantityOutOfStock}\n {', '}\n {product.orderRowStatusText}\n </span>\n )}\n <span>\n {translate('product.unitprice')}:{' '}\n {product.priceInfo?.formattedCampaignPrice === ''\n ? product.priceInfo.formattedPrice\n : product.priceInfo?.formattedCampaignPrice}\n <span className=\"ml-2 line-through\">\n {product.priceInfo?.formattedCampaignPrice !== '' &&\n product.priceInfo?.formattedPrice}\n </span>\n </span>\n <span className=\"font-bold\">\n {translate('product.total')}: {product.totalPrice}\n </span>\n </div>\n </div>\n );\n};\n\nexport default ProductCard;\n","import React, { useMemo, forwardRef } from 'react';\nimport { translate } from '../../Services/translation';\nimport ProductCard from './ui/ProductCard';\nimport { Order } from '../../Types/Order';\nimport { EditorStringModel } from '../../Types/EditorString';\nimport SalesAddress from '../../Types/OrderDetailAddress';\nimport clsx from 'clsx';\nimport Icon from '../Icon';\ndeclare var LitiumConstants: any;\n\ninterface OrderDetailProps {\n order: Order;\n isConfirmation: boolean;\n confirmationTitle?: string;\n confirmationText?: EditorStringModel;\n confirmationExtraText?: EditorStringModel;\n}\n\nconst OrderDetailAddress = ({ address }: { address: SalesAddress }) => {\n const addressCountry =\n LitiumConstants.countries && address\n ? LitiumConstants.countries.find(\n (country) =>\n country.value &&\n address.country &&\n country.value.toLowerCase() === address.country.toLowerCase()\n )\n : null;\n\n return (\n <>\n {address.organizationName && <span>{address.organizationName}</span>}\n <span>\n {address.firstName} {address.lastName}\n </span>\n <span>{address.address1}</span>\n {address.address2 && <span>{address.address2}</span>}\n {address.careOf && <span>C/O: {address.careOf}</span>}\n <span>\n {address.zipCode} {address.city}\n </span>\n <span>{addressCountry ? addressCountry.text : address.country}</span>\n </>\n );\n};\nconst OrderDetail = forwardRef<HTMLDivElement, OrderDetailProps>(\n (\n {\n order,\n isConfirmation,\n confirmationTitle,\n confirmationText,\n confirmationExtraText,\n },\n ref\n ) => {\n const deliveryAddress = useMemo(\n () =>\n order.deliveries?.length ? order.deliveries[0].address : null,\n [order.deliveries]\n );\n\n const { name, address } = order.pickUpLocation || {};\n const { city, postalCode, addressLines } = address || {};\n\n return (\n <div\n ref={ref}\n className={clsx(\n 'container flex flex-col gap-4 bg-gray-100 pb-6 pt-4',\n isConfirmation\n ? ' lg:items-center lg:pb-12 lg:pt-12'\n : 'mx-[-0.8rem] my-0 mb-6 md:mx-[-1.2rem] md:my-0 md:mb-6 lg:m-[unset] lg:items-center'\n )}\n >\n {isConfirmation ? (\n <div className=\"rounded bg-white p-4 text-center lg:w-full lg:max-w-[660px] lg:p-6\">\n <Icon name=\"confirm-check\" className=\"mb-3 h-12 w-12\" />\n <h1 className=\"mb-2\">{confirmationTitle}</h1>\n <div className=\"flex flex-col justify-center gap-2 text-lg lg:flex-row lg:gap-6\">\n <span>\n {translate('general.ordernumber')}:\n <span className=\"font-bold\"> {order.externalOrderID}</span>\n </span>\n <span>\n {translate('orderdetail.orderdate')}:\n <span className=\"font-bold\"> {order.orderDate}</span>\n </span>\n </div>\n {confirmationText?.value && (\n <div\n className=\"mt-2 text-lg\"\n dangerouslySetInnerHTML={{\n __html: confirmationText?.value,\n }}\n ></div>\n )}\n </div>\n ) : (\n <div className=\"flex flex-col gap-2 rounded bg-white p-4 text-center lg:w-full lg:max-w-[660px] lg:p-6\">\n <h1>\n {translate('general.ordernumber')}: {order.externalOrderID}\n </h1>\n <div className=\"flex flex-col justify-center gap-2 text-lg lg:flex-row lg:gap-6\">\n <span>\n {translate('orderdetail.orderdate')}:\n <span className=\"font-bold\"> {order.orderDate}</span>\n </span>\n <span>\n {translate('orderdetail.orderstatus')}:\n <span className=\"font-bold\"> {order.status}</span>\n </span>\n </div>\n </div>\n )}\n {order.deliveryLink && (\n <div className=\"flex flex-col gap-2 rounded bg-white p-4 text-center lg:w-full lg:max-w-[660px] lg:p-6\">\n <span>\n {translate('orderdetail.message')}{' '}\n <span className=\"font-bold\">{order.deliveryName}</span>\n <a\n href={order.deliveryLink}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"ml-4 inline-block rounded-md bg-red-800 px-4 py-2 text-white transition-all hover:bg-red-900\"\n >\n {translate('orderdetail.track')}\n </a>\n </span>\n </div>\n )}\n {isConfirmation && confirmationExtraText?.value && (\n <div\n className=\"rounded bg-white p-4 text-lg lg:w-full lg:max-w-[660px] lg:p-6\"\n dangerouslySetInnerHTML={{\n __html: confirmationExtraText?.value,\n }}\n ></div>\n )}\n <div className=\"flex flex-col rounded bg-white p-0 lg:w-full lg:max-w-[660px] \">\n {order.orderRows.map((product, idx) => (\n <ProductCard\n product={product}\n key={product.articleNumber + idx}\n isOrderRowItem={true}\n />\n ))}\n <div className=\"p-4 text-lg lg:p-6 [&_div:not(:last-child)]:mb-2\">\n {order.orderTotalDiscountAmount && (\n <div className=\"flex justify-between text-error-500\">\n <span>{translate('checkout.order.saved')}</span>\n <span>{order.orderTotalDiscountAmount}</span>\n </div>\n )}\n <div className=\"flex justify-between\">\n <span>{translate('checkout.order.shipping')}</span>\n <span>{order.orderTotalDeliveryCost}</span>\n </div>\n <div className=\"flex justify-between font-bold\">\n <span>{translate('orderdetail.grandtotal')}</span>\n <span>{order.orderGrandTotal}</span>\n </div>\n <div className=\"flex justify-between\">\n <span>{translate('checkout.order.vat')}</span>\n <span>{order.orderTotalVat}</span>\n </div>\n </div>\n </div>\n <div className=\"grid grid-cols-1 flex-wrap gap-6 rounded bg-white p-4 lg:w-full lg:max-w-[660px] lg:grid-cols-2 lg:p-6\">\n {deliveryAddress && (\n <div className=\"flex flex-col text-lg capitalize\">\n <span className=\"mb-2 font-bold\">\n {translate('orderdetail.deliveryaddress')}\n </span>\n <OrderDetailAddress address={deliveryAddress} />\n </div>\n )}\n {order.billingAddress && (\n <div className=\"flex flex-col text-lg capitalize\">\n <span className=\"mb-2 font-bold\">\n {translate('orderdetail.billingaddress')}\n </span>\n <OrderDetailAddress address={order.billingAddress} />\n </div>\n )}\n <div className=\"flex flex-col text-lg\">\n <span className=\"mb-2 font-bold capitalize\">\n {translate('orderdetail.paymentmethod')}\n </span>\n <span>{order.paymentMethod}</span>\n </div>\n <div className=\"flex flex-col text-lg capitalize\">\n <span className=\"mb-2 font-bold\">\n {translate('orderdetail.deliverymethod')}\n </span>\n <span>{order.deliveryMethod}</span>\n </div>\n {name && addressLines?.length > 0 && city && (\n <div className=\"flex flex-col text-lg capitalize\">\n <span className=\"mb-2 font-bold\">\n {translate('orderdetail.pickup')}\n </span>\n <span>{name}</span>\n <span>\n {addressLines[0]}, {city}\n </span>\n </div>\n )}\n </div>\n </div>\n );\n }\n);\n\nOrderDetail.displayName = 'orderDetail';\n\nexport default OrderDetail;\n","import React, { useEffect, useMemo, useRef } from 'react';\nimport { translate } from '../../Services/translation';\nimport { useNavigate, useParams } from 'react-router-dom';\nimport { useDispatch } from 'react-redux';\nimport { getOrder } from '../../Actions/Order.action';\nimport Icon from '../Icon';\nimport OrderDetail from '../OrderDetail/OrderDetail';\nimport { useTypedSelector } from '../../Hooks/useTypedSelector';\nimport { reorder } from '../../Services/Cart.service';\nimport { receive, loadError } from '../../Actions/Cart.action';\nimport { catchError } from '../../Actions/Error.action';\nimport { setError } from '../../Actions/Order.action';\nimport { useReactToPrint } from 'react-to-print';\n\nconst MyPagesOrderDetail = () => {\n const navigate = useNavigate();\n const { id } = useParams();\n const dispatch = useDispatch();\n const { order, errors = {} } = useTypedSelector(\n (state) => state.myPage.orders\n );\n const generalError = useMemo(\n () =>\n errors && errors['general']?.length ? errors['general'][0] : null,\n [errors]\n );\n\n useEffect(() => {\n if (!order) {\n dispatch(getOrder(id));\n }\n }, []);\n\n const addOrderToCart = async () => {\n try {\n const cart = await reorder(id);\n dispatch(receive(cart));\n return true;\n } catch (ex) {\n dispatch(catchError(ex, (error) => loadError(error)));\n return false;\n }\n };\n\n const componentRef = useRef(null);\n const handlePrint = useReactToPrint({\n content: () => componentRef.current,\n });\n\n return (\n <div className=\"col-span-3\">\n <div className=\"mb-4 flex flex-col gap-2 md:flex-row md:justify-between md:gap-0 lg:mb-6\">\n <button\n className=\"btn btn--small btn--outline flex w-full items-center justify-center gap-2 md:w-fit md:text-md\"\n onClick={() => {\n dispatch(setError({ general: [] }));\n navigate(-1);\n }}\n >\n <Icon name=\"chevron-left\" />\n {translate('mypage.order.allorders')}\n </button>\n <div className=\"flex gap-2 md:gap-4\">\n <button\n className=\"btn btn--outline btn--small flex w-1/2 items-center justify-center gap-2 md:w-fit md:text-md\"\n onClick={addOrderToCart}\n >\n <Icon name=\"reload\" className=\"h-4 w-4\" />\n <span>{translate('mypage.order.addtocart')}</span>\n </button>\n <button\n className=\"btn btn--small btn--outline flex w-1/2 items-center justify-center gap-2 md:w-fit md:text-md\"\n onClick={handlePrint}\n >\n <Icon name=\"printer\" className=\"h-4 w-4\" />\n <span>{translate('mypage.order.print')}</span>\n </button>\n </div>\n </div>\n {generalError && (\n <p className=\"error color-error-500 text-md\">{generalError}</p>\n )}\n {order ? (\n <OrderDetail\n ref={componentRef}\n order={order}\n isConfirmation={false}\n />\n ) : null}\n </div>\n );\n};\n\nexport default MyPagesOrderDetail;\n","import { ViewMode } from '../constants';\nimport { get, post, put, remove as httpRemove } from '../Services/http';\nimport { catchError } from './Error.action';\nimport { PERSON_RECEIVE, PERSON_ERROR, PERSON_CHANGE_MODE } from '../constants';\n\nconst rootRoute = '/api/mypageperson';\n\nexport const changeMode = (mode) => ({\n type: PERSON_CHANGE_MODE,\n payload: {\n mode,\n },\n});\n\nexport const query = (mode = ViewMode.List) => (dispatch) => {\n return get(rootRoute)\n .then((response) => response.json())\n .then((result) => {\n dispatch(receive(result, mode));\n })\n .catch((ex) => dispatch(catchError(ex, (error) => setError(error))));\n};\n\nexport const remove = (personSystemId) => (dispatch) =>\n httpRemove(rootRoute, personSystemId)\n .then(() => dispatch(query()))\n .catch((ex) => dispatch(catchError(ex, (error) => setError(error))));\n\nexport const add = (person) => (dispatch) =>\n post(rootRoute, person)\n .then(() => dispatch(query()))\n .catch((ex) => dispatch(catchError(ex, (error) => setError(error))));\n\nexport const edit = (person) => (dispatch) =>\n put(rootRoute, person)\n .then(() => dispatch(query()))\n .catch((ex) => dispatch(catchError(ex, (error) => setError(error))));\n\nexport const getPerson = (systemId) => {\n return get(`${rootRoute}/${systemId}`).then((response) => response.json());\n};\n\nconst receive = (list, mode) => ({\n type: PERSON_RECEIVE,\n payload: {\n list,\n mode,\n },\n});\n\nexport const setError = (error) => ({\n type: PERSON_ERROR,\n payload: {\n error,\n },\n});\n","import React from 'react';\nimport { translate } from '../../../Services/translation';\nimport Icon from '../../Icon';\nimport { useNavigate } from 'react-router-dom';\nimport { remove as removeUser } from '../../../Actions/Person.action';\nimport { useDispatch } from 'react-redux';\n\nconst UserListItemMobile = ({ person }) => {\n const navigate = useNavigate();\n const dispatch = useDispatch();\n\n return (\n <li className=\"mb-4 rounded border border-solid border-gray-300 p-4\">\n <p className=\"mb-3 text-md font-bold capitalize\">\n {person.firstName} {person.lastName}\n </p>\n <div className=\"grid grid-cols-2 gap-2 md:grid-cols-4\">\n <div className=\"flex flex-col\">\n <p className=\"text-sm uppercase text-gray-600\">\n {translate('mypage.person.email')}:\n </p>\n <p className=\"text-md\">{person.email}</p>\n </div>\n <div className=\"flex flex-col\">\n <p className=\"text-sm uppercase text-gray-600\">\n {translate('mypage.person.phone')}:\n </p>\n <p className=\"text-md\">{person.phone}</p>\n </div>\n <div className=\"flex flex-col\">\n <p className=\"text-sm uppercase text-gray-600\">\n {translate('mypage.person.role')}:\n </p>\n <p className=\"text-md\">{person.role}</p>\n </div>\n {person.role !== 'Admin' && (\n <div className=\"col-span-2 flex items-center gap-3 md:col-span-1 md:justify-end\">\n <button\n className=\"btn btn--clear btn--small flex h-8 w-8 items-center border border-solid border-primary-500 text-primary-500\"\n id=\"edit\"\n onClick={() => navigate(`edit/${person.systemId}`)}\n >\n <Icon\n name=\"edit\"\n className=\"color-primary\"\n style={{\n width: '16px',\n height: '16px',\n }}\n />\n </button>\n <button\n className=\"btn btn--clear btn--small flex h-8 w-8 items-center border border-solid border-error-500 text-error-500\"\n id=\"delete\"\n onClick={() => {\n dispatch(removeUser(person.systemId));\n }}\n >\n <Icon\n name=\"delete\"\n className=\"color-alert\"\n style={{\n width: '16px',\n height: '16px',\n }}\n />\n </button>\n </div>\n )}\n </div>\n </li>\n );\n};\n\nexport default UserListItemMobile;\n","import React from 'react';\nimport Icon from '../../Icon';\nimport { useNavigate } from 'react-router-dom';\nimport { remove as removeUser } from '../../../Actions/Person.action';\nimport { useDispatch } from 'react-redux';\n\nconst UserListItemDesktop = ({ person }) => {\n const navigate = useNavigate();\n const dispatch = useDispatch();\n\n return (\n <li className=\"grid grid-cols-5 items-center gap-4 px-2 [&:not(:last-child)]:border-b [&:not(:last-child)]:border-solid [&:not(:last-child)]:border-gray-300 [&:nth-child(even)]:bg-gray-100\">\n <p className=\"overflow-hidden text-ellipsis whitespace-nowrap text-md\">\n {person.firstName} {person.lastName}\n </p>\n <p className=\"overflow-hidden text-ellipsis whitespace-nowrap text-md\">\n {person.email}\n </p>\n <p className=\"overflow-hidden text-ellipsis whitespace-nowrap text-md\">\n {person.phone}\n </p>\n <p className=\"overflow-hidden text-ellipsis whitespace-nowrap text-md\">\n {person.role}\n </p>\n {person.role !== 'Admin' && (\n <div className=\"flex justify-end lg:gap-2\">\n <button\n className=\"btn btn--clear btn--small text-primary-500\"\n onClick={() => navigate(`edit/${person.systemId}`)}\n >\n <Icon\n name=\"edit\"\n id=\"edit\"\n style={{\n width: '24px',\n height: '24px',\n }}\n />\n </button>\n <button\n className=\"btn btn--clear btn--small text-error-500\"\n onClick={() => {\n dispatch(removeUser(person.systemId));\n }}\n >\n <Icon\n name=\"delete\"\n id=\"delete\"\n style={{\n width: '24px',\n height: '24px',\n }}\n />\n </button>\n </div>\n )}\n </li>\n );\n};\n\nexport default UserListItemDesktop;\n","import React, { useEffect } from 'react';\nimport { translate } from '../../Services/translation';\nimport { query as queryPersons } from '../../Actions/Person.action';\nimport { useDispatch } from 'react-redux';\nimport { useNavigate } from 'react-router-dom';\nimport UserListItemMobile from './ui/UserListItemMobile';\nimport UserListItemDesktop from './ui/UserListItemDesktop';\nimport { useTypedSelector } from '../../Hooks/useTypedSelector';\nimport SkeletonListItemDesktop from './ui/SkeletonListItemDesktop';\nimport SkeletonListItemMobile from './ui/SkeletonListItemMobile';\n\nconst MyPagesUsers = () => {\n const dispatch = useDispatch();\n const navigate = useNavigate();\n const { persons } = useTypedSelector<any>((state) => state.myPage);\n const personsList = persons.list;\n\n useEffect(() => {\n dispatch(queryPersons());\n }, []);\n\n return (\n <div className=\"col-span-3\">\n <h1 className=\"mb-2\">{translate('mypage.person.title')}</h1>\n <p className=\"mb-4 max-w-3xl text-md lg:mb-6\">\n Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed\n aliquam eget phasellus sit sed sit mi posuere tempus. Viverra non\n non, molestie at in dictum velit eros. Massa diam dignissim in\n suscipit in luctus vulputate sem.\n </p>\n <ul className=\"mb-2 md:mb-4 lg:hidden\">\n <SkeletonListItemMobile\n items={3}\n cells={5}\n loading={!personsList}\n />\n {personsList &&\n personsList.map((person) => (\n <UserListItemMobile person={person} key={person.systemId} />\n ))}\n </ul>\n <ul className=\"mb-10 hidden rounded border border-solid border-gray-300 lg:block\">\n <div className=\"grid grid-cols-5 gap-4 border-b border-solid border-gray-300 p-2\">\n <p className=\"overflow-hidden text-ellipsis whitespace-nowrap text-md font-bold\">\n {translate('mypage.person.name')}\n </p>\n <p className=\"overflow-hidden text-ellipsis whitespace-nowrap text-md font-bold\">\n {translate('mypage.person.email')}\n </p>\n <p className=\"overflow-hidden text-ellipsis whitespace-nowrap text-md font-bold\">\n {translate('mypage.person.phone')}\n </p>\n <p className=\"overflow-hidden text-ellipsis whitespace-nowrap text-md font-bold\">\n {translate('mypage.person.role')}\n </p>\n </div>\n <SkeletonListItemDesktop\n items={5}\n cells={5}\n loading={!personsList}\n />\n {personsList &&\n personsList.map((person) => (\n <UserListItemDesktop person={person} key={person.systemId} />\n ))}\n </ul>\n <button\n className=\"btn btn--primary btn--large\"\n onClick={() => navigate('add')}\n >\n {translate('mypage.person.adduser')}\n </button>\n </div>\n );\n};\n\nexport default MyPagesUsers;\n","import React, { useState } from 'react';\nimport { translate } from '../../Services/translation';\nimport { add as addPerson } from '../../Actions/Person.action';\nimport { useDispatch } from 'react-redux';\nimport { useNavigate } from 'react-router-dom';\nimport Input from '../Inputs/Input';\nimport RadioButton from '../Inputs/Radiobutton';\n\nconst MyPagesAddUser = () => {\n const navigate = useNavigate();\n const dispatch = useDispatch();\n\n // FORM-VALUES\n const [firstName, setFirstName] = useState('');\n const [lastName, setLastName] = useState('');\n const [email, setEmail] = useState('');\n const [phone, setPhone] = useState('');\n const [role, setRole] = useState('');\n\n const submitForm = () => {\n dispatch(\n addPerson({\n firstName,\n lastName,\n email,\n phone,\n role,\n })\n );\n navigate(-1);\n };\n\n return (\n <div className=\"col-span-2\">\n <h1 className=\"mb-2\">{translate('mypage.person.adduser')}</h1>\n <p className=\"mb-4 max-w-3xl text-md lg:mb-6\">\n Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed\n aliquam eget phasellus sit sed sit mi posuere tempus. Viverra non\n non, molestie at in dictum velit eros. Massa diam dignissim in\n suscipit in luctus vulputate sem.\n </p>\n <form className=\"flex flex-col\">\n <Input\n inputSize=\"large\"\n label={translate('mypage.person.firstname')}\n wrapperClassName=\"mb-4 [&_.input]:text-md\"\n onChange={(e) => setFirstName(e.target.value)}\n placeholder={translate('general.placeholder.firstname')}\n type=\"text\"\n id=\"fname\"\n />\n <Input\n inputSize=\"large\"\n label={translate('mypage.person.lastname')}\n wrapperClassName=\"mb-4 [&_.input]:text-md\"\n onChange={(e) => setLastName(e.target.value)}\n placeholder={translate('general.placeholder.lastname')}\n type=\"text\"\n id=\"lname\"\n />\n <Input\n inputSize=\"large\"\n label={translate('mypage.person.email')}\n wrapperClassName=\"mb-4 [&_.input]:text-md\"\n onChange={(e) => setEmail(e.target.value)}\n placeholder={translate('general.placeholder.email')}\n type=\"email\"\n id=\"email\"\n />\n <Input\n inputSize=\"large\"\n label={translate('mypage.person.phone')}\n wrapperClassName=\"mb-4 [&_.input]:text-md\"\n onChange={(e) => setPhone(e.target.value)}\n placeholder={translate('general.placeholder.phone')}\n type=\"tel\"\n id=\"tel\"\n />\n <div className=\"flex flex-col gap-4 pb-6 pt-2 lg:pb-8 lg:pt-4\">\n <RadioButton\n name=\"role-radio\"\n inputSize=\"large\"\n label=\"Admin\"\n value=\"Admin\"\n id=\"role1\"\n onChange={(e) => setRole(e.target.value)}\n wrapperClassName=\"text-md flex gap-2\"\n />\n <RadioButton\n name=\"role-radio\"\n inputSize=\"large\"\n label=\"OrderPlacer\"\n value=\"OrderPlacer\"\n id=\"role2\"\n onChange={(e) => setRole(e.target.value)}\n wrapperClassName=\"text-md flex gap-2\"\n />\n <RadioButton\n name=\"role-radio\"\n inputSize=\"large\"\n label=\"OrderApprover\"\n value=\"OrderApprover\"\n id=\"role3\"\n onChange={(e) => setRole(e.target.value)}\n wrapperClassName=\"text-md flex gap-2\"\n />\n </div>\n </form>\n <div className=\"flex gap-2\">\n <button\n className=\"btn btn--primary btn--large\"\n onClick={() => submitForm()}\n >\n {translate('general.save')}\n </button>\n <button\n className=\"btn btn--clear btn--large\"\n onClick={() => navigate(-1)}\n >\n {translate('general.cancel')}\n </button>\n </div>\n </div>\n );\n};\n\nexport default MyPagesAddUser;\n","import React, { useEffect, useState } from 'react';\nimport { translate } from '../../Services/translation';\nimport {\n getPerson,\n edit as editPerson,\n} from '../../Actions/Person.action';\nimport { useDispatch } from 'react-redux';\nimport { useParams, useNavigate } from 'react-router-dom';\nimport Person from '../../Types/Person';\nimport Input from '../Inputs/Input';\nimport RadioButton from '../Inputs/Radiobutton';\n\nconst MyPagesEditUser = () => {\n const { id } = useParams();\n const navigate = useNavigate();\n const dispatch = useDispatch();\n const [isLoading, setIsLoading] = useState(true);\n const [person, setPerson] = useState<Person>();\n\n const fetchUser = async () => {\n const person = await getPerson(id);\n setPerson(person);\n setIsLoading(!isLoading);\n };\n\n const setPersonValue = (key, value) => {\n const personCopy = Object.assign({}, person);\n personCopy[key] = value;\n setPerson(personCopy);\n };\n\n const submitForm = () => {\n dispatch(editPerson(person));\n navigate(-1);\n };\n\n useEffect(() => {\n fetchUser();\n }, []);\n\n return (\n <div className=\"col-span-2\">\n <h1 className=\"mb-2\">{translate('mypage.person.edituser')}</h1>\n <p className=\"mb-4 max-w-3xl text-md lg:mb-6\">\n Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed\n aliquam eget phasellus sit sed sit mi posuere tempus. Viverra non\n non, molestie at in dictum velit eros. Massa diam dignissim in\n suscipit in luctus vulputate sem.\n </p>\n <form className=\"flex flex-col\">\n <Input\n inputSize=\"large\"\n label={translate('mypage.person.firstname')}\n wrapperClassName=\"mb-4 [&_.input]:text-md\"\n value={person?.firstName}\n onChange={(e) => setPersonValue('firstName', e.target.value)}\n placeholder={translate('general.placeholder.firstname')}\n type=\"text\"\n id=\"fname\"\n disabled={isLoading}\n />\n <Input\n inputSize=\"large\"\n label={translate('mypage.person.lastname')}\n wrapperClassName=\"mb-4 [&_.input]:text-md\"\n onChange={(e) => setPersonValue('lastName', e.target.value)}\n value={person?.lastName}\n placeholder={translate('general.placeholder.lastname')}\n type=\"text\"\n id=\"lname\"\n disabled={isLoading}\n />\n <Input\n inputSize=\"large\"\n label={translate('mypage.person.email')}\n wrapperClassName=\"mb-4 [&_.input]:text-md\"\n onChange={(e) => setPersonValue('email', e.target.value)}\n value={person?.email}\n placeholder={translate('general.placeholder.email')}\n type=\"email\"\n id=\"email\"\n disabled={isLoading}\n />\n <Input\n inputSize=\"large\"\n label={translate('mypage.person.phone')}\n wrapperClassName=\"mb-4 [&_.input]:text-md\"\n onChange={(e) => setPersonValue('phone', e.target.value)}\n placeholder={translate('general.placeholder.phone')}\n type=\"tel\"\n value={person?.phone}\n id=\"tel\"\n disabled={isLoading}\n />\n <div className=\"flex flex-col gap-4 pb-6 pt-2 lg:pb-8 lg:pt-4\">\n <RadioButton\n name=\"role-radio\"\n inputSize=\"large\"\n label=\"Admin\"\n value=\"Admin\"\n id=\"role1\"\n onChange={(e) => setPersonValue('role', e.target.value)}\n checked={person?.role === 'Admin'}\n wrapperClassName=\"text-md flex gap-2\"\n disabled={isLoading}\n />\n <RadioButton\n name=\"role-radio\"\n inputSize=\"large\"\n label=\"OrderPlacer\"\n value=\"OrderPlacer\"\n id=\"role2\"\n checked={person?.role === 'OrderPlacer'}\n onChange={(e) => setPersonValue('role', e.target.value)}\n wrapperClassName=\"text-md flex gap-2\"\n disabled={isLoading}\n />\n <RadioButton\n name=\"role-radio\"\n inputSize=\"large\"\n label=\"OrderApprover\"\n value=\"OrderApprover\"\n id=\"role3\"\n checked={person?.role === 'OrderApprover'}\n onChange={(e) => setPersonValue('role', e.target.value)}\n wrapperClassName=\"text-md flex gap-2\"\n disabled={isLoading}\n />\n </div>\n </form>\n <div className=\"flex gap-2\">\n <button\n className=\"btn btn--primary btn--large\"\n onClick={() => submitForm()}\n disabled={isLoading}\n >\n {translate('general.save')}\n </button>\n <button\n className=\"btn btn--clear btn--large\"\n onClick={() => navigate(-1)}\n >\n {translate('general.cancel')}\n </button>\n </div>\n </div>\n );\n};\n\nexport default MyPagesEditUser;\n","import { ViewMode } from '../constants';\nimport { get, post, put, remove as httpRemove } from '../Services/http';\nimport { catchError } from './Error.action';\nimport {\n ADDRESS_CHANGE_MODE,\n ADDRESS_RECEIVE,\n ADDRESS_ERROR,\n} from '../constants';\nconst rootRoute = '/api/mypageaddress';\n\nexport const changeMode = (mode) => ({\n type: ADDRESS_CHANGE_MODE,\n payload: {\n mode,\n },\n});\n\nexport const query = (mode = ViewMode.List) => (dispatch) => {\n return get(rootRoute)\n .then((response) => response.json())\n .then((result) => {\n dispatch(receive(result, mode));\n })\n .catch((ex) => dispatch(catchError(ex, (error) => setError(error))));\n};\n\nexport const remove = (addressSystemId) => (dispatch) =>\n httpRemove(rootRoute, addressSystemId)\n .then(() => dispatch(query()))\n .catch((ex) => dispatch(catchError(ex, (error) => setError(error))));\n\nexport const add = (address) => (dispatch) =>\n post(rootRoute, address)\n .then(() => dispatch(query()))\n .catch((ex) => {\n dispatch(catchError(ex, (error) => setError(error)));\n throw ex;\n });\n\nexport const edit = (address) => (dispatch) =>\n put(rootRoute, address)\n .then(() => dispatch(query()))\n .catch((ex) => {\n dispatch(catchError(ex, (error) => setError(error)));\n throw ex;\n });\n\nexport const getAddress = (systemId) => {\n return get(`${rootRoute}/${systemId}`).then((response) => response.json());\n};\n\nconst receive = (list, mode) => ({\n type: ADDRESS_RECEIVE,\n payload: {\n list,\n mode,\n },\n});\n\nexport const setError = (error) => ({\n type: ADDRESS_ERROR,\n payload: {\n error,\n },\n});\n","import React from 'react';\nimport Icon from '../../Icon';\nimport { useNavigate } from 'react-router-dom';\nimport { remove as removeAddress } from '../../../Actions/Address.action';\nimport { useDispatch } from 'react-redux';\nimport clsx from 'clsx';\n\nconst AddressListItemDesktop = ({ address }) => {\n const navigate = useNavigate();\n const dispatch = useDispatch();\n return (\n <div\n className={clsx(\n 'grid',\n 'grid-cols-5',\n 'items-center',\n 'px-2',\n 'gap-4'\n )}\n >\n <p\n className={clsx(\n 'text-md',\n 'text-ellipsis',\n 'overflow-hidden',\n 'whitespace-nowrap'\n )}\n >\n {address.address}\n </p>\n <p\n className={clsx(\n 'text-md',\n 'text-ellipsis',\n 'overflow-hidden',\n 'whitespace-nowrap'\n )}\n >\n {address.zipCode}\n </p>\n <p\n className={clsx(\n 'text-md',\n 'text-ellipsis',\n 'overflow-hidden',\n 'whitespace-nowrap'\n )}\n >\n {address.city}\n </p>\n <p\n className={clsx(\n 'text-md',\n 'text-ellipsis',\n 'overflow-hidden',\n 'whitespace-nowrap'\n )}\n >\n {address.country}\n </p>\n <div className={clsx('flex', 'justify-end', 'lg:gap-2')}>\n <button\n className={clsx('btn', 'btn--clear', 'btn--small')}\n onClick={() => navigate(`edit/${address.systemId}`)}\n >\n <Icon\n name=\"edit\"\n className=\"color-primary\"\n style={{\n width: '24px',\n height: '24px',\n }}\n />\n </button>\n <button\n className={clsx(\n 'btn',\n 'btn--clear',\n 'btn--small',\n 'text-error-500'\n )}\n onClick={() => {\n dispatch(removeAddress(address.systemId));\n }}\n >\n <Icon\n name=\"delete\"\n className=\"color-alert\"\n style={{\n width: '24px',\n height: '24px',\n }}\n />\n </button>\n </div>\n </div>\n );\n};\nexport default AddressListItemDesktop;\n","import React from 'react';\nimport Icon from '../../Icon';\nimport { useNavigate } from 'react-router-dom';\nimport { remove as removeAddress } from '../../../Actions/Address.action';\nimport { useDispatch } from 'react-redux';\nimport clsx from 'clsx';\n\nconst AddressListItemMobile = ({ address }) => {\n const navigate = useNavigate();\n const dispatch = useDispatch();\n return (\n <div\n className={clsx(\n 'flex',\n 'justify-between',\n 'items-center',\n 'p-4',\n 'border',\n 'border-solid',\n 'border-gray-300',\n 'rounded',\n 'mb-4'\n )}\n >\n <div className={clsx('flex', 'flex-col')}>\n <p className={clsx('text-md', 'capitalize', 'font-bold')}>\n {address.address}\n </p>\n <p className={clsx('text-md', 'capitalize')}>\n {address.zipCode} {address.city}\n </p>\n <p className={clsx('text-md', 'capitalize')}>{address.country}</p>\n </div>\n <div className={clsx('flex', 'gap-2')}>\n <button\n className={clsx(\n 'btn',\n 'btn--clear',\n 'btn--small',\n 'border',\n 'border-primary-500',\n 'border-solid'\n )}\n id=\"edit\"\n onClick={() => navigate(`edit/${address.systemId}`)}\n >\n <Icon\n name=\"edit\"\n className=\"color-primary\"\n style={{\n width: '16px',\n height: '16px',\n }}\n />\n </button>\n <button\n className={clsx(\n 'btn',\n 'btn--clear',\n 'btn--small',\n 'border',\n 'border-error-500',\n 'border-solid',\n 'text-error-500'\n )}\n id=\"delete\"\n onClick={() => {\n dispatch(removeAddress(address.systemId));\n }}\n >\n <Icon\n name=\"delete\"\n className=\"color-alert\"\n style={{\n width: '16px',\n height: '16px',\n }}\n />\n </button>\n </div>\n </div>\n );\n};\nexport default AddressListItemMobile;\n","import React, { useEffect } from 'react';\nimport { translate } from '../../Services/translation';\nimport { query as queryAddresses } from '../../Actions/Address.action';\nimport { useDispatch } from 'react-redux';\nimport { useNavigate } from 'react-router-dom';\nimport { useTypedSelector } from '../../Hooks/useTypedSelector';\nimport AddressListItemDesktop from './ui/AddressListItemDesktop';\nimport AddressListItemMobile from './ui/AddressListItemMobile';\nimport SkeletonListItemDesktop from './ui/SkeletonListItemDesktop';\nimport SkeletonListItemMobile from './ui/SkeletonListItemMobile';\n\nconst MyPagesUsers = () => {\n const dispatch = useDispatch();\n const navigate = useNavigate();\n const { addresses } = useTypedSelector<any>((state) => state.myPage);\n const addressList = addresses.list;\n useEffect(() => {\n dispatch(queryAddresses());\n }, []);\n return (\n <div className=\"col-span-3\">\n <h1 className=\"mb-2\">{translate('mypage.address.title')}</h1>\n <p className=\"mb-4 max-w-3xl text-md lg:mb-6\">\n Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed\n aliquam eget phasellus sit sed sit mi posuere tempus. Viverra non\n non, molestie at in dictum velit eros. Massa diam dignissim in\n suscipit in luctus vulputate sem.\n </p>\n <ul className=\"mb-2 md:mb-4 lg:hidden\">\n <SkeletonListItemMobile\n items={3}\n cells={2}\n loading={!addressList}\n />\n {addressList &&\n addressList.map((address) => (\n <AddressListItemMobile\n address={address}\n key={address.systemId}\n />\n ))}\n </ul>\n <ul\n className=\"mb-10 hidden rounded border border-solid border-gray-300 lg:block [&_div:not(:last-child)]:border-b\n [&_div:not(:last-child)]:border-solid\n [&_div:not(:last-child)]:border-gray-300\n [&_div:nth-child(even)]:bg-gray-100\"\n >\n <div className=\"grid grid-cols-5 gap-4 border-b border-solid border-gray-300 p-2\">\n <p className=\"overflow-hidden text-ellipsis whitespace-nowrap text-md font-bold\">\n {translate('mypage.address.address')}\n </p>\n <p className=\"overflow-hidden text-ellipsis whitespace-nowrap text-md font-bold\">\n {translate('mypage.address.zipcode')}\n </p>\n <p className=\"overflow-hidden text-ellipsis whitespace-nowrap text-md font-bold\">\n {translate('mypage.address.city')}\n </p>\n <p className=\"overflow-hidden text-ellipsis whitespace-nowrap text-md font-bold\">\n {translate('mypage.address.country')}\n </p>\n </div>\n <SkeletonListItemDesktop\n items={5}\n cells={5}\n loading={!addressList}\n />\n {addressList &&\n addressList.map((address) => (\n <AddressListItemDesktop\n address={address}\n key={address.systemId}\n />\n ))}\n </ul>\n <button\n className=\"btn btn--primary btn--large\"\n onClick={() => navigate('add')}\n >\n {translate('mypage.address.addaddress')}\n </button>\n </div>\n );\n};\nexport default MyPagesUsers;\n","import React, { useState } from 'react';\nimport { translate } from '../../Services/translation';\nimport { add as addAddress } from '../../Actions/Address.action';\nimport { useDispatch } from 'react-redux';\nimport { useNavigate } from 'react-router-dom';\nimport Input from '../Inputs/Input';\nimport { useTypedSelector } from '../../Hooks/useTypedSelector';\nimport Dropdown from '../Dropdown';\n\nconst MyPagesAddAddress = () => {\n const navigate = useNavigate();\n const dispatch = useDispatch();\n const countriesList = globalThis.LitiumConstants.countries;\n const { errors = {} } = useTypedSelector(\n (state) => state.myPage.addresses\n );\n\n // FORM-VALUES\n const [address, setAddress] = useState('');\n const [zipCode, setZipCode] = useState('');\n const [city, setCity] = useState('');\n const [country, setCountry] = useState(countriesList[0].value);\n const [phoneNumber, setPhoneNumber] = useState('');\n\n const submitForm = (e) => {\n e.preventDefault();\n dispatch(\n addAddress({\n address,\n zipCode,\n city,\n country,\n phoneNumber,\n })\n )\n .then(() => navigate(-1))\n .catch(() => {}); // must catch error\n };\n\n return (\n <div className=\"col-span-2\">\n <h1 className=\"mb-2\">{translate('mypage.address.addaddress')}</h1>\n <p className=\"mb-4 max-w-3xl text-md lg:mb-6\">\n Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed\n aliquam eget phasellus sit sed sit mi posuere tempus. Viverra non\n non, molestie at in dictum velit eros. Massa diam dignissim in\n suscipit in luctus vulputate sem.\n </p>\n <form className=\"flex flex-col\" onSubmit={submitForm}>\n <Input\n inputSize=\"large\"\n label={translate('mypage.address.address')}\n wrapperClassName=\"mb-4 [&_.input]:text-md\"\n onChange={(e) => setAddress(e.target.value)}\n placeholder={translate('general.placeholder.address')}\n type=\"text\"\n id=\"address\"\n required={true}\n inputState={errors['address']?.length ? 'error' : 'default'}\n message={\n errors['address']?.length ? errors['address']['0'] : null\n }\n />\n <Input\n inputSize=\"large\"\n label={translate('mypage.address.zipcode')}\n wrapperClassName=\"mb-4 [&_.input]:text-md\"\n onChange={(e) => setZipCode(e.target.value)}\n placeholder={translate('general.placeholder.zipCode')}\n type=\"text\"\n id=\"zip\"\n required={true}\n inputState={errors['zipCode']?.length ? 'error' : 'default'}\n message={\n errors['zipCode']?.length ? errors['zipCode']['0'] : null\n }\n />\n <Input\n inputSize=\"large\"\n label={translate('mypage.address.city')}\n wrapperClassName=\"mb-4 [&_.input]:text-md\"\n onChange={(e) => setCity(e.target.value)}\n placeholder={translate('general.placeholder.city')}\n type=\"text\"\n id=\"city\"\n required={true}\n inputState={errors['city']?.length ? 'error' : 'default'}\n message={errors['city']?.length ? errors['city']['0'] : null}\n />\n <label className=\"mb-2 text-md font-bold\">\n {translate('mypage.address.country')}\n </label>\n <Dropdown\n className=\"mb-4 [&_.dropdown-select]:p-3\"\n options={countriesList.map((country) => ({\n value: country.value,\n label: country.text,\n }))}\n size=\"large\"\n placeholder={translate('general.placeholder.country')}\n onChange={({ value }) => setCountry(value)}\n selectedValue={country}\n />\n <Input\n inputSize=\"large\"\n label={translate('mypage.address.phonenumber')}\n wrapperClassName=\"mb-4 [&_.input]:text-md\"\n onChange={(e) => setPhoneNumber(e.target.value)}\n placeholder={translate('general.placeholder.phone')}\n type=\"tel\"\n id=\"tel\"\n required={true}\n inputState={errors['phoneNumber']?.length ? 'error' : 'default'}\n message={\n errors['phoneNumber']?.length\n ? errors['phoneNumber']['0']\n : null\n }\n />\n <div className=\"flex gap-2\">\n <button className=\"btn btn--primary btn--large\" type=\"submit\">\n {translate('general.save')}\n </button>\n <button\n className=\"btn btn--clear btn--large\"\n onClick={(e) => {\n e.preventDefault();\n navigate(-1);\n }}\n >\n {translate('general.cancel')}\n </button>\n </div>\n </form>\n </div>\n );\n};\nexport default MyPagesAddAddress;\n","import React, { useEffect, useState } from 'react';\nimport { translate } from '../../Services/translation';\nimport {\n getAddress,\n edit as editAddress,\n} from '../../Actions/Address.action';\nimport { useDispatch } from 'react-redux';\nimport { useParams, useNavigate } from 'react-router-dom';\nimport Input from '../Inputs/Input';\nimport AddressViewModel from '../../Types/AddressViewModel';\nimport { useTypedSelector } from '../../Hooks/useTypedSelector';\nimport Dropdown from '../Dropdown';\n\nconst MyPagesEditAddress = () => {\n const [isLoading, setIsLoading] = useState(true);\n const [address, setAddress] = useState<AddressViewModel>();\n const { id } = useParams();\n const { errors = {} } = useTypedSelector(\n (state) => state.myPage.addresses\n );\n const navigate = useNavigate();\n const dispatch = useDispatch();\n const countriesList = globalThis.LitiumConstants.countries;\n\n const fetchAddress = async () => {\n const address = await getAddress(id);\n setAddress(address);\n setIsLoading(!isLoading);\n };\n\n const setAddressValue = (key, value) => {\n const addressCopy = Object.assign({}, address);\n addressCopy[key] = value;\n setAddress(addressCopy);\n };\n\n const submitForm = (e) => {\n e.preventDefault();\n dispatch(editAddress(address))\n .then(() => navigate(-1))\n .catch(() => {}); // must catch error;\n };\n\n useEffect(() => {\n fetchAddress();\n }, []);\n\n return (\n <div className=\"col-span-3\">\n <h1 className=\"mb-2\">{translate('mypage.address.editaddress')}</h1>\n <p className=\"mb-4 max-w-3xl text-md lg:mb-6\">\n Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed\n aliquam eget phasellus sit sed sit mi posuere tempus. Viverra non\n non, molestie at in dictum velit eros. Massa diam dignissim in\n suscipit in luctus vulputate sem.\n </p>\n\n <form className=\"flex flex-col\" onSubmit={submitForm}>\n <Input\n inputSize=\"large\"\n label={translate('mypage.address.address')}\n wrapperClassName=\"mb-4 [&_.input]:text-lg\"\n value={address?.address}\n onChange={(e) => setAddressValue('address', e.target.value)}\n placeholder={translate('general.placeholder.address')}\n type=\"text\"\n id=\"address\"\n disabled={isLoading}\n required={true}\n inputState={errors['address']?.length ? 'error' : 'default'}\n message={\n errors['address']?.length ? errors['address']['0'] : null\n }\n />\n <Input\n inputSize=\"large\"\n label={translate('mypage.address.zipcode')}\n wrapperClassName=\"mb-4 [&_.input]:text-lg\"\n value={address?.zipCode}\n onChange={(e) => setAddressValue('zipCode', e.target.value)}\n placeholder={translate('general.placeholder.zipCode')}\n type=\"text\"\n id=\"zip\"\n disabled={isLoading}\n required={true}\n inputState={errors['zipCode']?.length ? 'error' : 'default'}\n message={\n errors['zipCode']?.length ? errors['zipCode']['0'] : null\n }\n />\n <Input\n inputSize=\"large\"\n label={translate('mypage.address.city')}\n wrapperClassName=\"mb-4 [&_.input]:text-lg\"\n onChange={(e) => setAddressValue('city', e.target.value)}\n value={address?.city}\n placeholder={translate('general.placeholder.city')}\n type=\"text\"\n id=\"city\"\n disabled={isLoading}\n required={true}\n inputState={errors['city']?.length ? 'error' : 'default'}\n message={errors['city']?.length ? errors['city']['0'] : null}\n />\n <label className=\"mb-2 text-md font-bold\">\n {translate('mypage.address.country')}\n </label>\n <Dropdown\n selectedValue={address?.country}\n className=\"mb-4 [&_.dropdown-select]:p-3\"\n options={countriesList.map((country) => ({\n value: country.value,\n label: country.text,\n }))}\n size=\"large\"\n placeholder={translate('general.placeholder.country')}\n onChange={({ value }) => setAddressValue('country', value)}\n disabled={isLoading}\n />\n <Input\n inputSize=\"large\"\n label={translate('mypage.address.phonenumber')}\n wrapperClassName=\"mb-4 [&_.input]:text-lg\"\n value={address?.phoneNumber}\n onChange={(e) => setAddressValue('phoneNumber', e.target.value)}\n placeholder={translate('general.placeholder.phone')}\n type=\"tel\"\n id=\"tel\"\n disabled={isLoading}\n required={true}\n inputState={errors['address']?.length ? 'error' : 'default'}\n message={\n errors['address']?.length ? errors['address']['0'] : null\n }\n />\n <div className=\"flex gap-2\">\n <button className=\"btn btn--primary btn--large\" type=\"submit\">\n {translate('general.save')}\n </button>\n <button\n className=\"btn btn--large btn--clear\"\n onClick={(e) => {\n e.preventDefault();\n navigate(-1);\n }}\n >\n {translate('general.cancel')}\n </button>\n </div>\n </form>\n </div>\n );\n};\nexport default MyPagesEditAddress;\n","import { useEffect } from 'react';\nimport { useLocation } from 'react-router-dom';\n\nexport default function ScrollToTop() {\n const { pathname } = useLocation();\n\n useEffect(() => {\n window.scrollTo({ top: 0, behavior: 'smooth' });\n }, [pathname]);\n\n return null;\n}\n","import React, { useMemo } from 'react';\nimport { HashRouter, Route, Routes } from 'react-router-dom';\nimport MyPagesMobileMenu from './MyPagesMobileMenu';\nimport MyPagesDesktopMenu from './MyPagesDesktopMenu';\nimport MyPagesSettings from './MyPagesSettings';\nimport MyPagesOrderHistory from './MyPagesOrderHistory';\nimport MyPagesOrderDetail from './MyPagesOrderDetail';\nimport MyPagesUsers from './MyPagesUsers';\nimport MyPagesAddUser from './MyPagesAddUser';\nimport MyPagesEditUser from './MyPagesEditUser';\nimport MyPagesAddresses from './MyPagesAddresses';\nimport MyPagesAddAddress from './MyPagesAddAddress';\nimport MyPagesEditAddress from './MyPagesEditAddress';\nimport { translate } from '../../Services/translation';\nimport ScrollToTop from './ui/ScrollToTop';\nimport { useTypedSelector } from '../../Hooks/useTypedSelector';\n\nexport const navigation = [\n {\n name: translate('mypage.order.title'),\n url: '/orders',\n isB2bOnly: false,\n },\n { name: translate('mypage.info.title'), url: '/', isB2bOnly: false },\n {\n name: translate('mypage.person.title'),\n url: '/users',\n isB2bOnly: true,\n },\n {\n name: translate('mypage.address.addresses'),\n url: '/addresses',\n isB2bOnly: true,\n },\n];\n\nconst MyPagesContainer = () => {\n const { current: userInfo } = useTypedSelector(\n (state) => state.userInfo\n );\n const filteredNav = useMemo(\n () =>\n navigation.filter((option) =>\n !userInfo?.isBusinessCustomer ? !option.isB2bOnly : true\n ),\n [userInfo?.isBusinessCustomer]\n );\n\n return (\n <section className=\"container min-h-[72vh] bg-white pb-6 pt-4 text-gray-900 lg:grid lg:grid-cols-4 lg:gap-12 lg:py-10\">\n <HashRouter>\n <ScrollToTop />\n <MyPagesMobileMenu navigation={filteredNav} />\n <MyPagesDesktopMenu navigation={filteredNav} />\n <Routes>\n <Route path=\"/\" element={<MyPagesSettings />} />\n <Route path=\"/orders\" element={<MyPagesOrderHistory />} />\n <Route path=\"/orders/:id\" element={<MyPagesOrderDetail />} />\n\n {userInfo?.isBusinessCustomer && (\n <>\n <Route path=\"/users\" element={<MyPagesUsers />} />\n <Route path=\"/users/add\" element={<MyPagesAddUser />} />\n <Route\n path=\"/users/edit/:id\"\n element={<MyPagesEditUser />}\n />\n <Route path=\"/addresses\" element={<MyPagesAddresses />} />\n <Route\n path=\"/addresses/add\"\n element={<MyPagesAddAddress />}\n />\n <Route\n path=\"/addresses/edit/:id\"\n element={<MyPagesEditAddress />}\n />\n </>\n )}\n </Routes>\n </HashRouter>\n </section>\n );\n};\n\nexport default MyPagesContainer;\n","import React, { createRef, useEffect, useMemo, useState } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { addOverlay, removeOverlay } from '../../Actions/Overlay.action';\nimport { Swiper, SwiperSlide } from 'swiper/react';\nimport { Pagination, Thumbs, FreeMode, Zoom } from 'swiper';\nimport 'swiper/css/bundle';\nimport 'swiper/css/zoom';\nimport Icon from '../Icon';\nimport { translate } from '../../Services/translation';\nimport SliderImage from '../../Types/SliderImage';\nimport clsx from 'clsx';\n\ninterface FullscreenImageSliderProps {\n showCloseButton?: boolean;\n images: SliderImage[];\n initialSlide?: number;\n onClosed?: () => void;\n}\n\nconst FullscreenImageSlider = ({\n showCloseButton = true,\n images,\n initialSlide = 0,\n onClosed,\n}: FullscreenImageSliderProps) => {\n const dispatch = useDispatch();\n const contentRef = createRef<HTMLDivElement>();\n\n const [open, setOpen] = useState(true);\n const [isZoomed, setIsZoomed] = useState<boolean>(false);\n const [zoomInfoVisible, setZoomInfoVisible] = useState<boolean>(true);\n const [hasLoadedOriginalImage, setHasLoadedOriginalImage] = useState<\n number[]\n >([]);\n const imageCount = useMemo(() => images.length, [images]);\n\n const onKeyDown = (e) => {\n if (e.key == 'Escape') {\n setOpen(false);\n }\n };\n\n useEffect(() => {\n dispatch(\n addOverlay('FullscreenImageSlider', () => {\n setOpen(false);\n })\n );\n document.addEventListener('keydown', onKeyDown, false);\n\n return () => {\n document.removeEventListener('keydown', onKeyDown, false);\n };\n }, [dispatch]);\n\n useEffect(() => {\n if (!open) {\n dispatch(removeOverlay('FullscreenImageSlider'));\n onClosed && onClosed();\n }\n }, [dispatch, open, onClosed]);\n\n useEffect(() => {\n setTimeout(() => setZoomInfoVisible(false), 5000);\n }, []);\n\n const onZoom = (slideIndex: number, scale: number) => {\n setIsZoomed(scale > 1);\n if (!hasLoadedOriginalImage.includes(slideIndex)) {\n setHasLoadedOriginalImage((hasLoadedOriginalImage) => [\n ...hasLoadedOriginalImage,\n slideIndex,\n ]);\n }\n };\n\n return open ? (\n <div className=\"fixed inset-0 z-[55] h-screen w-full\">\n <div\n className={clsx(\n 'bg-[rgba(0, 0, 0, 0.5)] duration-125 absolute left-4 top-4 z-[60] hidden items-center rounded-2xl px-2 py-1 text-sm text-white transition-opacity ease-in-out lg:flex [&_svg]:mr-1',\n zoomInfoVisible\n ? 'pointer-events-auto opacity-100'\n : 'pointer-events-none opacity-0'\n )}\n onMouseOut={() => setZoomInfoVisible(false)}\n >\n <Icon name=\"info\" />\n {translate('fullscreen-image-slider.double-click-to-zoom')}\n </div>\n <div\n className={clsx(\n 'h-full',\n '[&_.swiper-pagination.swiper-pagination-horizontal]:bottom-4 [&_.swiper-pagination]:flex [&_.swiper-pagination]:!min-w-[80%] [&_.swiper-pagination]:justify-center [&_.swiper-pagination]:gap-1 [&_.swiper-pagination]:px-4',\n '[&_.pagination-dashfull]:relative [&_.pagination-dashfull]:h-4 [&_.pagination-dashfull]:w-[18px] [&_.pagination-dashfull]:cursor-pointer',\n '[&_.pagination-dashfull]:before:absolute [&_.pagination-dashfull]:before:left-0 [&_.pagination-dashfull]:before:right-0 [&_.pagination-dashfull]:before:top-1/2 [&_.pagination-dashfull]:before:h-1 [&_.pagination-dashfull]:before:bg-gray-400 [&_.pagination-dashfull]:before:content-[\"\"]',\n '[&_.pagination-dashfull.pagination-dashfull--active]:before:bg-gray-900'\n )}\n ref={contentRef}\n >\n <Swiper\n className=\"h-full [&_.swiper-pagination]:!bottom-8\"\n loop={true}\n slidesPerView={1}\n initialSlide={initialSlide}\n zoom={{\n toggle: true,\n }}\n modules={[Pagination, Thumbs, FreeMode, Zoom]}\n onZoomChange={(swiper, scale) => onZoom(swiper.realIndex, scale)}\n pagination={{\n bulletClass: 'pagination-dashfull',\n bulletActiveClass: 'pagination-dashfull--active',\n clickable: true,\n }}\n >\n {images.map((img, idx) => (\n <SwiperSlide\n key={'fullwidth-image-slide' + idx + img.hdSrc}\n zoom={true}\n >\n <div className=\"relative flex h-auto max-h-screen lg:h-full\">\n <div className=\"swiper-zoom-container\">\n <img\n className=\"h-full object-contain\"\n src={\n isZoomed || hasLoadedOriginalImage.includes(idx)\n ? img.originalSrc\n : img.hdSrc\n }\n loading={idx == 0 ? 'eager' : 'lazy'}\n />\n </div>\n </div>\n </SwiperSlide>\n ))}\n </Swiper>\n </div>\n {showCloseButton && (\n <div\n className=\"absolute right-4 top-4 z-[55] cursor-pointer bg-white p-2 leading-none\"\n onClick={() => setOpen(false)}\n >\n <Icon className=\"h-5 w-5\" name=\"close\" />\n </div>\n )}\n </div>\n ) : null;\n};\n\nexport default FullscreenImageSlider;\n","import React, { useEffect, useState } from 'react';\nimport { Swiper, SwiperSlide } from 'swiper/react';\nimport {\n Pagination,\n Thumbs,\n FreeMode,\n Swiper as SwiperClass,\n} from 'swiper';\nimport 'swiper/css/bundle';\nimport FullscreenImageSlider from '../FullscreenImageSlider/FullscreenImageSlider';\nimport { useMemo } from 'react';\nimport SliderImage from '../../Types/SliderImage';\nimport clsx from 'clsx';\nimport ResponsiveImage from '../ResponsiveImage/ResponsiveImage';\nimport { ResponsiveImageModel } from '../../Types/ResponsiveImageModel';\n\nexport interface ProductPageImageSliderProps {\n images: SliderImage[];\n splashImages?: ResponsiveImageModel[];\n}\n\nconst ProductPageImageSlider = ({\n images,\n splashImages,\n}: ProductPageImageSliderProps) => {\n const [swiper, setSwiper] = useState<SwiperClass>();\n const [fullscreenOpen, setFullscreenOpen] = useState(false);\n const [activeSlideIndex, setActiveSlideIndex] = useState(0);\n const [rendered, setRendered] = useState(false);\n const imageCount = useMemo(() => images.length, [images]);\n useEffect(() => setRendered(true), []);\n\n return (\n <div>\n {!rendered && images?.length > 0 && (\n <div\n className={clsx(\n 'mainSwiper-Placeholder flex justify-center border border-gray-200 py-[18px]',\n '[&_img]:max-h-[160px] [&_img]:w-auto [&_img]:cursor-pointer [&_img]:lg:max-h-[220px] [&_img]:xl:max-h-[304px] [&_img]:2xl:max-h-[362px]'\n )}\n >\n <div className=\"relative\">\n <ResponsiveImage {...images[0]?.image} />\n {splashImages && splashImages?.length > 0 && (\n <div className=\"absolute left-0 top-0 flex max-w-[45%] transform flex-col gap-1 [&_img]:w-auto\">\n {splashImages.map((splashImage, index) => (\n <ResponsiveImage key={index} {...splashImage} />\n ))}\n </div>\n )}\n </div>\n </div>\n )}\n {rendered && (\n <div\n className={clsx(\n 'relative border border-gray-200',\n '[&_.swiper-container-main]:py-[18px]',\n '[&_.swiper-pagination.swiper-pagination-horizontal]:bottom-0 [&_.swiper-pagination]:flex [&_.swiper-pagination]:!min-w-[80%] [&_.swiper-pagination]:justify-center [&_.swiper-pagination]:gap-1',\n '[&_.pagination-dash]:my-[7px] [&_.pagination-dash]:h-1 [&_.pagination-dash]:w-[18px] [&_.pagination-dash]:bg-gray-400 [&_.pagination-dash]:lg:hidden',\n '[&_.pagination-dash.pagination-dash--active]:bg-gray-900'\n )}\n >\n <Swiper\n pagination={{\n dynamicBullets: imageCount > 8 ? true : false,\n dynamicMainBullets: 3,\n bulletClass: 'pagination-dash',\n bulletActiveClass: 'pagination-dash--active',\n }}\n modules={[FreeMode, Pagination, Thumbs]}\n loop={true}\n slidesPerView={1}\n className=\"swiper-container-main\"\n onSlideChange={(swiper) =>\n setActiveSlideIndex(swiper.realIndex)\n }\n onSwiper={(swiper) => setSwiper(swiper)}\n >\n {images.map((image, index) => (\n <SwiperSlide key={index}>\n <div\n className={clsx(\n 'flex justify-center',\n '[&_img]:max-h-[160px] [&_img]:w-auto [&_img]:cursor-pointer [&_img]:lg:max-h-[220px] [&_img]:xl:max-h-[304px] [&_img]:2xl:max-h-[362px]'\n )}\n >\n <div className=\"relative\">\n <ResponsiveImage\n {...image.image}\n onClick={() => setFullscreenOpen(true)}\n />\n {index === 0 &&\n splashImages &&\n splashImages?.length > 0 && (\n <div className=\"absolute left-0 top-0 flex max-w-[45%] transform flex-col gap-1 [&_img]:w-auto\">\n {splashImages.map((splashImage, index) => (\n <ResponsiveImage\n key={index}\n {...splashImage}\n />\n ))}\n </div>\n )}\n </div>\n </div>\n </SwiperSlide>\n ))}\n </Swiper>\n {images.length > 1 && (\n <div className=\"absolute bottom-0 left-0 top-0 z-10 h-full bg-white md-down:hidden\">\n <div className=\"flex max-h-full flex-col gap-0.5 overflow-y-scroll p-1 scrollbar-none\">\n {images.map((image, index) => (\n <div\n className={clsx(\n 'flex h-10 w-10 items-center justify-center rounded-sm border',\n activeSlideIndex == index\n ? 'border-gray-900'\n : 'border-transparent'\n )}\n key={image.thumbnailSrc + index}\n >\n <img\n src={image.thumbnailSrc}\n alt={image.alt}\n itemProp=\"image\"\n className=\"cursor-pointer\"\n onClick={() => swiper?.slideTo(index + 1)}\n />\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n )}\n {fullscreenOpen && (\n <FullscreenImageSlider\n images={images}\n onClosed={() => setFullscreenOpen(false)}\n initialSlide={activeSlideIndex}\n />\n )}\n </div>\n );\n};\n\nexport default ProductPageImageSlider;\n","import React, { useEffect, useState } from 'react';\nimport { Swiper, SwiperSlide } from 'swiper/react';\nimport {\n Pagination,\n Thumbs,\n FreeMode,\n Swiper as SwiperClass,\n} from 'swiper';\nimport 'swiper/css/bundle';\nimport FullscreenImageSlider from '../FullscreenImageSlider/FullscreenImageSlider';\nimport { useMemo } from 'react';\nimport SliderImage from '../../Types/SliderImage';\nimport clsx from 'clsx';\n\ninterface NewsPageImageSliderProps {\n images: SliderImage[];\n}\n\nconst NewsPageImageSlider = ({ images }: NewsPageImageSliderProps) => {\n const [swiper, setSwiper] = useState<SwiperClass>();\n const [fullscreenOpen, setFullscreenOpen] = useState(false);\n const [activeSlideIndex, setActiveSlideIndex] = useState(0);\n const [rendered, setRendered] = useState(false);\n const imageCount = useMemo(() => images.length, [images]);\n useEffect(() => setRendered(true), []);\n\n return (\n <div\n className={clsx(\n 'my-6',\n 'lg:my-10',\n '[&_.swiper-pagination.swiper-pagination-horizontal]:bottom-0',\n '[&_.swiper-pagination]:flex',\n '[&_.swiper-pagination]:justify-center',\n '[&_.swiper-pagination]:gap-1',\n '[&_.pagination-dash]:my-[7px]',\n '[&_.pagination-dash]:h-1',\n '[&_.pagination-dash]:w-[18px]',\n '[&_.pagination-dash]:bg-gray-400',\n '[&_.pagination-dash.pagination-dash--active]:lg:bg-white',\n '[&_.pagination-dash.pagination-dash--active]:bg-gray-900'\n )}\n >\n {!rendered && images?.length > 0 && (\n <div className=\"mainSwiper-Placeholder\">\n <img\n className=\"cursor-pointer\"\n style={{ margin: 'auto' }}\n src={images[0]?.src}\n alt={images[0]?.alt}\n />\n </div>\n )}\n {rendered && (\n <div className=\"relative\">\n <Swiper\n pagination={{\n dynamicBullets: imageCount > 8 ? true : false,\n dynamicMainBullets: 3,\n bulletClass: 'pagination-dash',\n bulletActiveClass: 'pagination-dash--active',\n }}\n modules={[FreeMode, Pagination, Thumbs]}\n lazy={true}\n loop={true}\n slidesPerView={1}\n className=\"swiper-container-main\"\n onSlideChange={(swiper) =>\n setActiveSlideIndex(swiper.realIndex)\n }\n onSwiper={(swiper) => setSwiper(swiper)}\n >\n {images.map((image, index) => (\n <SwiperSlide key={image.src + index}>\n <div className=\"flex justify-center\">\n <img\n className=\"cursor-pointer\"\n onClick={() => setFullscreenOpen(true)}\n src={image.src}\n alt={image.alt}\n />\n </div>\n </SwiperSlide>\n ))}\n </Swiper>\n </div>\n )}\n {fullscreenOpen && (\n <FullscreenImageSlider\n images={images}\n onClosed={() => setFullscreenOpen(false)}\n initialSlide={activeSlideIndex}\n />\n )}\n </div>\n );\n};\n\nexport default NewsPageImageSlider;\n","import React from 'react';\nimport { useTypedSelector } from '../Hooks/useTypedSelector';\n\ninterface AdminEditButtonProps {\n url: string;\n}\n\nconst AdminEditButton = (props: AdminEditButtonProps) => {\n const { current } = useTypedSelector((state) => state.userInfo);\n\n return current?.mayEditPage && props?.url ? (\n <a className=\"ml-6\" href={props?.url}>\n <i className=\"text-[32px]\">🖉</i>\n </a>\n ) : null;\n};\n\nexport default AdminEditButton;\n","import React from 'react';\nimport { translate } from '../../Services/translation';\nimport { LinkModel } from '../../Types/LinkModel';\nimport { IconTag } from '@tabler/icons-react';\nimport { ResponsiveImageModel } from '../../Types/ResponsiveImageModel';\nimport ResponsiveImage from '../ResponsiveImage/ResponsiveImage';\n\nexport interface ProductCampaignDescriptionProps {\n title?: string;\n link?: LinkModel;\n image?: ResponsiveImageModel;\n}\n\nconst ProductCampaignDescription = (\n props: ProductCampaignDescriptionProps\n) => (\n <div className=\"bg-gray-100 p-3\">\n <div className=\"flex items-center justify-between gap-1\">\n <div className=\"flex items-center gap-1\">\n {props.image ? (\n <ResponsiveImage {...props.image} lazyLoad={true} />\n ) : (\n <IconTag size={16} color=\"#A41E34\" className=\"flex-shrink-0\" />\n )}\n <span className=\"text-sm font-bold text-gray-900 lg:text-md\">\n {props.title}\n </span>\n </div>\n {props.link && (\n <a\n href={props.link.href}\n className=\"flex-shrink-0 text-sm underline\"\n >\n {translate('product.campaigndescription.linktext')}\n </a>\n )}\n </div>\n </div>\n);\n\nexport default ProductCampaignDescription;\n","import React from 'react';\nimport ResponsiveImage from '../ResponsiveImage/ResponsiveImage';\nimport { ResponsiveImageModel } from '../../Types/ResponsiveImageModel';\n\ninterface TagProps {\n image?: ResponsiveImageModel;\n lazyLoadImage?: boolean;\n}\n\nconst ProductAttributeTag: React.FC<TagProps> = ({\n image = null,\n lazyLoadImage = false,\n}) => {\n return <ResponsiveImage {...image} lazyLoad={lazyLoadImage} />;\n};\n\nexport default ProductAttributeTag;\n","import { PRICE_HISTORY_SET_MODAL_OPEN } from '../constants';\n\nexport const setPriceHistoryModalOpen = (\n modalOpen: boolean,\n previouslyLowestPrice: string,\n numberOfDays: number,\n description: string,\n title: string\n) => {\n const action = {\n type: PRICE_HISTORY_SET_MODAL_OPEN,\n payload: {\n modalOpen,\n previouslyLowestPrice,\n numberOfDays,\n description,\n title,\n },\n };\n return action;\n};\n","import Icon from '../Icon';\nimport React from 'react';\nimport { useDispatch } from 'react-redux';\nimport { setPriceHistoryModalOpen } from '../../Actions/PriceHistory.actions';\nimport PriceModal from '../../Types/PriceModal';\n\nconst PriceHistoryModalTrigger = (productPriceHistory: PriceModal) => {\n const { title, previouslyLowestPrice, numberOfDays, description } =\n productPriceHistory;\n const dispatch = useDispatch();\n return (\n <button\n onClick={() =>\n dispatch(\n setPriceHistoryModalOpen(\n true,\n previouslyLowestPrice,\n numberOfDays,\n description,\n title\n )\n )\n }\n >\n <Icon\n className=\"h-5 w-5 cursor-pointer [&_#price-history-icon]:h-5 [&_#price-history-icon]:w-5 [&_#price-history-icon]:cursor-pointer [&_#price-history-icon]:align-top [&_#price-history-icon]:font-normal\"\n name=\"info\"\n />\n </button>\n );\n};\nexport default PriceHistoryModalTrigger;\n","import { NOT_PRICED_SET_MODAL_OPEN } from '../constants';\n\nexport const setNotPricedModalOpen = (\n modalOpen: boolean\n) => {\n const action = {\n type: NOT_PRICED_SET_MODAL_OPEN,\n payload: {\n modalOpen\n },\n };\n return action;\n};\n","import Icon from '../Icon';\nimport React from 'react';\nimport { useDispatch } from 'react-redux';\nimport { setNotPricedModalOpen } from '../../Actions/NotPriced.actions';\n\nconst NotPricedModalTrigger = () => {\n const dispatch = useDispatch();\n return (\n <button\n onClick={() =>\n dispatch(\n setNotPricedModalOpen(\n true\n )\n )\n }\n >\n <Icon\n className=\"h-5 w-5 cursor-pointer [&_#not-priced-icon]:h-5 [&_#not-priced-icon]:w-5 [&_#not-priced-icon]:cursor-pointer [&_#not-priced-icon]:align-top [&_#not-priced-icon]:font-normal\"\n name=\"info\"\n />\n </button>\n );\n};\nexport default NotPricedModalTrigger;\n","import React from 'react';\nimport PriceModel from '../../Types/PriceModel';\nimport PriceModal from '../../Types/PriceModal';\nimport PriceHistoryModalTrigger from '../ProductPriceHistory/PriceHistoryModalTrigger';\nimport NotPricedModalTrigger from '../NotPricedProduct/NotPricedModalTrigger';\n\ninterface ProductPagePriceProps {\n price: PriceModel;\n discountPercentage?: string;\n productPriceHistory?: PriceModal;\n notPricedString?: string;\n}\n\nconst ProductPagePrice = ({\n price,\n discountPercentage,\n productPriceHistory,\n notPricedString,\n}: ProductPagePriceProps) => {\n return (\n <div className=\"flex leading-tight\">\n {price.formattedCampaignPrice ? (\n <div className=\"flex items-baseline gap-2 lg:flex-col lg:gap-[5px] xl:flex-row xl:gap-2\">\n <span className=\"h1 flex font-bold text-brand-red\">\n {price.formattedCampaignPrice}\n </span>\n <div className=\"flex items-baseline gap-1.5\">\n <div className=\"flex items-baseline gap-2\">\n <span className=\"text-md leading-tight text-gray-500 line-through lg:text-lg\">\n {price.formattedPrice}\n </span>\n {discountPercentage && (\n <span className=\"text-md leading-tight text-brand-red lg:text-lg\">\n {discountPercentage}\n </span>\n )}\n </div>\n {productPriceHistory && (\n <PriceHistoryModalTrigger {...productPriceHistory} />\n )}\n </div>\n </div>\n ) : (\n (price.formattedPrice || price.price?.price == '0') && (\n <>\n {price.price?.price == '0' ? (\n <div className=\"flex gap-2\">\n <div className=\"h1 text-gray-900\">{notPricedString}</div>\n <NotPricedModalTrigger />\n </div>\n ) : (\n <div className=\"h1 text-gray-900\">\n {price.formattedPrice}\n </div>\n )}\n </>\n )\n )}\n </div>\n );\n};\n\nexport default ProductPagePrice;\n","import React from 'react';\nimport Icon from '../Icon';\nimport { translate } from '../../Services/translation';\nimport { EditorStringModel } from '../../Types/EditorString';\nimport EditorString from '../EditorString/EditorString';\n\ninterface UsedProductAttributes {\n shortDescription?: EditorStringModel;\n includedAccessories?: string;\n numberOfExposures?: string;\n usedListing?: string;\n}\n\nconst UsedProduct = (props: UsedProductAttributes) => {\n return (\n <div className=\"bg-gray-100 p-3\">\n <div className=\"flex flex-col gap-0.5\">\n <div className=\"flex items-center gap-1\">\n <Icon name=\"info\" className=\"h-[20px] w-[20px]\" />\n <span className=\"text-sm font-bold text-gray-900 lg:text-md\">\n {translate('product.used.title')}\n </span>\n </div>\n <div className=\"text-sm text-gray-900 lg:text-md [&>*:nth-child(2)]:mt-2\">\n <EditorString value={props.shortDescription?.value} />\n {props.includedAccessories &&\n props.includedAccessories != '' && (\n <div>\n <span className=\"font-bold\">\n {translate('product.used.included-accessories')}:\n </span>{' '}\n {props.includedAccessories}\n </div>\n )}\n {props.numberOfExposures && props.numberOfExposures != '' && (\n <div>\n <span className=\"font-bold\">\n {translate('product.used.number-of-exposures')}:\n </span>{' '}\n {props.numberOfExposures}\n </div>\n )}\n {props.usedListing && props.usedListing != '' && (\n <div>\n <span className=\"font-bold\">\n {translate('product.used.used-listing')}:\n </span>{' '}\n {props.usedListing}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n};\n\nexport default UsedProduct;\n","import React from 'react';\nimport VariantPickerProps from './types/VariantPickerProps';\nimport clsx from 'clsx';\n\nconst VariantPickerLinks = ({\n options,\n selectedValue,\n}: VariantPickerProps) => {\n return (\n <div className=\"flex flex-wrap gap-1\">\n {options.map((opt, idx) => (\n <a\n className={clsx(\n 'btn btn--outline btn--medium min-w-10 min-h-10',\n selectedValue == opt.value\n ? 'border-2 border-success-500'\n : '',\n opt.formattedPrice ? 'py-1 leading-tight' : ''\n )}\n key={'variant-picker' + opt.value + idx}\n href={opt.url}\n >\n {opt.label}\n {opt.formattedPrice && (\n <span\n className={clsx(\n 'block text-sm font-normal',\n opt.isCampaign ? 'text-red-600' : ''\n )}\n >\n {opt.formattedPrice}\n </span>\n )}\n </a>\n ))}\n </div>\n );\n};\n\nexport default VariantPickerLinks;\n","export const breakpoints = {\n sm: '480px',\n md: '768px',\n lg: '1024px',\n xl: '1440px',\n '2xl': '1920px',\n '3xl': '2560px',\n};\n","import { useEffect, useState } from 'react';\nimport useWindowSize from './useWindowSize';\nimport { breakpoints as breakpointVars } from '../styling/variables/breakpoints';\n\nconst useBreakpoint = () => {\n const [windowWidth] = useWindowSize();\n const [currentBreakpoint, setCurrentBreakpoint] = useState<\n string | undefined\n >();\n const [breakpointValues, setBreakpointValues] = useState<number[]>([]);\n const [breakpoints, setBreakpoints] = useState<string[]>([]);\n\n useEffect(() => {\n const _breakpoints = Object.keys(breakpointVars).reduce(\n (obj, key) => ({\n ...obj,\n [key]: parseInt(breakpointVars[key]?.replace('px', '') ?? '0'),\n }),\n {}\n );\n\n const sortedValues: any = Object.values(_breakpoints).sort(\n (a: number, b: number) => a - b\n );\n const keyArray: string[] = [];\n for (let sortedValue of sortedValues) {\n for (let key of Object.keys(_breakpoints)) {\n const value = _breakpoints[key];\n if (value == sortedValue) {\n keyArray.push(key);\n }\n }\n }\n\n setBreakpoints(keyArray);\n setBreakpointValues(sortedValues);\n }, [breakpointVars]);\n\n useEffect(() => {\n var index = 0;\n for (let key of breakpoints) {\n const value = !breakpointValues[index];\n\n if (index == breakpointValues.length - 1 && windowWidth >= value) {\n setCurrentBreakpoint(key);\n break;\n }\n\n const nextValue = breakpointValues[index + 1] ?? 0;\n if (windowWidth >= value && windowWidth < nextValue) {\n setCurrentBreakpoint(key);\n break;\n }\n index++;\n }\n }, [windowWidth, breakpointValues, breakpoints]);\n\n return currentBreakpoint;\n};\n\nexport default useBreakpoint;\n","import { useState, useEffect } from 'react';\n\nexport default function () {\n var initialWidth = global.window && window.innerWidth ? window.innerWidth : 0;\n var initialHeight =\n global.window && window.innerHeight ? window.innerHeight : 0;\n const [size, setSize] = useState([initialWidth, initialHeight]);\n useEffect(() => {\n function updateSize() {\n setSize([window.innerWidth, window.innerHeight]);\n }\n window.addEventListener('resize', updateSize);\n updateSize();\n return () => window.removeEventListener('resize', updateSize);\n }, []);\n return size;\n}\n","import React, { useCallback, useMemo, useState } from 'react';\nimport ProductCardProps from './types/ProductCardProps';\nimport StockStatus from '../StockStatus/StockStatus';\nimport Dropdown, { DropdownOption } from '../Dropdown';\nimport { translate } from '../../Services/translation';\nimport ResponsiveImage from '../ResponsiveImage/ResponsiveImage';\nimport ProductTag from '../ProductTags/ProductTag';\nimport ProductAttributeTag from '../ProductTags/ProductAttributeTag';\nimport ProductCardBuyButton from './ProductCardBuyButton';\nimport ProductPrice from '../ProductPrice/ProductPrice';\nimport useBreakpoint from '../../Hooks/useBreakpoint';\nimport clsx from 'clsx';\n\nconst ProductCardForSlider = ({\n product,\n isVariantListing,\n lazyLoadImage,\n}: ProductCardProps) => {\n const [selectedOption, setSelectedOption] = useState<DropdownOption>();\n\n const articleNumber = useMemo(\n () =>\n product.variantOptions?.length ? selectedOption?.value : product.id,\n [product.id, product.variantOptions?.length, selectedOption?.value]\n );\n\n const breakpoint = useBreakpoint();\n const productTagsSize = useCallback(() => {\n switch (breakpoint) {\n case 'lg':\n case 'xl':\n case '2xl':\n case '3xl':\n return 'l';\n default:\n return 's';\n }\n }, [breakpoint]);\n\n return (\n <div className=\"m-w-0 flex h-full max-w-full flex-col rounded-sm bg-white shadow-mc\">\n <a\n href={product.url}\n className={clsx(\n 'relative flex w-full justify-center overflow-hidden rounded-t pt-3 lg:pt-4',\n 'max-h-[167px] min-h-[167px] lg:max-h-[190px] lg:min-h-[190px]'\n )}\n >\n {product.images && product.images.length > 0 && (\n <div className=\"aspect-square h-full max-w-full\">\n <div className=\"relative h-full\">\n <div className=\"h-full [&_img]:aspect-square [&_img]:h-full [&_img]:w-full [&_img]:object-contain\">\n <ResponsiveImage\n {...product.images[0]}\n lazyLoad={lazyLoadImage}\n />\n </div>\n {product.splashImages && product.splashImages.length > 0 && (\n <div className=\"absolute left-0 top-0 flex max-w-[45%] transform flex-col gap-1 [&_img]:w-auto\">\n {product.splashImages.map((splashImage, index) => (\n <ResponsiveImage\n key={index}\n {...splashImage}\n lazyLoad={lazyLoadImage}\n />\n ))}\n </div>\n )}\n </div>\n </div>\n )}\n {product.tags?.length ? (\n <div className=\"absolute right-0 top-0 flex flex-col items-end gap-[1px]\">\n {product.tags.map((tag) => (\n <ProductTag\n tagSize={productTagsSize()}\n id={tag.id}\n key={tag.id}\n isCampaign={tag.isCampaign}\n >\n {tag.name}\n </ProductTag>\n ))}\n </div>\n ) : null}\n {product.attributeTag ? (\n <div className=\"absolute bottom-0 right-0 mr-2 flex h-10 w-10 flex-col items-end lg:h-14 lg:w-14\">\n <ProductAttributeTag\n image={product.attributeTag.image}\n lazyLoadImage={lazyLoadImage}\n ></ProductAttributeTag>\n </div>\n ) : null}\n </a>\n <div className=\"flex flex-1 flex-col rounded-b px-3 pb-2 pt-1 lg:px-4 lg:pb-3\">\n <div className=\"mb-2 flex-1 overflow-y-hidden leading-tight\">\n {product.brand && (\n <div className=\"mb-0.5 text-sm text-gray-600\">\n {product.brand}\n </div>\n )}\n <a className=\"mb-2 block text-md font-bold\" href={product.url}>\n {product.name}\n </a>\n {product.usps && product.usps.length > 0 && (\n <ul className=\"product-usps text-sm text-gray-600\">\n {product.usps.map((item, idx) => (\n <li className=\"mb-1 flex items-center\" key={idx}>\n {item}\n </li>\n ))}\n </ul>\n )}\n </div>\n <div>\n <StockStatus {...product.stockStatus} />\n <div className=\"mt-2 flex items-center justify-between gap-2\">\n <ProductPrice\n price={product.price}\n discountPercentage={product.discountPercentage}\n isQuickSearch={false}\n notPricedString={product.notPricedString}\n />\n {product.variantOptions?.length ? (\n <Dropdown\n options={product.variantOptions}\n size=\"small\"\n selectedValue={selectedOption?.value}\n onChange={(option) => setSelectedOption(option)}\n placeholder={translate('product.sizepicker')}\n />\n ) : null}\n <ProductCardBuyButton\n product={{ ...product, id: articleNumber }}\n isVariantListing={isVariantListing}\n showQuantityInput={false}\n className=\"[&_button]:flex-1 [&_button]:text-sm [&_button]:leading-[1.33] [&_div]:flex-1 [&_input]:text-sm\"\n />\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport default ProductCardForSlider;\n","import React from 'react';\nimport { IconChevronLeft, IconChevronRight } from '@tabler/icons-react';\nimport clsx from 'clsx';\nimport { LinkModel } from '../Types/LinkModel';\n\ninterface ProductSliderHeaderProps {\n title: string;\n link?: LinkModel;\n slideNext: () => void;\n slidePrev: () => void;\n canSlideNext: boolean;\n canSlidePrev: boolean;\n}\n\nconst ProductSliderHeader = ({\n title,\n link,\n slideNext,\n slidePrev,\n canSlideNext,\n canSlidePrev,\n}: ProductSliderHeaderProps) => {\n return (\n <div className=\"w-full\">\n <div className=\"relative flex items-center justify-between\">\n <h5 className=\"lg:h4\">{title}</h5>\n <div className=\"flex flex-row items-center gap-4\">\n {link?.href && link?.href != '' && (\n <a\n className=\"text-md text-primary-500 underline underline-offset-4\"\n href={link.href}\n >\n {link.text}\n </a>\n )}\n {(canSlideNext || canSlidePrev) && (\n <div className=\"flex items-center gap-2\">\n <span\n className={clsx(\n 'cursor-pointer items-center justify-center gap-2 rounded-full border border-gray-400 p-2',\n !canSlidePrev && 'opacity-50'\n )}\n onClick={() => canSlidePrev && slidePrev()}\n >\n <IconChevronLeft size={16} />\n </span>\n <span\n className={clsx(\n 'cursor-pointer items-center justify-center gap-2 rounded-full border border-gray-400 p-2',\n !canSlideNext && 'opacity-50'\n )}\n onClick={() => canSlideNext && slideNext()}\n >\n <IconChevronRight size={16} />\n </span>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n};\n\nexport default ProductSliderHeader;\n","import { Swiper, SwiperSlide } from 'swiper/react';\nimport React, { useEffect, useRef, useState } from 'react';\nimport Product from '../../Types/Product';\nimport { Pagination, Swiper as SwiperType, Navigation } from 'swiper';\nimport ProductCardForSlider from '../ProductCards/ProductCardForSlider';\nimport clsx from 'clsx';\nimport ProductSliderHeader from '../ProductSliderHeader';\n\ninterface ProductPageProductSliderProps {\n title: string;\n products: Product[];\n numberOfSlidesMobile?: number;\n numberOfSlidesDesktop?: number;\n}\n\nconst ProductPageProductSlider = ({\n title,\n products,\n numberOfSlidesMobile = 2,\n numberOfSlidesDesktop = 4,\n}: ProductPageProductSliderProps) => {\n const [renderSlider, setRenderSlider] = useState(false);\n const [isBeginning, setIsBeginning] = useState(true);\n const [isEnd, setIsEnd] = useState(false);\n const swiperRef = useRef<SwiperType>();\n\n useEffect(() => setRenderSlider(true), []);\n\n const slidePrev = () => {\n swiperRef.current?.slidePrev();\n };\n const slideNext = () => {\n swiperRef.current?.slideNext();\n };\n\n return (\n <div className=\"flex flex-col gap-2\">\n <div className=\"px-4 lg:px-0\">\n <ProductSliderHeader\n title={title}\n slideNext={slideNext}\n slidePrev={slidePrev}\n canSlideNext={!isEnd}\n canSlidePrev={!isBeginning}\n />\n </div>\n {renderSlider ? (\n <div\n className={clsx(\n '[&_.swiper-pagination.swiper-pagination-horizontal]:bottom-0 [&_.swiper-pagination]:flex [&_.swiper-pagination]:justify-center [&_.swiper-pagination]:gap-1',\n '[&_.pagination-dash]:mb-[7px] [&_.pagination-dash]:mt-[7px] [&_.pagination-dash]:h-1 [&_.pagination-dash]:w-[18px] [&_.pagination-dash]:bg-gray-400',\n '[&_.pagination-dash.pagination-dash--active]:bg-gray-900'\n )}\n >\n <div className=\"relative\">\n <Swiper\n spaceBetween={2}\n slidesPerView={numberOfSlidesMobile}\n slidesPerGroup={numberOfSlidesMobile}\n pagination={{\n dynamicBullets: false,\n bulletClass: 'pagination-dash',\n bulletActiveClass: 'pagination-dash--active',\n }}\n loop={false}\n modules={[Pagination, Navigation]}\n breakpoints={{\n 767: {\n slidesPerView: numberOfSlidesDesktop,\n slidesPerGroup: numberOfSlidesDesktop,\n },\n 1023: {\n slidesPerView: numberOfSlidesMobile,\n slidesPerGroup: numberOfSlidesMobile,\n },\n 1439: {\n slidesPerView: numberOfSlidesDesktop,\n slidesPerGroup: numberOfSlidesDesktop,\n },\n }}\n onSlideChange={(swiper) => {\n setIsBeginning(swiper.isBeginning);\n setIsEnd(swiper.isEnd);\n }}\n onAfterInit={(swiper) => {\n setIsBeginning(swiper.isBeginning);\n setIsEnd(swiper.isEnd);\n }}\n onBeforeInit={(swiper) => {\n swiperRef.current = swiper;\n }}\n className=\"productpage-swiper !px-0.5 [&_.swiper-slide]:h-auto [&_.swiper-wrapper]:pb-8 [&_.swiper-wrapper]:pt-0.5\"\n >\n {products.map((product, idx) => (\n <SwiperSlide key={product.id + 'slide' + idx}>\n <ProductCardForSlider\n product={product}\n lazyLoadImage={true}\n />\n </SwiperSlide>\n ))}\n </Swiper>\n </div>\n </div>\n ) : (\n //Render product block without slider on server to avoid layout shifting\n <div>\n <div className=\"grid grid-cols-2 gap-0.5 md:hidden lg:grid xl:hidden\">\n {products\n .slice(0, numberOfSlidesMobile)\n .map((product, idx) => (\n <ProductCardForSlider\n key={product.id + 'noslide' + idx}\n product={product}\n />\n ))}\n </div>\n <div className=\"hidden grid-cols-3 gap-0.5 md:grid lg:hidden xl:grid\">\n {products\n .slice(0, numberOfSlidesDesktop)\n .map((product, idx) => (\n <ProductCardForSlider\n key={product.id + 'noslide' + idx}\n product={product}\n />\n ))}\n </div>\n </div>\n )}\n </div>\n );\n};\n\nexport default ProductPageProductSlider;\n","import React, { useState, useEffect } from 'react';\n\ninterface KlarnaPlacementProps {\n priceInMinorUnits: number;\n}\n\nconst KlarnaPlacement = ({ priceInMinorUnits }: KlarnaPlacementProps) => {\n const [isMounted, setIsMounted] = useState(false);\n\n useEffect(() => {\n setIsMounted(true);\n }, []);\n\n useEffect(() => {\n if (isMounted && window.Klarna && window.Klarna.OnsiteMessaging) {\n window.Klarna.OnsiteMessaging.refresh();\n }\n });\n return (\n <>\n {isMounted && (\n <>\n {/* <!-- Placement v2 --> */}\n <klarna-placement\n data-key=\"credit-promotion-badge\"\n data-locale=\"sv-SE\"\n data-purchase-amount={priceInMinorUnits.toLocaleString(\n 'en-US',\n {\n useGrouping: false,\n }\n )}\n ></klarna-placement>\n {/* <!-- end Placement --> */}\n </>\n )}\n </>\n );\n};\n\nexport default KlarnaPlacement;\n","import React from 'react';\nimport { LinkModel } from '../../Types/LinkModel';\n\nexport interface ProductListInformationUspProps {\n title: string;\n link: LinkModel;\n imageUrl: string;\n imageAlt: string;\n}\n\ninterface ProductPageInformationUspsProps {\n productListInformationUsps: ProductListInformationUspProps[];\n}\n\nconst ProductPageInformationUsps = ({\n productListInformationUsps,\n}: ProductPageInformationUspsProps) => (\n <>\n {productListInformationUsps.map((usp, i) => (\n <a\n key={i}\n href={usp.link.href}\n className=\"flex items-center gap-1.5\"\n >\n <div className=\"h-5 w-8 rounded-sm bg-gray-100\">\n <img src={usp.imageUrl} alt={usp.imageAlt} />\n </div>\n <p className=\"text-sm leading-[1.2]\">{usp.title}</p>\n </a>\n ))}\n </>\n);\n\nexport default ProductPageInformationUsps;\n","import React from 'react';\nimport ProductTag, { TagProps } from '../ProductTags/ProductTag';\nimport ProductTagModel from '../../Types/ProductTagModel';\n\ninterface ProductPageItemTagsProps {\n tagSize: 'xs' | 's' | 'l' | 'xl';\n className?: string;\n tags?: TagProps &\n React.HTMLAttributes<HTMLDivElement> &\n ProductTagModel[];\n}\n\nconst ProductPageItemTags = ({\n tagSize,\n className,\n tags,\n}: ProductPageItemTagsProps) => (\n <>\n {tags && tags.length > 0 && (\n <div className={className}>\n {tags.map((tag) => (\n <ProductTag\n tagSize={tagSize}\n id={tag.id}\n key={tag.id}\n isCampaign={tag.isCampaign}\n >\n {tag.name}\n </ProductTag>\n ))}\n </div>\n )}\n </>\n);\n\nexport default ProductPageItemTags;\n","import React from 'react';\nimport { TierPriceItem } from '../../Types/PriceModel';\n\ninterface ProductPageTierPricesProps {\n currencyId?: string;\n tierPriceItems?: TierPriceItem[];\n}\n\nconst ProductPageTierPrices = ({\n currencyId,\n tierPriceItems,\n}: ProductPageTierPricesProps) => (\n <>\n {currencyId && tierPriceItems && tierPriceItems.length > 0 && (\n <div className=\"product-detail__price\">\n <div>\n {tierPriceItems.map((price, i) => (\n <div key={i}>\n {price.price && (\n <>\n <div>\n {tierPriceItems.length == 1 ? (\n <>\n {price.minimumQuantityFormatted}{' '}\n {price.unitOfMeasurementTitle}\n </>\n ) : !price.nextMinimumQuantity ? (\n <>{price.minimumQuantityFormatted}+</>\n ) : price.minimumQuantity ==\n price.nextMinimumQuantity ? (\n <>\n {price.minimumQuantityFormatted}{' '}\n {price.unitOfMeasurementTitle}\n </>\n ) : (\n <>\n {price.minimumQuantityFormatted} -{' '}\n {price.nextMinimumQuantityFormatted}{' '}\n {price.unitOfMeasurementTitle}\n </>\n )}\n <div>\n {new Intl.NumberFormat('sv-SE', {\n style: 'currency',\n currency: currencyId,\n }).format(price.price)}{' '}\n {price.unitOfMeasurementTitle}\n </div>\n </div>\n <meta\n itemProp=\"price\"\n content={price.price?.toLocaleString('en-US', {\n useGrouping: false,\n })}\n />\n </>\n )}\n </div>\n ))}\n <meta itemProp=\"priceCurrency\" content={currencyId} />\n </div>\n </div>\n )}\n </>\n);\n\nexport default ProductPageTierPrices;\n","import React, { useState } from 'react';\nimport { UpSellItemType } from '../types/UpSellItemType';\nimport clsx from 'clsx';\nimport { translate } from '../../../Services/translation';\nimport ResponsiveImage from '../../ResponsiveImage/ResponsiveImage';\n\ninterface UpSellItemProps {\n upSellItem: UpSellItemType;\n handleSetOpenIndex: Function;\n index: number;\n}\n\nconst UpSellItem = (item: UpSellItemProps) => {\n const [activeItemId, setActiveItemId] = useState('');\n\n return (\n <>\n {item?.upSellItem?.products &&\n item.upSellItem.products.length > 0 && (\n <div\n onClick={() => {\n setActiveItemId('');\n item.handleSetOpenIndex(item.index);\n }}\n className={clsx(\n 'mb-1 flex cursor-pointer items-center justify-between rounded-sm border border-gray-400 p-3 [&:last-child]:mb-0 [&_img]:h-10 [&_img]:w-10',\n activeItemId == '' && 'border-2 border-success-500'\n )}\n >\n <div className=\"flex items-center\">\n {translate('product.upsell.no.thanks')}\n </div>\n </div>\n )}\n {item?.upSellItem?.products &&\n item.upSellItem.products.length > 0 &&\n item.upSellItem.products.map((product, i) => (\n <div\n key={i}\n onClick={() => {\n setActiveItemId(product?.id || '');\n item.handleSetOpenIndex(item.index, product);\n }}\n className={clsx(\n 'mb-1 flex cursor-pointer items-center justify-between gap-2 rounded-sm border border-gray-400 p-1 pr-2 [&:last-child]:mb-0 [&_img]:h-10 [&_img]:w-10',\n activeItemId == product.id && 'border-2 border-success-500'\n )}\n >\n <div className=\"flex items-center gap-2\">\n {product.images && product.images.length > 0 && (\n <ResponsiveImage {...product.images[0]} lazyLoad={true} />\n )}\n <div className=\"text-sm leading-tight\">\n {product.brand\n ? product.brand + ' ' + product.name\n : product.name}\n </div>\n </div>\n <div className=\"flex-none text-sm font-bold leading-tight\">\n {product.price?.formattedCampaignPrice === '' ? (\n <div className=\"flex\">\n + {product.price.formattedPrice}\n </div>\n ) : (\n <div className=\"flex text-brand-red\">\n + {product.price.formattedCampaignPrice}\n </div>\n )}\n </div>\n </div>\n ))}\n </>\n );\n};\n\nexport default UpSellItem;\n","import React, { useEffect, useState } from 'react';\nimport { UpSellItemType } from '../types/UpSellItemType';\nimport Collapsible from '../../Collapsible';\nimport clsx from 'clsx';\nimport { translate } from '../../../Services/translation';\nimport UpSellItem from './UpSellItem';\nimport Product from '../../../Types/Product';\nimport { setBuyButtonUpSellArticleNumbers } from '../../../Actions/BuyButton.action';\nimport { useDispatch } from 'react-redux';\n\ninterface UpSellItemsProps {\n upSellItems: UpSellItemType[];\n}\n\nconst UpSellItems = (items: UpSellItemsProps) => {\n const dispatch = useDispatch();\n const [openIndex, setOpenIndex] = useState(0);\n const [selectedItems, setSelectedItems] = useState(\n Array(items.upSellItems.length).fill({})\n );\n\n const handleSetOpenIndex = (index: number, product: Product) => {\n setOpenIndex(index + 1);\n setSelectedItems((prevState) => {\n const newItems = [...prevState];\n newItems[index] = product;\n\n return newItems;\n });\n };\n\n useEffect(() => {\n dispatch(\n setBuyButtonUpSellArticleNumbers(\n selectedItems.map(function (product) {\n return product?.id;\n })\n )\n );\n }, [selectedItems, dispatch]);\n\n return (\n <div className=\"mr-1 flex flex-col rounded-sm border border-gray-400\">\n {items?.upSellItems &&\n items.upSellItems.length > 0 &&\n items.upSellItems\n .filter((x) => x?.products && x.products.length > 0)\n .map((upSellItem, idx) => (\n <Collapsible\n isOpen={openIndex == idx}\n onStateChange={() => setOpenIndex(idx)}\n className={clsx(\n 'border-t',\n 'border-solid',\n 'border-gray-400',\n '[&:first-child]:border-t-0',\n '[&_.ReactCollapse--content]:p-3',\n '[&_.ReactCollapse--content]:pt-0',\n '[&_.ReactCollapse--content]:text-md',\n '[&_.ReactCollapse--content]:max-h-56',\n '[&_.ReactCollapse--content]:overflow-y-auto',\n '[&_.site-icon]:h-6 ',\n '[&_.site-icon]:w-6',\n '[&_label]:text-md',\n '[&_label]:leading-tight',\n '[&_label]:py-2',\n '[&_label]:px-3'\n )}\n key={idx}\n label={\n <div className=\"flex flex-grow items-center justify-between\">\n <div className=\"flex flex-col\">\n {upSellItem.name}\n <span\n className={clsx('text-sm font-normal leading-tight')}\n >\n {selectedItems[idx]?.name ? (\n <span\n className={clsx(\n selectedItems[idx]?.name && 'text-success-600'\n )}\n >\n {selectedItems[idx].brand\n ? selectedItems[idx].brand +\n ' ' +\n selectedItems[idx].name\n : selectedItems[idx].name}\n {selectedItems[idx].price\n ?.formattedCampaignPrice === '' ? (\n <span className=\"ml-1 text-sm font-normal leading-tight text-gray-900\">\n {'('}\n <span className=\"font-bold\">\n {'+'}\n {selectedItems[idx].price.formattedPrice}\n </span>\n {')'}\n </span>\n ) : (\n <span className=\"ml-1 text-sm font-normal leading-tight text-brand-red\">\n {'('}\n <span className=\"font-bold\">\n {'+'}\n {\n selectedItems[idx].price\n .formattedCampaignPrice\n }\n </span>\n {')'}\n </span>\n )}\n </span>\n ) : (\n translate('product.upsell.no.selected')\n )}\n </span>\n </div>\n <div className=\"ml-1 font-normal leading-tight\">\n {selectedItems[idx]?.name\n ? translate('product.upsell.change')\n : translate('product.upsell.choose')}\n </div>\n </div>\n }\n >\n <UpSellItem\n upSellItem={upSellItem}\n handleSetOpenIndex={handleSetOpenIndex}\n index={idx}\n />\n </Collapsible>\n ))}\n </div>\n );\n};\n\nexport default UpSellItems;\n","import React, { useState, useEffect } from 'react';\n\nconst VideolyVideoboxPlaceholder = () => {\n const [isMounted, setIsMounted] = useState(false);\n\n useEffect(() => {\n setIsMounted(true);\n }, []);\n\n return <>{isMounted && <div id=\"videoly-videobox-placeholder\"></div>}</>;\n};\n\nexport default VideolyVideoboxPlaceholder;\n","import React from 'react';\nimport Icon from '../Icon';\nimport { translate } from '../../Services/translation';\nimport { EditorStringModel } from '../../Types/EditorString';\nimport EditorString from '../EditorString/EditorString';\n\ninterface DemoProductAttributes {\n shortDescription?: EditorStringModel;\n includedAccessories?: string;\n numberOfExposures?: string;\n usedListing?: string;\n}\n\nconst DemoProduct = (props: DemoProductAttributes) => {\n return (\n <div className=\"bg-gray-100 p-3\">\n <div className=\"flex flex-col gap-0.5\">\n <div className=\"flex items-center gap-1\">\n <Icon name=\"info\" className=\"h-[20px] w-[20px]\" />\n <span className=\"text-sm font-bold text-gray-900 lg:text-md\">\n {translate('product.demo.title')}\n </span>\n </div>\n <div className=\"text-sm text-gray-900 lg:text-md [&>*:nth-child(2)]:mt-2\">\n <EditorString value={props.shortDescription?.value} />\n </div>\n </div>\n </div>\n );\n};\n\nexport default DemoProduct;\n","import React, { useState } from 'react';\nimport { ResponsiveImageModel } from '../../Types/ResponsiveImageModel';\nimport PriceModel from '../../Types/PriceModel';\nimport { ProductInformationTabsItem } from '../ProductInformationTabs/types/ProductInformationTabProps';\nimport ProductCampaignDescription, {\n ProductCampaignDescriptionProps,\n} from '../ProductCampaignDescription/ProductCampaignDescription';\nimport VariantPickerOption from '../VariantPicker/types/VariantPickerOption';\nimport Product from '../../Types/Product';\nimport { EditorStringModel } from '../../Types/EditorString';\nimport ProductPageImageSlider from '../ProductPageImageSlider/ProductPage.ImageSlider';\nimport SliderImage from '../../Types/SliderImage';\nimport { TagProps } from '../ProductTags/ProductTag';\nimport ProductTagModel from '../../Types/ProductTagModel';\nimport { translate } from '../../Services/translation';\nimport ProductAttributeTag from '../ProductTags/ProductAttributeTag';\nimport ProductInformationTabs from '../ProductInformationTabs/ProductInformationTabs';\nimport ProductPagePrice from '../ProductPrice/ProductPagePrice';\nimport EditorString from '../EditorString/EditorString';\nimport UsedProduct from '../UsedProduct/UsedProduct';\nimport VariantPickerLinks from '../VariantPicker/VariantPicker.Links';\nimport StockStatusProps from '../../Types/StockStatus';\nimport StockStatus, {\n ProductAvailabilityItem,\n} from '../StockStatus/StockStatus';\nimport BuyButton from '../BuyButton/BuyButton';\nimport FloatingBuyButton from '../BuyButton/FloatingBuyButton';\nimport ProductPageProductSlider from '../ProductPageProductSlider/ProductPageProductSlider';\nimport KlarnaPlacement from './KlarnaPlacement';\nimport ProductPageInformationUsps, {\n ProductListInformationUspProps,\n} from './ProductPageInformationUsps';\nimport ProductPageItemTags from './ProductPageItemTags';\nimport ProductPageTierPrices from './ProductPageTierPrices';\nimport { UpSellItemType } from './types/UpSellItemType';\nimport UpSellItems from './UpSellItems/UpSellItems';\nimport VideolyVideoboxPlaceholder from './VideolyVideoboxPlaceholder';\nimport AdminEditButton from '../AdminEditButton';\nimport DemoProduct from '../DemoProduct/DemoProduct';\n\nconst CanBuy = (stockStatus?: StockStatusProps): boolean => {\n return stockStatus?.inStock ?? false;\n};\n\ninterface ProductPriceHistoryProps {\n previouslyLowestPrice: string;\n numberOfDays: number;\n title: string;\n description: string;\n}\n\ninterface CurrencyProps {\n id: string;\n}\n\ninterface ProductItemViewModelProps {\n brand?: string;\n color?: string;\n currency?: CurrencyProps;\n description?: string;\n id?: string;\n systemId?: string;\n images?: ResponsiveImageModel[];\n name?: string;\n price?: PriceModel;\n notPricedString?: string;\n purchasePriceWithoutVatFormatted?: string;\n priceInMinorUnits?: number;\n quantityFieldId?: string;\n showBuyButton?: boolean;\n showQuantityField?: boolean;\n size?: string;\n url?: string;\n useVariantUrl?: boolean;\n stockStatus?: StockStatusProps;\n cutDescription?: string;\n tags?: TagProps &\n React.HTMLAttributes<HTMLDivElement> &\n ProductTagModel[];\n splashImages?: ResponsiveImageModel[];\n productPriceHistory?: ProductPriceHistoryProps;\n usps?: string[];\n attributeTag?: TagProps &\n React.HTMLAttributes<HTMLDivElement> &\n ProductTagModel;\n discountPercentage?: string;\n additionalStockInformation?: string;\n mpn?: string;\n isVariantGrouping: boolean;\n isDropShipment: boolean;\n}\n\ninterface ProductPageProps {\n productItem: ProductItemViewModelProps;\n itemPropPrice?: string;\n itemPropPriceCurrency?: string;\n sliderImages: SliderImage[];\n productInformationTabs: ProductInformationTabsItem[];\n productListInformationUsps: ProductListInformationUspProps[];\n usedProduct: boolean;\n isDemoProduct: boolean;\n shortDescription: EditorStringModel;\n campaignDescriptions?: ProductCampaignDescriptionProps[];\n variantOptions?: Record<string, VariantPickerOption[]>;\n otherVariants: Product[];\n accessoriesProducts: Product[];\n recommendAccessory: Product[];\n similarProducts: Product[];\n mostSoldProducts: Product[];\n uSPBlock: EditorStringModel;\n upSellItems: UpSellItemType[];\n includedAccessories?: string;\n numberOfExposures?: string;\n usedListing?: string;\n customerPurchaseCommentActive: boolean;\n customerPurchaseCommentTitle?: string;\n}\n\nconst ProductPage = ({\n productItem,\n itemPropPrice,\n itemPropPriceCurrency,\n sliderImages,\n productInformationTabs,\n productListInformationUsps,\n usedProduct,\n isDemoProduct,\n shortDescription,\n campaignDescriptions,\n variantOptions,\n otherVariants,\n accessoriesProducts,\n recommendAccessory,\n similarProducts,\n mostSoldProducts,\n uSPBlock,\n upSellItems,\n includedAccessories,\n numberOfExposures,\n usedListing,\n customerPurchaseCommentActive,\n customerPurchaseCommentTitle,\n}: ProductPageProps) => {\n const [purchaseComment, setPurchaseComment] = useState('');\n const onPurchaseCommentChange = (e) => {\n setPurchaseComment(e.target.value);\n };\n\n return (\n <div\n className=\"lg:container\"\n itemScope\n itemType=\"http://schema.org/Product\"\n >\n <div className=\"flex w-full flex-wrap gap-2 bg-white px-4 pb-4 pt-2 md:px-6 lg:mb-6 lg:flex-nowrap lg:pb-5 lg:pt-5\">\n <div className=\"relative flex w-full flex-col gap-2 lg:min-w-[30.25rem] lg:gap-0 xl:w-1/2 xl:pr-6\">\n <div className=\"flex flex-col gap-0.5\">\n <h1 className=\"h4\">\n {productItem.brand && (\n <>\n <span itemProp=\"brand\">{productItem.brand}</span>{' '}\n </>\n )}\n <span itemProp=\"name\">{productItem.name}</span>\n <AdminEditButton\n url={`/Litium/UI/products/product/${productItem.systemId}`}\n />\n </h1>\n <div className=\"flex flex-wrap gap-3\">\n <div className=\"text-sm text-gray-500\">\n {translate('product.id-title')} {productItem.id}\n </div>\n {productItem.mpn && (\n <div className=\"text-sm text-gray-500\">\n {translate('product.mpn-title')} {productItem.mpn}\n </div>\n )}\n </div>\n </div>\n\n <div className=\"relative\">\n <ProductPageImageSlider\n images={sliderImages}\n splashImages={productItem.splashImages}\n />\n\n <ProductPageItemTags\n tags={productItem.tags}\n className=\"absolute right-[5px] top-[5px] z-10 flex flex-col items-end gap-0.5 lg:hidden\"\n tagSize=\"s\"\n />\n\n {productItem.attributeTag?.image && (\n <div className=\"absolute bottom-1 right-1 z-10 flex h-16 w-16 flex-col items-end\">\n <a href={productItem.attributeTag.urlToPage}>\n <ProductAttributeTag\n image={productItem.attributeTag.image}\n />\n </a>\n </div>\n )}\n </div>\n <div>\n <VideolyVideoboxPlaceholder />\n </div>\n <div className=\"my-6 hidden flex-wrap gap-x-4 gap-y-2 lg:flex\">\n <ProductPageInformationUsps\n productListInformationUsps={productListInformationUsps}\n />\n </div>\n\n <div className=\"hidden lg:block\">\n <ProductInformationTabs items={productInformationTabs} />\n </div>\n </div>\n <div className=\"relative w-full lg:min-w-[24.75rem] lg:pl-8 xl:w-1/2 xl:pl-6\">\n <ProductPageItemTags\n tags={productItem.tags}\n className=\"absolute right-0 top-0 z-10 hidden flex-col items-end lg:flex lg:gap-1\"\n tagSize=\"xl\"\n />\n\n {productItem.description && (\n <div itemProp=\"description\" className=\"mb-8 mt-2 text-lg\">\n {productItem.description}\n </div>\n )}\n\n {productItem.price && (\n <meta\n itemProp=\"sku\"\n content={productItem.price.price?.unitOfMeasurementTitle}\n />\n )}\n <div className=\"flex flex-col gap-3 lg:gap-4\">\n {productItem.price && (\n <div\n itemProp=\"offers\"\n itemScope\n itemType=\"http://schema.org/Offer\"\n className=\"flex flex-col lg:gap-1\"\n >\n <link itemProp=\"url\" href={productItem.url} />\n <ProductAvailabilityItem\n stockStatus={productItem.stockStatus}\n />\n <div className=\"flex items-baseline\">\n <ProductPagePrice\n price={productItem.price}\n discountPercentage={productItem.discountPercentage}\n productPriceHistory={\n productItem.price?.formattedCampaignPrice &&\n productItem.productPriceHistory\n ?.previouslyLowestPrice\n ? productItem.productPriceHistory\n : undefined\n }\n notPricedString={productItem.notPricedString}\n />\n <meta itemProp=\"price\" content={itemPropPrice} />\n <meta\n itemProp=\"priceCurrency\"\n content={itemPropPriceCurrency}\n />\n </div>\n {productItem.purchasePriceWithoutVatFormatted &&\n productItem.price.price?.price > 0 && (\n <div className=\"text-sm text-gray-500 lg:text-md [&_a]:underline\">\n <EditorString\n className=\"leading-tight [&>p]:leading-tight\"\n value={\n productItem.purchasePriceWithoutVatFormatted\n }\n />\n </div>\n )}\n </div>\n )}\n {isDemoProduct && !usedProduct && shortDescription?.value && (\n <DemoProduct\n shortDescription={shortDescription}\n includedAccessories={includedAccessories}\n numberOfExposures={numberOfExposures}\n usedListing={usedListing}\n />\n )}\n {usedProduct && (\n <UsedProduct\n shortDescription={shortDescription}\n includedAccessories={includedAccessories}\n numberOfExposures={numberOfExposures}\n usedListing={usedListing}\n />\n )}\n {campaignDescriptions && campaignDescriptions.length > 0 && (\n <>\n {campaignDescriptions.map((campaignDescription, i) => (\n <ProductCampaignDescription\n key={i}\n image={campaignDescription.image}\n link={campaignDescription.link}\n title={campaignDescription.title}\n />\n ))}\n </>\n )}\n {productItem.usps && productItem.usps.length > 0 && (\n <ul className=\"ml-4 list-disc text-sm\">\n {productItem.usps.map((usp, i) => (\n <li key={i} className=\"mb-1 lg:text-md\">\n {usp}\n </li>\n ))}\n </ul>\n )}\n {variantOptions?.color && variantOptions.color.length > 0 && (\n <div className=\"flex flex-col gap-2\">\n <p className=\"text-md\">\n <span className=\"font-bold\">\n {translate('product.color')}\n </span>\n : {productItem.color}\n </p>\n\n <VariantPickerLinks\n options={variantOptions.color}\n selectedValue={productItem.id}\n />\n </div>\n )}\n {variantOptions?.size && variantOptions.size.length > 0 && (\n <div className=\"flex flex-col gap-2\">\n <p className=\"text-md\">\n <span className=\"font-bold\">\n {translate('product.size')}\n </span>\n : {productItem.size}\n </p>\n\n <VariantPickerLinks\n options={variantOptions.size}\n selectedValue={productItem.id}\n />\n </div>\n )}\n {productItem.stockStatus && (\n <div className=\"mr-1 flex py-1\">\n <StockStatus\n {...productItem.stockStatus}\n isDropShipment={productItem.isDropShipment}\n additionalInformation={\n productItem.additionalStockInformation\n }\n />\n </div>\n )}\n {upSellItems && upSellItems.length > 0 && (\n <UpSellItems upSellItems={upSellItems} />\n )}\n {customerPurchaseCommentActive &&\n customerPurchaseCommentTitle && (\n <div className=\"flex flex-col gap-1\">\n <label className=\"text-sm font-bold text-gray-900 lg:text-md\">\n {customerPurchaseCommentTitle}\n </label>\n <input\n type=\"text\"\n className=\"flex h-8 w-full grow rounded-sm border border-solid border-gray-400 px-3 py-2 text-md font-normal leading-[150%]\"\n maxLength={60}\n onChange={onPurchaseCommentChange}\n value={purchaseComment}\n />\n </div>\n )}\n <div className=\"flex flex-col gap-1\">\n <div className=\"[&_.quantity-input]:min-h-[56px] [&_.quantity-input]:w-full [&_.quantity-input]:max-w-[56px]\">\n <BuyButton\n articleNumber={productItem.id}\n disabled={!CanBuy(productItem.stockStatus)}\n showQuantityInput={false}\n className=\"buy-button flex gap-2 [&>button]:py-3\"\n showCartIcon={true}\n label={translate('general.add-to-cart-page')}\n purchaseComment={purchaseComment}\n />\n {productItem.price && (\n <FloatingBuyButton\n articleNumber={productItem.id}\n disabled={!CanBuy(productItem.stockStatus)}\n showQuantityInput={false}\n className=\"buy-button [&>button]:px-4 [&>button]:py-2 [&>button]:text-sm [&>button]:lg:px-4 [&>button]:lg:py-2 [&>button]:lg:text-md\"\n showCartIcon={false}\n label={translate('general.add-to-cart')}\n name={productItem.name}\n brand={productItem.brand}\n price={productItem.price}\n discountPercentage={productItem.discountPercentage}\n purchaseComment={purchaseComment}\n />\n )}\n </div>\n {productItem.priceInMinorUnits &&\n productItem.priceInMinorUnits > 0 ? (\n <KlarnaPlacement\n priceInMinorUnits={productItem.priceInMinorUnits}\n />\n ) : null}\n </div>\n <div className=\"flex flex-col gap-y-2 lg:hidden\">\n <ProductPageInformationUsps\n productListInformationUsps={productListInformationUsps}\n />\n </div>\n <div className=\"hidden lg:block\">\n {otherVariants && otherVariants.length > 0 && (\n <div className=\"mt-4 lg:mt-7 [&_.swiper-block]:overflow-y-hidden\">\n <ProductPageProductSlider\n title={translate('product.availableinothervariants')}\n products={otherVariants}\n numberOfSlidesMobile={2}\n numberOfSlidesDesktop={3}\n />\n </div>\n )}\n\n {recommendAccessory && recommendAccessory.length > 0 && (\n <div className=\"mt-4 lg:mt-7 [&_.swiper-block]:overflow-y-hidden\">\n <ProductPageProductSlider\n title={translate('product.recommendaccessory')}\n products={recommendAccessory}\n numberOfSlidesMobile={2}\n numberOfSlidesDesktop={3}\n />\n </div>\n )}\n\n {accessoriesProducts && accessoriesProducts.length > 0 && (\n <div className=\"mt-4 lg:mt-7 [&_.swiper-block]:overflow-y-hidden\">\n <ProductPageProductSlider\n title={translate('product.recommendedaccessories')}\n products={accessoriesProducts}\n numberOfSlidesMobile={2}\n numberOfSlidesDesktop={3}\n />\n </div>\n )}\n\n {similarProducts && similarProducts.length > 0 && (\n <div className=\"mt-4 lg:mt-7 [&_.swiper-block]:overflow-y-hidden\">\n <ProductPageProductSlider\n title={translate('product.similarproducts')}\n products={similarProducts}\n numberOfSlidesMobile={2}\n numberOfSlidesDesktop={3}\n />\n </div>\n )}\n\n {mostSoldProducts && mostSoldProducts.length > 0 && (\n <div className=\"mt-4 lg:mt-7 [&_.swiper-block]:overflow-y-hidden\">\n <ProductPageProductSlider\n title={translate('product.mostsoldproducts')}\n products={mostSoldProducts}\n numberOfSlidesMobile={2}\n numberOfSlidesDesktop={3}\n />\n </div>\n )}\n </div>\n <ProductPageTierPrices\n currencyId={productItem.currency?.id}\n tierPriceItems={productItem.price?.tierPrices}\n />\n </div>\n {uSPBlock?.value && (\n <div className=\"my-8\">\n <EditorString {...uSPBlock} />\n </div>\n )}\n </div>\n </div>\n\n <div className=\"bg-white pb-4 lg:hidden\">\n <ProductInformationTabs items={productInformationTabs} />\n {otherVariants && otherVariants.length > 0 && (\n <div className=\"mt-4 lg:mt-7 [&_.swiper-block]:overflow-y-hidden\">\n <ProductPageProductSlider\n title={translate('product.availableinothervariants')}\n products={otherVariants}\n numberOfSlidesMobile={2}\n numberOfSlidesDesktop={3}\n />\n </div>\n )}\n\n {recommendAccessory && recommendAccessory.length > 0 && (\n <div className=\"mt-4 lg:mt-7 [&_.swiper-block]:overflow-y-hidden\">\n <ProductPageProductSlider\n title={translate('product.recommendaccessory')}\n products={recommendAccessory}\n numberOfSlidesMobile={2}\n numberOfSlidesDesktop={3}\n />\n </div>\n )}\n\n {accessoriesProducts && accessoriesProducts.length > 0 && (\n <div className=\"mt-4 lg:mt-7 [&_.swiper-block]:overflow-y-hidden\">\n <ProductPageProductSlider\n title={translate('product.recommendedaccessories')}\n products={accessoriesProducts}\n numberOfSlidesMobile={2}\n numberOfSlidesDesktop={3}\n />\n </div>\n )}\n\n {similarProducts && similarProducts.length > 0 && (\n <div className=\"mt-4 lg:mt-7 [&_.swiper-block]:overflow-y-hidden\">\n <ProductPageProductSlider\n title={translate('product.similarproducts')}\n products={similarProducts}\n numberOfSlidesMobile={2}\n numberOfSlidesDesktop={3}\n />\n </div>\n )}\n\n {mostSoldProducts && mostSoldProducts.length > 0 && (\n <div className=\"mt-4 lg:mt-7 [&_.swiper-block]:overflow-y-hidden\">\n <ProductPageProductSlider\n title={translate('product.mostsoldproducts')}\n products={mostSoldProducts}\n numberOfSlidesMobile={2}\n numberOfSlidesDesktop={3}\n />\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport default ProductPage;\n","import React from 'react';\nimport { LinkModel } from '../../Types/LinkModel';\nimport clsx from 'clsx';\n\nexport interface BannerItemProps {\n imageUrl: string;\n imageHeight: number;\n imageWidth: number;\n mobileImageUrl?: string;\n mobileImageHeight: number;\n mobileImageWidth: number;\n linkText?: string;\n overlay: boolean;\n link?: LinkModel;\n bodyText?: string;\n cardLink?: string;\n lazyLoadImage?: boolean;\n className?: string;\n}\n\nconst BannerBlockItem = ({\n imageUrl,\n imageHeight,\n imageWidth,\n mobileImageUrl,\n mobileImageHeight,\n mobileImageWidth,\n linkText,\n overlay,\n link,\n cardLink,\n bodyText,\n lazyLoadImage = false,\n className,\n}: BannerItemProps) => {\n const hasLinkButton = link;\n\n const DivOrAnchor = ({ children, ...rest }) =>\n cardLink ? (\n <a href={cardLink} className={rest.className}>\n {children}\n </a>\n ) : hasLinkButton && link?.href ? (\n <a {...rest}>{children}</a>\n ) : (\n <div {...rest}>{children}</div>\n );\n\n return (\n <DivOrAnchor\n className={clsx(\n className,\n 'text-white',\n 'overflow-hidden',\n 'transition',\n 'duration-300',\n 'text-center',\n 'grid',\n (link?.href || cardLink) && 'hover:opacity-70'\n )}\n href={link?.href}\n >\n {mobileImageUrl ? (\n <>\n <img\n className={clsx(\n 'banner-item-image',\n 'col-start-1',\n 'row-start-1',\n 'w-full',\n 'h-full',\n 'object-cover',\n 'flex',\n 'lg:hidden'\n )}\n src={mobileImageUrl}\n height={mobileImageHeight > 0 ? mobileImageHeight : undefined}\n width={mobileImageWidth > 0 ? mobileImageWidth : undefined}\n loading={lazyLoadImage ? 'lazy' : undefined}\n />{' '}\n <img\n className={clsx(\n 'banner-item-image',\n 'col-start-1',\n 'row-start-1',\n 'w-full',\n 'h-full',\n 'object-cover',\n 'hidden',\n 'lg:flex'\n )}\n src={imageUrl}\n height={imageHeight > 0 ? imageHeight : undefined}\n width={imageWidth > 0 ? imageWidth : undefined}\n loading={lazyLoadImage ? 'lazy' : undefined}\n />\n </>\n ) : (\n <img\n className={clsx(\n 'banner-item-image',\n 'col-start-1',\n 'row-start-1',\n 'w-full',\n 'h-full',\n 'object-cover'\n )}\n src={imageUrl}\n height={imageHeight > 0 ? imageHeight : undefined}\n width={imageWidth > 0 ? imageWidth : undefined}\n loading={lazyLoadImage ? 'lazy' : undefined}\n />\n )}\n <div\n className={clsx(\n 'w-full',\n 'h-full',\n 'col-start-1',\n 'row-start-1',\n 'z-10',\n 'flex',\n 'items-start',\n 'justify-end',\n 'flex-col',\n 'max-w-[600px]',\n 'p-4',\n 'lg:p-6',\n 'box-border'\n )}\n >\n <h4 className=\"mb-2 text-white\">{linkText}</h4>\n {bodyText && <p className=\"mb-4 text-left\">{bodyText}</p>}\n {hasLinkButton && link.text && (\n <span className=\"btn btn--white btn--medium-long\">\n {link.text}\n </span>\n )}\n </div>\n {overlay && (\n <div\n className={clsx(\n 'col-start-1',\n 'row-start-1',\n 'w-full',\n 'h-full',\n 'z-0',\n 'bg-[rgba(0,0,0,0.551)]',\n 'pointer-events-none'\n )}\n ></div>\n )}\n </DivOrAnchor>\n );\n};\n\nexport default BannerBlockItem;\n","import React from 'react';\nimport clsx from 'clsx';\nimport { LinkModel } from '../Types/LinkModel';\n\ninterface BlockHeaderProps {\n title?: string;\n link?: LinkModel;\n}\n\nconst BlockHeader = ({ title, link }: BlockHeaderProps) => {\n if (!title && !link) return null;\n\n return (\n <div\n className={clsx(\n 'mb-2',\n 'flex',\n 'w-full',\n 'flex-row',\n 'items-center',\n 'justify-between'\n )}\n >\n <div className=\"flex items-center\">\n {title && <h5 className={clsx('text-gray-900')}>{title}</h5>}\n </div>\n <div className=\"flex items-center justify-end\">\n {link?.href && (\n <a\n className={clsx(\n 'text-primary-500',\n 'underline',\n 'underline-offset-4',\n 'text-md'\n )}\n href={link.href}\n >\n {link.text}\n </a>\n )}\n </div>\n </div>\n );\n};\n\nexport default BlockHeader;\n","import React from 'react';\nimport BannerBlockItem, { BannerItemProps } from './BannerBlockItem';\nimport clsx from 'clsx';\nimport { LinkModel } from '../../Types/LinkModel';\nimport BlockHeader from '../BlockHeader';\n\nexport interface BannerBlockProps {\n systemId: string;\n title: string;\n link?: LinkModel;\n numPerRow: number;\n banners: BannerItemProps[];\n className?: string;\n}\n\nconst bannerCellClass = {\n 1: 'grid-cols-1',\n 2: 'sm-down:grid-cols-1 grid-cols-2',\n 3: 'sm-down:grid-cols-1 grid-cols-3',\n 4: 'md-down:grid-cols-2 grid-cols-4',\n 5: 'md-down:grid-cols-3 sm-down:grid-cols-2 grid-cols-5',\n 6: 'md-down:grid-cols-3 sm-down:grid-cols-2 grid-cols-6',\n};\n\nconst BannerBlock = ({\n systemId,\n banners,\n title,\n link,\n numPerRow,\n className,\n}: BannerBlockProps) => {\n return banners?.length > 0 ? (\n <div className={clsx('container', 'overflow-x-hidden', className)}>\n <BlockHeader title={title} link={link} />\n <div className={`grid ${bannerCellClass[numPerRow]} gap-4 md:gap-6`}>\n {banners.map((banner, idx) => (\n <BannerBlockItem\n {...banner}\n key={'banner-block' + idx + systemId}\n />\n ))}\n </div>\n </div>\n ) : null;\n};\n\nexport default BannerBlock;\n","import React, { useState, useEffect } from 'react';\nimport { Swiper, SwiperSlide } from 'swiper/react';\nimport { Pagination, Navigation, FreeMode } from 'swiper';\nimport BannerBlockItem, { BannerItemProps } from './BannerBlockItem';\nimport BannerBlock from './BannerBlock';\nimport clsx from 'clsx';\n\ninterface BannerBlockProps {\n slides: BannerItemProps[];\n numPerRow: number;\n systemId: string;\n}\n\nconst BannerSliderBlock = ({\n systemId,\n slides,\n numPerRow,\n}: BannerBlockProps) => {\n const [ready, setReady] = useState(false);\n\n useEffect(() => setReady(true), []);\n\n if (!slides || slides.length == 0) {\n return null;\n }\n\n return !ready ? (\n <BannerBlock\n numPerRow={numPerRow}\n banners={slides.slice(0, 1)}\n systemId={systemId}\n title=\"\"\n />\n ) : (\n <div\n className={clsx(\n 'px-4',\n 'md:px-6',\n 'lg:px-0',\n 'max-w-[100vw]',\n 'overflow-x-hidden',\n '[&_.swiper-pagination.swiper-pagination-horizontal]:bottom-[60px]',\n '[&_.swiper-pagination]:flex',\n '[&_.swiper-pagination]:justify-center',\n '[&_.swiper-pagination]:gap-1',\n '[&_.pagination-dash]:my-[7px]',\n '[&_.pagination-dash]:h-1',\n '[&_.pagination-dash]:w-[18px]',\n '[&_.swiper-button-prev]:h-6',\n '[&_.swiper-button-next]:h-6',\n '[&_.pagination-dash]:bg-gray-400',\n '[&_.pagination-dash.pagination-dash--active]:bg-gray-900'\n )}\n >\n {ready && (\n <Swiper\n className={clsx('banner-swiper')}\n pagination={\n slides.length > 1\n ? {\n dynamicBullets: slides.length > 8 ? true : false,\n dynamicMainBullets: 3,\n bulletClass: 'pagination-dash',\n bulletActiveClass: 'pagination-dash--active',\n }\n : false\n }\n navigation={slides.length > 1}\n modules={[FreeMode, Pagination, Navigation]}\n lazy={true}\n loop={slides.length > 1}\n >\n {slides.map((slide: BannerItemProps, index: number) => (\n <SwiperSlide key={'banner-slider' + index + systemId}>\n <BannerBlockItem {...slide} />\n </SwiperSlide>\n ))}\n </Swiper>\n )}\n </div>\n );\n};\n\nexport default BannerSliderBlock;\n","import React from 'react';\nimport { LinkModel } from '../Types/LinkModel';\nimport clsx from 'clsx';\n\ninterface CategoryLinkBlockProps {\n title?: string;\n showThumbnail?: boolean;\n links: CategoryLinkBlockItem[];\n}\n\ninterface CategoryLinkBlockItem {\n link: LinkModel;\n imageUrl?: string;\n imageAlt?: string;\n}\n\nconst CategoryLinkBlock = ({\n title,\n showThumbnail,\n links,\n}: CategoryLinkBlockProps) => {\n return (\n <div className=\"container flex flex-col gap-2 text-gray-900\">\n {title && <h5>{title}</h5>}\n <div className=\"relative\">\n <div className=\"absolute -left-4 top-0 h-10 w-4 bg-inverted-shadow-gradient lg:hidden\"></div>\n <div className=\"absolute -right-4 top-0 h-full w-4 bg-shadow-gradient lg:hidden\"></div>\n <div\n className={clsx(\n '-ml-4 -mr-4 flex flex-row flex-nowrap gap-2 overflow-x-auto pl-4 scrollbar-none lg:ml-0 lg:mr-0 lg:grid lg:grid-cols-6 lg:pl-0'\n )}\n >\n {links.map((link, i) => (\n <a\n href={link.link?.href}\n aria-label={link.link?.text}\n key={i}\n className={clsx(\n 'flex-shrink-0 rounded-sm border-gray-400 text-center last:mr-2 last:lg:mr-0',\n !showThumbnail && 'border',\n !showThumbnail && 'px-4',\n !showThumbnail && 'py-2',\n showThumbnail && 'justify-self-center',\n showThumbnail && 'w-[40%] lg:w-[unset]'\n )}\n >\n <span\n className={clsx(\n 'text-md leading-6',\n !showThumbnail && 'font-medium',\n showThumbnail && 'font-bold text-black'\n )}\n >\n {showThumbnail && (\n <img\n className=\"mb-1 rounded-sm bg-[#d3d3d3]\"\n src={link.imageUrl}\n />\n )}\n {link.link?.text}\n </span>\n </a>\n ))}\n </div>\n </div>\n </div>\n );\n};\n\nexport default CategoryLinkBlock;\n","import React, { useCallback, useMemo, useState } from 'react';\nimport ProductCardProps from './types/ProductCardProps';\nimport StockStatus from '../StockStatus/StockStatus';\nimport Dropdown, { DropdownOption } from '../Dropdown';\nimport { translate } from '../../Services/translation';\nimport ResponsiveImage from '../ResponsiveImage/ResponsiveImage';\nimport ProductTag from '../ProductTags/ProductTag';\nimport ProductAttributeTag from '../ProductTags/ProductAttributeTag';\nimport ProductCardBuyButton from './ProductCardBuyButton';\nimport ProductPrice from '../ProductPrice/ProductPrice';\nimport useBreakpoint from '../../Hooks/useBreakpoint';\nimport clsx from 'clsx';\n\nconst ProductCard = ({\n product,\n isVariantListing,\n lazyLoadImage,\n}: ProductCardProps) => {\n const [selectedOption, setSelectedOption] = useState<DropdownOption>();\n\n const articleNumber = useMemo(\n () =>\n product.variantOptions?.length ? selectedOption?.value : product.id,\n [product.id, product.variantOptions?.length, selectedOption?.value]\n );\n\n const breakpoint = useBreakpoint();\n const productTagsSize = useCallback(() => {\n switch (breakpoint) {\n case 'lg':\n case 'xl':\n case '2xl':\n case '3xl':\n return 'l';\n default:\n return 's';\n }\n }, [breakpoint]);\n\n return (\n <div className=\"m-w-0 flex h-full max-w-full flex-col rounded-sm bg-white shadow-mc\">\n <a\n href={product.url}\n className={clsx(\n 'relative flex w-full justify-center overflow-hidden rounded-t pt-3 lg:pt-4',\n 'max-h-[167px] min-h-[167px] md:max-h-[242px] md:min-h-[242px] lg:max-h-[213px] lg:min-h-[213px] xl:max-h-[251px] xl:min-h-[251px] 2xl:max-h-[304px] 2xl:min-h-[304px]'\n )}\n >\n {product.images && product.images.length > 0 && (\n <div className=\"aspect-square h-full max-w-full\">\n <div className=\"relative h-full\">\n <div className=\"h-full [&_img]:aspect-square [&_img]:h-full [&_img]:w-full [&_img]:object-contain\">\n <ResponsiveImage\n {...product.images[0]}\n lazyLoad={lazyLoadImage}\n />\n </div>\n {product.splashImages && product.splashImages.length > 0 && (\n <div className=\"absolute left-0 top-0 flex max-w-[45%] transform flex-col gap-1 [&_img]:w-auto\">\n {product.splashImages.map((splashImage, index) => (\n <ResponsiveImage\n key={index}\n {...splashImage}\n lazyLoad={lazyLoadImage}\n />\n ))}\n </div>\n )}\n </div>\n </div>\n )}\n {product.tags?.length ? (\n <div className=\"absolute right-0 top-0 flex flex-col items-end gap-[1px]\">\n {product.tags.map((tag) => (\n <ProductTag\n tagSize={productTagsSize()}\n id={tag.id}\n key={tag.id}\n isCampaign={tag.isCampaign}\n >\n {tag.name}\n </ProductTag>\n ))}\n </div>\n ) : null}\n {product.hasMultipleVariants && (\n <div\n className=\"absolute left-0 top-0 rounded-sm bg-gray-900 px-2 text-md font-medium text-white\"\n style={{\n backgroundColor: product.variantsLabel?.color,\n color: product.variantsLabel?.textColor,\n }}\n >\n {product.variantsLabel?.text}\n </div>\n )}\n {product.attributeTag ? (\n <div className=\"absolute bottom-0 right-0 mr-2 flex h-10 w-10 flex-col items-end lg:h-14 lg:w-14\">\n <ProductAttributeTag\n image={product.attributeTag.image}\n lazyLoadImage={lazyLoadImage}\n ></ProductAttributeTag>\n </div>\n ) : null}\n </a>\n <div className=\"flex flex-1 flex-col rounded-b px-3 pb-2 pt-1 lg:px-4 lg:pb-3\">\n <div\n className={clsx(\n 'mb-2 flex-1 overflow-y-hidden leading-tight',\n 'max-h-[168px] min-h-[168px] md:max-h-[114px] md:min-h-[114px] lg:max-h-[118px] lg:min-h-[118px]'\n )}\n >\n {product.brand && (\n <div className=\"mb-0.5 text-sm text-gray-600\">\n {product.brand}\n </div>\n )}\n <a className=\"mb-2 block text-md font-bold\" href={product.url}>\n {product.name}\n </a>\n {product.usps && product.usps.length > 0 && (\n <ul className=\"product-usps text-sm text-gray-600\">\n {product.usps.map((item, idx) => (\n <li className=\"mb-1 flex items-center\" key={idx}>\n {item}\n </li>\n ))}\n </ul>\n )}\n </div>\n <div className=\"max-h-[59px] min-h-[59px]\">\n <StockStatus {...product.stockStatus} />\n <div className=\"mt-2 flex items-center justify-between gap-2\">\n <ProductPrice\n price={product.price}\n lowestVariantPrice={product.lowestVariantPrice}\n discountPercentage={product.discountPercentage}\n isQuickSearch={false}\n notPricedString={product.notPricedString}\n hasMultipleVariants={product.hasMultipleVariants}\n />\n {product.variantOptions?.length ? (\n <Dropdown\n options={product.variantOptions}\n size=\"small\"\n selectedValue={selectedOption?.value}\n onChange={(option) => setSelectedOption(option)}\n placeholder={translate('product.sizepicker')}\n />\n ) : null}\n <ProductCardBuyButton\n product={{ ...product, id: articleNumber }}\n isVariantListing={isVariantListing}\n showQuantityInput={false}\n className=\"[&_button]:flex-1 [&_button]:text-sm [&_button]:leading-[1.33] [&_div]:flex-1 [&_input]:text-sm\"\n />\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport default ProductCard;\n","import React from 'react';\nimport Product from '../Types/Product';\nimport { LinkModel } from '../Types/LinkModel';\nimport ProductCard from '../Components/ProductCards/ProductCard';\n\nexport interface ProductNoSliderProps {\n products: Product[];\n numPerRow: number;\n title: string;\n link: LinkModel;\n}\n\nconst ProductBlockNoSlider = (props: ProductNoSliderProps) => {\n const { products, numPerRow, title, link } = props;\n\n const cells = {\n 1: 'grid-cols-1',\n 2: 'grid-cols-1 md:grid-cols-2',\n 3: 'grid-cols-1 sm:grid-cols-2 md:grid-cols-3',\n 4: 'grid-cols-2 lg:grid-cols-4',\n 5: 'grid-cols-6 lg:grid-cols-5',\n 6: 'grid-cols-2 md:grid-cols-3 lg:grid-cols-6',\n };\n\n return (\n <>\n <div className=\"relative flex items-center justify-between\">\n <h5 className=\"lg:h4\">{title}</h5>\n <div className=\"flex items-center\">\n {link?.href && link?.href != '' && (\n <a\n className=\"text-md text-primary-500 underline underline-offset-4\"\n href={link.href}\n >\n {link.text}\n </a>\n )}\n </div>\n </div>\n <div className={`mt-2 grid gap-0.5 ${cells[numPerRow]}`}>\n {products.map((product, idx) => (\n <ProductCard\n key={product.id + 'noslide' + idx}\n product={product}\n />\n ))}\n </div>\n </>\n );\n};\n\nexport default ProductBlockNoSlider;\n","import { Swiper, SwiperSlide } from 'swiper/react';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Pagination, Swiper as SwiperType, Navigation } from 'swiper';\nimport Product from '../Types/Product';\nimport ProductBlockNoSlider from './ProductBlockNoSlider';\nimport clsx from 'clsx';\nimport ProductSliderHeader from '../Components/ProductSliderHeader';\nimport { LinkModel } from '../Types/LinkModel';\nimport ProductCard from '../Components/ProductCards/ProductCard';\n\ninterface ProductSliderProps {\n products: Product[];\n title: string;\n link?: LinkModel;\n}\n\nconst ProductSlider = ({ products, title, link }: ProductSliderProps) => {\n const [renderSlider, setRenderSlider] = useState(false);\n const swiperRef = useRef<SwiperType>();\n\n useEffect(() => setRenderSlider(true), []);\n\n const slidePrev = () => {\n swiperRef.current?.slidePrev();\n };\n const slideNext = () => {\n swiperRef.current?.slideNext();\n };\n\n return renderSlider ? (\n <>\n <ProductSliderHeader\n title={title}\n link={link}\n slideNext={slideNext}\n slidePrev={slidePrev}\n canSlideNext={true}\n canSlidePrev={true}\n />\n <div\n className={clsx(\n '[&_.swiper-pagination.swiper-pagination-horizontal]:bottom-[24] [&_.swiper-pagination]:flex [&_.swiper-pagination]:justify-center [&_.swiper-pagination]:gap-1',\n '[&_.pagination-dash]:mb-[7px] [&_.pagination-dash]:mt-[7px] [&_.pagination-dash]:h-1 [&_.pagination-dash]:w-[18px] [&_.pagination-dash]:bg-gray-400',\n 'mt-2 [&_.pagination-dash.pagination-dash--active]:bg-gray-900'\n )}\n >\n <div className=\"relative\">\n <Swiper\n spaceBetween={2}\n slidesPerView={2}\n slidesPerGroup={2}\n pagination={{\n dynamicBullets: false,\n bulletClass: 'pagination-dash',\n bulletActiveClass: 'pagination-dash--active',\n }}\n loop={true}\n modules={[Pagination, Navigation]}\n breakpoints={{\n 767: { spaceBetween: 4 },\n 1023: { slidesPerView: 4, slidesPerGroup: 4 },\n }}\n className=\"product-swiper !px-[1px] !pt-[2px] pb-8 [&_.swiper-pagination]:bottom-0 [&_.swiper-pagination]:h-auto [&_.swiper-slide]:h-auto [&_.swiper-wrapper]:pb-11\"\n onBeforeInit={(swiper) => {\n swiperRef.current = swiper;\n }}\n >\n {products.map((product, idx) => (\n <SwiperSlide key={product.id + 'slide' + idx}>\n <ProductCard product={product} lazyLoadImage={true} />\n </SwiperSlide>\n ))}\n </Swiper>\n </div>\n </div>\n </>\n ) : (\n //Render product block without slider on server to avoid layout shifting\n <div className=\"pb-8\">\n <h5 className=\"lg:h4\">{title}</h5>\n <ProductBlockNoSlider\n products={products.slice(0, 4)}\n numPerRow={4}\n />\n </div>\n );\n};\n\nexport default ProductSlider;\n","import React, { useState, useEffect, useMemo } from 'react';\nimport { translate } from '../Services/translation';\nconst MAX_LEN = 117;\n\nconst ProductListHeaderText = ({ value }: { value?: string }) => {\n const [showMore, setShowMore] = useState(true);\n const wordLength = useMemo(() => value?.length ?? 0, [value]);\n\n useEffect(() => {\n setShowMore(wordLength > MAX_LEN);\n }, [wordLength]);\n\n const trimmedText = useMemo(() => {\n if (!value) return '';\n return value.length > MAX_LEN ? value.substring(0, MAX_LEN) + '...' : value;\n }, [value]);\n\n return (\n <div className=\"mb-4 flex lg:mb-6\">\n <div className={`mb-2 text-md overflow-hidden`}>\n <span\n id=\"mcs-current-category-description\"\n className=\"mb-2 text-md\"\n style={{ display: showMore ? 'inline' : 'none' }} \n dangerouslySetInnerHTML={{\n __html: trimmedText,\n }}\n />\n <span\n id=\"mcs-current-category-description-full\"\n className=\"mb-2 text-md\"\n style={{ display: showMore ? 'none' : 'inline' }}\n dangerouslySetInnerHTML={{\n __html: value ?? '',\n }}\n />\n {wordLength > MAX_LEN && (\n <>\n {' '}\n <a\n className=\"cursor-pointer text-md underline\"\n onClick={() => setShowMore(!showMore)}\n >\n {showMore ? translate('productlist.showmore') : translate('productlist.showless')}\n </a>\n </>\n )}\n </div>\n </div>\n );\n};\n\nexport default ProductListHeaderText;","import React from 'react';\nimport { useMemo } from 'react';\nimport { useDispatch } from 'react-redux';\nimport Chip from '../Chip';\nimport { FilterGroup } from '../ProductFiltering/types/FilterGroup';\nimport { FilterGroupType } from '../ProductFiltering/types/FilterGroupType';\nimport { clearFilterGroup } from '../../Actions/ProductFiltering.action';\nimport FormatPrice from '../../Utils/FormatPrice';\nimport { useTypedSelector } from '../../Hooks/useTypedSelector';\n\ninterface FilterGroupChipsAttributes {\n filterGroup: FilterGroup;\n}\n\nconst FilterGroupChips = (props: FilterGroupChipsAttributes) => {\n const currencyFormat = useTypedSelector((state) => state.currencyFormat);\n const dispatch = useDispatch();\n const { selectedOptions, id, label, filterGroupType, options } =\n props.filterGroup;\n\n const chipText = useMemo(() => {\n if (id === 'category') {\n return selectedOptions\n .map((selectedId) => {\n const matchingOption = options.find(\n (opt) => opt.id === selectedId\n );\n return matchingOption ? matchingOption.label : selectedId;\n })\n .join(', ');\n }\n return selectedOptions.join(', ');\n }, [selectedOptions, options, id]);\n\n if (selectedOptions.length == 0) return null;\n\n return (\n <>\n {filterGroupType == FilterGroupType.Checkbox && (\n <Chip\n key={id + 'chip'}\n chipProps={{\n title: chipText.length > 30 ? chipText : undefined,\n className: 'bg-white',\n }}\n onDeleteClick={() => dispatch(clearFilterGroup(id))}\n >\n <span>\n <strong>{label}:</strong> {chipText.substring(0, 30)}\n {chipText.length > 30 ? '...' : ''}\n </span>\n </Chip>\n )}\n {filterGroupType == FilterGroupType.Range &&\n selectedOptions.length == 2 && (\n <Chip\n onDeleteClick={() => dispatch(clearFilterGroup(id))}\n chipProps={{ className: 'bg-white' }}\n >\n <span>\n <strong>{label}:</strong> {selectedOptions[0]}-\n {selectedOptions[1]}\n </span>\n </Chip>\n )}\n {filterGroupType == FilterGroupType.PriceRange &&\n selectedOptions.hasOwnProperty(0) &&\n selectedOptions[0] !== undefined &&\n selectedOptions.hasOwnProperty(1) &&\n selectedOptions[1] !== undefined && (\n <Chip\n onDeleteClick={() => dispatch(clearFilterGroup(id))}\n chipProps={{ className: 'bg-white' }}\n >\n <span>\n <strong>{label}:</strong>{' '}\n {FormatPrice(parseInt(selectedOptions[0]), currencyFormat)} -{' '}\n {FormatPrice(parseInt(selectedOptions[1]), currencyFormat)}\n </span>\n </Chip>\n )}\n </>\n );\n};\n\nexport default FilterGroupChips;\n","import React from 'react';\nimport { useTypedSelector } from '../../Hooks/useTypedSelector';\nimport FilterGroupChips from './FilterGroupChips';\nimport { translate } from '../../Services/translation';\nimport { useDispatch } from 'react-redux';\nimport { clearAllFilters } from '../../Actions/ProductFiltering.action';\nimport { useMemo } from 'react';\nimport clsx from 'clsx';\n\nconst ActiveFilterChips = () => {\n const dispatch = useDispatch();\n const filters = useTypedSelector(\n (state) => state.productFiltering.filters\n );\n const hasAnyOptionSelected = useMemo(\n () => filters?.some((f) => f.selectedOptions.length > 0),\n [filters]\n );\n\n return hasAnyOptionSelected ? (\n <div\n className={clsx(\n 'gap-2',\n 'mb-4',\n '-mt-2',\n 'flex',\n 'items-center',\n 'text-sm',\n 'md-down:hidden'\n )}\n >\n {filters.map((g) => (\n <FilterGroupChips key={g.id + 'chips'} filterGroup={g} />\n ))}\n <a\n className={clsx('text-sm', 'underline', 'cursor-pointer')}\n onClick={() => dispatch(clearAllFilters())}\n >\n {translate('product-filtering.clear-all-filters')}\n </a>\n </div>\n ) : null;\n};\n\nexport default ActiveFilterChips;\n","import React, { useMemo } from 'react';\nimport { translate } from '../../Services/translation';\n\ninterface ProgressBarProps {\n progress?: number;\n maxProgress?: number;\n showLabel?: boolean;\n}\n\nconst ProgressBar = ({\n progress = 0,\n maxProgress = 100,\n showLabel = true,\n}: ProgressBarProps) => {\n const progressPercent = useMemo(\n () =>\n maxProgress == 0\n ? 100\n : Math.min((progress / maxProgress) * 100, 100),\n [progress, maxProgress]\n );\n\n return (\n <>\n <div className=\"relative mt-4 h-[10px] w-full rounded bg-primary-50\">\n <div\n className=\"z-10 h-full rounded bg-primary-500 transition-[width] duration-[125ms] ease-in-out\"\n style={{ width: `${progressPercent}%` }}\n ></div>\n </div>\n {showLabel && (\n <label className=\"mt-4 text-center text-md\">\n {translate('progress-bar.label')\n .replace('{0}', progress)\n .replace('{1}', maxProgress)}\n </label>\n )}\n </>\n );\n};\n\nexport default ProgressBar;\n","import React, { forwardRef, useEffect, useState } from 'react';\nimport ProgressBar from '../ProgressBar/ProgressBar';\nimport { translate } from '../../Services/translation';\nimport clsx from 'clsx';\n\ninterface LoadMoreButtonAttributes\n extends React.HTMLAttributes<HTMLDivElement> {\n disabled?: boolean;\n count?: number;\n totalCount?: number;\n isLoading?: boolean;\n productsPerLoad?: number;\n location?: string;\n pageNumberForCrawler: number;\n pageSize: number;\n canLoadMore?: boolean;\n onClick: () => void;\n}\n\nconst LoadMoreButton = forwardRef<\n HTMLDivElement,\n LoadMoreButtonAttributes\n>(\n (\n {\n onClick,\n disabled = false,\n count,\n totalCount,\n isLoading = false,\n productsPerLoad,\n location,\n pageNumberForCrawler,\n canLoadMore,\n pageSize,\n ...props\n }: LoadMoreButtonAttributes,\n wrapperRef\n ) => {\n const [crawlerCount, setCrawlerCount] = useState(\n count >= totalCount\n ? count\n : count + productsPerLoad < totalCount\n ? count + productsPerLoad\n : totalCount\n );\n\n useEffect(() => {\n if (count >= totalCount) {\n setCrawlerCount(count);\n } else {\n if (count + productsPerLoad < totalCount) {\n setCrawlerCount(count + productsPerLoad);\n } else {\n setCrawlerCount(totalCount);\n }\n }\n }, [count, productsPerLoad, totalCount]);\n\n return (\n <div\n {...props}\n className={clsx(\n props.className,\n 'mx-auto my-0 flex max-w-[240px] flex-col pt-4 md:pt-6'\n )}\n ref={wrapperRef}\n >\n {/* Anchor tag with a link to support crawlers */}\n {canLoadMore && count !== totalCount && (\n <a\n className={clsx(\n 'btn btn--inverted-outline btn--large w-full text-center',\n disabled && 'disabled'\n )}\n onClick={(e) => {\n if (onClick) {\n e.preventDefault();\n onClick();\n }\n }}\n href={`${location}?count=${pageSize}&page=${pageNumberForCrawler}`}\n >\n {count == totalCount\n ? translate('general.loading.done')\n : isLoading\n ? translate('general.loading') + '...'\n : translate('general.load-more')}\n </a>\n )}\n <ProgressBar progress={count} maxProgress={totalCount} />\n </div>\n );\n }\n);\n\nLoadMoreButton.displayName = 'LoadMoreButton';\n\nexport default LoadMoreButton;\n","import React, { useEffect, useCallback, useMemo } from 'react';\nimport { useDispatch } from 'react-redux';\nimport {\n setProductListingType,\n setProductsPerRow,\n setProductCardHeight,\n} from '../../Actions/ProductListing.action';\nimport useBreakpoint from '../../Hooks/useBreakpoint';\nimport { useTypedSelector } from '../../Hooks/useTypedSelector';\nimport { ProductListingType } from '../../Reducers/ProductListing.reducer';\n\nconst getGridCardHeight = (breakpoint) => {\n switch (breakpoint) {\n case 'sm':\n return 414;\n case 'md':\n return 435;\n case 'lg':\n return 415;\n case 'xl':\n return 452;\n default:\n return 505;\n }\n};\n\nconst getListCardHeight = (breakpoint) => {\n switch (breakpoint) {\n case 'sm':\n case 'md':\n case 'lg':\n case 'xl':\n default:\n return 127;\n }\n};\n\nconst getSingleCardHeight = (breakpoint) => {\n return 505; // Single card is not used\n};\n\nconst ProductListingResizeObserver = () => {\n const { productListingType } = useTypedSelector(\n (state) => state.productListing\n );\n\n const dispatch = useDispatch();\n\n const breakpoint = useBreakpoint();\n const isMedium = useMemo(() => breakpoint == 'md', [breakpoint]);\n\n const getProductsPerRowForBreakpoint = useCallback(() => {\n switch (breakpoint) {\n case 'xs':\n case 's':\n case 'sm':\n return 2;\n case 'md':\n case 'lg':\n return 3;\n default:\n return 4;\n }\n }, [breakpoint]);\n\n useEffect(() => {\n switch (productListingType) {\n case ProductListingType.Grid:\n dispatch(setProductsPerRow(getProductsPerRowForBreakpoint()));\n dispatch(setProductCardHeight(getGridCardHeight(breakpoint)));\n return;\n case ProductListingType.List:\n dispatch(setProductsPerRow(1));\n dispatch(setProductCardHeight(getListCardHeight(breakpoint)));\n return;\n case ProductListingType.SingleCard:\n dispatch(setProductsPerRow(1));\n dispatch(setProductCardHeight(getSingleCardHeight(breakpoint)));\n return;\n }\n }, [\n dispatch,\n getProductsPerRowForBreakpoint,\n productListingType,\n breakpoint,\n isMedium,\n ]);\n\n return null;\n};\n\nexport default ProductListingResizeObserver;\n","import React from 'react';\nimport clsx from 'clsx';\n\nconst ProductCardPlaceholder = () => {\n return (\n <div className=\"skeleton\">\n <div\n className={clsx(\n 'relative flex overflow-hidden rounded-t bg-gray-200 [&_img]:aspect-square [&_img]:h-full [&_img]:w-full [&_img]:object-cover',\n 'max-h-[167px] min-h-[167px] md:max-h-[242px] md:min-h-[242px] lg:max-h-[213px] lg:min-h-[213px] xl:max-h-[251px] xl:min-h-[251px] 2xl:max-h-[304px] 2xl:min-h-[304px]'\n )}\n ></div>\n <div className=\"flex flex-1 flex-col rounded-b px-3 pb-2 pt-1 lg:px-4 lg:pb-3\">\n <div\n className={clsx(\n 'mb-2',\n 'max-h-[171px] min-h-[171px] md:max-h-[116px] md:min-h-[116px]'\n )}\n >\n <div className=\"mb-0.5 max-w-[80px] bg-gray-200\"> </div>\n <div className=\"mb-2 block max-w-[80%] bg-gray-200 text-md\">\n \n </div>\n <ul className=\"text-sm\">\n <li className=\"mb-1 flex max-w-[60%] items-center bg-gray-200\">\n \n </li>\n <li className=\"mb-1 flex max-w-[85%] items-center bg-gray-200\">\n \n </li>\n <li className=\"mb-1 flex max-w-[70%] items-center bg-gray-200\">\n \n </li>\n </ul>\n </div>\n <div className={clsx('max-h-[59px] min-h-[59px]')}>\n <div className=\"flex max-w-[80px] items-center bg-gray-200 text-sm leading-[1.2]\">\n \n </div>\n <div className=\"mb-2 mt-2 flex items-center justify-between gap-2\">\n <div className=\"flex w-16 max-w-[80px] flex-col bg-gray-200 leading-tight\">\n \n </div>\n <div className=\"flex w-14 max-w-[80px] gap-2 rounded bg-gray-200 p-1\">\n \n </div>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport default ProductCardPlaceholder;\n","import React, { useMemo, useState } from 'react';\nimport { translate } from '../../Services/translation';\nimport { DropdownOption } from '../Dropdown';\nimport StockStatus from '../StockStatus/StockStatus';\nimport ProductCardProps from './types/ProductCardProps';\nimport ResponsiveImage from '../ResponsiveImage/ResponsiveImage';\nimport ProductTag from '../ProductTags/ProductTag';\nimport ProductCardBuyButton from './ProductCardBuyButton';\nimport clsx from 'clsx';\nimport ProductPrice from '../ProductPrice/ProductPrice';\nimport Icon from '../Icon';\nimport ProductAttributeTag from '../ProductTags/ProductAttributeTag';\n\nconst ProductCardLandscape = ({\n product,\n isVariantListing = false,\n lazyLoadImage,\n}: ProductCardProps) => {\n const [selectedOption, setSelectedOption] = useState<DropdownOption>();\n\n const articleNumber = useMemo(\n () =>\n product.variantOptions?.length ? selectedOption?.value : product.id,\n [product.id, product.variantOptions?.length, selectedOption?.value]\n );\n\n return (\n <div\n className={clsx('relative flex gap-3 bg-white p-2 shadow-mc lg:p-3')}\n >\n <div\n className={clsx(\n 'h-14 w-14 bg-gray-200',\n '[&_img]:aspect-square [&_img]:w-full [&_img]:object-cover'\n )}\n >\n {product.images && product.images.length > 0 && (\n <a href={product.url}>\n <ResponsiveImage\n {...product.images[0]}\n lazyLoad={lazyLoadImage}\n />\n </a>\n )}\n {product.attributeTag ? (\n <div className=\"absolute bottom-1 left-1 flex h-10 w-10 flex-col items-start\">\n <ProductAttributeTag\n image={product.attributeTag.image}\n lazyLoadImage={lazyLoadImage}\n ></ProductAttributeTag>\n </div>\n ) : null}\n </div>\n <div className={clsx('flex-1')}>\n <div\n className={clsx(\n 'flex flex-row justify-between overflow-y-hidden',\n 'max-h-[76px] min-h-[76px] lg:max-h-[68px] lg:min-h-[68px]'\n )}\n >\n <div className={clsx('flex flex-col')}>\n <div className={clsx('mb-0.5 text-sm text-gray-600')}>\n {product.brand}\n </div>\n <a\n className={clsx(\n 'mb-[2.5px] text-md font-bold leading-tight'\n )}\n href={product.url}\n >\n {product.name}\n </a>\n <div className={clsx('text-sm text-gray-600')}>\n {product.variantOptions?.length && (\n <>\n <Icon\n name=\"multiple-variants\"\n className={clsx('mr-1 h-4 w-4')}\n />\n <span>{translate('available.in.several.variants')}</span>\n </>\n )}\n </div>\n </div>\n {product.tags?.length ? (\n <div className={clsx('mb-1 flex flex-col items-end')}>\n {product.tags.map((tag) => (\n <ProductTag\n tagSize=\"s\"\n id={tag.id}\n key={tag.id}\n isCampaign={tag.isCampaign}\n >\n {tag.name}\n </ProductTag>\n ))}\n </div>\n ) : null}\n </div>\n <div className=\"flex flex-1 flex-row justify-between\">\n <div className=\"flex items-center\">\n <StockStatus {...product.stockStatus} />\n </div>\n <div className={clsx('flex flex-shrink-0 items-end')}>\n <div className={clsx('mr-2 self-center')}>\n <ProductPrice\n price={product.price}\n discountPercentage={product.discountPercentage}\n isQuickSearch={false}\n notPricedString={product.notPricedString}\n />\n </div>\n <ProductCardBuyButton\n product={{ ...product, id: articleNumber }}\n isVariantListing={isVariantListing}\n showQuantityInput={false}\n className={clsx(\n '[&_button]:flex-1 [&_button]:text-sm [&_div]:flex-1 [&_input]:text-sm'\n )}\n />\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport default ProductCardLandscape;\n","import React from 'react';\nimport clsx from 'clsx';\n\nconst LandscapeProductCardPlaceholder = () => {\n return (\n <div className=\"skeleton\">\n <div className=\"flex gap-3 rounded bg-white p-2 shadow-mc lg:p-3\">\n <div className=\"h-14 w-14 bg-gray-200\"></div>\n <div className=\"flex-1\">\n <div\n className={clsx(\n 'flex w-full flex-row justify-between',\n 'max-h-[79px] min-h-[79px] lg:max-h-[70px] lg:min-h-[70px]'\n )}\n >\n <div className=\"flex w-full flex-col\">\n <div className=\"mb-0.5 max-w-[80px] bg-gray-200 text-sm\">\n \n </div>\n <span className=\"mb-[2.5px] max-w-[160px] bg-gray-200 text-md font-bold\">\n \n </span>\n </div>\n </div>\n <div className=\"flex flex-1 flex-row justify-between\">\n <div className=\"flex w-full items-center\">\n <div className=\"flex w-full max-w-[60px] items-center bg-gray-200 leading-[1.2]\">\n \n </div>\n </div>\n <div className=\"flex w-full max-w-[160px] items-end\">\n <div className=\"mr-2 w-full self-center\">\n <div className=\"flex w-full flex-col leading-tight\">\n <div className=\"w-full max-w-[80px] bg-gray-200 text-md font-bold lg:text-lg\">\n \n </div>\n </div>\n </div>\n <div className=\"flex w-28 max-w-[80%] gap-2 bg-gray-200 p-1\">\n \n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport default LandscapeProductCardPlaceholder;\n","import React, {\n useEffect,\n useMemo,\n useState,\n useCallback,\n HTMLAttributes,\n useLayoutEffect,\n} from 'react';\nimport LoadMoreButton from '../LoadMoreButton/LoadMoreButton';\nimport {\n AutoSizer,\n CellMeasurer,\n CellMeasurerCache,\n Index,\n InfiniteLoader,\n List,\n WindowScroller,\n} from 'react-virtualized';\nimport {\n addPlaceholderProducts,\n fetchProducts,\n setIsLoadingReverse,\n setIsLoadingMore,\n} from '../../Actions/ProductListing.action';\nimport { useDispatch } from 'react-redux';\nimport ProductListingResizeObserver from './ProductListingResizeObserver';\nimport { useTypedSelector } from '../../Hooks/useTypedSelector';\nimport { ProductListingType } from '../../Reducers/ProductListing.reducer';\nimport ProductCard from '../ProductCards/ProductCard';\nimport ProductCardPlaceholder from '../ProductCards/ProductCardPlaceholder';\nimport ProductCardLandscape from '../ProductCards/ProductCardLandscape';\nimport LandscapeProductCardPlaceholder from '../ProductCards/ProductCardLandscapePlaceholder';\nimport { pushEcommerce } from '../../Services/Gtm.service';\nimport clsx from 'clsx';\n\nconst PRODUCTS_PER_LOAD = 60;\n\nconst cache = new CellMeasurerCache({\n defaultWidth: 150,\n minWidth: 70,\n defaultHeight: 507,\n fixedWidth: true,\n fixedHeight: false,\n});\n\nconst oneColRowClass = 'grid grid-cols-1 pb-0.5 md:px-0.5';\n\nconst ProductListing = () => {\n const dispatch = useDispatch();\n\n /* Updates with delayToUpdate ms after resize.\n Prevents spamming of resize */\n useLayoutEffect(() => {\n var delay;\n function updateSize() {\n clearTimeout(delay);\n delay = setTimeout(() => {\n cache.clearAll();\n listRef?.recomputeRowHeights(0);\n }, 100);\n }\n\n window.addEventListener('resize', updateSize);\n updateSize();\n return () => window.removeEventListener('resize', updateSize);\n }, []);\n\n const {\n products,\n isLoadingMore,\n isLoadingReverse,\n totalProductsCount,\n productsPerRow = 4,\n productCardHeight = 505,\n canLoadMore,\n productListingType = ProductListingType.Grid,\n pageSize,\n gtmViewModel,\n location,\n pageNumberForCrawler,\n } = useTypedSelector((state) => state.productListing);\n\n const [ready, setReady] = useState(false);\n const rowCount = useMemo(\n () => Math.ceil(products.length / productsPerRow),\n [products.length, productsPerRow]\n );\n let listRef: List | null = null;\n\n const RowComponent = useCallback(\n ({\n children,\n className,\n ...props\n }: HTMLAttributes<HTMLDivElement>) => {\n return (\n <>\n {productListingType == ProductListingType.Grid && (\n <div\n className={clsx(\n className,\n 'grid grid-cols-2 !gap-x-0.5 pb-0.5 md:grid-cols-3 md:px-[2px] xl:grid-cols-4'\n )}\n {...props}\n >\n {children}\n </div>\n )}\n {productListingType == ProductListingType.List && (\n <div className={clsx(className, oneColRowClass)} {...props}>\n {children}\n </div>\n )}\n {productListingType == ProductListingType.SingleCard && (\n <div className={clsx(className, oneColRowClass)} {...props}>\n {children}\n </div>\n )}\n </>\n );\n },\n [productListingType]\n );\n\n const [ProductComponent, ProductPlaceholderComponent] = useMemo(() => {\n switch (productListingType) {\n case ProductListingType.Grid:\n case ProductListingType.SingleCard:\n default:\n return [ProductCard, ProductCardPlaceholder];\n case ProductListingType.List:\n return [ProductCardLandscape, LandscapeProductCardPlaceholder];\n }\n }, [productListingType]);\n\n useEffect(() => {\n if (!ready) return;\n cache.clearAll();\n listRef?.recomputeRowHeights(0);\n }, [listRef, ready, productListingType, products, productsPerRow]);\n\n useEffect(() => {\n if (!ready) {\n pushEcommerce(gtmViewModel);\n }\n setReady(true);\n }, []);\n\n const loadMoreClick = () => {\n const startIndex = rowCount;\n const endIndex =\n rowCount + Math.ceil(PRODUCTS_PER_LOAD / productsPerRow);\n\n dispatch(addPlaceholderProducts(startIndex, endIndex));\n dispatch(setIsLoadingMore(true));\n };\n\n const isRowLoaded = ({ index }: Index) => {\n return index >= rowCount || !!products[index * productsPerRow];\n };\n\n const loadMoreRows = ({ startIndex, stopIndex }): Promise<any> => {\n if (startIndex >= rowCount) {\n return new Promise((resolve) => resolve(null));\n }\n\n const endIndex = stopIndex + 1;\n dispatch(setIsLoadingReverse(true));\n return dispatch(fetchProducts(startIndex, endIndex))\n .then(() => {\n for (let i = startIndex; i < endIndex; i++) {\n cache.clear(i, 0);\n }\n listRef?.recomputeRowHeights(startIndex);\n })\n .finally(() => {\n dispatch(setIsLoadingReverse(false));\n });\n };\n\n const rowRenderer = useCallback(\n ({ index, key, parent, style }) => {\n const startIndex = index * productsPerRow;\n const endIndex = startIndex + productsPerRow;\n const productsForRow = products.slice(startIndex, endIndex);\n\n return (\n <CellMeasurer\n cache={cache}\n rowIndex={index}\n columnIndex={0}\n parent={parent}\n key={key}\n >\n <div style={style} className=\"pt-2\">\n <RowComponent key={key}>\n {productsForRow.length > 0 &&\n productsForRow.map((product, idx) =>\n product ? (\n <ProductComponent\n product={product}\n key={key + idx}\n lazyLoadImage={true}\n />\n ) : (\n <ProductPlaceholderComponent key={key + idx} />\n )\n )}\n </RowComponent>\n </div>\n </CellMeasurer>\n );\n },\n [products, productsPerRow]\n );\n\n return (\n <div className=\"-mt-2\">\n {!ready && (\n <RowComponent className=\"!gap-[2px] pt-2\">\n {products.map((product, idx) =>\n product ? (\n <ProductComponent\n product={product}\n key={'not-ready' + idx}\n lazyLoadImage={false}\n />\n ) : (\n <ProductPlaceholderComponent key={'not-ready' + idx} />\n )\n )}\n </RowComponent>\n )}\n {ready && (\n <WindowScroller>\n {({ height, isScrolling, onChildScroll, scrollTop }) => (\n <AutoSizer disableHeight>\n {({ width }) => (\n <InfiniteLoader\n minimumBatchSize={pageSize / productsPerRow}\n isRowLoaded={isRowLoaded}\n loadMoreRows={loadMoreRows}\n rowCount={rowCount}\n threshold={5}\n >\n {({ onRowsRendered, registerChild }) => (\n <List\n autoHeight\n ref={(ref) => {\n if (ref) {\n registerChild(ref);\n listRef = ref;\n }\n }}\n height={height}\n onRowsRendered={onRowsRendered}\n width={width}\n isScrolling={isScrolling}\n onScroll={onChildScroll}\n scrollTop={scrollTop}\n rowCount={rowCount}\n rowRenderer={rowRenderer}\n rowHeight={productCardHeight + 2} // This together with pb-[2px] creates the gap between rows\n />\n )}\n </InfiniteLoader>\n )}\n </AutoSizer>\n )}\n </WindowScroller>\n )}\n <LoadMoreButton\n onClick={loadMoreClick}\n disabled={\n !canLoadMore ||\n isLoadingMore ||\n products.length >= totalProductsCount\n }\n isLoading={isLoadingMore}\n count={products.length}\n totalCount={totalProductsCount}\n canLoadMore={canLoadMore}\n location={location}\n pageNumberForCrawler={pageNumberForCrawler}\n pageSize={pageSize}\n />\n <ProductListingResizeObserver />\n </div>\n );\n};\n\nexport default ProductListing;\n","import React from 'react';\n\nconst SearchResultLinkTab = ({ items }) => {\n return (\n <div className=\"container grid gap-4 pb-6 sm:grid-cols-1 md:grid-cols-4 lg:pb-8 xl:pb-10\">\n {items.value.map((item) => {\n return (\n <a\n className=\"cursor-pointer text-md text-gray-900 underline\"\n key={item.id}\n href={item.url}\n >\n {item.name}\n </a>\n );\n })}\n </div>\n );\n};\nexport default SearchResultLinkTab;\n","import React from 'react';\nimport FilterBar from '../FilterBar/FilterBar';\nimport ProductFiltering from '../ProductFiltering/ProductFiltering';\nimport ProductListing from '../ProductListing/ProductListing';\nimport SearchResultLinkTab from './SearchResultLinkTab';\nimport { useTypedSelector } from '../../Hooks/useTypedSelector';\n\nconst SearchResult = (props) => {\n const { activeTab = 'products' } = useTypedSelector<any>(\n (state) => state.search\n );\n\n return (\n <>\n {props.productListing?.totalProductsCount > 0 &&\n activeTab == 'products' && (\n <div className=\"lg:container grid grid-cols-5 gap-4 pb-6 lg:gap-6 lg:pb-8 xl:pb-10\">\n <aside className=\"col-span-1 hidden lg:block\">\n <ProductFiltering />\n </aside>\n <div className=\"col-span-5 lg:col-span-4\">\n <FilterBar />\n <ProductListing />\n </div>\n </div>\n )}\n {props.brandListing?.total > 0 && activeTab == 'brands' && (\n <SearchResultLinkTab items={props.brandListing.items} />\n )}\n {props.pagesListing?.total > 0 && activeTab == 'pages' && (\n <SearchResultLinkTab items={props.pagesListing.items} />\n )}\n {props.categoryListing?.total > 0 && activeTab == 'categories' && (\n <SearchResultLinkTab items={props.categoryListing.items} />\n )}\n </>\n );\n};\n\nexport default SearchResult;\n","import { SEARCH_ACTIVE_TAB } from '../constants';\n\nexport const setActiveTab = (key) => ({\n type: SEARCH_ACTIVE_TAB,\n payload: {\n activeTab: key,\n },\n});\n","import React from 'react';\nimport { translate } from '../../Services/translation';\nimport { useDispatch } from 'react-redux';\nimport { setActiveTab } from '../../Actions/Search.action';\nimport clsx from 'clsx';\n\nconst SearchNavigationItem = ({ resultKey, quantity, active }) => {\n const dispatch = useDispatch();\n\n return (\n <li\n className={clsx(\n active ? 'text-gray-900' : 'text-gray-500',\n active && 'border-b-2 border-gray-900',\n 'border-solid',\n 'py-1',\n 'cursor-pointer',\n 'flex',\n 'flex-row',\n 'gap-1',\n 'leading-6'\n )}\n onClick={() => dispatch(setActiveTab(resultKey))}\n >\n <span className=\"text-md font-medium\">\n {translate(`quicksearchheader.${resultKey}`)}\n </span>\n <span className=\"self-center text-sm leading-[0.875rem]\">\n {'(' + quantity + ')'}\n </span>\n </li>\n );\n};\n\nexport default SearchNavigationItem;\n","import React, { useEffect, useCallback } from 'react';\nimport SearchNavigationItem from './SearchNavigationItem';\nimport { useDispatch } from 'react-redux';\nimport { setActiveTab as setActiveTabAction } from '../../Actions/Search.action';\nimport { useTypedSelector } from '../../Hooks/useTypedSelector';\n\nconst SearchNavigation = (props) => {\n const { activeTab = 'products' } = useTypedSelector<any>(\n (state) => state.search\n );\n const dispatch = useDispatch();\n\n const setActiveTab = useCallback(() => {\n var productListingHits = props.productListing?.totalProductsCount;\n var categoryListingHits = props.categoryListing?.total ?? 0;\n var pagesListingHits = props.pagesListing?.total ?? 0;\n var brandListingHits = props.brandListing?.total ?? 0;\n\n if (productListingHits > 0) {\n dispatch(setActiveTabAction('products'));\n } else if (categoryListingHits > 0) {\n dispatch(setActiveTabAction('categories'));\n } else if (pagesListingHits > 0) {\n dispatch(setActiveTabAction('pages'));\n } else if (brandListingHits > 0) {\n dispatch(setActiveTabAction('brands'));\n }\n }, [\n dispatch,\n props.brandListing?.total,\n props.categoryListing?.total,\n props.pagesListing?.total,\n props.productListing?.totalProductsCount,\n ]);\n\n useEffect(() => {\n setActiveTab();\n }, [setActiveTab]);\n\n return (\n <>\n {props.totalHits > 0 && (\n <ul className=\"mb-4 mt-2 flex flex-row gap-4 overflow-x-auto scrollbar-none lg:mb-6 lg:mt-4\">\n {props.productListing.totalProductsCount > 0 && (\n <SearchNavigationItem\n resultKey={'products'}\n quantity={props.productListing.totalProductsCount}\n active={activeTab == 'products'}\n />\n )}\n {props.categoryListing.total > 0 && (\n <SearchNavigationItem\n resultKey={'categories'}\n quantity={props.categoryListing.total}\n active={activeTab == 'categories'}\n />\n )}\n {props.pagesListing.total > 0 && (\n <SearchNavigationItem\n resultKey={'pages'}\n quantity={props.pagesListing.total}\n active={activeTab == 'pages'}\n />\n )}\n {props.brandListing.total > 0 && (\n <SearchNavigationItem\n resultKey={'brands'}\n quantity={props.brandListing.total}\n active={activeTab == 'brands'}\n />\n )}\n </ul>\n )}\n </>\n );\n};\n\nexport default SearchNavigation;\n","import { get } from '../Services/http';\nimport { catchError } from './Error.action';\nimport { NAVIGATION_LOAD_ERROR, NAVIGATION_RECEIVE } from '../constants';\n\nexport const load = () => (dispatch, getState) => {\n return get('/api/navigation')\n .then((response) => response.json())\n .then((data) => dispatch(receive(data)))\n .catch((ex) => dispatch(catchError(ex, (error) => loadError(error))));\n};\n\nexport const loadError = (error) => ({\n type: NAVIGATION_LOAD_ERROR,\n payload: {\n error,\n },\n});\n\nexport const receive = (data) => ({\n type: NAVIGATION_RECEIVE,\n payload: {\n contentLinks: data.contentLinks,\n },\n});\n\nexport const setMobileMenuOpen = (mobileMenuOpen) => ({\n type: NAVIGATION_RECEIVE,\n payload: {\n mobileMenuOpen,\n },\n});\n","import React from 'react';\nimport Icon from '../../Icon';\nimport clsx from 'clsx';\nimport { translate } from '../../../Services/translation';\n\nconst MobileNavigationItem = ({\n link,\n isParentLink = false,\n onLinkClick,\n}: {\n link: any;\n isParentLink?: boolean;\n onLinkClick: (link: any) => void;\n}) => {\n return (\n <li\n className={clsx(\n 'flex justify-between border-b border-gray-300 text-lg font-bold'\n )}\n >\n <a\n className=\"flex-1 p-4 py-[1.125rem] leading-[1.2rem] text-gray-900\"\n href={link.url}\n onClick={(e) => {\n if (link.links?.length > 0 && !isParentLink) {\n e.preventDefault();\n onLinkClick(link);\n }\n }}\n >\n {isParentLink\n ? link.showAllText && link.showAllText != ''\n ? link.showAllText\n : translate('navigation.show.all')\n : link.name}\n </a>\n {link.links?.length > 0 && !isParentLink && (\n <div\n className=\"flex cursor-pointer items-center p-[1.125rem]\"\n onClick={() => onLinkClick(link)}\n >\n <Icon className=\"gray-900 h-5 w-5\" name=\"chevron-right\" />\n </div>\n )}\n </li>\n );\n};\nexport default MobileNavigationItem;\n","import React, { useEffect, useState } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { setMobileMenuOpen } from '../../Actions/Navigation.action';\nimport Icon from '../Icon';\nimport SideMenu from '../SideMenu/SideMenu';\nimport MobileNavigationItem from './ui/MobileNavigationItem';\nimport { translate } from '../../Services/translation';\nimport { useTypedSelector } from '../../Hooks/useTypedSelector';\nimport clsx from 'clsx';\n\ninterface NavigationMobileProps {\n logoUrl: string;\n mobileContentLinks: any;\n socialMediaLinks: any;\n}\n\nconst NavigationMobile = ({\n logoUrl,\n mobileContentLinks,\n socialMediaLinks,\n}: NavigationMobileProps) => {\n const { mobileMenuOpen } = useTypedSelector((state) => state.navigation);\n const dispatch = useDispatch();\n const [currentLink, setCurrentLink] = useState<any>();\n const [previousLink, setPreviousLink] = useState<any>();\n\n const Header = () => (\n <div className=\"flex flex-1 items-center justify-between\">\n {!currentLink && (\n <>\n <img className=\"max-h-5\" src={logoUrl} alt=\"Logo\" />\n <div\n className={clsx('-m-[1rem] cursor-pointer p-4')}\n onClick={() => dispatch(setMobileMenuOpen(false))}\n >\n <Icon className=\"h-5 w-5\" name=\"close\" color=\"white\" />\n </div>\n </>\n )}\n {currentLink && (\n <>\n <div\n className=\"flex flex-1 cursor-pointer items-center text-white\"\n onClick={onBackClick}\n >\n <Icon className=\"h-5 w-5\" name=\"chevron-left\" color=\"white\" />\n {translate('general.back')}\n </div>\n <div\n className=\"-m-[1rem] p-4\"\n onClick={() => dispatch(setMobileMenuOpen(false))}\n >\n <Icon className=\"h-5 w-5\" name=\"close\" color=\"white\" />\n </div>\n </>\n )}\n </div>\n );\n\n const Content = () => (\n <div className=\"gap-4 overflow-y-auto p-0\">\n <ul className=\"flex flex-col\">\n {currentLink && (\n <MobileNavigationItem\n link={currentLink}\n isParentLink={true}\n key={'mobile' + currentLink.url + currentLink.name}\n onLinkClick={onLinkClick}\n />\n )}\n {links.map((link) => (\n <MobileNavigationItem\n link={link}\n key={'mobile' + link.url + link.name}\n onLinkClick={onLinkClick}\n />\n ))}\n </ul>\n </div>\n );\n\n const footer = () => (\n <>\n {!currentLink &&\n socialMediaLinks &&\n socialMediaLinks.length > 0 &&\n socialMediaLinks.map((link, idx) => (\n <div key={idx} className=\"my-4 bg-primary-gradient\">\n <a\n href={link.url}\n className=\"flex h-10 w-10 items-center justify-center\"\n >\n <img\n className=\"brightness-[100] filter\"\n style={{ filter: 'brightness(100)' }} // The className is not working in test for some reason...\n src={link.iconUrl}\n />\n </a>\n </div>\n ))}\n </>\n );\n const onLinkClick = (link) => {\n link.previousLink = previousLink;\n setPreviousLink(currentLink);\n setCurrentLink(link);\n };\n const onBackClick = () => {\n setPreviousLink(previousLink?.previousLink);\n setCurrentLink(previousLink);\n };\n\n const links = (currentLink?.links ?? mobileContentLinks).filter(\n (l) => !l.rightAligned\n );\n useEffect(() => {\n if (mobileMenuOpen) {\n setCurrentLink(null);\n }\n }, [mobileMenuOpen]);\n return (\n <>\n <SideMenu\n className=\"z-[60] max-w-[320px] border-gray-300 md:max-w-[480px]\"\n from=\"left\"\n id=\"navigation-mobile\"\n open={mobileMenuOpen}\n onClosed={() => dispatch(setMobileMenuOpen(false))}\n components={{ Header, Content, Footer: footer }}\n showCloseButton={false}\n ></SideMenu>\n </>\n );\n};\nexport default NavigationMobile;\n","import React, { useCallback, useEffect } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { removeOverlay as removeOverlayAction } from '../Actions/Overlay.action';\nimport { useTypedSelector } from '../Hooks/useTypedSelector';\nimport clsx from 'clsx';\n\nconst OVERLAY_CLASS = 'overlay';\n\nconst Overlay = () => {\n const dispatch = useDispatch();\n\n const { activeOverlays, disableOverlayClick } = useTypedSelector(\n (state) => state.overlay\n );\n\n const removeOverlay = (componentName: string) =>\n dispatch(removeOverlayAction(componentName));\n\n const overlayClasses = activeOverlays\n ? activeOverlays.map((c) => `${OVERLAY_CLASS}--${c.name}`)\n : [];\n /**\n * Adds overlay classes to body to enable styling on components based on active overlays\n */\n useEffect(() => {\n // Remove all overlay classes that are not active anymore, before adding new\n const classesToRemove = Array.from(document.body.classList).filter(\n (c) => c.startsWith(OVERLAY_CLASS) || c == OVERLAY_CLASS\n );\n if (classesToRemove && classesToRemove.length > 0) {\n for (let className of classesToRemove) {\n document.body.classList.remove(className);\n }\n }\n\n // Add overlay classes to body\n if (activeOverlays && activeOverlays.length > 0) {\n for (let className of overlayClasses) {\n document.body.classList.add(className);\n }\n }\n }, [activeOverlays]);\n\n /**\n * Removes all overlays.\n * Triggers onOverLay click on all active overlay components\n */\n const onOverlayClick = useCallback(() => {\n if (disableOverlayClick) return;\n\n for (let component of activeOverlays) {\n if (component.onOverlayClick) {\n if (component.onOverlayClick() !== false) {\n removeOverlay(component.name);\n }\n }\n }\n }, [activeOverlays, disableOverlayClick]);\n\n return (\n activeOverlays &&\n activeOverlays.length > 0 && (\n <div\n className={clsx(\n OVERLAY_CLASS,\n overlayClasses.join(' '),\n 'fixed inset-0 z-30 h-full w-full animate-[0.2s_ease-in-out_0s_both_1_fade-in] bg-overlay opacity-100'\n )}\n onClick={onOverlayClick}\n />\n )\n );\n};\n\nexport default Overlay;\n","import React, { useEffect } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { setBuyButtonArticleNumber } from '../../Actions/BuyButton.action';\nimport Dropdown from '../Dropdown';\nimport VariantPickerOption from './types/VariantPickerOption';\nimport { translate } from '../../Services/translation';\nimport VariantPickerProps from './types/VariantPickerProps';\n\nconst VariantPickerDropdown = ({\n options,\n selectedValue,\n}: VariantPickerProps) => {\n const dispatch = useDispatch();\n\n const onChange = (option: VariantPickerOption) => {\n dispatch(setBuyButtonArticleNumber(option.value));\n };\n\n useEffect(() => {\n if (selectedValue) {\n setTimeout(() => dispatch(setBuyButtonArticleNumber(selectedValue)), 1);\n }\n }, [dispatch, selectedValue]);\n\n return (\n <Dropdown\n placeholder={translate('variant-picker.select-option')}\n options={options}\n onChange={onChange}\n selectedValue={selectedValue}\n />\n );\n};\n\nexport default VariantPickerDropdown;\n","import React, { useCallback, useEffect } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { setBuyButtonArticleNumber } from '../../Actions/BuyButton.action';\nimport VariantPickerOption from './types/VariantPickerOption';\nimport VariantPickerProps from './types/VariantPickerProps';\nimport { useTypedSelector } from '../../Hooks/useTypedSelector';\nimport clsx from 'clsx';\n\nconst VariantPickerButtons = ({\n options,\n selectedValue,\n}: VariantPickerProps) => {\n const dispatch = useDispatch();\n\n const { articleNumber } = useTypedSelector((state) => state.buyButton);\n\n const onClick = useCallback(\n (option: VariantPickerOption) => {\n dispatch(setBuyButtonArticleNumber(option.value));\n },\n [dispatch]\n );\n\n useEffect(() => {\n if (selectedValue) {\n let option = options.find((opt) => opt.value == selectedValue);\n setTimeout(() => option && onClick(option), 1);\n }\n }, [dispatch, selectedValue, onClick, options]);\n\n return (\n <div className=\"flex gap-1\">\n {options.map((opt, idx) => (\n <button\n className={clsx(\n 'btn btn--outline btn--medium min-w-10 h-10',\n opt.value == articleNumber && 'bg-primary-50'\n )}\n disabled={opt.disabled}\n onClick={() => onClick(opt)}\n key={'variant-picker' + opt.value + idx}\n >\n {opt.label}\n </button>\n ))}\n </div>\n );\n};\n\nexport default VariantPickerButtons;\n","import React, { useState } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { submitChangePassword } from '../../../Actions/Login.action';\nimport { useTypedSelector } from '../../../Hooks/useTypedSelector';\nimport { translate } from '../../../Services/translation';\nimport Input from '../../Inputs/Input';\nimport clsx from 'clsx';\n\nconst LoginChangePassword = () => {\n const {\n isLoading,\n username = '',\n password = '',\n } = useTypedSelector((state) => state.login);\n const [newPassword, setNewPassword] = useState('');\n const [passwordConfirmation, setPasswordConfirmation] = useState('');\n const dispatch = useDispatch();\n\n const onSubmit = (e?: any) => {\n if (e) {\n e.preventDefault();\n }\n dispatch(\n submitChangePassword(\n username,\n password,\n newPassword,\n passwordConfirmation\n )\n );\n };\n\n return (\n <>\n <h3>{translate('login.change-password')}</h3>\n <form onSubmit={onSubmit} className={clsx('mt-6')}>\n <Input\n wrapperClassName={clsx('mb-4')}\n label={translate('general.password')}\n inputSize=\"large\"\n value={newPassword}\n onChange={(e) => setNewPassword(e.target.value)}\n placeholder={translate('general.password')}\n type=\"password\"\n disabled={isLoading}\n />\n <Input\n label={translate('login.confirm-password')}\n inputSize=\"large\"\n value={passwordConfirmation}\n onChange={(e) => setPasswordConfirmation(e.target.value)}\n placeholder={translate('login.confirm-password')}\n type=\"password\"\n disabled={isLoading}\n />\n <button\n className={clsx(\n 'btn',\n 'btn--large',\n 'btn--primary',\n 'w-full',\n 'mt-4',\n 'font-medium',\n 'normal-case'\n )}\n type=\"submit\"\n disabled={isLoading}\n >\n {!isLoading && translate('general.send')}\n {isLoading && translate('general.loading')}\n </button>\n </form>\n </>\n );\n};\n\nexport default LoginChangePassword;\n","import React, { useEffect, useState } from 'react';\nimport { useDispatch } from 'react-redux';\nimport {\n submitForgotPassword,\n setUsername,\n setLoginMode,\n submitMagicLink,\n} from '../../../Actions/Login.action';\nimport { useTypedSelector } from '../../../Hooks/useTypedSelector';\nimport { translate } from '../../../Services/translation';\nimport LoginMode from '../../../Types/LoginMode';\nimport Input from '../../Inputs/Input';\nimport clsx from 'clsx';\n\nconst LoginForgotPassword = () => {\n const {\n username = '',\n isLoading,\n magicLinkModel,\n } = useTypedSelector((state) => state.login);\n const [isSuccessful, setIsSuccessful] = useState(false);\n const dispatch = useDispatch();\n\n const onSubmit = (e?: any) => {\n if (e) {\n e.preventDefault();\n }\n dispatch(submitForgotPassword(username)).then((success) =>\n setIsSuccessful(success)\n );\n };\n\n useEffect(() => {\n // Send magic link on first render only, if magic link model is in state\n if (!magicLinkModel?.link) return;\n dispatch(submitMagicLink(magicLinkModel));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return (\n <>\n <h3 className={clsx('mb-2')}>\n {!magicLinkModel ? (\n translate('login.forgot-password')\n ) : (\n <>{translate('general.loading')}...</>\n )}\n </h3>\n <p className={clsx('text-md', 'text-gray-900')}>\n {translate('general.forgotpassword.information')}\n </p>\n {!isSuccessful && !magicLinkModel && (\n <>\n <form className={clsx('mt-6')} onSubmit={onSubmit}>\n <Input\n wrapperClassName={clsx('mt-4')}\n label={translate('general.username')}\n inputSize=\"large\"\n value={username}\n onChange={(e) => dispatch(setUsername(e.target.value))}\n placeholder={translate('general.placeholder.username')}\n />\n <button\n className={clsx(\n 'btn',\n 'btn--primary',\n 'btn--large',\n 'w-full',\n 'mt-6',\n 'font-medium',\n 'normal-case'\n )}\n type=\"submit\"\n disabled={isLoading}\n >\n {!isLoading && translate('general.send')}\n {isLoading && translate('general.loading')}\n </button>\n </form>\n <div\n className={clsx(\n 'flex',\n 'flex-col',\n 'items-center',\n 'text-center',\n 'mt-6'\n )}\n >\n <button\n className={clsx(\n 'btn',\n 'btn--clear',\n 'btn--medium',\n 'self-center',\n 'underline',\n 'normal-case'\n )}\n onClick={() => dispatch(setLoginMode(LoginMode.Login))}\n disabled={isLoading}\n >\n {!isLoading && translate('general.back')}\n {isLoading && translate('general.loading')}\n </button>\n </div>\n </>\n )}\n {isSuccessful && (\n <>\n <p className={clsx('text-md', 'mt-4')}>\n {translate('login.forgot-password.success')}\n </p>\n <div className={clsx('flex', 'flex-col', 'mt-6')}>\n <button\n className={clsx('btn', 'btn--clear', 'btn--large', 'w-full')}\n onClick={() => dispatch(setLoginMode(LoginMode.Login))}\n >\n {translate('general.back')}\n </button>\n </div>\n </>\n )}\n </>\n );\n};\n\nexport default LoginForgotPassword;\n","import React from 'react';\nimport { useDispatch } from 'react-redux';\nimport {\n performLogin as performLoginAction,\n setLoginMode,\n setPassword,\n setUsername,\n} from '../../../Actions/Login.action';\nimport { useTypedSelector } from '../../../Hooks/useTypedSelector';\nimport { translate } from '../../../Services/translation';\nimport LoginMode from '../../../Types/LoginMode';\nimport Input from '../../Inputs/Input';\nimport clsx from 'clsx';\n\nconst LoginForm = () => {\n const {\n isLoading,\n username = '',\n password = '',\n } = useTypedSelector((state) => state.login);\n const dispatch = useDispatch();\n\n const performLogin = (e?: any) => {\n if (e) {\n e.preventDefault();\n }\n dispatch(performLoginAction(username, password));\n };\n\n return (\n <>\n <h3 className={clsx('mb-2')}>{translate('general.login')}</h3>\n <p className={clsx('text-md', 'text-gray-900')}>\n {translate('general.login.information')}\n </p>\n <form className={clsx('mt-6')} onSubmit={performLogin}>\n <Input\n label={translate('general.username')}\n inputSize=\"large\"\n wrapperClassName={clsx('mb-4')}\n placeholder={translate('general.placeholder.username')}\n onChange={(e) => dispatch(setUsername(e.target.value))}\n disabled={isLoading}\n />\n <Input\n label={translate('general.password')}\n inputSize=\"large\"\n placeholder={translate('general.placeholder.password')}\n onChange={(e) => dispatch(setPassword(e.target.value))}\n disabled={isLoading}\n type=\"password\"\n />\n <button\n type=\"submit\"\n className={clsx(\n 'mt-8',\n 'btn',\n 'btn--large',\n 'w-full',\n 'btn--primary',\n 'text-lg',\n 'font-medium',\n 'normal-case'\n )}\n disabled={isLoading}\n >\n {!isLoading && translate('general.login')}\n {isLoading && translate('general.loading')}\n </button>\n </form>\n <div className={clsx('flex', 'flex-col', 'mt-6')}>\n <button\n onClick={() => dispatch(setLoginMode(LoginMode.ForgotPassword))}\n disabled={isLoading}\n className={clsx(\n 'btn',\n 'btn--medium',\n 'btn--clear',\n 'underline',\n 'normal-case',\n 'self-center'\n )}\n >\n {translate('login.forgot-password')}\n </button>\n </div>\n </>\n );\n};\n\nexport default LoginForm;\n","import React, { useState } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { selectOrganization } from '../../../Actions/Login.action';\nimport { useTypedSelector } from '../../../Hooks/useTypedSelector';\nimport { translate } from '../../../Services/translation';\nimport Dropdown from '../../Dropdown';\nimport clsx from 'clsx';\n\nconst LoginSelectOrganization = () => {\n const dispatch = useDispatch();\n const { organizations, isLoading } = useTypedSelector(\n (state) => state.login\n );\n const [\n selectedOrganizationId,\n setSelectedOrganizationId,\n ] = useState<string | undefined>();\n\n return organizations ? (\n <>\n <h3 className={clsx('mb-6')}>\n {translate('login.choose-organization')}\n </h3>\n <Dropdown\n placeholder={translate('login.choose-organization')}\n onChange={({ value }) =>\n setSelectedOrganizationId(value)\n }\n options={organizations.map((org) => ({\n value: org.systemId,\n label: org.name,\n }))}\n disabled={isLoading}\n />\n <button\n className={clsx(\n 'button',\n 'btn',\n 'btn--primary',\n 'btn--large',\n 'w-full',\n 'mt-8',\n 'font-medium',\n 'normal-case'\n )}\n onClick={() =>\n selectedOrganizationId &&\n dispatch(\n selectOrganization(selectedOrganizationId)\n )\n }\n disabled={isLoading || !selectedOrganizationId}\n >\n {!isLoading && translate('general.select')}\n {isLoading && translate('general.loading')}\n </button>\n </>\n ) : null;\n};\n\nexport default LoginSelectOrganization;\n","import React from 'react';\nimport { useTypedSelector } from '../../Hooks/useTypedSelector';\nimport LoginMode from '../../Types/LoginMode';\nimport LoginChangePassword from './ui/LoginChangePassword';\nimport LoginForgotPassword from './ui/LoginForgotPassword';\nimport LoginForm from './ui/LoginForm';\nimport LoginSelectOrganization from './ui/LoginSelectOrganization';\nimport clsx from 'clsx';\n\nconst LoginContainer = () => {\n const { loginMode, error } = useTypedSelector((state) => state.login);\n\n return (\n <>\n {error && (\n <div className={clsx('text-md', 'text-error-500', 'mb-4')}>\n {error}\n </div>\n )}\n {loginMode == LoginMode.Login && <LoginForm />}\n {loginMode == LoginMode.SelectOrganization && (\n <LoginSelectOrganization />\n )}\n {loginMode == LoginMode.ChangePassword && <LoginChangePassword />}\n {loginMode == LoginMode.ForgotPassword && <LoginForgotPassword />}\n </>\n );\n};\n\nexport default LoginContainer;\n","import React, { useMemo } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { setLoginModalOpen } from '../../Actions/Login.action';\nimport { useTypedSelector } from '../../Hooks/useTypedSelector';\nimport LoginMode from '../../Types/LoginMode';\nimport LoginContainer from './LoginContainer';\nimport SideMenu from '../SideMenu/SideMenu';\nimport clsx from 'clsx';\n\nconst LoginModal = () => {\n const { modalOpen, loginMode, isLoading } = useTypedSelector(\n (state) => state.login\n );\n const dispatch = useDispatch();\n const disableClosing = useMemo(\n () =>\n loginMode == LoginMode.ChangePassword ||\n loginMode == LoginMode.SelectOrganization,\n [loginMode]\n );\n\n return (\n <SideMenu\n className={clsx('z-50 max-w-[320px] md:max-w-[640px]')}\n id=\"login-modal\"\n open={modalOpen}\n onClosed={() => dispatch(setLoginModalOpen(false))}\n disableClosing={disableClosing || isLoading}\n >\n <div className={clsx('px-2', 'py-6', 'md:py-10', 'md:px-6')}>\n <LoginContainer />\n </div>\n </SideMenu>\n );\n};\n\nexport default LoginModal;\n","import React from 'react';\nimport LoginContainer from './LoginContainer';\nimport clsx from 'clsx';\n\nconst LoginPage = () => {\n return (\n <div\n className={clsx(\n 'container',\n 'grid',\n 'pt-6',\n 'pb-6',\n 'place-items-center',\n 'md:pt-8',\n 'md:pb-8',\n 'lg:pt-10',\n 'lg:pb-10'\n )}\n >\n <div className={clsx('w-full', 'sm:max-w-md')}>\n <LoginContainer />\n </div>\n </div>\n );\n};\nexport default LoginPage;\n","import React from 'react';\nimport { LinkModel } from '../../Types/LinkModel';\nimport clsx from 'clsx';\n\ninterface LinkBlockProps {\n title?: string;\n link?: LinkModel;\n numPerRow: number;\n links: LinkBlockItem[];\n}\n\ninterface LinkBlockItem {\n thumbnailUrl?: string;\n title?: string;\n text?: string;\n link: LinkModel;\n}\n\nconst linkCellClass = {\n 1: 'sm-down:grid-cols-1 grid-cols-2',\n 2: 'sm-down:grid-cols-1 grid-cols-2',\n 3: 'sm-down:grid-cols-1 grid-cols-3',\n 4: 'sm-down:grid-cols-1 md-down:grid-cols-2 grid-cols-4',\n 5: 'sm-down:grid-cols-1 md-down:grid-cols-2 grid-cols-4',\n 6: 'sm-down:grid-cols-1 md-down:grid-cols-2 grid-cols-4',\n};\n\nconst LinkBlock = ({ title, link, numPerRow, links }: LinkBlockProps) => {\n const Link = React.memo<{ item: LinkBlockItem }>(({ item }) => (\n <a className={clsx('flex', 'flex-col')} href={item.link.href}>\n {item.thumbnailUrl && (\n <img\n className={clsx(\n 'aspect-auto',\n 'max-h-[248px]',\n 'w-full',\n 'min-w-[128px]',\n 'object-cover',\n 'mb-4'\n )}\n src={item.thumbnailUrl}\n alt={item.link.text}\n loading=\"lazy\"\n />\n )}\n {item.title && (\n <h5 className={clsx('mb-2')}>{item.title}</h5>\n )}\n {item.text && <p className={clsx('text-md')}>{item.text}</p>}\n {item.link?.text && (\n <p className={clsx('text-md', 'underline', 'mt-4')}>\n {item.link.text}\n </p>\n )}\n </a>\n ));\n\n return (\n <div className=\"container\">\n <div\n className={clsx(\n 'mb-2',\n 'flex',\n 'w-full',\n 'flex-row',\n 'items-center',\n 'justify-between',\n 'px-4',\n 'md:px-6',\n 'lg:px-0'\n )}\n >\n <div className=\"flex items-center\">\n {title && <h5 className={clsx('text-gray-900')}>{title}</h5>}\n </div>\n <div className=\"flex items-center justify-end\">\n {link?.href && (\n <a\n className={clsx(\n 'text-primary-500',\n 'underline',\n 'underline-offset-4',\n 'text-md'\n )}\n href={link.href}\n >\n {link.text}\n </a>\n )}\n </div>\n </div>\n <div\n className={`grid ${linkCellClass[numPerRow]} gap-x-6 gap-y-2 md:gap-6`}\n >\n {links.map((item, idx) => (\n <Link item={item} key={'link-block' + idx + item.link.text} />\n ))}\n </div>\n </div>\n );\n};\n\nexport default LinkBlock;\n","import React from 'react';\nimport { LinkModel } from '../Types/LinkModel';\nimport clsx from 'clsx';\nimport { translate } from '../Services/translation';\n\ninterface LinkBlockProps {\n title?: string;\n link?: LinkModel;\n links: LinkBlockItem[];\n}\n\ninterface LinkBlockItem {\n thumbnailUrl?: string;\n title?: string;\n text?: string;\n newsDate?: string;\n url: string;\n}\n\nconst NewsBlock = ({ title, link, links }: LinkBlockProps) => {\n const Link = React.memo<{ item: LinkBlockItem }>(({ item }) => (\n <a className={clsx('flex', 'flex-col')} href={item.url}>\n {item.thumbnailUrl && (\n <img\n className={clsx(\n 'aspect-auto',\n 'max-h-[248px]',\n 'w-full',\n 'min-w-[128px]',\n 'object-cover',\n 'mb-4'\n )}\n src={item.thumbnailUrl}\n loading=\"lazy\"\n />\n )}\n {item.newsDate && (\n <p className=\"text-sm text-gray-600\">{item.newsDate}</p>\n )}\n {item.title && <h5 className={clsx('my-2')}>{item.title}</h5>}\n {item.text && <p className={clsx('text-md')}>{item.text}</p>}\n {item.url && (\n <p className={clsx('text-md', 'underline', 'mt-4')}>\n {translate('productlist.showmore')}\n </p>\n )}\n </a>\n ));\n\n return (\n <div className=\"container\">\n <div\n className={clsx(\n 'mb-2',\n 'flex',\n 'w-full',\n 'flex-row',\n 'items-center',\n 'justify-between',\n 'px-4',\n 'md:px-6',\n 'lg:px-0'\n )}\n >\n <div className=\"flex items-center\">\n {title && <h5 className={clsx('text-gray-900')}>{title}</h5>}\n </div>\n <div className=\"flex items-center justify-end\">\n {link?.href && (\n <a\n className={clsx(\n 'text-primary-500',\n 'underline',\n 'underline-offset-4',\n 'text-md'\n )}\n href={link.href}\n >\n {link.text}\n </a>\n )}\n </div>\n </div>\n <div\n className={`grid grid-cols-4 gap-x-6 gap-y-2 md:gap-6 md-down:grid-cols-2 sm-down:grid-cols-1`}\n >\n {links.map((item, idx) => (\n <Link item={item} key={'news-block' + idx + item.title} />\n ))}\n </div>\n </div>\n );\n};\n\nexport default NewsBlock;\n","import React from 'react';\nimport { LinkModel } from '../../Types/LinkModel';\nimport clsx from 'clsx';\nimport { ResponsiveImageModel } from '../../Types/ResponsiveImageModel';\nimport ResponsiveImage from '../../Components/ResponsiveImage/ResponsiveImage';\n\ninterface DivOrAnchorProps {\n className?: string;\n href?: string;\n children?: React.ReactNode;\n}\n\nconst DivOrAnchor = ({ className, href, children }: DivOrAnchorProps) =>\n href ? (\n <a href={href} className={className}>\n {children}\n </a>\n ) : (\n <div className={className}>{children}</div>\n );\n\nexport interface ResponsiveBannerBlockItemProps {\n responsiveImage: ResponsiveImageModel;\n responsiveMobileImage?: ResponsiveImageModel;\n linkText?: string;\n overlay: boolean;\n link?: LinkModel;\n bodyText?: string;\n cardLink?: string;\n className?: string;\n}\n\nconst ResponsiveBannerBlockItem = ({\n responsiveImage,\n responsiveMobileImage,\n linkText,\n overlay,\n link,\n cardLink,\n bodyText,\n className,\n}: ResponsiveBannerBlockItemProps) => {\n const hasLinkButton = link;\n\n return (\n <DivOrAnchor\n className={clsx(\n className,\n 'grid overflow-hidden text-center text-white transition duration-300',\n (link?.href || cardLink) && 'hover:opacity-70'\n )}\n href={cardLink ?? link?.href}\n >\n {responsiveMobileImage ? (\n <>\n <div className=\"banner-item-image col-start-1 row-start-1 block h-full w-full lg:hidden [&_img]:w-full [&_img]:object-cover\">\n <ResponsiveImage {...responsiveMobileImage} />\n </div>\n <div className=\"banner-item-image col-start-1 row-start-1 hidden h-full w-full lg:block [&_img]:w-full [&_img]:object-cover\">\n <ResponsiveImage {...responsiveImage} />\n </div>\n </>\n ) : (\n <div className=\"banner-item-image col-start-1 row-start-1 h-full w-full object-cover [&_img]:w-full\">\n <ResponsiveImage {...responsiveImage} />\n </div>\n )}\n <div className=\"z-10 col-start-1 row-start-1 box-border flex h-full w-full max-w-[600px] flex-col items-start justify-end p-4 lg:p-6\">\n <h4 className=\"mb-2 text-white\">{linkText}</h4>\n {bodyText && <p className=\"mb-4 text-left\">{bodyText}</p>}\n {hasLinkButton && link.text && (\n <span className=\"btn btn--white btn--medium-long\">\n {link.text}\n </span>\n )}\n </div>\n {overlay && (\n <div className=\"pointer-events-none z-0 col-start-1 row-start-1 h-full w-full bg-[rgba(0,0,0,0.551)]\"></div>\n )}\n </DivOrAnchor>\n );\n};\n\nexport default ResponsiveBannerBlockItem;\n","import { RefObject, useEffect, useState } from 'react';\n\nconst useScrollShadow = (\n ref: RefObject<HTMLElement>,\n defaultHasBottomShadow: boolean = true,\n defaultHasTopShadow: boolean = false\n) => {\n const [hasBottomShadow, setHasBottomShadow] = useState(\n defaultHasBottomShadow\n );\n const [hasTopShadow, setHasTopShadow] = useState(defaultHasTopShadow);\n\n useEffect(() => {\n function updateScrolling() {\n if (ref?.current) {\n setHasBottomShadow(\n ref?.current.scrollTop + ref?.current.clientHeight <\n ref?.current.scrollHeight - 1\n );\n setHasTopShadow(ref?.current.scrollTop > 0);\n }\n }\n\n const container = ref?.current;\n\n if (container) {\n updateScrolling();\n\n container.addEventListener('scroll', updateScrolling);\n window.addEventListener('resize', updateScrolling);\n\n return () => {\n container.removeEventListener('scroll', updateScrolling);\n window.removeEventListener('resize', updateScrolling);\n };\n }\n }, [ref]);\n\n return [hasBottomShadow, hasTopShadow];\n};\n\nexport default useScrollShadow;\n","import { useEffect, useState } from 'react';\n\nconst useIsMobile = () => {\n const [isMobile, setIsMobile] = useState(true);\n\n useEffect(() => {\n function updateIsMobile() {\n setIsMobile(window.innerWidth < 1024);\n }\n\n window.addEventListener('resize', updateIsMobile);\n updateIsMobile();\n return () => window.removeEventListener('resize', updateIsMobile);\n }, []);\n\n return isMobile;\n};\n\nexport default useIsMobile;\n","import React from 'react';\nimport ResponsiveBannerBlockItem, {\n ResponsiveBannerBlockItemProps,\n} from './ResponsiveBannerBlockItem';\nimport clsx from 'clsx';\nimport { LinkModel } from '../../Types/LinkModel';\nimport BlockHeader from '../BlockHeader';\n\nexport interface ResponsiveBannerBlockProps {\n systemId: string;\n title: string;\n link?: LinkModel;\n numPerRow: number;\n banners: ResponsiveBannerBlockItemProps[];\n className?: string;\n}\n\nconst bannerCellClass = {\n 1: 'grid-cols-1',\n 2: 'sm-down:grid-cols-1 grid-cols-2',\n 3: 'sm-down:grid-cols-1 grid-cols-3',\n 4: 'md-down:grid-cols-2 grid-cols-4',\n 5: 'md-down:grid-cols-3 sm-down:grid-cols-2 grid-cols-5',\n 6: 'md-down:grid-cols-3 sm-down:grid-cols-2 grid-cols-6',\n};\n\nconst ResponsiveBannerBlock = ({\n systemId,\n banners,\n title,\n link,\n numPerRow,\n className,\n}: ResponsiveBannerBlockProps) => {\n return banners?.length > 0 ? (\n <div className={clsx('container', 'overflow-x-hidden', className)}>\n <BlockHeader title={title} link={link} />\n <div className={`grid ${bannerCellClass[numPerRow]} gap-4 md:gap-6`}>\n {banners.map((banner, idx) => (\n <ResponsiveBannerBlockItem\n {...banner}\n key={'banner-block' + idx + systemId}\n />\n ))}\n </div>\n </div>\n ) : null;\n};\n\nexport default ResponsiveBannerBlock;\n","import React, { useState, useEffect, useRef } from 'react';\nimport { Swiper, SwiperSlide } from 'swiper/react';\nimport { Pagination, Navigation, FreeMode } from 'swiper';\nimport clsx from 'clsx';\nimport ResponsiveBannerBlockItem, {\n ResponsiveBannerBlockItemProps,\n} from './BannerBlock/ResponsiveBannerBlockItem';\nimport { LinkModel } from '../Types/LinkModel';\nimport useScrollShadow from '../Hooks/useScrollShadow';\nimport useIsMobile from '../Hooks/useIsMobile';\nimport ResponsiveBannerBlock from './BannerBlock/ResponsiveBannerBlock';\nimport { ResponsiveImageModel } from '../Types/ResponsiveImageModel';\nimport ResponsiveImage from '../Components/ResponsiveImage/ResponsiveImage';\n\ninterface StartPageBlockProps {\n slides: ResponsiveBannerBlockItemProps[];\n blogHeader: string;\n allLinksUrl: LinkModel;\n links: BlockBlockItem[];\n images: ImagesItem[];\n}\n\ninterface BlockBlockItem {\n thumbnailUrl?: string;\n title?: string;\n url: string;\n}\n\ninterface ImagesItem {\n image: ResponsiveImageModel;\n linkUrl: string;\n}\n\nconst StartPageBlock = ({\n slides,\n blogHeader,\n allLinksUrl,\n links,\n images,\n}: StartPageBlockProps) => {\n const [ready, setReady] = useState(false);\n const isMobile = useIsMobile();\n\n useEffect(() => setReady(true), []);\n\n const blogPostsContainer = useRef<HTMLUListElement>(null);\n const [hasBottomShadow, hasTopShadow] =\n useScrollShadow(blogPostsContainer);\n\n if (!slides || slides.length == 0) {\n return null;\n }\n return (\n <div className=\"lg:container flex flex-col gap-2 lg:mt-4 lg:grid lg:grid-cols-2 lg:gap-6\">\n <div\n className={clsx(\n 'aspect-[2/1] h-full w-full object-cover [&_.swiper]:aspect-[2/1] [&_.swiper]:max-w-full [&_.swiper]:rounded-sm',\n '[&_.swiper-pagination.swiper-pagination-horizontal]:bottom-0',\n '[&_.swiper-pagination]:flex',\n '[&_.swiper-pagination]:justify-center',\n '[&_.swiper-pagination]:gap-1',\n '[&_.pagination-dash]:my-[7px]',\n '[&_.pagination-dash]:h-1',\n '[&_.pagination-dash]:w-[18px]',\n '[&_.swiper-button-prev]:h-6',\n '[&_.swiper-button-next]:h-6',\n '[&_.pagination-dash]:bg-gray-400',\n '[&_.pagination-dash.pagination-dash--active]:lg:bg-white',\n '[&_.pagination-dash.pagination-dash--active]:bg-gray-900'\n )}\n >\n {ready ? (\n <Swiper\n className=\"banner-swiper\"\n pagination={\n slides.length > 1\n ? {\n dynamicBullets: slides.length > 8 ? true : false,\n dynamicMainBullets: 3,\n bulletClass: 'pagination-dash',\n bulletActiveClass: 'pagination-dash--active',\n }\n : false\n }\n navigation={!isMobile && slides.length > 1}\n modules={[FreeMode, Pagination, Navigation]}\n lazy={true}\n loop={slides.length > 1}\n >\n {slides.map(\n (slide: ResponsiveBannerBlockItemProps, index: number) => (\n <SwiperSlide key={'banner-slider' + index + '0000'}>\n <ResponsiveBannerBlockItem {...slide} />\n </SwiperSlide>\n )\n )}\n </Swiper>\n ) : (\n <ResponsiveBannerBlock\n numPerRow={1}\n banners={slides.slice(0, 1)}\n systemId=\"0000\"\n title=\"\"\n className=\"p-0\"\n />\n )}\n </div>\n\n <div className=\"flex flex-col-reverse gap-2 lg:aspect-[2/1] lg:flex-row lg:gap-6\">\n <div className=\"h-full max-h-full overflow-y-auto border-gray-100 pl-4 lg:flex-1 lg:pl-0\">\n <div className=\"relative flex h-full flex-col justify-between rounded-sm border-gray-200 lg:border\">\n <div className=\"flex justify-between bg-gray-100 pb-2 pr-4 lg:absolute lg:left-0 lg:right-0 lg:z-10 lg:h-9 lg:items-center lg:p-0 lg:pl-2 lg:pr-0\">\n {blogHeader && (\n <h6 className=\"text-xl lg:text-lg\">{blogHeader}</h6>\n )}\n {allLinksUrl?.href && (\n <a\n className=\"underline-offset-3 flex items-center text-md text-primary-500 underline lg:hidden\"\n href={allLinksUrl.href}\n >\n {allLinksUrl.text}\n </a>\n )}\n {hasTopShadow && (\n <div className=\"absolute left-0 right-0 top-5 hidden h-4 w-full shadow-xs lg:block\"></div>\n )}\n </div>\n <div className=\"relative mb-auto flex overflow-hidden\">\n {hasBottomShadow && (\n <div className=\"absolute -bottom-4 left-0 hidden h-4 w-full shadow-xs-reverse lg:block\"></div>\n )}\n <ul\n className=\"flex w-full flex-row overflow-y-scroll scrollbar-none lg:flex-col lg:pt-9\"\n ref={blogPostsContainer}\n >\n {links.map((item, idx) => (\n <li\n className=\"flex border-b border-l border-t border-b-gray-200 border-l-gray-200 border-t-gray-200 px-2 py-1 last-of-type:border-r last-of-type:border-r-gray-200 lg:w-full lg:border-l-0 lg:border-r-0 lg:border-t-0\"\n key={'start-page-block' + idx + item.title}\n >\n <a\n className=\"flex w-72 gap-x-2 lg:w-auto\"\n href={item.url}\n >\n {item.thumbnailUrl && (\n <img\n className=\"aspect-auto h-[40px] w-[60px] rounded-sm object-cover\"\n src={item.thumbnailUrl}\n loading=\"lazy\"\n />\n )}\n {item.title && (\n <p className=\"self-center text-md font-bold leading-tight lg:text-sm xl:text-md\">\n {item.title}\n </p>\n )}\n </a>\n </li>\n ))}\n </ul>\n </div>\n {allLinksUrl?.href && (\n <a\n className=\"underline-offset-3 hidden p-2 text-sm text-primary-500 underline lg:flex\"\n href={allLinksUrl.href}\n >\n {allLinksUrl.text}\n </a>\n )}\n </div>\n </div>\n <div className=\"flex h-full flex-row gap-2 lg:flex-1 lg:flex-col lg:gap-6\">\n {images.map((item, idx) => (\n <div\n key={'start-page-block' + idx + item.linkUrl}\n className=\"aspect-[2/1] max-w-full overflow-hidden md-down:flex-1\"\n >\n <a\n href={item.linkUrl}\n className=\"h-full w-full [&_img]:min-h-full [&_img]:min-w-full [&_img]:object-cover\"\n >\n <ResponsiveImage {...item.image} />\n </a>\n </div>\n ))}\n </div>\n </div>\n </div>\n );\n};\n\nexport default StartPageBlock;\n","import React from 'react';\nimport OrderDetail from '../OrderDetail/OrderDetail';\n\nconst OrderConfirmation = ({ title, text, order, extraText }) => {\n return (\n <div>\n {order && (\n <OrderDetail\n isConfirmation={true}\n order={order}\n confirmationTitle={title}\n confirmationText={text}\n confirmationExtraText={extraText}\n />\n )}\n </div>\n );\n};\n\nexport default OrderConfirmation;\n","import React from 'react';\nimport { LinkModel } from '../Types/LinkModel';\nimport clsx from 'clsx';\nimport BlockHeader from './BlockHeader';\n\ninterface BrandsBlockProps {\n title?: string;\n brands: BrandItem[];\n link?: LinkModel;\n}\n\ninterface BrandItem {\n link: LinkModel;\n imageUrl?: string;\n}\n\nconst BrandsBlock = ({ title, link, brands }: BrandsBlockProps) => {\n return (\n <div className=\"container pb-8 pt-6 md:pb-10 md:pt-8 lg:pb-12 lg:pt-10\">\n <BlockHeader title={title} link={link} />\n <ul\n className={clsx(\n 'grid grid-cols-2 items-center justify-center gap-4 py-0 pb-2 md:grid-cols-3 lg:grid-cols-6 lg:gap-6'\n )}\n >\n {brands.map((brand) => (\n <li className=\"h-full\" key={brand.link.text + brand.link.href}>\n <a\n className={clsx(\n 'flex',\n 'h-full',\n 'justify-center',\n 'border-gray-200',\n 'rounded-sm',\n 'bg-white',\n 'p-2'\n )}\n href={brand.link.href}\n aria-label={brand.link.text}\n >\n {brand.imageUrl && (\n <img\n src={brand.imageUrl}\n alt={brand.link.text}\n loading=\"lazy\"\n />\n )}\n </a>\n </li>\n ))}\n </ul>\n </div>\n );\n};\n\nexport default BrandsBlock;\n","import React from 'react';\nimport { EditorStringModel } from '../Types/EditorString';\nimport EditorString from '../Components/EditorString/EditorString';\nimport clsx from 'clsx';\n\ninterface RichTextBlockColumnProps {\n column: RichTextColumn;\n}\n\nconst RichTextBlockColumn = ({ column }: RichTextBlockColumnProps) => {\n const textMobile = column.textMobile?.value\n ? column.textMobile\n : column.text;\n\n return (\n <div\n className={clsx(\n column.columnCountMobile == 12 && 'w-full',\n column.columnCountMobile == 8 && 'w-3/4',\n column.columnCountMobile == 6 && 'w-1/2',\n column.columnCountMobile == 4 && 'w-1/3',\n column.columnCountMobile == 3 && 'w-1/4',\n column.columnCountMobile == 2 && 'w-1/6',\n column.columnCount == 12 && 'lg:w-full',\n column.columnCount == 8 && 'lg:w-3/4',\n column.columnCount == 6 && 'lg:w-1/2',\n column.columnCount == 4 && 'lg:w-1/3',\n column.columnCount == 3 && 'lg:w-1/4',\n column.columnCount == 2 && 'lg:w-1/6'\n )}\n >\n <div className=\"hidden lg:block\">\n <EditorString {...column.text} />\n </div>\n\n <div className=\"lg:hidden\">\n <EditorString {...textMobile} />\n </div>\n </div>\n );\n};\n\ninterface RichTextBlockProps {\n rowLayout: 'slim' | 'container' | 'fullwidth' | 'fullwidth-nopadding';\n columns: RichTextColumn[];\n slimContainerMaxWidth: number;\n verticalAlignment?: 'flex-start' | 'center' | 'flex-end';\n reverseColumnOrderForMobile: boolean;\n}\n\ninterface RichTextColumn {\n columnCount: number;\n columnCountMobile?: number;\n text: EditorStringModel;\n textMobile?: EditorStringModel;\n}\n\nconst RichTextBlock = ({\n rowLayout,\n columns,\n slimContainerMaxWidth,\n verticalAlignment,\n reverseColumnOrderForMobile,\n}: RichTextBlockProps) => {\n const styles =\n rowLayout == 'slim' && slimContainerMaxWidth\n ? { maxWidth: slimContainerMaxWidth + 'px' }\n : {};\n\n return (\n <div\n className={clsx(\n 'flex',\n ['container', 'slim', 'fullwidth'].includes(rowLayout) &&\n 'container',\n verticalAlignment == 'center' && 'items-center',\n verticalAlignment == 'flex-end' && 'items-end',\n reverseColumnOrderForMobile && 'flex-row-reverse lg:flex-row'\n )}\n style={styles}\n >\n {columns.map((column, idx) => (\n <RichTextBlockColumn\n key={`${column.columnCount}-${idx}`}\n column={column}\n />\n ))}\n </div>\n );\n};\n\nexport default RichTextBlock;\n","import React from 'react';\nimport Collapsible from '../Components/Collapsible';\nimport { EditorStringModel } from '../Types/EditorString';\nimport EditorString from '../Components/EditorString/EditorString';\n\ninterface FaqAccordionProps {\n systemId: string;\n title: string;\n faqItems: FaqAccordionItem[];\n}\n\ninterface FaqAccordionItem {\n title?: string;\n text?: EditorStringModel;\n}\n\nconst FaqAccordion = (props: FaqAccordionProps) => {\n const faqList = props.faqItems;\n\n return (\n <div className=\"container flex flex-col items-center\">\n {faqList.map((faq, idx) => (\n <Collapsible\n className=\"w-full max-w-3xl bg-gray-100 [&:last-child]:border-0 [&:not(:last-child)]:mb-2 [&_.ReactCollapse--content]:border [&_.ReactCollapse--content]:border-t-0 [&_.ReactCollapse--content]:border-solid [&_.ReactCollapse--content]:border-gray-100 [&_.ReactCollapse--content]:bg-white [&_.ReactCollapse--content]:p-4 [&_.ReactCollapse--content]:text-md [&_.collapsible]:border-0 [&_.icon-wrapper]:h-10 [&_.icon-wrapper]:w-10 [&_.icon-wrapper]:bg-primary-500 [&_.site-icon]:h-6 [&_.site-icon]:w-6 [&_label]:p-2 [&_label]:pl-4\"\n key={idx}\n label={faq.title}\n >\n <EditorString value={faq.text?.value} />\n </Collapsible>\n ))}\n </div>\n );\n};\n\nexport default FaqAccordion;\n","import React from 'react';\nimport EditorString from '../Components/EditorString/EditorString';\nimport { EditorStringModel } from '../Types/EditorString';\n\ninterface UspBlockProps {\n title?: string;\n items: UspItem[];\n}\n\ninterface UspItem {\n title: string;\n imageUrl: string;\n text: EditorStringModel;\n}\n\nconst UspBlock = ({ items, title }: UspBlockProps) => {\n return (\n <div className=\"container\">\n <ul className=\"grid grid-cols-2 gap-4 md:grid-cols-4 [&_div]:text-center [&_div]:text-md\">\n {items.map((item, index) => (\n <li\n className=\"flex flex-col items-center\"\n key={item.title + index}\n >\n <img\n className=\"mb-4 max-h-6\"\n src={item.imageUrl}\n alt={item.title}\n loading=\"lazy\"\n />\n <h6 className=\"mb-2\">{item.title}</h6>\n <EditorString value={item.text.value} />\n </li>\n ))}\n </ul>\n </div>\n );\n};\n\nexport default UspBlock;\n","import React from 'react';\nimport Product from '../../Types/Product';\nimport ProductCardLandscape from '../ProductCards/ProductCardLandscape';\n\ninterface ProductPageVariantListProps {\n variants: Product[];\n}\n\nconst ProductPageVariantList = ({\n variants,\n}: ProductPageVariantListProps) => {\n return (\n <div className=\"mt-4 grid grid-cols-1 gap-2 md:mt-4\">\n {variants.map((p) => (\n <ProductCardLandscape\n product={p}\n isVariantListing={true}\n key={'ProductPageVariantList' + p.id}\n />\n ))}\n </div>\n );\n};\n\nexport default ProductPageVariantList;\n","import React, { useCallback, useMemo } from 'react';\nimport Icon from '../Icon';\n\ninterface ScrollToElementButtonProps {\n btnType: 'default' | 'primary' | 'secondary' | 'outlined';\n btnSize:\n | 'xsmall'\n | 'small'\n | 'medium'\n | 'large'\n | 'xlarge';\n selector: string;\n label: string | JSX.Element;\n fullwidth?: boolean;\n iconBefore?: string | JSX.Element;\n iconAfter?: string | JSX.Element;\n}\n\nconst ScrollToElementButton = ({\n btnType,\n btnSize,\n selector,\n label,\n fullwidth = false,\n iconBefore,\n iconAfter,\n}: ScrollToElementButtonProps) => {\n const onClick = () => {\n const elementTopPosition =\n document\n .querySelector(selector)\n ?.getBoundingClientRect().top ?? 0;\n if (!elementTopPosition) return;\n\n const headerHeight =\n document\n .querySelector('#header')\n ?.getBoundingClientRect().height ?? 0;\n\n window.scrollTo({\n top: elementTopPosition - headerHeight,\n behavior: 'smooth',\n });\n };\n\n const IconElement = useCallback(\n ({ icon }: { icon: string | JSX.Element }) => {\n if (typeof icon == 'string') {\n return <Icon name={icon} />;\n } else {\n return icon;\n }\n },\n []\n );\n\n return (\n <div>TODO</div>\n // <Button\n // btnType={btnType}\n // btnSize={btnSize}\n // fullwidth={fullwidth}\n // onClick={onClick}\n // >\n // {iconBefore && <IconElement icon={iconBefore} />}\n // <span>{label}</span>\n // {iconAfter && <IconElement icon={iconAfter} />}\n // </Button>\n );\n};\n\nexport default ScrollToElementButton;\n","import React, { useEffect, useState } from 'react';\nimport { Collapse } from 'react-collapse';\nimport Icon from '../Icon';\nimport clsx from 'clsx';\n\ninterface CollapsibleAttributes {\n label?: string | JSX.Element;\n className?: string;\n transitionDuration?: string;\n onStateChange?: Function;\n isOpen?: boolean;\n hideBorder?: boolean;\n children?: any;\n}\n\nexport default ({\n children,\n label,\n className = '',\n onStateChange: externalStateChange,\n isOpen: externalIsOpen,\n hideBorder,\n}: CollapsibleAttributes) => {\n const [isOpen, setIsOpen] = useState<boolean>(externalIsOpen ?? false);\n\n const onStateChange = (open: boolean) => {\n externalStateChange && externalStateChange(open);\n setIsOpen(open);\n };\n\n useEffect(() => {\n setIsOpen(externalIsOpen ?? false);\n }, [externalIsOpen]);\n\n return (\n <div\n className={`collapsible [&_.ReactCollapse--content]:!pb-0 [&_ul>li_a]:pl-[1.75rem] [&_ul>li_a]:text-md ${\n className ?? ''\n } ${hideBorder ? 'border-b-0 border-t-0' : ''}`}\n >\n <label\n className={clsx(\n 'border-gray-300',\n '!pb-0',\n '!pt-0',\n 'text-md',\n '!font-[400]',\n '[&_>a]:flex-1',\n isOpen && 'border-b',\n !isOpen && 'border-b-0'\n )}\n >\n {label}\n <div\n className=\"flex h-10 w-10 items-center justify-center border-l border-gray-300\"\n onClick={() => onStateChange(!isOpen)}\n >\n <Icon\n className={clsx(\n 'h-5 w-5 duration-200',\n isOpen ? 'rotate-180' : 'rotate-0'\n )}\n name=\"caret-down\"\n />\n </div>\n </label>\n <div className=\"collapsible__content\">\n <Collapse isOpened={isOpen}>{children}</Collapse>\n </div>\n </div>\n );\n};\n","import React from 'react';\nimport SubNavigationCollapsible from './SubNavigationCollapsible';\nimport { SubNavigationLinkModel } from '../../Types/SubNavigationLinkModel';\nimport clsx from 'clsx';\n\nconst SubNavigation = ({\n links,\n name,\n url,\n isSelected = false,\n}: SubNavigationLinkModel) => {\n if (links?.length == 0 && !name && !url) {\n return null;\n }\n\n return (\n <>\n {(name || url) && (\n <a\n className=\"mb-3 ml-4 hidden min-h-[40px] items-center text-h5 font-bold leading-tight hover:bg-gray-100 md:flex lg:ml-0\"\n href={url}\n >\n {name}\n </a>\n )}\n <ul className=\"rounded-sm border-t border-gray-300 md:rounded md:border [&_.collapsible]:!border-b-0 [&_.collapsible]:!border-t-0\">\n {links?.length >= 1 && (\n <ul\n className={clsx(\n 'border-gray-300 [&_>li:not(:last-child)]:border-b'\n )}\n >\n {(name || url) && (\n <li\n className={clsx(\n 'border-gray-300 md:hidden [&:not(:last-child)]:border-b',\n isSelected && 'bg-gray-100'\n )}\n >\n <a\n className={clsx(\n 'flex min-h-[40px] items-center pl-2 text-md hover:bg-gray-100',\n isSelected && 'font-bold'\n )}\n href={url}\n >\n {name}\n </a>\n </li>\n )}\n {links.map((link, idx) =>\n link.links?.length >= 1 ? (\n <li\n className={clsx(\n 'border-b-0',\n link.isSelected && 'bg-gray-100'\n )}\n key={link.name + link.url + idx}\n >\n <SubNavigationCollapsible\n isOpen={\n link.isSelected ||\n link.links.some((l) => l.isSelected == true)\n }\n label={\n <a\n className={clsx(\n 'flex min-h-[40px] items-center pl-4 text-md hover:bg-gray-100',\n link.isSelected && 'font-bold'\n )}\n href={link.url}\n >\n {link.name}\n </a>\n }\n >\n <ul>\n {link.links.map((secondLevelLink, idx) => (\n <li\n className={clsx(\n 'border-b-0',\n !secondLevelLink.isSelected && 'bg-white',\n secondLevelLink.isSelected && 'bg-gray-100'\n )}\n key={secondLevelLink.name + idx}\n >\n <a\n className={clsx(\n 'flex min-h-[40px] items-center !text-md hover:bg-gray-100',\n secondLevelLink.isSelected && 'font-bold'\n )}\n href={secondLevelLink.url}\n >\n {secondLevelLink.name}\n </a>\n </li>\n ))}\n </ul>\n </SubNavigationCollapsible>\n </li>\n ) : (\n <li\n className={clsx(link.isSelected && 'bg-gray-100')}\n key={link.name + idx}\n >\n <a\n className={clsx(\n 'flex min-h-[40px] items-center pl-4 text-md hover:bg-gray-100',\n link.isSelected && 'font-bold'\n )}\n href={link.url}\n >\n {link.name}\n </a>\n </li>\n )\n )}\n </ul>\n )}\n </ul>\n </>\n );\n};\n\nexport default SubNavigation;\n","import React from 'react';\nimport SubNavigation from './SubNavigation';\nimport Collapsible from '../Collapsible';\nimport { SubNavigationLinkModel } from '../../Types/SubNavigationLinkModel';\n\nconst SubNavigationContainer = ({\n links,\n name,\n url,\n isSelected,\n}: SubNavigationLinkModel) => {\n if (!links || links.length === 0) {\n return null;\n }\n\n return (\n <>\n <div className=\"lg:hidden\">\n <Collapsible\n className=\"[&_>label]:bold mb-6 rounded border border-gray-300 !pb-0 [&_.ReactCollapsible--content]:!pb-0 [&_>label]:!pl-4 [&_>label]:!pr-4\"\n label={name}\n >\n <SubNavigation\n links={links}\n name={name}\n url={url}\n isSelected={isSelected}\n />\n </Collapsible>\n </div>\n <div className=\"hidden lg:block\">\n <SubNavigation links={links} name={name} url={url} />\n </div>\n </>\n );\n};\n\nexport default SubNavigationContainer;\n","import React from 'react';\nimport { LinkModel } from '../../Types/LinkModel';\nimport clsx from 'clsx';\n\nexport interface BannerItemProps {\n imageUrl: string;\n mobileImageUrl?: string;\n linkText?: string;\n overlay: boolean;\n link?: LinkModel;\n bodyText?: string;\n cardLink?: string;\n lazyLoadImage?: boolean;\n className?: string;\n}\n\nconst ProductsBannerBlockItem = ({\n imageUrl,\n mobileImageUrl,\n linkText,\n overlay,\n link,\n cardLink,\n bodyText,\n lazyLoadImage = false,\n className,\n}: BannerItemProps) => {\n const hasLinkButton = link;\n\n const DivOrAnchor = ({ children, ...rest }) =>\n cardLink ? (\n <a href={cardLink}>{children}</a>\n ) : hasLinkButton && link?.href ? (\n <a {...rest}>{children}</a>\n ) : (\n <div {...rest}>{children}</div>\n );\n\n return (\n <DivOrAnchor\n className={clsx(\n className,\n 'grid h-full w-full overflow-hidden rounded-sm text-white transition duration-300 lg:relative',\n (link?.href || cardLink) && 'hover:opacity-70'\n )}\n href={link?.href}\n >\n {mobileImageUrl ? (\n <>\n <img\n className={clsx(\n 'col-start-1 row-start-1 h-full w-full object-cover',\n 'lg:hidden'\n )}\n src={mobileImageUrl}\n loading={lazyLoadImage ? 'lazy' : undefined}\n />{' '}\n <img\n className={clsx(\n 'col-start-1 row-start-1 h-full w-full object-cover lg:absolute',\n 'lg:flex'\n )}\n src={imageUrl}\n loading={lazyLoadImage ? 'lazy' : undefined}\n />\n </>\n ) : (\n <img\n className=\"col-start-1 row-start-1 h-full w-full object-cover lg:absolute\"\n src={imageUrl}\n loading={lazyLoadImage ? 'lazy' : undefined}\n />\n )}\n <div className=\"z-10 col-start-1 row-start-1 box-border flex h-full w-full max-w-[600px] flex-col items-start justify-end p-4 lg:p-6\">\n <h4 className=\"mb-2 text-white\">{linkText}</h4>\n {bodyText && <p className=\"mb-4 text-left\">{bodyText}</p>}\n {hasLinkButton && link.text && (\n <span className=\"btn btn--white btn--medium-long\">\n {link.text}\n </span>\n )}\n </div>\n {overlay && (\n <div className=\"pointer-events-none z-0 col-start-1 row-start-1 h-full w-full bg-[rgba(0,0,0,0.551)]\"></div>\n )}\n </DivOrAnchor>\n );\n};\n\nexport default ProductsBannerBlockItem;\n","import React, { useMemo } from 'react';\nimport ProductCard from '../Components/ProductCards/ProductCard';\nimport ProductsBannerBlockItem from './BannerBlock/ProductsBannerBlockItem';\nimport { BannerBlockProps } from './BannerBlock/BannerBlock';\nimport { ProductNoSliderProps } from './ProductBlockNoSlider';\nimport { LinkModel } from '../Types/LinkModel';\nimport BlockHeader from './BlockHeader';\nimport clsx from 'clsx';\n\ninterface ProductAndBannerProps {\n products: ProductNoSliderProps;\n banners: BannerBlockProps;\n showBannerToTheRight: boolean;\n productQuantity: number;\n title?: string;\n link?: LinkModel;\n}\n\nconst ProductsAndBannerBlock = ({\n products: productsBlock,\n banners: bannersBlock,\n showBannerToTheRight,\n title,\n link,\n}: ProductAndBannerProps) => {\n const bannerBlockItem = useMemo(\n () => (bannersBlock.banners?.length ? bannersBlock.banners[0] : null),\n [bannersBlock.banners]\n );\n const firstTwoProducts = useMemo(\n () => productsBlock.products?.slice(0, 2),\n [productsBlock]\n );\n const remainingProducts = useMemo(\n () =>\n productsBlock.products?.slice(\n 2,\n (productsBlock?.numPerRow ?? 4) + 2\n ),\n [productsBlock]\n );\n\n if (!bannerBlockItem) return null;\n\n return (\n <>\n <div className=\"px-4 md:px-6 lg:px-0\">\n <BlockHeader title={title} link={link} />\n </div>\n <div className=\"grid grid-cols-1 gap-0.5 lg:grid-cols-2\">\n <div className={clsx(showBannerToTheRight && 'lg:hidden')}>\n <ProductsBannerBlockItem\n {...bannerBlockItem}\n lazyLoadImage={true}\n />\n </div>\n {firstTwoProducts && (\n <div\n className={clsx(\n 'grid grid-cols-2 gap-0.5',\n firstTwoProducts.length == 1 && 'lg:grid-cols-1',\n firstTwoProducts.length == 2 && 'lg:grid-cols-2',\n firstTwoProducts.length == 3 && 'lg:grid-cols-3',\n firstTwoProducts.length == 4 && 'lg:grid-cols-4',\n firstTwoProducts.length == 5 && 'lg:grid-cols-5',\n firstTwoProducts.length == 6 && 'lg:grid-cols-6'\n )}\n >\n {firstTwoProducts.map((product, idx) => (\n <ProductCard\n key={product.id + 'mixed' + idx}\n product={product}\n lazyLoadImage={true}\n />\n ))}\n </div>\n )}\n {showBannerToTheRight && (\n <div className=\"hidden lg:flex\">\n <ProductsBannerBlockItem\n className=\"banner-item\"\n {...bannerBlockItem}\n lazyLoadImage={true}\n />\n </div>\n )}\n </div>\n {remainingProducts?.length ? (\n <div className=\"mt-0.5 grid grid-cols-2 gap-0.5 lg:grid-cols-4\">\n {remainingProducts.map((product, idx) => (\n <ProductCard\n key={product.id + 'mixed' + idx}\n product={product}\n lazyLoadImage={true}\n />\n ))}\n </div>\n ) : null}\n </>\n );\n};\n\nexport default ProductsAndBannerBlock;\n","import React, { useCallback } from 'react';\nimport Modal from 'react-modal';\nimport { useTypedSelector } from '../../Hooks/useTypedSelector';\nimport { useDispatch } from 'react-redux';\nimport { setPriceHistoryModalOpen } from '../../Actions/PriceHistory.actions';\nimport Icon from '../Icon';\n\nconst customModalStyles = {\n content: {\n background: 'none',\n padding: 0,\n border: 'none',\n },\n overlay: {\n background: 'rgba(0, 0, 0, 0.8)',\n zIndex: 2003,\n },\n};\n\nconst PriceHistoryModal = () => {\n const {\n modalOpen,\n previouslyLowestPrice,\n numberOfDays,\n description,\n title,\n } = useTypedSelector((state) => state.priceHistory);\n\n const dispatch = useDispatch();\n\n const close = useCallback(() => {\n dispatch(\n setPriceHistoryModalOpen(\n false,\n previouslyLowestPrice,\n numberOfDays,\n description,\n title\n )\n );\n }, [dispatch, previouslyLowestPrice, numberOfDays, description, title]);\n\n return (\n <div id=\"price-history\">\n <Modal\n ariaHideApp={false}\n preventScroll={true}\n isOpen={modalOpen}\n onRequestClose={close}\n style={customModalStyles}\n shouldCloseOnOverlayClick={true}\n >\n <div className=\"absolute bottom-0 left-0 right-0 top-0 flex\">\n <div className=\"relative m-auto max-w-[640px] rounded border border-gray-400 bg-gray-100\">\n <div className=\"absolute right-2 top-2\" onClick={close}>\n <Icon\n className=\"h-[20px] w-[20px] cursor-pointer text-gray-900\"\n name=\"close\"\n cursor=\"pointer\"\n />\n </div>\n <div className=\"flex flex-col gap-2 px-4 pb-4 pt-6 lg:p-8\">\n <h5>{title}</h5>\n <h4>{previouslyLowestPrice}</h4>\n <div className=\"text-md text-gray-900\">\n <p>{description}</p>\n </div>\n </div>\n </div>\n </div>\n </Modal>\n </div>\n );\n};\n\nexport default PriceHistoryModal;\n","import React, { useEffect, useState } from 'react';\nimport { Swiper, SwiperSlide } from 'swiper/react';\nimport { Autoplay } from 'swiper';\nimport clsx from 'clsx';\nimport Icon from '../Icon';\n\nconst TopMenuUsps = ({ uspList }) => {\n const [hasLoaded, setHasLoaded] = useState(false);\n\n useEffect(() => {\n setHasLoaded(true);\n }, []);\n\n return (\n <>\n {!hasLoaded && uspList.length > 0 && (\n <a\n className=\"flex items-center text-sm text-white\"\n href={uspList[0].uspLink?.href}\n >\n <Icon\n className=\"mr-[2px] h-[18px] w-[18px] text-success-500\"\n name=\"check\"\n />\n {uspList[0].uspText}\n </a>\n )}\n {hasLoaded && uspList.length > 0 && (\n <Swiper\n className=\"flex h-[18px] items-center justify-center text-center\"\n modules={[Autoplay]}\n direction={'vertical'}\n loop={true}\n autoplay={{\n delay: 4000,\n disableOnInteraction: false,\n }}\n >\n {uspList.map((usp, idx) => (\n <SwiperSlide\n key={'slide' + idx}\n className=\"flex justify-center\"\n >\n <a\n className={clsx(\n 'flex items-center text-sm text-white',\n usp.uspLink?.href &&\n 'hover:cursor-pointer hover:opacity-80'\n )}\n href={usp.uspLink?.href}\n >\n <Icon\n className=\"mr-[2px] h-[18px] w-[18px] text-success-500\"\n name=\"check\"\n />\n {usp.uspText}\n </a>\n </SwiperSlide>\n ))}\n </Swiper>\n )}\n </>\n );\n};\n\nexport default TopMenuUsps;\n","import React, { useState } from 'react';\nimport { translate } from '../../Services/translation';\nimport { post } from '../../Services/http';\nimport {\n IconChevronRight,\n IconReload,\n IconCheck,\n} from '@tabler/icons-react';\nimport clsx from 'clsx';\n\ninterface NewsletterRegistrationFormProps {\n buttonClassName?: string;\n}\n\nexport const NewsletterRegistrationForm = ({\n buttonClassName,\n}: NewsletterRegistrationFormProps) => {\n const [email, setEmail] = useState('');\n const [registrationError, setRegistrationError] = useState('');\n const [isTryingToSubscribe, setIsTryingToSubscribe] = useState(false);\n const [registrationSuccessful, setRegistrationSuccessful] =\n useState(false);\n const handleEmailChange = (e) => {\n setRegistrationSuccessful(false);\n setEmail(e.target.value);\n };\n\n const handleSubmit = (e) => {\n e.preventDefault();\n if (registrationSuccessful || isTryingToSubscribe) {\n return;\n }\n setIsTryingToSubscribe(true);\n setRegistrationError('');\n post('/api/newsletter/subscribe', { email })\n .then((response) => {\n if (response.ok) {\n setRegistrationSuccessful(true);\n } else {\n setRegistrationSuccessful(false);\n console.error('Failed to subscribe to newsletter.');\n setRegistrationError(\n translate('newsletter.registration-failed')\n );\n }\n })\n .catch((error) => {\n setRegistrationSuccessful(false);\n setRegistrationError(translate('newsletter.registration-failed'));\n console.error(\n 'An error occurred while subscribing to newsletter:',\n error\n );\n })\n .finally(() => {\n setIsTryingToSubscribe(false);\n });\n };\n\n return (\n <div>\n <form className=\"relative\" onSubmit={handleSubmit}>\n <input\n className=\"w-full rounded-sm border border-gray-400 px-3 py-3 text-lg text-gray-900 xl:px-4 xl:py-4\"\n type=\"text\"\n onChange={handleEmailChange}\n placeholder={translate('newsletter.submit')}\n value={email}\n required\n />\n <button\n className={clsx(\n 'absolute right-[4px] top-[4px] z-[1] flex h-10 w-10 items-center justify-center rounded-sm bg-primary-500 disabled:cursor-not-allowed disabled:bg-primary-300 xl:h-12 xl:w-12',\n buttonClassName\n )}\n disabled={registrationSuccessful}\n type=\"submit\"\n >\n {registrationSuccessful ? (\n <IconCheck size={24} />\n ) : isTryingToSubscribe ? (\n <IconReload size={24} />\n ) : (\n <IconChevronRight size={24} />\n )}\n </button>\n </form>\n {registrationError && (\n <div className=\"mt-2 text-sm text-error-500\">\n {registrationError}\n </div>\n )}\n {registrationSuccessful && (\n <div className=\"mt-2 text-sm text-success-500\">\n {translate('newsletter.registration-success')}\n </div>\n )}\n </div>\n );\n};\n\nconst NewsletterRegistration = () => {\n return (\n <div>\n <h6 className=\"mb-2 text-white\">\n {translate('newsletter-registration.title')}\n </h6>\n <p className=\"mb-4\">{translate('newsletter-registration.text')}</p>\n <NewsletterRegistrationForm />\n </div>\n );\n};\n\nexport default NewsletterRegistration;\n","import React from 'react';\nimport { NewsletterRegistrationForm } from '../Components/NewsletterRegistration/NewsletterRegistration';\n\nconst NewsletterFormBlock = () => {\n return (\n <div>\n <NewsletterRegistrationForm buttonClassName=\"text-white\" />\n </div>\n );\n};\n\nexport default NewsletterFormBlock;\n","import { SET_NEWS_LIST_FILTER } from '../constants';\nimport { translate } from '../Services/translation';\n\nexport const setNews = (newsListModel) => ({\n type: SET_NEWS_LIST_FILTER,\n payload: {\n ...newsListModel,\n },\n});\n\nfunction updateQueryStringParameter(uri, key, value) {\n var re = new RegExp('([?&])' + key + '=.*?(&|$)', 'i');\n var separator = uri.indexOf('?') !== -1 ? '&' : '?';\n if (uri.match(re)) {\n return uri.replace(re, '$1' + key + '=' + value + '$2');\n } else {\n return uri + separator + key + '=' + value;\n }\n}\n\nfunction removeURLParameter(url, parameter) {\n //prefer to use l.search if you have a location/link object\n var urlparts = url.split('?');\n if (urlparts.length >= 2) {\n var prefix = encodeURIComponent(parameter) + '=';\n var pars = urlparts[1].split(/[&;]/g);\n\n //reverse iteration as may be destructive\n for (var i = pars.length; i-- > 0; ) {\n //idiom for string.startsWith\n if (pars[i].lastIndexOf(prefix, 0) !== -1) {\n pars.splice(i, 1);\n }\n }\n\n return urlparts[0] + (pars.length > 0 ? '?' + pars.join('&') : '');\n }\n return url;\n}\n\nexport const getNews =\n (type, year, month, page) => (dispatch, getState) => {\n const model = getState().newsList;\n model.news = null;\n model.selectedType = type;\n model.selectedYear = year;\n model.selectedMonth = month;\n model.selectedPage = page;\n\n if (!year || year == '' || year == translate('blog.show.all.years')) {\n model.selectedYear = '';\n model.selectedMonth = '';\n }\n\n if (\n !month ||\n month == '' ||\n month == translate('blog.show.all.months')\n ) {\n model.selectedMonth = '';\n }\n\n let url = window.location.href;\n\n url = updateQueryStringParameter(\n url,\n 'selectedType',\n model.selectedType || ''\n );\n url = updateQueryStringParameter(\n url,\n 'selectedYear',\n model.selectedYear || ''\n );\n url = updateQueryStringParameter(\n url,\n 'selectedMonth',\n model.selectedMonth || ''\n );\n\n url = removeURLParameter(url, 'page');\n\n window.location.href = url;\n };\n","import React, { useEffect, useState, useCallback } from 'react';\nimport Pagination from '../Pagination';\nimport { calculatePager, Pager } from '../../Services/Pagination.service';\nimport ResponsiveImage from '../ResponsiveImage/ResponsiveImage';\nimport { translate } from '../../Services/translation';\nimport clsx from 'clsx';\nimport Dropdown from '../Dropdown';\nimport { getNews } from '../../Actions/News.action';\nimport { useTypedSelector } from '../../Hooks/useTypedSelector';\nimport { useDispatch } from 'react-redux';\nimport AdminEditButton from '../AdminEditButton';\n\nconst NewsList = () => {\n const dispatch = useDispatch();\n const {\n title,\n introduction,\n newsTypes,\n years,\n months,\n news,\n pagination,\n selectedType,\n selectedYear,\n selectedMonth,\n } = useTypedSelector((state) => state.newsList);\n\n const { totalCount, currentPageIndex } = pagination;\n const [pager, setPager] = useState<Pager>({});\n\n useEffect(() => {\n setPager(calculatePager(totalCount, currentPageIndex));\n }, [totalCount, currentPageIndex]);\n\n const changePageIndex = useCallback(\n (index) => {\n if (index !== currentPageIndex) {\n dispatch(\n getNews(selectedType, selectedYear, selectedMonth, index)\n );\n window.scrollTo(0, 0);\n }\n },\n [currentPageIndex, selectedType, selectedYear, selectedMonth, dispatch]\n );\n\n return (\n <>\n <div>\n <div className=\"border-b border-gray-300 bg-white\">\n <div className=\"container flex flex-col bg-white md-down:items-center\">\n <div className=\"mx-auto flex flex-col items-center gap-2 md:max-w-[635px] lg:max-w-[768px]\">\n <h1>{title}</h1>\n {introduction && introduction.length > 0 && (\n <p className=\"text-xl\">{introduction}</p>\n )}\n </div>\n\n <div className=\"mb-4 flex flex-col justify-between gap-2 lg:mt-4 lg:flex-row\">\n {newsTypes && (\n <div className=\"mt-2 flex flex-row justify-center gap-2 lg:mt-0 lg:gap-4\">\n {Object.entries(newsTypes).map((item, idx) => (\n <button\n className={clsx(\n 'btn btn--medium-long flex flex-grow justify-center rounded-sm',\n Number(item[0]) == 0 &&\n (!selectedType || selectedType == 0)\n ? 'btn--black cursor-default'\n : Number(item[0]) === selectedType\n ? 'btn--black cursor-default'\n : 'btn--outline'\n )}\n key={idx}\n onClick={() =>\n dispatch(\n getNews(item[0], selectedYear, selectedMonth, 1)\n )\n }\n >\n {item[0] == '0'\n ? translate('navigation.show.all')\n : item[1]}\n </button>\n ))}\n </div>\n )}\n\n <div className=\"flex flex-col gap-2 lg:flex-row lg:gap-4 [&_.dropdown-selecter]:py-2\">\n <Dropdown\n className={clsx('w-[328px]', 'lg:w-[224px]')}\n size=\"small\"\n placeholder={translate('blog.show.from.year')}\n selectedValue={selectedYear}\n options={years.map((year) => ({\n value: year,\n label: year,\n }))}\n onChange={({ value }) => {\n dispatch(\n getNews(selectedType, value, selectedMonth, 1)\n );\n }}\n />\n\n <Dropdown\n className={clsx('w-[328px]', 'lg:w-[224px]')}\n size=\"small\"\n placeholder={translate('blog.show.from.month')}\n selectedValue={selectedMonth}\n options={months.map((month) => ({\n value: month,\n label: month.charAt(0).toUpperCase() + month.slice(1),\n }))}\n onChange={({ value }) => {\n dispatch(\n getNews(selectedType, selectedYear, value, 1)\n );\n }}\n disabled={!selectedYear || selectedYear == ''}\n />\n </div>\n </div>\n </div>\n </div>\n\n {news && news.length > 0 ? (\n <div className=\"container grid grid-cols-1 gap-x-6 gap-y-8 bg-gray-100 pt-6 sm:grid-cols-2 md:gap-6 lg:grid-cols-3 lg:gap-y-8 lg:pt-10 xl:grid-cols-4 xl:gap-y-12 2xl:gap-y-8\">\n {news.map((newsPage, idx) => (\n <a className=\"flex flex-col\" key={idx} href={newsPage.url}>\n {newsPage.image && (\n <div className=\"mb-4 aspect-auto max-h-[248px] w-full min-w-[128px] object-cover\">\n <ResponsiveImage {...newsPage.image} lazyLoad={true} />\n </div>\n )}\n <p className=\"text-sm text-gray-600\">\n {newsPage.newsDate}\n <AdminEditButton\n url={`/Litium/UI/websites/page/${newsPage.systemId}`}\n />\n </p>\n <h5 className=\"my-2\">{newsPage.title}</h5>\n <p className=\"text-md\">{newsPage.introduction}</p>\n <p className=\"mt-4 text-md underline\">\n {translate('productlist.showmore')}\n </p>\n </a>\n ))}\n </div>\n ) : (\n <div className=\"container py-4\">\n <h4>{translate('blog.no.articles.found')}</h4>\n </div>\n )}\n <div\n className={clsx(\n 'container',\n 'bg-gray-100',\n pager?.pageCount && pager.pageCount == 1 && 'pt-6'\n )}\n ></div>\n </div>\n </>\n );\n};\n\nexport default NewsList;\n","import Icon from '../Icon';\nimport React from 'react';\nimport { useDispatch } from 'react-redux';\nimport { setMobileMenuOpen } from '../../Actions/Navigation.action';\n\nconst NavigationMobileTrigger = () => {\n const dispatch = useDispatch();\n\n return (\n <button className=\"flex items-center p-2\">\n <Icon\n className=\"h-6 w-6 text-white\"\n name=\"menu\"\n onClick={() => dispatch(setMobileMenuOpen(true))}\n />\n </button>\n );\n};\n\nexport default NavigationMobileTrigger;\n","import Icon from '../Icon';\nimport React from 'react';\n\nconst QuickSearchMobileTrigger = () => {\n const mobileSearch =\n typeof document !== 'undefined'\n ? document.getElementById('quicksearch-mobile')\n : null;\n const quicksearchMobileTrigger =\n typeof document !== 'undefined'\n ? document.getElementById('quick-search-mobile-trigger-wrapper')\n : null;\n\n const toggleSearch = () => {\n mobileSearch?.classList.remove('quicksearch--hidden');\n quicksearchMobileTrigger?.classList.add('hidden');\n };\n\n return (\n <button className=\"flex items-center p-2\">\n <Icon\n className=\"h-6 w-6 text-white\"\n name=\"magnifier\"\n onClick={() => toggleSearch()}\n />\n </button>\n );\n};\n\nexport default QuickSearchMobileTrigger;\n","import Icon from '../Icon';\nimport React from 'react';\n\nconst QuickSearchNoHit = (props) => {\n const { title, description } = props;\n\n return (\n <div className=\"mb-40 flex items-center justify-center lg:my-8\">\n <div className=\"flex flex-col items-center text-center\">\n {title && <h4 className=\"mt-3\">{title}</h4>}\n {description && (\n <div\n className=\"mt-2\"\n dangerouslySetInnerHTML={{\n __html: description.value,\n }}\n />\n )}\n </div>\n </div>\n );\n};\n\nexport default QuickSearchNoHit;\n","import React from 'react';\nimport { SearchItem } from '../../Types/SearchItem';\nimport clsx from 'clsx';\nimport ProductPrice from '../ProductPrice/ProductPrice';\nimport StockStatus from '../StockStatus/StockStatus';\nimport ProductTag from '../ProductTags/ProductTag';\n\nconst ProductCardQuickSearch = ({ product }: { product: SearchItem }) => {\n return (\n <a\n href={product.url}\n className={clsx(\n 'flex',\n 'col-span-1',\n 'p-2',\n 'md:col-span-2',\n 'gap-2',\n 'shadow-[0px_1px_4px_rgba(0,0,0,0.16)]',\n 'mb-[2px]'\n )}\n >\n {product.hasImage && (\n <div className={clsx('flex', 'justify-center')}>\n <img\n className={clsx(\n 'aspect-square',\n 'object-contain',\n 'w-14',\n 'h-14'\n )}\n src={product.imageSource}\n alt={product.name}\n />\n </div>\n )}\n <div\n className={clsx('flex', 'flex-col', 'flex-1', 'justify-center')}\n >\n <div className={clsx('flex', 'flex-row', 'justify-between')}>\n <div className={clsx('flex', 'flex-col')}>\n <span className={clsx('text-sm', 'text-gray-600', 'mb-[2px]')}>\n {product.brand}\n </span>\n <span className={clsx('font-bold', 'text-sm', 'mb-2')}>\n <b>{product.name}</b>\n </span>\n </div>\n {product.tags?.length ? (\n <div className={clsx('flex', 'flex-col', 'mb-1', 'items-end')}>\n {product.tags.map((tag) => (\n <ProductTag\n tagSize=\"s\"\n id={tag.id}\n key={tag.id}\n isCampaign={tag.isCampaign}\n >\n {tag.name}\n </ProductTag>\n ))}\n </div>\n ) : null}\n </div>\n <div className=\"flex flex-1 flex-row justify-between\">\n <div className=\"flex items-center\">\n <StockStatus {...product.stockStatus} />\n </div>\n <ProductPrice\n isQuickSearch={true}\n price={product.price}\n discountPercentage={product.discountPercentage}\n notPricedString={product.notPricedString}\n />\n </div>\n </div>\n </a>\n );\n};\n\nexport default ProductCardQuickSearch;\n","import React from 'react';\n\nconst QuickSearchLinkItem = ({ name, url }) => {\n return (\n <a className=\"py-1.5 text-md underline\" href={url}>\n {name}\n </a>\n );\n};\n\nexport default QuickSearchLinkItem;\n","import React from 'react';\nimport ProductCardQuickSearch from '../ProductCards/ProductCardQuickSearch';\nimport QuickSearchLinkItem from './QuickSearch.LinkItem';\nimport { SearchItem } from '../../Types/SearchItem';\n\ninterface QuickSearchResultTabProps {\n modelKey: string;\n results: SearchItem[];\n}\n\nconst QuickSearchResultItem = ({\n modelKey,\n item,\n}: {\n modelKey: string;\n item: SearchItem;\n}) => {\n switch (modelKey) {\n case 'products':\n return <ProductCardQuickSearch product={item} />;\n default:\n return <QuickSearchLinkItem name={item.name} url={item.url} />;\n }\n};\n\nconst QuickSearchResultTab = ({\n modelKey,\n results,\n}: QuickSearchResultTabProps) => {\n return (\n <div\n id={`quick-search__tab-${modelKey}`}\n className=\"mt-5 grid h-[calc(100vh_-_100px)] auto-rows-min grid-cols-1 gap-1 overflow-y-auto pb-40 lg:h-auto lg:max-h-64 lg:pb-4\"\n >\n {results.map((result, index) => (\n <QuickSearchResultItem\n key={index}\n modelKey={modelKey}\n item={result}\n />\n ))}\n </div>\n );\n};\n\nexport default QuickSearchResultTab;\n","import { post } from '../Services/http';\nimport { catchError } from './Error.action';\nimport {\n QUICK_SEARCH_QUERY,\n QUICK_SEARCH_RECEIVE,\n QUICK_SEARCH_ERROR,\n QUICK_SEARCH_SHOW_FULL_FORM,\n QUICK_SEARCH_SELECT_ITEM,\n QUICK_SEARCH_ACTIVE_TAB,\n QUICK_SEARCH_INPUT_ACTIVE,\n} from '../constants';\n\nlet abortController;\n\nexport const query = (q) => (dispatch, getState) => {\n // abort any existing, pending request.\n // It's ok to call .abort() after the fetch has already completed, fetch simply ignores it.\n abortController && abortController.abort();\n abortController = new AbortController();\n\n if (!q || q.trim() == '') {\n dispatch(receive());\n return;\n }\n\n return post('/api/quickSearch', q, abortController)\n .then((response) => response.json())\n .then((result) => dispatch(receive(result)))\n .catch((ex) =>\n dispatch(catchError(ex, (error) => searchError(error)))\n );\n};\n\nexport const setSearchQuery = (query) => ({\n type: QUICK_SEARCH_QUERY,\n payload: {\n query,\n },\n});\n\nexport const searchError = (error) => ({\n type: QUICK_SEARCH_ERROR,\n payload: {\n error,\n },\n});\n\nexport const setActiveTab = (key) => ({\n type: QUICK_SEARCH_ACTIVE_TAB,\n payload: {\n activeTab: key,\n },\n});\n\nexport const toggleInputActive =\n (active, clear = false) =>\n (dispatch, getState) => {\n const { query } = getState().quickSearch;\n return dispatch({\n type: QUICK_SEARCH_INPUT_ACTIVE,\n payload: {\n inputActive: active,\n query: clear && !active ? '' : query,\n },\n });\n };\n\nexport const receive = (result) => (dispatch, getState) => {\n const { query } = getState().quickSearch;\n return dispatch({\n type: QUICK_SEARCH_RECEIVE,\n payload: {\n result,\n showResult:\n result && Object.keys(result).length > 0 && query.length > 0,\n activeTab:\n result && result.results?.length\n ? result.results[0].key\n : undefined,\n },\n });\n};\n\nexport const toggleShowFullForm = () => (dispatch, getState) => {\n dispatch(show(!getState().quickSearch.showFullForm));\n};\n\nconst show = (visible) => ({\n type: QUICK_SEARCH_SHOW_FULL_FORM,\n payload: {\n showFullForm: visible,\n },\n});\n\nexport const handleKeyDown = (event, opt) => (dispatch, getState) => {\n const { result, selectedItem } = getState().quickSearch;\n\n if (!result?.results || !result.results.length) {\n return;\n }\n\n var items = result.results[0]?.items;\n const max = items.length - 1,\n clip = (index) => (index < 0 ? max : index > max ? 0 : index);\n switch (event.keyCode) {\n case 38:\n dispatch(selectItem(clip(selectedItem - 1)));\n break;\n case 40:\n dispatch(selectItem(clip(selectedItem + 1)));\n break;\n case 13:\n const selectedObject = items[selectedItem];\n if (selectedObject && selectedObject.url) {\n location.href = selectedObject.url;\n } else {\n location.href = opt.searchUrl;\n }\n break;\n default:\n break;\n }\n};\n\nexport const handleClickSearch = (opt) => (dispatch, getState) => {\n const { result } = getState().quickSearch;\n\n if (!result || !result.length) {\n return;\n }\n location.href = opt.searchUrl;\n};\n\nconst selectItem = (selectedItem) => ({\n type: QUICK_SEARCH_SELECT_ITEM,\n payload: {\n selectedItem,\n },\n});\n","import React from 'react';\nimport { translate } from '../../../Services/translation';\nimport { setActiveTab } from '../../../Actions/QuickSearch.action';\nimport { useDispatch } from 'react-redux';\nimport clsx from 'clsx';\n\nexport interface QuickSearchResultTabItemModel {\n resultKey: string;\n quantity: number;\n active: boolean;\n}\n\nconst QuickSearchResultTabItem = ({\n resultKey,\n quantity,\n active,\n}: QuickSearchResultTabItemModel) => {\n const dispatch = useDispatch();\n var translation = translate(`quicksearchheader.${resultKey}`);\n return (\n <li\n className={clsx(\n 'py-1',\n active ? 'text-gray-900' : 'text-gray-500',\n active && 'border-b-2',\n 'border-solid',\n 'border-gray-900',\n 'cursor-pointer'\n )}\n onClick={() => dispatch(setActiveTab(resultKey))}\n >\n <span className=\"text-md font-medium\">{translation}</span>\n <span className=\"text-sm\"> {'(' + quantity + ')'}</span>\n </li>\n );\n};\n\nexport default QuickSearchResultTabItem;\n","import React, { useMemo } from 'react';\nimport { translate } from '../../Services/translation';\nimport QuickSearchNoHit from './QuickSearch.NoHit';\nimport QuickSearchResultTab from './QuickSearchResultTab';\nimport QuickSearchResultTabItem from './utils/QuickSearchResult.TabItem';\nimport { QuickSearchResultItem } from '../../Types/QuickSearchResultItem';\nimport { EditorStringModel } from '../../Types/EditorString';\nimport clsx from 'clsx';\n\ninterface QuickSearchResultProps {\n result: { results: QuickSearchResultItem[] };\n searchUrl: string;\n activeTab?: string;\n noHitHeader: string;\n noHitDescription: EditorStringModel;\n}\n\nconst QuickSearchResult = ({\n result,\n searchUrl,\n activeTab,\n noHitHeader,\n noHitDescription,\n}: QuickSearchResultProps) => {\n const items = useMemo(() => result?.results, [result]);\n const totalNumResults = useMemo(\n () =>\n items?.reduce((total, curr) => curr.items.length + total, 0) ?? 0,\n [items]\n );\n\n return (\n <div\n className={clsx(\n 'absolute',\n 'top-12',\n 'left-0',\n 'right-0',\n 'px-4',\n 'bg-white',\n 'border',\n 'border-solid',\n 'border-gray-300',\n 'h-screen',\n 'z-[55]',\n 'lg:top-11',\n totalNumResults > 0 && 'lg:h-96',\n totalNumResults <= 0 && 'flex justify-center lg:h-auto',\n 'lg:rounded'\n )}\n >\n <div>\n <ul className=\"-mr-4 flex list-none gap-4 overflow-y-auto whitespace-nowrap pr-4 pt-4 scrollbar-none\">\n {items?.map(\n (item, idx) =>\n item.items.length > 0 && (\n <QuickSearchResultTabItem\n resultKey={item.key}\n active={item.key == activeTab}\n quantity={item.total}\n key={idx}\n />\n )\n )}\n </ul>\n {totalNumResults > 0 &&\n items?.map(\n (item, idx) =>\n item.items.length > 0 &&\n item.key == activeTab && (\n <QuickSearchResultTab\n modelKey={item.key}\n results={item.items}\n key={idx}\n />\n )\n )}\n </div>\n {totalNumResults == 0 && (\n <QuickSearchNoHit\n title={noHitHeader}\n description={noHitDescription}\n />\n )}\n {totalNumResults > 0 && (\n <div className=\"fixed -left-4 bottom-0 ml-4 flex h-16 w-full items-center justify-center border-t border-solid border-gray-300 bg-white px-4 py-2 lg:absolute lg:bottom-0 lg:left-0 lg:ml-0\">\n <a\n href={searchUrl}\n className=\"btn btn--outline btn--large w-full \"\n >\n {translate('quicksearch.showmore')}\n </a>\n </div>\n )}\n </div>\n );\n};\n\nexport default QuickSearchResult;\n","import React from 'react';\nimport { QuickSearchModel } from '../../Types/QuickSearchModel';\nimport EditorString from '../EditorString/EditorString';\n\nconst QuickSearchInitialTab = ({ sectionList }: QuickSearchModel) => {\n return (\n <div className=\"absolute left-0 top-12 z-[55] h-screen w-screen border border-solid border-gray-500 bg-white p-4 lg:top-11 lg:h-auto lg:w-full lg:rounded\">\n <div className=\"flex flex-col\">\n {sectionList.map((listItem, index) => (\n <div\n key={listItem.sectionTitle + index}\n className=\"mt-6 flex flex-col first:mt-0\"\n >\n <h6 className=\"mb-2\">{listItem.sectionTitle}</h6>\n {listItem.sectionLinkList.length > 0 && (\n <div className=\"flex flex-col\">\n {listItem.sectionLinkList.map((subListItem, index) => (\n <a\n key={'quick-search-initial' + subListItem.href + index}\n className=\"mt-0 pb-1.5 pt-1.5 text-md underline\"\n href={subListItem.href}\n >\n {subListItem.text}\n </a>\n ))}\n </div>\n )}\n {listItem.sectionSearchText?.value && (\n <EditorString\n className=\"text-md [&>p+p]:mt-0 [&>p]:pb-1.5 [&>p]:pt-1.5 [&_a]:underline\"\n value={listItem.sectionSearchText.value}\n />\n )}\n </div>\n ))}\n </div>\n </div>\n );\n};\n\nexport default QuickSearchInitialTab;\n","import React, { useRef, useEffect, useState } from 'react';\nimport { useDispatch } from 'react-redux';\nimport * as debounce from 'lodash.debounce';\nimport QuickSearchResult from './QuickSearchResult';\nimport { uniqueId } from 'lodash';\nimport { translate } from '../../Services/translation';\nimport { addOverlay, removeOverlay } from '../../Actions/Overlay.action';\nimport {\n query,\n setSearchQuery,\n handleKeyDown,\n toggleInputActive,\n} from '../../Actions/QuickSearch.action';\nimport QuickSearchInitialTab from './QuickSearch.InitialTab';\nimport { useTypedSelector } from '../../Hooks/useTypedSelector';\nimport { QuickSearchModel } from '../../Types/QuickSearchModel';\nimport Icon from '../Icon';\nimport clsx from 'clsx';\n\nconst debouncedQuery = debounce(\n (dispatch, text) => dispatch(query(text)),\n 200\n);\n\ninterface QuickSearchModelProps {\n props: QuickSearchModel;\n isMobile: boolean;\n}\n\nconst QuickSearch = (quickSearchModel: QuickSearchModelProps) => {\n const quickSearch = useTypedSelector((state) => state.quickSearch);\n const { query, result, showResult, activeTab, inputActive } =\n quickSearch;\n\n const [id] = useState(uniqueId());\n const searchContainer = useRef(null);\n const searchInput = useRef(null);\n const dispatch = useDispatch();\n const searchUrl =\n global['LitiumQuickSearchUrl'] +\n (query.length > 0 ? `?q=${query}` : '');\n\n useEffect(() => {\n if (inputActive) {\n dispatch(\n addOverlay('quick-search__' + id, () =>\n dispatch(toggleInputActive(false))\n )\n );\n } else {\n dispatch(removeOverlay('quick-search__' + id));\n }\n }, [dispatch, inputActive, id]);\n\n return (\n <div\n id={clsx(\n quickSearchModel.isMobile\n ? 'quicksearch-mobile'\n : 'quicksearch-desktop'\n )}\n className={clsx(\n quickSearchModel.isMobile\n ? 'quick-search'\n : 'quicksearch hidden lg:flex lg:flex-1'\n )}\n >\n <div className=\"grow\" role=\"search\" ref={searchContainer}>\n <div\n className=\"md-down:container relative flex w-full items-center\"\n role=\"search\"\n >\n <div className=\"w-full\">\n <form\n className=\"relative flex w-full\"\n action=\"#\"\n onSubmit={(e) => e.preventDefault()}\n >\n <Icon\n name={inputActive ? 'close' : 'magnifier'}\n className={clsx(\n 'absolute',\n 'top-1/2',\n 'translate-y-[-50%]',\n 'right-3',\n 'm-0',\n 'text-xl',\n inputActive && 'text-gray-500',\n 'w-5',\n 'h-5'\n )}\n onClick={() =>\n dispatch(toggleInputActive(!inputActive, inputActive))\n }\n />\n <input\n style={{ WebkitBorderRadius: '2px' }}\n className={clsx(\n 'flex',\n 'w-full',\n 'grow',\n 'px-3',\n 'py-2',\n 'h-10',\n 'font-normal',\n 'leading-[150%]',\n 'text-gray-500',\n 'border',\n 'border-solid',\n 'rounded-sm',\n 'text-lg',\n 'search-decoration:hidden',\n inputActive ? 'border-gray-600' : 'border-gray-400',\n '[&:focus]:outline-none'\n )}\n type=\"search\"\n placeholder={translate('general.search')}\n autoComplete=\"off\"\n onClick={() => {\n dispatch(toggleInputActive(true));\n }}\n {...(quickSearchModel.props.klevuEnabled\n ? {\n id: 'klevu-search',\n name: 'q',\n onChange: (event) => {\n const text = encodeURIComponent(\n event.target.value\n );\n dispatch(setSearchQuery(text));\n },\n onKeyDown: (event) => {\n switch (event.key) {\n case 'NumpadEnter':\n case 'Enter':\n if (query.length > 0) {\n location.href = searchUrl;\n event.preventDefault();\n }\n default:\n break;\n }\n },\n }\n : {\n value: decodeURIComponent(query),\n onChange: (event) => {\n const text = encodeURIComponent(\n event.target.value\n );\n dispatch(setSearchQuery(text));\n debouncedQuery(dispatch, text);\n },\n onKeyDown: (event) =>\n dispatch(handleKeyDown(event, { searchUrl })),\n ref: searchInput,\n })}\n />\n </form>\n </div>\n {!quickSearchModel.props.klevuEnabled && (\n <>\n {showResult && inputActive && result && (\n <QuickSearchResult\n result={result}\n searchUrl={searchUrl}\n noHitDescription={\n quickSearchModel.props.noHitDescription\n }\n noHitHeader={quickSearchModel.props.noHitHeader}\n activeTab={activeTab}\n />\n )}\n {!showResult && inputActive && (\n <QuickSearchInitialTab {...quickSearchModel.props} />\n )}\n </>\n )}\n </div>\n </div>\n </div>\n );\n};\n\nexport default QuickSearch;\n","import React, { useState, useRef } from 'react';\nimport Icon, { IconAttributes } from './Icon';\nimport clsx from 'clsx';\n\nexport interface DropdownMenuItem {\n label?: string;\n onClick?: (\n event?: React.MouseEvent<HTMLAnchorElement, MouseEvent>\n ) => void;\n href: string;\n icon?: IconAttributes;\n disabled?: boolean;\n}\n\ninterface DropdownMenuProps {\n menuItems: DropdownMenuItem[];\n children?: React.ReactNode;\n}\n\nconst DropdownMenu = ({ menuItems, children }: DropdownMenuProps) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const [dropdownOpen, setDropdownOpen] = useState<boolean>(false);\n\n const OnBlur = (event: React.FocusEvent<HTMLDivElement>) => {\n if (!containerRef.current?.contains(event.relatedTarget)) {\n setDropdownOpen(false);\n }\n };\n\n return (\n <div ref={containerRef} onBlur={OnBlur}>\n <button onClick={() => setDropdownOpen(!dropdownOpen)}>\n {children}\n </button>\n\n <div className=\"relative rounded-sm text-gray-900\">\n {dropdownOpen && (\n <ul\n className=\"absolute right-0 top-full z-40 mt-1 w-full min-w-[240px] rounded-sm border border-solid border-gray-300 bg-white\"\n aria-expanded={dropdownOpen}\n >\n {menuItems.map((menuItem, i) => (\n <li\n className=\"border-b border-solid border-gray-300 [&:last-child]:border-b-0\"\n key={i}\n >\n <a\n href={menuItem.href}\n onClick={menuItem.onClick}\n className={clsx(\n 'flex w-full cursor-pointer items-center gap-1.5 px-3 py-2.5 text-left text-md transition-colors focus:bg-gray-100 hover:bg-gray-100',\n menuItem.disabled && 'pointer-events-none'\n )}\n >\n {menuItem.icon && <Icon {...menuItem.icon} />}\n {menuItem.label}\n </a>\n </li>\n ))}\n </ul>\n )}\n </div>\n </div>\n );\n};\n\nexport default DropdownMenu;\n","import Icon from '../Icon';\nimport React, { useMemo } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { setLoginModalOpen } from '../../Actions/Login.action';\nimport clsx from 'clsx';\nimport { translate } from '../../Services/translation';\nimport { LinkModel } from '../../Types/LinkModel';\nimport DropdownMenu, { DropdownMenuItem } from '../DropdownMenu';\nimport { navigation } from '../MyPages/MyPagesContainer';\nimport { useTypedSelector } from '../../Hooks/useTypedSelector';\nimport { concat } from 'lodash-es';\nimport { signOut } from '../../Actions/Login.action';\nimport useBreakpoint from '../../Hooks/useBreakpoint';\n\ninterface LoggedInLinkProps {\n myPagesLink: LinkModel;\n}\n\nconst LoggedInLink = ({ myPagesLink }: LoggedInLinkProps) => {\n const { current: userInfo } = useTypedSelector(\n (state) => state.userInfo\n );\n const breakpoint = useBreakpoint();\n const isMobile = useMemo(\n () => breakpoint && ['sm', 'md'].includes(breakpoint),\n [breakpoint]\n );\n\n const navigationItems: DropdownMenuItem[] = useMemo(\n () =>\n navigation\n .filter((option) =>\n !userInfo?.isBusinessCustomer ? !option.isB2bOnly : true\n )\n .map((option) => {\n return {\n label: option.name,\n href: `${myPagesLink.href}#${option.url}`,\n };\n }),\n [myPagesLink.href, userInfo?.isBusinessCustomer]\n );\n const logOutMenuItems: DropdownMenuItem[] = [\n {\n label: translate('general.sign-out'),\n icon: {\n name: 'logout',\n color: '#C0191E', // Error/500\n size: 'large',\n className: 'flex-shrink-0',\n },\n href: '',\n onClick: (e) => {\n signOut();\n e?.preventDefault();\n },\n },\n ];\n const loggedInMenuItems: DropdownMenuItem[] = concat(\n navigationItems,\n logOutMenuItems\n );\n\n return (\n <>\n {isMobile ? (\n <a\n href={myPagesLink.href}\n className=\"flex cursor-pointer items-center p-2 text-sm text-white transition-opacity hover:opacity-80\"\n >\n <Icon className=\"h-6 w-6 text-xl text-white\" name=\"user\" />\n <span className=\"hidden lg:inline\">\n {' '}\n {translate('header.my.pages')}\n </span>\n </a>\n ) : (\n <DropdownMenu menuItems={loggedInMenuItems}>\n <span className=\"flex cursor-pointer items-center p-2 text-sm text-white transition-opacity hover:opacity-80\">\n <Icon className=\"h-6 w-6 text-xl text-white\" name=\"user\" />\n <span className=\"hidden lg:inline\">\n {' '}\n {translate('header.my.pages')}\n </span>\n </span>\n </DropdownMenu>\n )}\n </>\n );\n};\n\ninterface LoginModalTriggerProps {\n isLoggedIn: boolean;\n myPagesLink: LinkModel;\n}\n\nconst LoginModalTrigger = ({\n isLoggedIn,\n myPagesLink,\n}: LoginModalTriggerProps) => {\n const dispatch = useDispatch();\n\n return isLoggedIn ? (\n <LoggedInLink myPagesLink={myPagesLink} />\n ) : (\n <button\n className=\"flex cursor-pointer items-center p-2 transition-opacity hover:opacity-80\"\n onClick={() => dispatch(setLoginModalOpen(true))}\n >\n <Icon className={clsx('h-6 w-6 text-xl text-white')} name=\"user\" />\n <span className=\"hidden text-sm text-white lg:ml-1 lg:inline-block\">\n {translate('header.log-in')}\n </span>\n </button>\n );\n};\nexport default LoginModalTrigger;\n","import React from 'react';\nimport { useMemo } from 'react';\nimport Icon from '../Icon';\nimport { useTypedSelector } from '../../Hooks/useTypedSelector';\nimport clsx from 'clsx';\nimport { translate } from '../../Services/translation';\n\nconst MiniCartIcon = () => {\n const {\n orderRows,\n addToCartAnimating = false,\n orderTotal,\n } = useTypedSelector((state) => state.cart);\n\n const quantity = useMemo(\n () =>\n Math.min(\n orderRows.reduce((prev, current) => prev + current.quantity, 0),\n 99\n ),\n [orderRows]\n );\n\n return (\n <div\n className={clsx(\n 'color-gray-900 flex items-center p-2 transition-opacity hover:opacity-80',\n quantity > 0 && 'lg:rounded-sm lg:bg-accent-500'\n )}\n >\n <div className=\"relative\">\n <Icon\n className=\"h-6 w-6 text-white\"\n name={translate('shopping-cart')}\n />\n {quantity > 0 ? (\n <div\n className={clsx(\n 'absolute -right-[3px] -top-[1px] flex h-4 w-4 items-center justify-center rounded-[100%] text-center text-xs leading-tight text-white transition duration-[125ms] ease-in-out lg:border lg:border-accent-500 lg:text-gray-900',\n addToCartAnimating && 'scale-150',\n addToCartAnimating\n ? 'bg-accent-300 lg:bg-gray-200'\n : 'bg-accent-500 lg:bg-white'\n )}\n >\n {quantity}\n </div>\n ) : null}\n </div>\n <span className=\"hidden flex-col text-sm leading-tight text-white lg:ml-1 lg:inline-block\">\n {translate('header.shopping-cart')}\n {quantity > 0 && (\n <span className=\"hidden text-xs lg:flex\">{orderTotal}</span>\n )}\n </span>\n </div>\n );\n};\n\nexport default MiniCartIcon;\n","import React from 'react';\nimport { useDispatch } from 'react-redux';\nimport { setShowMiniCart } from '../../Actions/Cart.action';\nimport MiniCartIcon from './MiniCartIcon';\n\nconst MiniCartButton = () => {\n const dispatch = useDispatch();\n\n return (\n <button onClick={() => dispatch(setShowMiniCart(true))}>\n <MiniCartIcon />\n </button>\n );\n};\n\nexport default MiniCartButton;\n","import { uniqueId } from 'lodash';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { addOverlay, removeOverlay } from '../../Actions/Overlay.action';\nimport clsx from 'clsx';\nimport Icon from '../Icon';\nimport ResponsiveImage from '../ResponsiveImage/ResponsiveImage';\n\nconst MegaMenu = ({\n open,\n onMegaMenuClose,\n onMouseOverMegaMenu,\n onMouseLeaveMegaMenu,\n link,\n blocks,\n}) => {\n const dispatch = useDispatch();\n const blockContainerRef = useRef<HTMLDivElement>(null);\n const [id] = useState(uniqueId());\n const [activeSubMegaMenuLink, setActiveSubMegaMenuLink] =\n useState<any>();\n const [activeHooverLink, setActiveHooverLink] = useState<any>();\n const [subMegaMenuTimer, setSubMegaMenuTimer] = useState<any>();\n\n const handleSetActiveHooverLink = (hooverLink) => {\n if (hooverLink?.megaMenuImage) {\n setActiveHooverLink(hooverLink);\n } else {\n setActiveHooverLink(link);\n }\n };\n\n const onSubLinkHover = (link) => {\n clearTimeout(subMegaMenuTimer);\n setSubMegaMenuTimer(\n setTimeout(() => {\n setActiveSubMegaMenuLink(link);\n setSubMegaMenuTimer(null);\n }, 50)\n );\n };\n\n const onClick = (e, subLink) => {\n if (activeSubMegaMenuLink != subLink && subLink?.links?.length > 0) {\n e.preventDefault();\n }\n };\n\n useEffect(() => {\n if (!blockContainerRef?.current) return;\n blockContainerRef.current.innerHTML = '';\n for (let block of blocks) {\n blockContainerRef.current.appendChild(block);\n }\n }, [blockContainerRef, blocks]);\n\n useEffect(() => {\n if (open) {\n dispatch(addOverlay('MegaMenu-' + id, onMegaMenuClose));\n } else {\n dispatch(removeOverlay('MegaMenu-' + id));\n }\n\n if (!activeSubMegaMenuLink) {\n setActiveSubMegaMenuLink(link.links[0]);\n setActiveHooverLink(link.links[0]);\n } else if (!activeHooverLink) {\n setActiveHooverLink(link);\n }\n }, [open, link]);\n\n const showLeftContainer = activeSubMegaMenuLink?.links?.length > 0;\n const showRightContainer =\n activeHooverLink?.megaMenuImage || blocks.length > 0;\n\n return (\n <div\n className={clsx(\n 'delay-125 absolute left-0 right-0 top-full bg-white transition-opacity ease-in-out',\n open ? 'opacity-1' : 'opacity-0',\n !open && 'pointer-events-none'\n )}\n onMouseLeave={onMouseLeaveMegaMenu}\n onMouseOver={onMouseOverMegaMenu}\n >\n <span\n className=\"fixed right-0 cursor-pointer p-1\"\n onClick={onMegaMenuClose}\n >\n <Icon\n name=\"cross\"\n className=\"h-5 w-5\"\n color=\"#737373\"\n width={20}\n height={20}\n />\n </span>\n\n <div className=\"container\">\n <div className=\"grid grid-cols-[274px_auto] lg:-mx-3\">\n <div className=\"border-r border-gray-300 py-3\">\n <a\n href={link.url}\n className=\"px-3 py-1.5 text-xl font-bold text-black hover:bg-primary-500 hover:text-white\"\n onMouseOver={() => {\n handleSetActiveHooverLink(\n link.megaMenuImage ? link : activeHooverLink\n );\n }}\n >\n {link.name}\n </a>\n {link.links?.length > 0 &&\n link.links\n .filter((link) => link.extraInfo != 'mobile')\n .map((subLink, idx) => (\n <a\n key={link.url + subLink.url + 'mega-sub-' + idx}\n className={clsx(\n 'flex items-center justify-between px-3 py-1.5 text-md text-black',\n activeSubMegaMenuLink == subLink &&\n 'bg-primary-500 text-white'\n )}\n href={subLink.url}\n tabIndex={-1}\n onClick={(e) => {\n onClick(e, subLink);\n\n if (subLink.links?.length > 0) {\n onSubLinkHover(subLink);\n }\n }}\n onMouseOver={() => {\n onSubLinkHover(subLink);\n handleSetActiveHooverLink(subLink);\n }}\n >\n <p>{subLink.name ?? <> </>}</p>\n {subLink.links?.length > 0 && (\n <Icon\n name=\"chevron-right\"\n color={\n activeSubMegaMenuLink == subLink ||\n subLink.isSelected\n ? 'white'\n : '#171717'\n }\n className={clsx(\n 'w-5',\n 'h-5',\n (activeSubMegaMenuLink == subLink ||\n subLink.isSelected) &&\n 'invert'\n )}\n style={\n (activeSubMegaMenuLink == subLink ||\n subLink.isSelected) && {\n filter: 'invert(1)',\n }\n }\n width={20}\n height={20}\n />\n )}\n </a>\n ))}\n </div>\n <div\n className={clsx(\n 'grid py-3 pl-2 pr-8',\n showRightContainer && showLeftContainer\n ? 'lg:grid-cols-[2fr_1fr] xl:grid-cols-[3fr_1fr]'\n : 'grid-cols-1'\n )}\n >\n {showLeftContainer && (\n <div>\n <a\n href={activeSubMegaMenuLink.url}\n className=\"px-3 py-1.5 text-xl font-bold text-black hover:bg-primary-500 hover:text-white\"\n >\n {activeSubMegaMenuLink.name}\n </a>\n <div\n className={clsx(\n 'grid',\n showRightContainer\n ? 'lg:grid-cols-2 xl:grid-cols-3'\n : 'lg:grid-cols-3 xl:grid-cols-4'\n )}\n >\n {activeSubMegaMenuLink.links.map((subSubLink, idx) => (\n <a\n key={\n activeSubMegaMenuLink.url +\n subSubLink.url +\n activeSubMegaMenuLink.name +\n idx +\n 'mega-sub-2'\n }\n className={clsx(\n 'flex items-center justify-between px-3 py-1.5 text-md text-black hover:bg-primary-500 hover:text-white',\n subSubLink.isSelected &&\n 'bg-primary-500 text-white'\n )}\n href={subSubLink.url}\n onMouseOver={() => {\n handleSetActiveHooverLink(\n subSubLink?.megaMenuImage\n ? subSubLink\n : activeSubMegaMenuLink\n );\n }}\n >\n {subSubLink.name}\n </a>\n ))}\n </div>\n </div>\n )}\n {showRightContainer && (\n <div className={clsx(showLeftContainer && 'pl-3')}>\n {activeHooverLink?.megaMenuImage && (\n <a href={activeHooverLink.megaMenuLink}>\n <ResponsiveImage\n {...activeHooverLink?.megaMenuImage}\n lazyLoad={true}\n />\n </a>\n )}\n {!activeHooverLink?.megaMenuImage && blocks.length > 0 && (\n <div ref={blockContainerRef}></div>\n )}\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport default MegaMenu;\n","import React from 'react';\nimport MegaMenu from '../MegaMenu/MegaMenu';\nimport clsx from 'clsx';\nimport Icon from '../Icon';\n\nconst NavigationLink = ({\n link,\n isActive,\n onLinkHover,\n onMouseLeaveLink,\n onMegaMenuClose,\n onClick,\n blocks,\n right = false,\n}) => (\n <>\n <a\n className={clsx(\n 'flex',\n 'items-center',\n 'h-full',\n 'text-md',\n 'text-white',\n 'no-underline',\n 'py-2',\n 'px-3',\n isActive && 'border-b-4',\n isActive && 'border-white'\n )}\n href={link.url || '#'}\n onMouseOver={onLinkHover}\n onMouseLeave={onMouseLeaveLink}\n onClick={onClick}\n >\n {link.name}\n {link.links?.length > 0 && (\n <Icon\n name=\"caret-down\"\n className=\"ml-1 mt-1 h-4 w-4\"\n color=\"white\"\n width={16}\n height={16}\n />\n )}\n </a>\n {link.links?.length > 0 && (\n <MegaMenu\n onMegaMenuClose={onMegaMenuClose}\n onMouseLeaveMegaMenu={onMouseLeaveLink}\n onMouseOverMegaMenu={() => onLinkHover(link)}\n link={link}\n open={isActive}\n blocks={blocks}\n />\n )}\n </>\n);\n\nexport default NavigationLink;\n","import React, { useEffect, useState } from 'react';\nimport NavigationLink from './NavigationLink';\n\ninterface NavigationProps {\n contentLinks: any;\n rightContentLinks: any;\n}\n\nconst Navigation = ({\n contentLinks,\n rightContentLinks,\n}: NavigationProps) => {\n const [activeMegaMenuLink, setActiveMegaMenuLink] = useState<any>();\n const [megaMenuTimer, setMegaMenuTimer] = useState<any>();\n const [blockElements, setBlockElements] = useState<any[]>([]);\n\n const onLinkHover = (link) => {\n clearTimeout(megaMenuTimer);\n setMegaMenuTimer(\n setTimeout(() => {\n setActiveMegaMenuLink(link);\n setMegaMenuTimer(null);\n }, 100)\n );\n };\n\n const onMouseLeaveLink = () => {\n clearTimeout(megaMenuTimer);\n setMegaMenuTimer(\n setTimeout(() => {\n setActiveMegaMenuLink(null);\n setMegaMenuTimer(null);\n }, 100)\n );\n };\n\n const onClick = (e, link) => {\n if (activeMegaMenuLink != link && link?.links?.length > 0) {\n e.preventDefault();\n }\n };\n\n const onMegaMenuClose = () => setActiveMegaMenuLink(null);\n\n useEffect(() => {\n const blockElementsContainer =\n document.getElementById('mega-menu-blocks');\n const blockElements = blockElementsContainer\n ? Array.from(blockElementsContainer.children)\n : [];\n setBlockElements(blockElements);\n if (blockElementsContainer) blockElementsContainer.remove();\n }, []);\n\n return contentLinks?.length > 0 || rightContentLinks?.length > 0 ? (\n <div id=\"navigation\" className=\"header__navigation relative z-30\">\n <div className=\"container\">\n <div className=\"hidden lg:-mx-3 lg:block\">\n <div className=\"z-30 flex h-full justify-between\">\n <div className=\"flex h-full\">\n {contentLinks.map((link) => (\n <NavigationLink\n key={link.url + link.name + 'NavigationLink'}\n link={link}\n isActive={\n link.links?.length > 0 && activeMegaMenuLink == link\n }\n onLinkHover={() => onLinkHover(link)}\n onClick={(e) => onClick(e, link)}\n onMouseLeaveLink={onMouseLeaveLink}\n onMegaMenuClose={onMegaMenuClose}\n blocks={blockElements?.filter(\n (b) =>\n link.blockSystemIds.indexOf(\n b.dataset['litiumBlockId']\n ) != -1\n )}\n />\n ))}\n </div>\n <div className=\"flex h-full\">\n {rightContentLinks?.map((link) => (\n <NavigationLink\n key={link.url + link.name + 'NavigationLink'}\n link={link}\n isActive={\n link.links?.length > 0 && activeMegaMenuLink == link\n }\n onLinkHover={() => onLinkHover(link)}\n onClick={(e) => onClick(e, link)}\n onMouseLeaveLink={onMouseLeaveLink}\n onMegaMenuClose={onMegaMenuClose}\n blocks={blockElements?.filter(\n (b) =>\n link.blockSystemIds.indexOf(\n b.dataset['litiumBlockId']\n ) != -1\n )}\n right={true}\n />\n ))}\n </div>\n </div>\n </div>\n </div>\n </div>\n ) : null;\n};\n\nexport default Navigation;\n","import React, { useState } from 'react';\nimport { Collapse } from 'react-collapse';\nimport { EditorStringModel } from '../../Types/EditorString';\n\ninterface TopMessageProps {\n topMessage: TopMessageModel;\n}\n\ninterface TopMessageModel {\n systemId: string;\n message: EditorStringModel;\n topMessageTextColor?: string;\n topMessageBackgroundColor?: string;\n}\n\nconst TopMessage = (props: TopMessageProps) => {\n return (\n <div className=\"top-message\">\n {props.topMessage.message && (\n <Collapse isOpened={true}>\n <div\n className=\"relative bg-gray-900 text-center text-white\"\n style={{\n color: props.topMessage.topMessageTextColor,\n backgroundColor: props.topMessage.topMessageBackgroundColor,\n }}\n >\n <div\n className=\"block py-2 pl-4 pr-8 text-md\"\n dangerouslySetInnerHTML={{\n __html: props.topMessage.message.value ?? '',\n }}\n ></div>\n </div>\n </Collapse>\n )}\n </div>\n );\n};\n\nexport default TopMessage;\n","import React from 'react';\nimport { useTypedSelector } from '../../Hooks/useTypedSelector';\nimport { HeaderModel } from '../../Types/HeaderModel ';\nimport Icon from '../Icon';\nimport NavigationMobileTrigger from '../Navigation/NavigationMobileTrigger';\nimport QuickSearchMobileTrigger from '../QuickSearch/QuickSearchMobileTrigger';\nimport QuickSearch from '../QuickSearch/QuickSearch';\nimport ResponsiveImage from '../ResponsiveImage/ResponsiveImage';\nimport LoginModalTrigger from '../Login/LoginModalTrigger';\nimport MiniCartButton from '../MiniCart/MiniCartButton';\nimport Navigation from '../Navigation/Navigation';\nimport TopMessage from '../TopMessage/TopMessage';\nimport TopMenuUsps from '../TopMenuUsps/TopMenuUsps';\n\nconst Header = (props: HeaderModel) => {\n const { current } = useTypedSelector((state) => state.userInfo);\n\n return (\n <>\n <header\n id=\"header\"\n role=\"banner\"\n className=\"header header__menu-visible -top fixed left-0 right-0 top-0 z-50 transition-[top] duration-200 ease-in-out\"\n >\n <div className=\"bg-gray-900\">\n <div className=\"flex h-[22px] items-center justify-center pb-[0.2px] pt-[0.2px]\">\n <div className=\"hidden md:flex\">\n {props.topMenuUspList?.map((usp, idx) =>\n usp.uspLink?.href ? (\n <a\n className=\"leading-large mx-2 my-0 flex items-center text-sm text-white hover:cursor-pointer hover:opacity-80 [&_svg]:mr-[2px] [&_svg]:h-[18px] [&_svg]:w-[18px] [&_svg]:text-success-500\"\n href={usp.uspLink?.href}\n key={idx}\n >\n <Icon name=\"check\" />\n {usp.uspText}\n </a>\n ) : (\n <div\n key={idx}\n className=\"leading-large mx-2 my-0 flex items-center text-sm text-white [&_svg]:mr-[2px] [&_svg]:h-[18px] [&_svg]:w-[18px] [&_svg]:text-success-500\"\n >\n <Icon name=\"check\" />\n {usp.uspText}\n </div>\n )\n )}\n </div>\n <div className=\"block md:hidden\">\n <TopMenuUsps uspList={props.topMenuUspList} />\n </div>\n </div>\n </div>\n\n <div className=\"bg-primary-gradient\">\n <div className=\"lg:container px-[5px]\">\n <div className=\"header__main-content flex h-auto items-center justify-between gap-0 transition-all duration-200 ease-in-out lg:gap-6\">\n <div className=\"flex flex-1 justify-start lg:hidden\">\n <NavigationMobileTrigger />\n <div\n id=\"quick-search-mobile-trigger-wrapper\"\n className=\"initially-hidden\"\n >\n <QuickSearchMobileTrigger />\n </div>\n </div>\n <div className=\"header__logo-wrapper flex flex-1 items-center justify-center p-0 lg:justify-start\">\n <a\n href={props.startPageUrl}\n className=\"header__logo [&_img]:h-[18px] [&_img]:w-auto [&_img]:max-w-[unset] [&_img]:lg:h-8\"\n >\n <ResponsiveImage {...props.logo} />\n </a>\n </div>\n <QuickSearch props={props.quickSearch} isMobile={false} />\n <div className=\"header__components box-border flex flex-1 items-center justify-end pl-1 no-underline \">\n {props.certificateList?.length > 0 && (\n <div className=\"mr-5 hidden lg:flex \">\n {props.certificateList?.map(\n (certificate, idx) =>\n certificate.certificateImageUrl && (\n <div\n key={idx}\n className=\"relative h-10 [&:hover_img]:opacity-80 [&:hover_span]:inline-block [&:hover_span]:opacity-100 [&:not(:last-child)]:mr-2\"\n >\n {certificate.certificateLink?.href ? (\n <a href={certificate.certificateLink.href}>\n <img\n className=\"h-10 w-auto max-w-[unset]\"\n src={certificate.certificateImageUrl}\n loading=\"lazy\"\n />\n </a>\n ) : (\n <img\n className=\"h-10 w-auto max-w-[unset]\"\n src={certificate.certificateImageUrl}\n loading=\"lazy\"\n />\n )}\n {certificate.certificateHoverText && (\n <>\n <span className=\"arrow left-[calc(50% - 5px)] top-10 z-[1] h-[10px] w-[10px] rotate-45 opacity-0 transition-opacity transition-transform duration-100 ease-in-out content-['']\"></span>\n <span className=\"left-[calc(50% - 80px)] pointer-events-none absolute top-11 z-[2] w-40 bg-white p-1 text-center text-sm opacity-0 transition-opacity duration-200 ease-in-out\">\n {certificate.certificateHoverText}\n </span>\n </>\n )}\n </div>\n )\n )}\n </div>\n )}\n <div className=\"profile\">\n <LoginModalTrigger\n isLoggedIn={current != null}\n myPagesLink={props.myPage}\n />\n </div>\n <MiniCartButton />\n </div>\n </div>\n </div>\n {props.quickSearch && (\n <QuickSearch props={props.quickSearch} isMobile={true} />\n )}\n\n <Navigation\n contentLinks={props.contentLinks}\n rightContentLinks={props.rightContentLinks}\n />\n </div>\n </header>\n\n {props.message?.message?.value &&\n props.message.message.value != '' && (\n <TopMessage topMessage={props.message} />\n )}\n </>\n );\n};\n\nexport default Header;\n","import React, { useMemo } from 'react';\nimport Icon from '../Icon';\nimport { ToastModel } from '../../Types/Toast';\nimport clsx from 'clsx';\n\nconst Toast = ({ title, text, type = 'default' }: ToastModel) => {\n const iconName = useMemo(() => {\n switch (type) {\n case 'default':\n case 'info':\n default:\n return 'info';\n case 'success':\n return 'check-circle';\n case 'error':\n case 'warning':\n return 'warning';\n }\n }, [type]);\n\n const backgroundColor = useMemo(() => {\n switch (type) {\n case 'default':\n default:\n return 'bg-white';\n case 'info':\n return 'bg-primary-50';\n case 'success':\n return 'bg-success-50';\n case 'error':\n return 'bg-error-50';\n case 'warning':\n return 'bg-warning-50';\n }\n }, [type]);\n\n const iconColor = useMemo(() => {\n switch (type) {\n case 'default':\n default:\n return 'text-gray-900';\n case 'info':\n return 'text-primary-500';\n case 'success':\n return 'text-success-500';\n case 'error':\n return 'text-error-500';\n case 'warning':\n return 'text-warning-500';\n }\n }, [type]);\n\n return (\n <div className={clsx('grid grid-cols-8 gap-2 p-3', backgroundColor)}>\n <div className=\"col-span-1 flex items-start justify-center\">\n <Icon name={iconName} className={clsx(iconColor, 'h-5 w-5')} />\n </div>\n <div className=\"col-span-7\">\n {title && (\n <div className=\"mb-2 text-md font-bold text-gray-900\">\n {title}\n </div>\n )}\n {text && (\n <div className=\"text-md font-light text-gray-600\">{text}</div>\n )}\n </div>\n </div>\n );\n};\n\nexport default Toast;\n","import React, { useEffect, useState } from 'react';\nimport Input from '../Components/Inputs/Input';\nimport { useForm } from 'react-hook-form';\nimport TextArea from '../Components/Inputs/TextArea';\nimport { translate } from '../Services/translation';\nimport { post } from '../Services/http';\nimport Icon from '../Components/Icon';\nimport { triggerToast } from '../Services/Toast.service';\n\ntype FormData = {\n name: string;\n subject: string;\n email: string;\n orderno: string;\n message: string;\n toEmail: string;\n};\n\ninterface ContactFormProps {\n receiverEmail?: string;\n}\n\nconst ContactForm = ({ receiverEmail }: ContactFormProps) => {\n const {\n register,\n handleSubmit,\n formState: { errors },\n reset,\n setValue,\n } = useForm<FormData>();\n\n useEffect(() => {\n if (receiverEmail) {\n setValue('toEmail', receiverEmail);\n }\n }, [receiverEmail, setValue]);\n\n const onSubmit = (data) => {\n post('/api/contact', data)\n .catch((err) => {\n err.response\n .json()\n .then((data) =>\n triggerToast({ type: 'error', text: data?.error ?? data })\n );\n })\n .finally(() => {\n reset();\n setEmailHasBeenSent(true);\n });\n };\n const [emailHasBeenSent, setEmailHasBeenSent] = useState(false);\n return (\n <form onSubmit={handleSubmit(onSubmit)}>\n <h4 className=\"mb-4\">{translate('contact-form.title')}</h4>\n <Input\n wrapperClassName=\"mb-4\"\n inputSize=\"xlarge\"\n showAnimatedLabel={true}\n inputState={errors.name ? 'error' : 'default'}\n label={translate('contact-form.name')}\n type=\"text\"\n helperText={\n errors.name && translate('contact-form.required-message')\n }\n {...register('name', { required: true })}\n />\n <Input\n wrapperClassName=\"mb-4\"\n inputSize=\"xlarge\"\n showAnimatedLabel={true}\n inputState={errors.subject ? 'error' : 'default'}\n label={translate('contact-form.subject')}\n type=\"text\"\n helperText={\n errors.subject && translate('contact-form.required-message')\n }\n {...register('subject', { required: true })}\n />\n <Input\n wrapperClassName=\"mb-6\"\n inputSize=\"xlarge\"\n inputState={errors.email ? 'error' : 'default'}\n showAnimatedLabel={true}\n label={translate('contact-form.email')}\n type=\"email\"\n helperText={\n errors.email && translate('contact-form.required-message')\n }\n {...register('email', { required: true })}\n />\n <Input\n wrapperClassName=\"mb-6\"\n inputSize=\"xlarge\"\n inputState=\"default\"\n showAnimatedLabel={true}\n label={translate('contact-form.orderno')}\n type=\"text\"\n helperText={\n errors.email && translate('contact-form.required-message')\n }\n {...register('orderno', { required: false })}\n />\n <TextArea\n inputSize=\"xlarge\"\n inputState={errors.message ? 'error' : 'default'}\n wrapperClassName=\"mb-6\"\n showAnimatedLabel={true}\n label={translate('contact-form.message')}\n type=\"text\"\n helperText={\n errors.message && translate('contact-form.required-message')\n }\n {...register('message', { required: true })}\n />\n <button\n className=\"btn btn--black btn--xlarge w-full\"\n disabled={emailHasBeenSent}\n type=\"submit\"\n >\n {emailHasBeenSent ? (\n <>\n {translate('contact-form.message-sent')}{' '}\n <Icon name=\"check\" className=\"h-4 w-4\" />\n </>\n ) : (\n translate('contact-form.submit')\n )}\n </button>\n </form>\n );\n};\n\nexport default ContactForm;\n","import React from 'react';\nimport { ToastModel } from '../Types/Toast';\nimport { toast } from 'react-toastify';\nimport Toast from '../Components/Toast/Toast';\n\nexport const triggerToast = ({ title, text, type }: ToastModel) => {\n toast(<Toast title={title} text={text} type={type} />, {\n position: 'bottom-right',\n autoClose: 5000,\n });\n};\n","import React, { useEffect } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { add as addToCart } from '../../Services/Cart.service';\nimport {\n receive as receiveCart,\n triggerAddToCartAnimation,\n} from '../../Actions/Cart.action';\n\nconst KlevuMain = () => {\n const dispatch = useDispatch();\n\n useEffect(() => {\n window.addEventListener('klevuAddToCart', klevuAddToCart);\n\n return () => {\n window.removeEventListener('klevuAddToCart', klevuAddToCart);\n };\n }, []);\n\n const klevuAddToCart = async ({ detail }) => {\n const { id, qty, url } = detail;\n try {\n const cart = await addToCart({\n articleNumber: id,\n quantity: qty,\n purchaseComment: '',\n upSellIds: null,\n });\n dispatch(receiveCart(cart));\n dispatch(triggerAddToCartAnimation());\n } catch (err) {\n alert('Kunde inte lägga i varukorgen');\n }\n };\n\n return <div className=\"klevu_action_listener\"></div>;\n};\n\nexport default KlevuMain;\n","import React, { useCallback, useEffect } from 'react';\nimport Modal from 'react-modal';\nimport { useTypedSelector } from '../../Hooks/useTypedSelector';\nimport { useDispatch } from 'react-redux';\nimport { setNotPricedModalOpen } from '../../Actions/NotPriced.actions';\nimport { translate } from '../../Services/translation';\nimport Icon from '../Icon';\n\nconst customModalStyles = {\n content: {\n background: 'none',\n padding: 0,\n border: 'none',\n },\n overlay: {\n background: 'rgba(0, 0, 0, 0.8)',\n zIndex: 2003,\n },\n};\n\nconst NotPricedModal = () => {\n const { modalOpen } = useTypedSelector((state) => state.notPriced);\n\n const dispatch = useDispatch();\n\n const close = useCallback(() => {\n dispatch(setNotPricedModalOpen(false));\n }, [dispatch]);\n\n return (\n <div id=\"not-priced\">\n <Modal\n ariaHideApp={false}\n preventScroll={true}\n isOpen={modalOpen}\n onRequestClose={close}\n style={customModalStyles}\n shouldCloseOnOverlayClick={true}\n >\n <div className=\"absolute bottom-0 left-0 right-0 top-0 flex\">\n <div className=\"relative m-auto max-w-[640px] rounded border border-gray-400 bg-gray-100\">\n <div className=\"absolute right-2 top-2\" onClick={close}>\n <Icon\n className=\"h-[20px] w-[20px] cursor-pointer text-gray-900\"\n name=\"close\"\n cursor=\"pointer\"\n />\n </div>\n <div className=\"flex flex-col gap-2 px-4 pb-4 pt-6 lg:p-8\">\n <h5>{translate('product-card.not-priced-title')}</h5>\n <div className=\"text-md text-gray-900\">\n <p>{translate('product-card.not-priced-description')}</p>\n </div>\n </div>\n </div>\n </div>\n </Modal>\n </div>\n );\n};\n\nexport default NotPricedModal;\n","import renderWrapper from './render-wrapper';\nimport MiniCart from '../Components/MiniCart/MiniCart';\nimport StockStatus from '../Components/StockStatus/StockStatus';\nimport Checkout from '../Components/Checkout/Checkout';\nimport ProductFiltering from '../Components/ProductFiltering/ProductFiltering';\nimport ProductSorting from '../Components/ProductSorting/ProductSorting';\nimport ProductInformationTabs from '../Components/ProductInformationTabs/ProductInformationTabs';\nimport BuyButton from '../Components/BuyButton/BuyButton';\nimport FloatingBuyButton from '../Components/BuyButton/FloatingBuyButton';\nimport FilterBar from '../Components/FilterBar/FilterBar';\nimport MyPagesContainer from '../Components/MyPages/MyPagesContainer';\nimport ProductPageImageSlider from '../Components/ProductPageImageSlider/ProductPage.ImageSlider';\nimport NewsPageImageSlider from '../Components/News/NewsPage.ImageSlider';\nimport AdminEditButton from '../Components/AdminEditButton';\nimport ProductCampaignDescription from '../Components/ProductCampaignDescription/ProductCampaignDescription';\nimport ProductAttributeTag from '../Components/ProductTags/ProductAttributeTag';\nimport ProductTag from '../Components/ProductTags/ProductTag';\nimport ProductPage from '../Components/ProductPage/ProductPage';\nimport BannerSliderBlock from '../Blocks/BannerBlock/BannerSliderBlock';\nimport BannerBlock from '../Blocks/BannerBlock/BannerBlock';\nimport CategoryLinkBlock from '../Blocks/CategoryLinkBlock';\nimport ProductSlider from '../Blocks/ProductSlider';\nimport ProductListHeaderText from '../Components/ProductList.HeaderText';\nimport ActiveFilterChips from '../Components/ActiveFilterChips/ActiveFilterChips';\nimport ProductBlockNoSlider from '../Blocks/ProductBlockNoSlider';\nimport SearchResult from '../Components/SearchResult/SearchResult';\nimport SearchNavigation from '../Components/SearchResult/SearchNavigation';\nimport NavigationMobile from '../Components/Navigation/NavigationMobile';\nimport Overlay from '../Components/Overlay';\nimport VariantPickerDropdown from '../Components/VariantPicker/VariantPicker.Dropdown';\nimport VariantPickerButtons from '../Components/VariantPicker/VariantPicker.Buttons';\nimport VariantPickerLinks from '../Components/VariantPicker/VariantPicker.Links';\nimport LoginModal from '../Components/Login/LoginModal';\nimport LoginPage from '../Components/Login/LoginPage';\nimport ProductListing from '../Components/ProductListing/ProductListing';\nimport ProductPagePrice from '../Components/ProductPrice/ProductPagePrice';\nimport ProductPageProductSlider from '../Components/ProductPageProductSlider/ProductPageProductSlider';\nimport UsedProduct from '../Components/UsedProduct/UsedProduct';\nimport PriceHistoryModalTrigger from '../Components/ProductPriceHistory/PriceHistoryModalTrigger';\nimport LinkBlock from '../Blocks/LinkBlock/LinkBlock';\nimport NewsBlock from '../Blocks/NewsBlock';\nimport StartPageBlock from '../Blocks/StartPageBlock';\nimport OrderConfirmation from '../Components/OrderConfirmation/OrderConfirmation';\nimport BrandsBlock from '../Blocks/BrandsBlock';\nimport EditorString from '../Components/EditorString/EditorString';\nimport RichTextBlock from '../Blocks/RichTextBlock';\nimport FaqAccordion from '../Blocks/FaqAccordion';\nimport ResponsiveImage from '../Components/ResponsiveImage/ResponsiveImage';\nimport UspBlock from '../Blocks/UspBlock';\nimport ProductPageVariantList from '../Components/ProductPageVariantList/ProductPage.VariantList';\nimport ScrollToElementButton from '../Components/ScrollToElementButton/ScrollToElementButton';\nimport SubNavigationContainer from '../Components/SubNavigationContainer/SubNavigationContainer';\nimport ProductsAndBannerBlock from '../Blocks/ProductsAndBannerBlock';\nimport PriceHistoryModal from '../Components/ProductPriceHistory/PriceHistoryModal';\nimport CategoryNavigation from '../Components/ProductListing/CategoryNavigation';\nimport TopMenuUsps from '../Components/TopMenuUsps/TopMenuUsps';\nimport NewsletterRegistration from '../Components/NewsletterRegistration/NewsletterRegistration';\nimport NewsletterFormBlock from '../Blocks/NewsletterFormBlock';\nimport NewsList from '../Components/News/NewsList';\nimport Header from '../Components/Header/Header';\nimport ContactForm from '../Blocks/ContactForm';\nimport KlevuMain from '../Components/Klevu/KlevuMain';\nimport NotPricedModal from '../Components/NotPricedProduct/NotPricedModal';\n\nglobal['Components'] = {\n Header: (props) => renderWrapper(Header, props),\n ProductListing: (props) => renderWrapper(ProductListing, props),\n MiniCart: (props) => renderWrapper(MiniCart, props),\n StockStatus: (props) => renderWrapper(StockStatus, props),\n ProductFiltering: (props) => renderWrapper(ProductFiltering, props),\n ProductSorting: (props) => renderWrapper(ProductSorting, props),\n ProductInformationTabs: (props) =>\n renderWrapper(ProductInformationTabs, props),\n MyPagesContainer: (props) => renderWrapper(MyPagesContainer, props),\n Checkout: (props) => renderWrapper(Checkout, props),\n BuyButton: (props) => renderWrapper(BuyButton, props),\n FloatingBuyButton: (props) => renderWrapper(FloatingBuyButton, props),\n FilterBar: (props) => renderWrapper(FilterBar, props),\n SearchResult: (props) => renderWrapper(SearchResult, props),\n SearchNavigation: (props) => renderWrapper(SearchNavigation, props),\n ProductBlockNoSlider: (props) =>\n renderWrapper(ProductBlockNoSlider, props),\n ProductListHeaderText: (props) =>\n renderWrapper(ProductListHeaderText, props),\n ProductPageImageSlider: (props) =>\n renderWrapper(ProductPageImageSlider, props),\n NewsPageImageSlider: (props) =>\n renderWrapper(NewsPageImageSlider, props),\n ProductCampaignDescription: (props) =>\n renderWrapper(ProductCampaignDescription, props),\n BannerSliderBlock: (props) => renderWrapper(BannerSliderBlock, props),\n BannerBlock: (props) => renderWrapper(BannerBlock, props),\n CategoryLinkBlock: (props) => renderWrapper(CategoryLinkBlock, props),\n ProductSlider: (props) => renderWrapper(ProductSlider, props),\n ActiveFilterChips: (props) => renderWrapper(ActiveFilterChips, props),\n NavigationMobile: (props) => renderWrapper(NavigationMobile, props),\n Overlay: (props) => renderWrapper(Overlay, props),\n VariantPickerDropdown: (props) =>\n renderWrapper(VariantPickerDropdown, props),\n VariantPickerButtons: (props) =>\n renderWrapper(VariantPickerButtons, props),\n VariantPickerLinks: (props) => renderWrapper(VariantPickerLinks, props),\n LoginModal: (props) => renderWrapper(LoginModal, props),\n LoginPage: (props) => renderWrapper(LoginPage, props),\n OrderConfirmation: (props) => renderWrapper(OrderConfirmation, props),\n ProductsAndBannerBlock: (props) =>\n renderWrapper(ProductsAndBannerBlock, props),\n LinkBlock: (props) => renderWrapper(LinkBlock, props),\n NewsBlock: (props) => renderWrapper(NewsBlock, props),\n BrandsBlock: (props) => renderWrapper(BrandsBlock, props),\n EditorString: (props) => renderWrapper(EditorString, props),\n RichTextBlock: (props) => renderWrapper(RichTextBlock, props),\n FaqAccordion: (props) => renderWrapper(FaqAccordion, props),\n UspBlock: (props) => renderWrapper(UspBlock, props),\n ResponsiveImage: (props) => renderWrapper(ResponsiveImage, props),\n ProductPageVariantList: (props) =>\n renderWrapper(ProductPageVariantList, props),\n ScrollToElementButton: (props) =>\n renderWrapper(ScrollToElementButton, props),\n SubNavigationContainer: (props) =>\n renderWrapper(SubNavigationContainer, props),\n ProductPagePrice: (props) => renderWrapper(ProductPagePrice, props),\n ProductPageProductSlider: (props) =>\n renderWrapper(ProductPageProductSlider, props),\n UsedProduct: (props) => renderWrapper(UsedProduct, props),\n PriceHistoryModalTrigger: (props) =>\n renderWrapper(PriceHistoryModalTrigger, props),\n PriceHistoryModal: (props) => renderWrapper(PriceHistoryModal, props),\n NotPricedModal: (props) => renderWrapper(NotPricedModal, props),\n CategoryNavigation: (props) => renderWrapper(CategoryNavigation, props),\n TopMenuUsps: (props) => renderWrapper(TopMenuUsps, props),\n NewsletterRegistration: (props) =>\n renderWrapper(NewsletterRegistration, props),\n NewsletterFormBlock: (props) =>\n renderWrapper(NewsletterFormBlock, props),\n ProductTag: (props) => renderWrapper(ProductTag, props),\n ProductPage: (props) => renderWrapper(ProductPage, props),\n ProductAttributeTag: (props) =>\n renderWrapper(ProductAttributeTag, props),\n NewsList: (props) => renderWrapper(NewsList, props),\n StartPageBlock: (props) => renderWrapper(StartPageBlock, props),\n AdminEditButton: (props) => renderWrapper(AdminEditButton, props),\n ContactForm: (props) => renderWrapper(ContactForm, props),\n KlevuMain: (props) => renderWrapper(KlevuMain, props),\n};\n"],"sourceRoot":""}