{"version":3,"sources":["webpack:///./src/Frontend/app/utils/url-utils.ts","webpack:///./src/Frontend/app/utils/body-class-util.ts","webpack:///./src/Frontend/app/components/product-gallery/product-gallery.tsx","webpack:///./src/Frontend/app/components/input-checkbox/input-checkbox.tsx","webpack:///./src/Frontend/app/components/search-results/facet-group/facet-group.tsx","webpack:///./src/Frontend/app/components/search-results/facet-form/facet-form.tsx","webpack:///./src/Frontend/app/components/search-results/sorting-form/sorting-form.tsx","webpack:///./src/Frontend/app/components/search-results/search-results.tsx","webpack:///./src/Frontend/app/views/search-results/search-results-view.tsx","webpack:///./src/Frontend/app/components/icons/icon.tsx","webpack:///./src/Frontend/app/components/anchor/anchor.tsx","webpack:///./src/Frontend/app/components/cta-button/cta-button.tsx","webpack:///./src/Frontend/app/components/tag/tag.tsx","webpack:///./src/Frontend/app/utils/tracking-utils.ts","webpack:///./src/Frontend/app/components/product-image/product-image.tsx","webpack:///./src/Frontend/app/components/spinner/spinner.tsx","webpack:///./src/Frontend/app/components/product-authors/product-authors.tsx","webpack:///./src/Frontend/app/components/button/button.tsx","webpack:///./src/Frontend/app/types/product.ts","webpack:///./src/Frontend/app/components/product-tile/product-tile-image.tsx","webpack:///./src/Frontend/app/components/product-tile/product-tile-title.tsx","webpack:///./src/Frontend/app/components/product-tile/product-tile.tsx","webpack:///./src/Frontend/app/components/input-select/input-select.tsx","webpack:///./src/Frontend/app/hooks/useShuffleIndex.ts","webpack:///./src/Frontend/app/components/gallery/gallery.tsx","webpack:///./src/Frontend/app/components/accordion/useAccordion.ts","webpack:///./src/Frontend/app/components/accordion/accordion-item/accordion-item.tsx","webpack:///./src/Frontend/app/components/accordion/accordion-header/accordion-header.tsx","webpack:///./src/Frontend/app/components/accordion/accordion-content/accordion-content.tsx","webpack:///./src/Frontend/app/components/accordion/accordion.tsx"],"names":["getUrlParameters","global","window","params","document","location","toString","indexOf","query","replace","split","i","l","length","aux","decodeURIComponent","Object","keys","getUrlParameterByName","name","updateUrlParameters","parameters","parameterKeys","parameterString","map","p","encodeURIComponent","join","history","replaceState","pushState","toggleBodyClass","bodyClass","toggleOn","hasBodyClass","body","classList","contains","add","remove","products","trackingList","disableCentering","anchorId","someProductsHaveStatus","some","product","baseClass","componentClasses","productListClasses","className","id","isCentered","index","key","productId","hideBackground","hideStatus","hasTopPadding","ctaLink","undefined","sizes","trackingPosition","props","label","required","requiredIndicatorOnly","rootClasses","switchStyle","inputId","idPrefix","fieldName","htmlFor","input","type","checked","value","autoComplete","role","iconId","dangerouslySetInnerHTML","__html","facets","handleSubmit","seeLessLabel","seeMoreLabel","useAccordion","activeIndex","setActiveIndex","isActive","isOverflowHidden","setIsOverflowHidden","hasOverflow","classes","renderHeader","onClick","renderContent","facet","Field","component","count","onChange","event","preventDefault","formConfig","form","values","dispatch","selectedFacets","entries","push","anyTouched","apiUrl","loadMoreWebApiUrl","page","touchOnChange","reduxForm","facetGroups","facetsSeeMoreBtnLabel","facetsSeeLessBtnLabel","isFacetModalOpen","closeFacetModal","facetGroupsTitle","facetGroupsConfirmButtonLabel","group","sorting","excludeDefaultOption","readyForSorting","options","sortingOptions","search","isSearchPending","productsFromStore","displayedProductsOutOfTotalLabelFromStore","pageFromStore","sortingFromStore","facetsFromStore","productsTotalCountFromStore","productsTotalCountLabelFromStore","loadMoreBtnLabel","loadMorePageSize","secondaryPriceLabel","searchQueryRichText","themeCodes","searchString","complexQuery","facetsNoResultsRichText","facetModalButtonLabel","initialLoad","setInitialLoad","setIsFacetModalOpen","toggleFacetModal","displayedProductsOutOfTotalLabel","productsTotalCountLabel","showLoadMoreBtn","productsTotalCount","searchParams","store","searchUrlParams","String","updateUrlParametersOnEffect","facetUrlString","reduce","accumulator","currentValue","existingUrlParams","facetsInitialValues","forEach","sortingInitialValues","initialValues","e","isLarge","disabled","render","this","contextModel","spriteUrl","viewBox","preserveAspectRatio","xmlnsXlink","xlinkHref","isInverted","isSecondary","link","tagTypeClassMap","NEWS","SPOT","BESTSELLER","BOOK_OF_THE_MONTH","UPCOMING","classModifier","shape","children","EventTypes","CurrencyCodes","TrackingDimensions","ensureDataLayer","dataLayer","pushEcommerenceTrackingEvent","trackingEvent","pushTrackingEvent","pushClickTrackingEvent","title","CLICK","ecommerce","click","actionField","list","position","pushDetailViewTrackingEvent","DETAIL_VIEW","detail","pushImpressionViewTrackingEvent","IMPRESSION_VIEW","impressions","ProductImage","ref","fallbackSrc","loading","src","size","authors","maxLines","Wrapper","lines","author","url","href","PriceTypesEnum","ProductStatusEnum","ProductStockStatusEnum","ProductTileImage","hasQuickView","target","imageSrcSet","imageFallbackSrc","detailsLabel","status","statusLabel","imageBaseClasses","Image","srcSet","alt","ProductTile","btnIsLarge","description","hideAuthors","onQuickViewClick","showCtaAsLink","singleItemHighlight","triggerOnce","inView","clickTrackingEvent","onTileClick","touched","error","defaultLabel","enableInlineError","forceErrorStyling","allOptions","inputHasError","dropdownVisible","setDropdownVisible","initial","currentIndex","setCurrentIndex","shuffleAction","useShuffleIndex","shuffle","dropdownRef","isAValueSelected","currentlySelectedOption","find","option","toggleDropdown","toggleState","onBlur","current","relatedTarget","activeElement","onKeyPress","onKeyDown","supportsNativeSmoothScroll","documentElement","style","keyCode","nextIndex","currentElement","querySelector","scrollIntoView","behavior","block","navigator","userAgent","toLowerCase","isOptionSelected","tabIndex","dataValue","getAttribute","parseInt","defaultIndex","baseRootClass","contentClassName","duration","applyInlineTransitions","height","isDisabled","isLoading","hideIcon"],"mappings":"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","file":"9.e379dfe731cc9c54b62b.js","sourcesContent":["interface IParameterObject {\r\n    [key: string]: string;\r\n}\r\n\r\nexport function getUrlParameters(): IParameterObject | undefined {\r\n    if (!global.window) {\r\n        return;\r\n    }\r\n\r\n    const params: IParameterObject = {};\r\n\r\n    if (document.location && document.location.toString().indexOf(\"?\") !== -1) {\r\n        const query = (document as any).location\r\n            .toString()\r\n            .replace(/^.*?\\?/, \"\")\r\n            .replace(/#.*$/, \"\")\r\n            .split(\"&\");\r\n\r\n        for (let i = 0, l = query.length; i < l; i++) {\r\n            const aux = decodeURIComponent(query[i]).split(\"=\");\r\n            params[aux[0]] = aux[1];\r\n        }\r\n    }\r\n\r\n    if (Object.keys(params).length === 0) {\r\n        return;\r\n    }\r\n\r\n    return params;\r\n}\r\n\r\nexport function getUrlParameterByName(name: string): string | undefined {\r\n    const params = getUrlParameters();\r\n    return params && params[name];\r\n}\r\n\r\nexport function updateUrlParameters(parameters: IParameterObject, replace = false): void {\r\n    const parameterKeys = Object.keys(parameters);\r\n\r\n    if (parameterKeys.length === 0 || !global.window) {\r\n        return;\r\n    }\r\n\r\n    const parameterString = parameterKeys\r\n        .map(p => encodeURIComponent(p) + \"=\" + encodeURIComponent(parameters[p]))\r\n        .join(\"&\");\r\n\r\n    replace\r\n        ? window.history.replaceState({}, \"\", `?${parameterString}`)\r\n        : window.history.pushState({}, \"\", `?${parameterString}`);\r\n}\r\n\r\nexport default {\r\n    getUrlParameters,\r\n    getUrlParameterByName,\r\n    updateUrlParameters\r\n};\r\n","export function toggleBodyClass(bodyClass: string, toggleOn: boolean) {\r\n    const hasBodyClass = document.body.classList.contains(bodyClass);\r\n\r\n    if (toggleOn && hasBodyClass) {\r\n        return;\r\n    }\r\n\r\n    if (toggleOn && !hasBodyClass) {\r\n        document.body.classList.add(bodyClass);\r\n    } else {\r\n        document.body.classList.remove(bodyClass);\r\n    }\r\n}\r\n","import * as React from \"react\";\r\nimport { IProduct } from \"~/types/product\";\r\nimport ProductTile from \"~/components/product-tile/product-tile\";\r\nimport classNames from \"classnames\";\r\n// import { IButtonAddToBasketProps } from \"../button-add-to-basket/button-add-to-basket\";\r\nimport Gallery from \"../gallery/gallery\";\r\nimport Anchor from \"../anchor/anchor\";\r\nimport { IDiscountOffer } from \"~/types/discount-offer\";\r\n\r\nexport interface IProductGalleryProps {\r\n    products: IProduct[];\r\n    secondaryPriceLabel?: string;\r\n    disableCentering?: boolean;\r\n    discountOffer?: IDiscountOffer;\r\n    anchorId?: string;\r\n    trackingList?: string;\r\n}\r\n\r\nconst ProductGallery: React.FC<IProductGalleryProps> = ({\r\n    products,\r\n    // addToBasketWebApiUrl,\r\n    // secondaryPriceLabel,\r\n    trackingList,\r\n    disableCentering,\r\n    anchorId\r\n}) => {\r\n    const someProductsHaveStatus = products.some(product => !!product.status);\r\n    // const someProductsHaveSubText = products.some(\r\n    //     product => !!product.secondaryPrice || !!product.stockStatusLabel\r\n    // );\r\n    // const someProductsHaveNumberOfProductsLabel = products.some(product => !!product.numberOfProductsLabel);\r\n\r\n    const baseClass = \"product-gallery\";\r\n    const componentClasses = classNames(baseClass, {\r\n        \"anchor-wrapper\": !!anchorId\r\n    });\r\n    const productListClasses = classNames(`${baseClass}__list`, {\r\n        [`${baseClass}__list--isCentered`]: !disableCentering && products.length < 4\r\n    });\r\n\r\n    return (\r\n        <section className={componentClasses}>\r\n            {anchorId && <Anchor id={anchorId} />}\r\n            <div className={`${baseClass}__inner`}>\r\n                <div className={productListClasses}>\r\n                    <Gallery isCentered={!disableCentering}>\r\n                        {products.map((product, index) => (\r\n                            <div key={product.productId} className={`${baseClass}__item`}>\r\n                                <ProductTile\r\n                                    {...product}\r\n                                    className={`${baseClass}__product-tile`}\r\n                                    hideBackground\r\n                                    hideStatus={!someProductsHaveStatus}\r\n                                    hasTopPadding={someProductsHaveStatus}\r\n                                    // bottomPaddedSubText={someProductsHaveSubText}\r\n                                    // hasBottomPaddingNumberOfProducts={someProductsHaveNumberOfProductsLabel}\r\n                                    // ctaLabel={product.primaryPrice}\r\n                                    // addToBasketWebApiUrl={addToBasketWebApiUrl}\r\n                                    // secondaryPriceLabel={secondaryPriceLabel}\r\n                                    ctaLink={undefined}\r\n                                    sizes=\"(max-width: 480px) 150px, 100px\"\r\n                                    trackingList={trackingList || \"Product Gallery\"}\r\n                                    trackingPosition={index + 1}\r\n                                />\r\n                            </div>\r\n                        ))}\r\n                    </Gallery>\r\n                </div>\r\n            </div>\r\n        </section>\r\n    );\r\n};\r\n\r\nexport default ProductGallery;\r\n","import * as React from \"react\";\r\nimport Icon from \"~/components/icons/icon\";\r\nimport classNames from \"classnames\";\r\nimport { WrappedFieldProps } from \"redux-form\";\r\n\r\nexport interface IInputCheckboxProps {\r\n    label: string;\r\n    fieldName: string;\r\n    required?: boolean;\r\n    requiredIndicatorOnly?: boolean;\r\n    className?: string;\r\n    idPrefix?: string;\r\n    switchStyle: boolean;\r\n}\r\n\r\nconst InputCheckbox: React.FC<IInputCheckboxProps & WrappedFieldProps> = props => {\r\n    const label = props.required || props.requiredIndicatorOnly ? `${props.label} *` : props.label;\r\n    const baseClass = \"checkbox\";\r\n    const rootClasses = classNames(baseClass, props.className, {\r\n        [`${baseClass}--switchStyle`]: props.switchStyle\r\n    });\r\n    const inputId = props.idPrefix ? props.idPrefix + \"_\" + props.fieldName : props.fieldName;\r\n\r\n    return (\r\n        <label className={rootClasses} htmlFor={inputId}>\r\n            <input\r\n                {...props.input}\r\n                className={`${baseClass}__input`}\r\n                type=\"checkbox\"\r\n                id={inputId}\r\n                required={props.required}\r\n                checked={props.input.value}\r\n                autoComplete=\"off\"\r\n            />\r\n            <div className={`${baseClass}__mark-container`} role=\"presentation\">\r\n                <span className={`${baseClass}__mark`}>\r\n                    <Icon iconId=\"icon_placeholder_checkmark\" />\r\n                </span>\r\n            </div>\r\n            <div\r\n                className={`${baseClass}__label content-rich-text`}\r\n                dangerouslySetInnerHTML={{ __html: label }}\r\n            />\r\n        </label>\r\n    );\r\n};\r\n\r\nexport default InputCheckbox;\r\n","import classNames from \"classnames\";\r\nimport * as React from \"react\";\r\nimport { SubmitHandler, Field } from \"redux-form\";\r\nimport Accordion from \"~/components/accordion/accordion\";\r\nimport AccordionContent from \"~/components/accordion/accordion-content/accordion-content\";\r\nimport AccordionHeader from \"~/components/accordion/accordion-header/accordion-header\";\r\nimport AccordionItem from \"~/components/accordion/accordion-item/accordion-item\";\r\nimport { useAccordion } from \"~/components/accordion/useAccordion\";\r\nimport InputCheckbox from \"~/components/input-checkbox/input-checkbox\";\r\nimport { IFacetFormData, IFacetFormAllProps, IFacetGroup } from \"../facet-form/facet-form\";\r\n\r\ninterface IFacetGroupProps extends IFacetGroup {\r\n    index: number;\r\n    seeMoreLabel?: string;\r\n    seeLessLabel?: string;\r\n    handleSubmit: SubmitHandler<IFacetFormData, IFacetFormAllProps, string>;\r\n}\r\n\r\nconst FacetGroup: React.FC<IFacetGroupProps> = ({\r\n    facets,\r\n    label,\r\n    index,\r\n    handleSubmit,\r\n    seeLessLabel,\r\n    seeMoreLabel\r\n}) => {\r\n    const [activeIndex, setActiveIndex] = useAccordion(index);\r\n    const isActive = activeIndex === index;\r\n    const [isOverflowHidden, setIsOverflowHidden] = React.useState(true);\r\n    const hasOverflow = facets.length > 5;\r\n    const baseClass = \"facet-group\";\r\n    const classes = classNames(baseClass, {\r\n        [`${baseClass}--overflowHidden`]: isOverflowHidden\r\n    });\r\n\r\n    return (\r\n        <Accordion className={classes}>\r\n            <AccordionItem\r\n                isActive={isActive}\r\n                renderHeader={\r\n                    <AccordionHeader isActive={isActive} onClick={() => setActiveIndex(index)}>\r\n                        <h4 className=\"facet-group__header\">{label}</h4>\r\n                    </AccordionHeader>\r\n                }\r\n                renderContent={\r\n                    <AccordionContent>\r\n                        {facets.map(facet => {\r\n                            return (\r\n                                <div className=\"facet-group__facet\" key={facet.id}>\r\n                                    <Field\r\n                                        component={InputCheckbox}\r\n                                        label={`\r\n                                            <span>${facet.label}</span>\r\n                                            <span class=\"facet-group__facet-count\">(${facet.count})</span>\r\n                                        `}\r\n                                        name={facet.id}\r\n                                        fieldName={facet.id}\r\n                                        onChange={handleSubmit}\r\n                                    />\r\n                                </div>\r\n                            );\r\n                        })}\r\n                    </AccordionContent>\r\n                }\r\n            />\r\n            {hasOverflow && isActive && (\r\n                <button\r\n                    className={`${baseClass}__toggle-overflow-btn reset-button`}\r\n                    onClick={(event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\r\n                        event.preventDefault();\r\n                        setIsOverflowHidden(!isOverflowHidden);\r\n                    }}\r\n                >\r\n                    {isOverflowHidden ? seeMoreLabel : seeLessLabel}\r\n                </button>\r\n            )}\r\n        </Accordion>\r\n    );\r\n};\r\n\r\nexport default FacetGroup;\r\n","import * as React from \"react\";\r\nimport { InjectedFormProps, reduxForm, ConfigProps } from \"redux-form\";\r\nimport { ISearchParams } from \"~/store/reducers/search/search-reducer\";\r\nimport { ISearchResultsProps } from \"../search-results\";\r\nimport * as searchActions from \"~/store/reducers/search/search-actions\";\r\nimport Icon from \"../../icons/icon\";\r\nimport classNames from \"classnames\";\r\nimport FacetGroup from \"../facet-group/facet-group\";\r\n\r\ninterface IFacet {\r\n    id: string;\r\n    label: string;\r\n    count: number;\r\n}\r\nexport interface IFacetGroup {\r\n    label: string;\r\n    facets: IFacet[];\r\n}\r\n\r\nexport interface IFacetFormProps {\r\n    facetGroups?: IFacetGroup[];\r\n    facetGroupsTitle?: string;\r\n    facetGroupsConfirmButtonLabel?: string;\r\n    facetsSeeMoreBtnLabel?: string;\r\n    facetsSeeLessBtnLabel?: string;\r\n}\r\n\r\nexport interface IFacetFormAllProps\r\n    extends IFacetFormProps,\r\n        Pick<ISearchParams, \"facets\">,\r\n        Pick<ISearchResultsProps, \"loadMoreWebApiUrl\"> {\r\n    isFacetModalOpen: boolean;\r\n    closeFacetModal: (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void;\r\n}\r\n\r\nexport interface IFacetFormData {}\r\n\r\ntype FacetFormPropsUnion = IFacetFormAllProps & InjectedFormProps<IFacetFormData, IFacetFormAllProps>;\r\n\r\nconst FacetForm: React.FC<FacetFormPropsUnion> = ({\r\n    handleSubmit,\r\n    facetGroups,\r\n    facetsSeeMoreBtnLabel,\r\n    facetsSeeLessBtnLabel,\r\n    isFacetModalOpen,\r\n    closeFacetModal,\r\n    facetGroupsTitle,\r\n    facetGroupsConfirmButtonLabel\r\n}) => {\r\n    const baseClass = \"facet-form\";\r\n    const componentClasses = classNames(baseClass, {\r\n        [`${baseClass}--facetModalOpen`]: isFacetModalOpen\r\n    });\r\n\r\n    return (\r\n        <form className={componentClasses}>\r\n            <button className={`${baseClass}__modal-close-btn button`} onClick={closeFacetModal}>\r\n                <Icon iconId=\"icon_28_close\" />\r\n            </button>\r\n            <h3 className={`${baseClass}__modal-title h2-style`}>{facetGroupsTitle}</h3>\r\n            <div className={`${baseClass}__facets`}>\r\n                {facetGroups?.map((group, i) => (\r\n                    <FacetGroup\r\n                        {...group}\r\n                        seeLessLabel={facetsSeeLessBtnLabel}\r\n                        seeMoreLabel={facetsSeeMoreBtnLabel}\r\n                        handleSubmit={handleSubmit}\r\n                        index={i}\r\n                        key={i}\r\n                    />\r\n                ))}\r\n            </div>\r\n            <button className={`${baseClass}__modal-use-filter-btn button`} onClick={closeFacetModal}>\r\n                {facetGroupsConfirmButtonLabel}\r\n            </button>\r\n        </form>\r\n    );\r\n};\r\n\r\nconst formConfig: ConfigProps<IFacetFormData, IFacetFormAllProps> = {\r\n    form: \"facetForm\",\r\n    onChange: (values, dispatch, props) => {\r\n        const selectedFacets = [];\r\n\r\n        for (const [key, value] of Object.entries(values)) {\r\n            if (value === true) {\r\n                selectedFacets.push(key);\r\n            }\r\n        }\r\n\r\n        if (props.anyTouched) {\r\n            dispatch(\r\n                searchActions.searchRequest({\r\n                    apiUrl: props.loadMoreWebApiUrl,\r\n                    page: 0,\r\n                    facets: selectedFacets\r\n                })\r\n            );\r\n        }\r\n    },\r\n    touchOnChange: true\r\n};\r\n\r\nexport default reduxForm<IFacetFormData, IFacetFormAllProps>(formConfig)(FacetForm);\r\n","import * as React from \"react\";\r\nimport { InjectedFormProps, reduxForm, Field, ConfigProps } from \"redux-form\";\r\nimport { ISearchParams } from \"~/store/reducers/search/search-reducer\";\r\nimport { ISearchResultsProps } from \"../search-results\";\r\nimport * as searchActions from \"~/store/reducers/search/search-actions\";\r\nimport InputSelect from \"../../input-select/input-select\";\r\n\r\ninterface ISortingOption {\r\n    label: string;\r\n    value: string;\r\n}\r\nexport interface ISortingFormProps {\r\n    sortingOptions: ISortingOption[];\r\n}\r\n\r\ninterface ISortingFormAllProps\r\n    extends ISortingFormProps,\r\n        Pick<ISearchParams, \"sorting\">,\r\n        Pick<ISearchResultsProps, \"loadMoreWebApiUrl\"> {}\r\n\r\nexport interface ISortingFormData {\r\n    sorting: string;\r\n}\r\n\r\ntype SortingFormPropsUnion = ISortingFormAllProps & InjectedFormProps<ISortingFormData, ISortingFormAllProps>;\r\n\r\nconst SortingForm: React.FC<SortingFormPropsUnion> = props => {\r\n    return (\r\n        <form className=\"sorting-form\">\r\n            <Field\r\n                name=\"sorting\"\r\n                component={InputSelect}\r\n                fieldName=\"select\"\r\n                excludeDefaultOption\r\n                readyForSorting\r\n                options={props.sortingOptions}\r\n            />\r\n        </form>\r\n    );\r\n};\r\n\r\nconst formConfig: ConfigProps<ISortingFormData, ISortingFormAllProps> = {\r\n    form: \"sortingForm\",\r\n    onChange: (values, dispatch, props) => {\r\n        if (props.anyTouched) {\r\n            dispatch(\r\n                searchActions.searchRequest({\r\n                    apiUrl: props.loadMoreWebApiUrl,\r\n                    page: 0,\r\n                    sorting: values.sorting\r\n                })\r\n            );\r\n        }\r\n    },\r\n    touchOnChange: true\r\n};\r\n\r\nexport default reduxForm<ISortingFormData, ISortingFormAllProps>(formConfig)(SortingForm);\r\n","import * as React from \"react\";\r\nimport { IProduct } from \"~/types/product\";\r\nimport * as searchActions from \"~/store/reducers/search/search-actions\";\r\nimport store from \"~/store\";\r\nimport { IRootState } from \"~/store/reducers\";\r\nimport { ISearchState, ISearchParams } from \"~/store/reducers/search/search-reducer\";\r\nimport { connect } from \"react-redux\";\r\nimport Button from \"../button/button\";\r\nimport ProductGallery, { IProductGalleryProps } from \"../product-gallery/product-gallery\";\r\nimport { ISearchRequest } from \"~/store/reducers/search/search-actions\";\r\nimport { updateUrlParameters, getUrlParameters } from \"~/utils/url-utils\";\r\nimport { useEffect } from \"react\";\r\nimport Icon from \"../icons/icon\";\r\nimport FacetForm, { IFacetFormProps } from \"./facet-form/facet-form\";\r\nimport classNames from \"classnames\";\r\nimport { toggleBodyClass } from \"~/utils/body-class-util\";\r\nimport SortingForm, { ISortingFormProps } from \"./sorting-form/sorting-form\";\r\nimport Anchor from \"../anchor/anchor\";\r\n\r\ninterface ISearchResultsPropsFromStore {\r\n    productsFromStore?: IProduct[];\r\n    sortingFromStore?: string;\r\n    facetsFromStore?: string[];\r\n    pageFromStore?: number;\r\n    productsTotalCountFromStore?: number;\r\n    productsTotalCountLabelFromStore?: string;\r\n    displayedProductsOutOfTotalLabelFromStore?: string;\r\n    anchorId?: string;\r\n}\r\n\r\nexport interface ISearchResultsProps\r\n    extends Omit<ISearchState, \"searchParams\" | \"products\">,\r\n        ISortingFormProps,\r\n        IFacetFormProps,\r\n        IProductGalleryProps,\r\n        ISearchResultsPropsFromStore {\r\n    loadMoreBtnLabel: string;\r\n    loadMoreWebApiUrl: string;\r\n    searchQueryRichText: string;\r\n    facetModalButtonLabel?: string;\r\n    facetsNoResultsRichText?: string;\r\n}\r\n\r\nexport type SearchResultsProps = ISearchResultsProps & ISearchParams;\r\n\r\nconst performSearch = (params: ISearchRequest) => {\r\n    store.dispatch(searchActions.searchRequest(params));\r\n};\r\n\r\nconst SearchResults: React.FC<SearchResultsProps> = ({\r\n    isSearchPending,\r\n    productsFromStore,\r\n    loadMoreWebApiUrl,\r\n    loadMoreBtnLabel,\r\n    loadMorePageSize,\r\n    secondaryPriceLabel,\r\n    // addToBasketWebApiUrl,\r\n    productsTotalCountFromStore,\r\n    displayedProductsOutOfTotalLabelFromStore,\r\n    productsTotalCountLabelFromStore,\r\n    searchQueryRichText,\r\n    themeCodes,\r\n    searchString,\r\n    complexQuery,\r\n    pageFromStore,\r\n    facetsNoResultsRichText,\r\n    facetsSeeMoreBtnLabel,\r\n    facetsSeeLessBtnLabel,\r\n    facetsFromStore,\r\n    facetGroups,\r\n    facetModalButtonLabel,\r\n    facetGroupsTitle,\r\n    facetGroupsConfirmButtonLabel,\r\n    sortingOptions,\r\n    sortingFromStore,\r\n    anchorId,\r\n    ...props\r\n}) => {\r\n    const [initialLoad, setInitialLoad] = React.useState(true);\r\n    const [isFacetModalOpen, setIsFacetModalOpen] = React.useState(false);\r\n\r\n    const toggleFacetModal = (event: React.MouseEvent<HTMLButtonElement, MouseEvent>, toggleOn: boolean) => {\r\n        event?.preventDefault();\r\n        setIsFacetModalOpen(toggleOn);\r\n        toggleBodyClass(\"body--facetOverlayOpen\", toggleOn);\r\n    };\r\n\r\n    const products = productsFromStore || props.products;\r\n    const page = pageFromStore != undefined ? pageFromStore : props.page;\r\n    const sorting = sortingFromStore || props.sorting;\r\n    const facets = facetsFromStore || props.facets;\r\n    const displayedProductsOutOfTotalLabel =\r\n        displayedProductsOutOfTotalLabelFromStore || props.displayedProductsOutOfTotalLabel;\r\n    const productsTotalCountLabel = productsTotalCountLabelFromStore || props.productsTotalCountLabel;\r\n    const productsTotalCount = productsTotalCountFromStore || props.productsTotalCount;\r\n    // TODO: Get rid of non-null assertion\r\n    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n    const showLoadMoreBtn = productsTotalCount! > products.length;\r\n\r\n    // Populate store with existing results and set search parameters\r\n    React.useEffect(() => {\r\n        const searchParams: ISearchParams = {\r\n            page,\r\n            loadMorePageSize,\r\n            themeCodes,\r\n            searchString,\r\n            complexQuery,\r\n            facets,\r\n            sorting\r\n        };\r\n\r\n        store.dispatch(searchActions.updateSearchParams(searchParams));\r\n        store.dispatch(searchActions.populateSearch({ products: props.products }));\r\n    }, []);\r\n\r\n    // Update page URL parameter\r\n    useEffect(() => {\r\n        const searchUrlParams: { [key: string]: string } = {};\r\n        searchUrlParams.page = String(page);\r\n\r\n        updateUrlParametersOnEffect(searchUrlParams);\r\n    }, [page]);\r\n\r\n    // Update sorting URL parameter\r\n    useEffect(() => {\r\n        const searchUrlParams: { [key: string]: string } = {};\r\n        searchUrlParams.page = String(0);\r\n\r\n        if (sorting) {\r\n            searchUrlParams.sorting = sorting;\r\n        }\r\n\r\n        updateUrlParametersOnEffect(searchUrlParams);\r\n    }, [sorting]);\r\n\r\n    // Update facets URL parameter\r\n    useEffect(() => {\r\n        const searchUrlParams: { [key: string]: string } = {};\r\n        searchUrlParams.page = String(0);\r\n\r\n        if (facets) {\r\n            let facetUrlString = \"\";\r\n            if (facets.length > 0) {\r\n                facetUrlString = facets.reduce((accumulator, currentValue) => {\r\n                    return accumulator + `_${currentValue}`;\r\n                });\r\n            }\r\n            searchUrlParams.facets = facetUrlString;\r\n        }\r\n\r\n        updateUrlParametersOnEffect(searchUrlParams);\r\n    }, [facets]);\r\n\r\n    const updateUrlParametersOnEffect = (searchUrlParams: { [key: string]: string }) => {\r\n        // Bail out on initial load to keep url clean until parameters change\r\n        if (initialLoad) {\r\n            setInitialLoad(false);\r\n            return;\r\n        }\r\n\r\n        const existingUrlParams = getUrlParameters();\r\n\r\n        // Combine search params with existing url params and update url\r\n        updateUrlParameters(\r\n            {\r\n                ...existingUrlParams,\r\n                ...searchUrlParams\r\n            },\r\n            true\r\n        );\r\n    };\r\n\r\n    const onLoadMore = () =>\r\n        performSearch({\r\n            apiUrl: loadMoreWebApiUrl,\r\n            // TODO: Get rid of non-null assertion\r\n            // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n            page: page! + 1\r\n        });\r\n\r\n    const facetsInitialValues: { [key: string]: any } = {};\r\n    if (props.facets && props.facets.length > 0) {\r\n        props.facets.forEach(currentValue => (facetsInitialValues[currentValue] = true));\r\n    }\r\n\r\n    const sortingInitialValues = { sorting: props.sorting };\r\n\r\n    const baseClass = \"search-results\";\r\n    const componentClasses = classNames(baseClass, {\r\n        \"anchor-wrapper\": !!anchorId,\r\n        [`${baseClass}--hasFacets`]: facetGroups\r\n    });\r\n\r\n    return (\r\n        <section className={componentClasses}>\r\n            {anchorId && <Anchor id={anchorId} />}\r\n            {searchQueryRichText && (\r\n                <div className={`${baseClass}__inner`}>\r\n                    <div\r\n                        className={`${baseClass}__search-rich-text content-rich-text`}\r\n                        dangerouslySetInnerHTML={{ __html: searchQueryRichText }}\r\n                    />\r\n                </div>\r\n            )}\r\n            <div className={`${baseClass}__inner`}>\r\n                {facetGroups && (\r\n                    <FacetForm\r\n                        initialValues={facetsInitialValues}\r\n                        closeFacetModal={e => toggleFacetModal(e, false)}\r\n                        loadMoreWebApiUrl={loadMoreWebApiUrl}\r\n                        facets={facets}\r\n                        facetGroups={facetGroups}\r\n                        facetsSeeMoreBtnLabel={facetsSeeMoreBtnLabel}\r\n                        facetsSeeLessBtnLabel={facetsSeeLessBtnLabel}\r\n                        isFacetModalOpen={isFacetModalOpen}\r\n                        facetGroupsTitle={facetGroupsTitle}\r\n                        facetGroupsConfirmButtonLabel={facetGroupsConfirmButtonLabel}\r\n                    />\r\n                )}\r\n                <div className={`${baseClass}__products`}>\r\n                    <div className={`${baseClass}__grid-align`}>\r\n                        <div className={`${baseClass}__top`}>\r\n                            {productsTotalCountLabel && (\r\n                                <div className={`${baseClass}__total-results`}>{productsTotalCountLabel}</div>\r\n                            )}\r\n                            <button\r\n                                className={`${baseClass}__open-facet-modal-btn reset-button`}\r\n                                onClick={e => toggleFacetModal(e, true)}\r\n                            >\r\n                                <Icon iconId=\"icon_placeholder_filtering\" />\r\n                                <span>{facetModalButtonLabel}</span>\r\n                            </button>\r\n                            {sortingOptions && (\r\n                                <div className={`${baseClass}__sorting-wrapper`}>\r\n                                    <SortingForm\r\n                                        initialValues={sortingInitialValues}\r\n                                        loadMoreWebApiUrl={loadMoreWebApiUrl}\r\n                                        sortingOptions={sortingOptions}\r\n                                        sorting={sorting}\r\n                                    />\r\n                                </div>\r\n                            )}\r\n                        </div>\r\n                    </div>\r\n                    {products.length > 0 ? (\r\n                        <>\r\n                            <ProductGallery\r\n                                products={products}\r\n                                secondaryPriceLabel={secondaryPriceLabel}\r\n                                // addToBasketWebApiUrl={addToBasketWebApiUrl}\r\n                                trackingList=\"Search Results\"\r\n                                disableCentering\r\n                            />\r\n                            {displayedProductsOutOfTotalLabel && (\r\n                                <div className={`${baseClass}__x-of-y`}>\r\n                                    {displayedProductsOutOfTotalLabel}\r\n                                </div>\r\n                            )}\r\n                            {showLoadMoreBtn && (\r\n                                <div className={`${baseClass}__button-wrapper`}>\r\n                                    <Button\r\n                                        className={`${baseClass}__button button--inverted`}\r\n                                        isLarge\r\n                                        onClick={onLoadMore}\r\n                                        disabled={isSearchPending}\r\n                                    >\r\n                                        {loadMoreBtnLabel}\r\n                                    </Button>\r\n                                </div>\r\n                            )}\r\n                        </>\r\n                    ) : (\r\n                        <div className={`${baseClass}__facets-no-results`}>\r\n                            {facetsNoResultsRichText && (\r\n                                <div dangerouslySetInnerHTML={{ __html: facetsNoResultsRichText }} />\r\n                            )}\r\n                        </div>\r\n                    )}\r\n                </div>\r\n            </div>\r\n        </section>\r\n    );\r\n};\r\n\r\nconst mapStateToProps = ({ search }: IRootState) => {\r\n    const {\r\n        searchParams: { page, sorting, facets },\r\n        isSearchPending,\r\n        products,\r\n        displayedProductsOutOfTotalLabel,\r\n        productsTotalCount,\r\n        productsTotalCountLabel\r\n    } = search;\r\n    return {\r\n        isSearchPending,\r\n        productsFromStore: products,\r\n        displayedProductsOutOfTotalLabelFromStore: displayedProductsOutOfTotalLabel,\r\n        pageFromStore: page,\r\n        sortingFromStore: sorting,\r\n        facetsFromStore: facets,\r\n        productsTotalCountFromStore: productsTotalCount,\r\n        productsTotalCountLabelFromStore: productsTotalCountLabel\r\n    };\r\n};\r\n\r\nexport default connect(mapStateToProps)(SearchResults);\r\n","import * as React from \"react\";\r\nimport SearchResults, { SearchResultsProps } from \"~/components/search-results/search-results\";\r\n\r\ninterface ISearchResultsViewProps {\r\n    contextModel: SearchResultsProps;\r\n}\r\n\r\nclass SearchResultsView extends React.Component<ISearchResultsViewProps> {\r\n    public render() {\r\n        return <SearchResults {...this.props.contextModel} />;\r\n    }\r\n}\r\n\r\nexport default SearchResultsView;\r\n","import * as React from \"react\";\r\nimport classNames from \"classnames\";\r\n\r\nexport type TIconNames =\r\n    | \"24_expand\"\r\n    | \"24_play\"\r\n    | \"24_star\"\r\n    | \"24_trash\"\r\n    | \"32_add-user\"\r\n    | \"32_basket\"\r\n    | \"32_checkmark-circle\"\r\n    | \"32_checkmark\"\r\n    | \"32_error\"\r\n    | \"32_information\"\r\n    | \"32_katalog\"\r\n    | \"32_search\"\r\n    | \"32_truck-in-motion\"\r\n    | \"32_user\"\r\n    | \"32_warning\"\r\n    | \"icon_16_arrow-down\"\r\n    | \"icon_16_arrow-left\"\r\n    | \"icon_16_arrow-right-bold\"\r\n    | \"icon_16_arrow-right\"\r\n    | \"icon_16_arrow-up\"\r\n    | \"icon_28_close\"\r\n    | \"icon_32_thumbs-up\"\r\n    | \"icon_80x41_quotation-mark-gyldendal-dk\"\r\n    | \"icon_80x48_quotation-mark\"\r\n    | \"icon_checkbox-black\"\r\n    | \"icon_checkmark-black\"\r\n    | \"icon_download\"\r\n    | \"icon_herringbone-narrow\"\r\n    | \"icon_herringbone-wide\"\r\n    | \"icon_placeholder-email\"\r\n    | \"icon_placeholder-lock\"\r\n    | \"icon_placeholder-phone-small\"\r\n    | \"icon_placeholder-vip-white\"\r\n    | \"icon_placeholder_basket\"\r\n    | \"icon_placeholder_checkmark\"\r\n    | \"icon_placeholder_eye-closed\"\r\n    | \"icon_placeholder_eye\"\r\n    | \"icon_placeholder_facebook\"\r\n    | \"icon_placeholder_filtering\"\r\n    | \"icon_placeholder_hamburger\"\r\n    | \"icon_placeholder_instagram\"\r\n    | \"icon_placeholder_phone\"\r\n    | \"icon_placeholder_user\"\r\n    | \"icon_read\"\r\n    | \"icon_listen\";\r\n\r\nexport interface IIconProps {\r\n    iconId: TIconNames;\r\n    spriteUrl?: string;\r\n    viewBox?: string;\r\n    className?: string;\r\n    onClick?: () => void;\r\n}\r\n\r\nconst Icon: React.FC<IIconProps> = props => {\r\n    const spriteUrl = props.spriteUrl || \"\";\r\n    const viewBox = props.viewBox || \"0 0 32 32\";\r\n\r\n    return (\r\n        <svg\r\n            viewBox={viewBox}\r\n            className={classNames(props.className, \"icon\", `icon-${props.iconId}`)}\r\n            preserveAspectRatio=\"xMidYMid\"\r\n            onClick={() => props.onClick && props.onClick()}\r\n        >\r\n            <use xmlnsXlink=\"http://www.w3.org/1999/xlink\" xlinkHref={`${spriteUrl}#${props.iconId}`} />\r\n        </svg>\r\n    );\r\n};\r\n\r\nexport default Icon;\r\n","import * as React from \"react\";\r\n\r\nexport interface AnchorProps {\r\n    id?: string;\r\n}\r\n\r\nconst Anchor = ({ id }: AnchorProps) => {\r\n    return <div className=\"anchor\" id={id} />;\r\n};\r\n\r\nexport default Anchor;\r\n","import * as React from \"react\";\r\nimport classNames from \"classnames\";\r\n\r\nexport interface ICtaButtonProps {\r\n    className?: string;\r\n    isLarge?: boolean;\r\n    isInverted?: boolean;\r\n    isSecondary?: boolean;\r\n    link: string;\r\n    onClick?(): void;\r\n}\r\n\r\nconst CtaButton = ({ className, isLarge, isInverted, isSecondary, link, onClick }: ICtaButtonProps) => {\r\n    const baseClass = \"cta-button\";\r\n    const componentClasses = classNames(className, baseClass, {\r\n        [`${baseClass}--large`]: isLarge,\r\n        [`${baseClass}--inverted`]: isInverted,\r\n        [`${baseClass}--secondary`]: isSecondary\r\n    });\r\n\r\n    return <div onClick={onClick} className={componentClasses} dangerouslySetInnerHTML={{ __html: link }} />;\r\n};\r\n\r\nexport default CtaButton;\r\n","import * as React from \"react\";\r\nimport classNames from \"classnames\";\r\nimport { ProductStatus } from \"~/types/product\";\r\n\r\nexport interface ITagProps {\r\n    type?: ProductStatus;\r\n    children: React.ReactNode;\r\n    className?: string;\r\n    shape?: \"pill\" | \"square\";\r\n}\r\n\r\nexport const tagTypeClassMap: { [key in ProductStatus]: string } = {\r\n    NEWS: \"news\",\r\n    SPOT: \"spot\",\r\n    BESTSELLER: \"bestseller\",\r\n    BOOK_OF_THE_MONTH: \"botm\",\r\n    UPCOMING: \"upcoming\"\r\n};\r\n\r\nconst Tag: React.FC<ITagProps> = props => {\r\n    const classModifier = props.type && tagTypeClassMap[props.type];\r\n    const rootClasses = classNames(\"tag\", props.className, `tag--shape-${props.shape || \"pill\"}`, {\r\n        [`tag--${classModifier}`]: props.type\r\n    });\r\n\r\n    return (\r\n        <div className={rootClasses}>\r\n            <span className=\"tag__label\">{props.children}</span>\r\n        </div>\r\n    );\r\n};\r\n\r\nexport default Tag;\r\n","import { MembershipType } from \"~/types/membership\";\r\nimport { IBasketProduct, IProduct } from \"~/types/product\";\r\n// import { IBasketSummationProps } from \"~/components/basket-summation/basket-summation\";\r\nimport { IProductTileProps } from \"~/components/product-tile/product-tile\";\r\n\r\nenum EventTypes {\r\n    SIGNUP = \"eec.signup\",\r\n    PURCHASE = \"eec.purchase\",\r\n    CHECKOUT = \"eec.checkout\",\r\n    ADD_TO_BASKET = \"eec.add\",\r\n    REMOVE_FROM_BASKET = \"eec.remove\",\r\n    CLICK = \"eec.impressionClick\",\r\n    DETAIL_VIEW = \"eec.detail\",\r\n    IMPRESSION_VIEW = \"eec.impressionView\",\r\n    PROMO_VIEW = \"eec.promotionView\",\r\n    PROMO_CLICK = \"eec.promotionClick\",\r\n    VOUCHER = \"eec.voucher\"\r\n}\r\n\r\nenum CurrencyCodes {\r\n    DKK = \"DKK\"\r\n}\r\n\r\nenum TrackingDimensions {\r\n    CAMPAIGN_ID = \"dimension2\",\r\n    MEMBERSHIP_TYPE = \"dimension3\",\r\n    PAYMENT_PERIOD = \"dimension4\",\r\n    DISCOUNT_SPLASH = \"dimension5\"\r\n}\r\n\r\ninterface ITrackingProduct {\r\n    name?: string;\r\n    id?: string;\r\n    price?: number;\r\n    quantity?: number;\r\n    [TrackingDimensions.MEMBERSHIP_TYPE]?: MembershipType | string;\r\n    [TrackingDimensions.PAYMENT_PERIOD]?: string;\r\n    [TrackingDimensions.DISCOUNT_SPLASH]?: string;\r\n}\r\n\r\ninterface IProductImpression extends ITrackingProduct {\r\n    list?: string;\r\n    position: number | undefined;\r\n}\r\n\r\ninterface ICheckoutActionField {\r\n    step: string;\r\n    [TrackingDimensions.CAMPAIGN_ID]?: string;\r\n    option?: string;\r\n    coupon?: string;\r\n}\r\n\r\ninterface IEcommerceTrackingEvent<T> {\r\n    event: EventTypes;\r\n    ecommerce: T & { currencyCode?: CurrencyCodes };\r\n}\r\n\r\ninterface ITrackingEvent {\r\n    event: \"trackEvent\";\r\n    eventData: {\r\n        category: string;\r\n        action: string;\r\n        label: string;\r\n    };\r\n}\r\n\r\nconst mapProductsToTrackingProducts = (\r\n    { title, primaryPriceNumber, productId, quantityNumber, discounts }: IBasketProduct,\r\n    membershipType?: MembershipType,\r\n    paymentPeriod?: string\r\n): ITrackingProduct => {\r\n    const product: ITrackingProduct = {\r\n        name: title,\r\n        price: primaryPriceNumber,\r\n        quantity: quantityNumber || 1,\r\n        [TrackingDimensions.MEMBERSHIP_TYPE]: membershipType || \"\",\r\n        [TrackingDimensions.PAYMENT_PERIOD]: paymentPeriod || \"\",\r\n        [TrackingDimensions.DISCOUNT_SPLASH]: discounts?.map(discount => discount.label).join(\" | \") || \"\"\r\n    };\r\n\r\n    if (productId) {\r\n        product.id = productId;\r\n    }\r\n\r\n    return product;\r\n};\r\n\r\nexport interface ISignupTrackingParams {\r\n    campaignId?: string;\r\n    membershipType?: MembershipType;\r\n    currentStepIndex: number;\r\n    paymentPeriod?: string;\r\n    miniBasketProducts?: IBasketProduct[];\r\n}\r\n\r\ninterface ISignupTrackingEvent\r\n    extends IEcommerceTrackingEvent<{\r\n        checkout: {\r\n            actionField: ICheckoutActionField;\r\n            products: ITrackingProduct[];\r\n        };\r\n    }> {}\r\n\r\nconst generateSignupTrackingEvent = ({\r\n    membershipType,\r\n    campaignId,\r\n    miniBasketProducts,\r\n    currentStepIndex,\r\n    paymentPeriod\r\n}: ISignupTrackingParams): ISignupTrackingEvent => {\r\n    const actionField: ICheckoutActionField = {\r\n        step: (currentStepIndex + 1).toString(),\r\n        option: currentStepIndex > 0 ? paymentPeriod : \"\"\r\n    };\r\n\r\n    actionField[TrackingDimensions.CAMPAIGN_ID] = campaignId || \"\";\r\n\r\n    const products: ITrackingProduct[] = miniBasketProducts\r\n        ? miniBasketProducts.map(product =>\r\n              mapProductsToTrackingProducts(product, membershipType, paymentPeriod)\r\n          )\r\n        : [];\r\n\r\n    const signupTrackingEvent = {\r\n        event: EventTypes.SIGNUP,\r\n        ecommerce: {\r\n            checkout: {\r\n                actionField,\r\n                products\r\n            }\r\n        }\r\n    };\r\n\r\n    return signupTrackingEvent;\r\n};\r\n\r\ninterface ICheckoutTrackingParams {\r\n    products?: IBasketProduct[];\r\n    paymentMethod?: string;\r\n    step: number;\r\n}\r\n\r\ninterface ICheckoutTrackingEvent\r\n    extends IEcommerceTrackingEvent<{\r\n        checkout: {\r\n            actionField: ICheckoutActionField;\r\n            products: ITrackingProduct[];\r\n        };\r\n    }> {}\r\n\r\nconst generateCheckoutTrackingEvent = ({\r\n    products,\r\n    step,\r\n    paymentMethod\r\n}: ICheckoutTrackingParams): ICheckoutTrackingEvent => {\r\n    const actionField: ICheckoutActionField = {\r\n        step: `${step}`\r\n    };\r\n\r\n    if (paymentMethod) {\r\n        actionField.option = paymentMethod;\r\n    }\r\n\r\n    const mappedProducts: ITrackingProduct[] = products\r\n        ? products.map(product => mapProductsToTrackingProducts(product))\r\n        : [];\r\n\r\n    return {\r\n        event: EventTypes.CHECKOUT,\r\n        ecommerce: {\r\n            checkout: {\r\n                actionField,\r\n                products: mappedProducts\r\n            }\r\n        }\r\n    };\r\n};\r\n\r\ninterface IPurchaseTrackingParams {\r\n    membershipType?: MembershipType;\r\n    miniBasketProducts?: IBasketProduct[];\r\n    // miniBasketSummation?: IBasketSummationProps;\r\n    orderId?: string;\r\n    campaignId?: string;\r\n}\r\n\r\ninterface IPurchaseActionField {\r\n    [TrackingDimensions.CAMPAIGN_ID]?: string;\r\n    coupon?: string;\r\n    revenue?: number;\r\n    shipping?: number;\r\n    tax?: number;\r\n    id?: string;\r\n}\r\n\r\ninterface IPurchaseTrackingEvent\r\n    extends IEcommerceTrackingEvent<{\r\n        purchase: {\r\n            actionField: IPurchaseActionField;\r\n            products: ITrackingProduct[];\r\n        };\r\n    }> {}\r\n\r\nconst generatePurchaseTrackingEvent = ({\r\n    membershipType,\r\n    miniBasketProducts,\r\n    // miniBasketSummation,\r\n    orderId,\r\n    campaignId\r\n}: IPurchaseTrackingParams): IPurchaseTrackingEvent => {\r\n    const actionField: IPurchaseActionField = {};\r\n\r\n    if (orderId) {\r\n        actionField.id = orderId;\r\n    }\r\n\r\n    actionField[TrackingDimensions.CAMPAIGN_ID] = campaignId || \"\";\r\n\r\n    // if (miniBasketSummation) {\r\n    //     actionField.tax = miniBasketSummation.vatNumber;\r\n    //     actionField.revenue = miniBasketSummation.totalPriceNumber;\r\n\r\n    //     if (miniBasketSummation.shippingFee) {\r\n    //         actionField.shipping = miniBasketSummation.shippingFeeNumber;\r\n    //     }\r\n    //     if (miniBasketSummation.voucherDiscount) {\r\n    //         actionField.coupon = miniBasketSummation.voucherDiscount;\r\n    //     }\r\n    // }\r\n\r\n    const products: ITrackingProduct[] = miniBasketProducts\r\n        ? miniBasketProducts.map(product => mapProductsToTrackingProducts(product, membershipType))\r\n        : [];\r\n\r\n    const purchaseTrackingEvent = {\r\n        event: EventTypes.PURCHASE,\r\n        ecommerce: {\r\n            currencyCode: CurrencyCodes.DKK,\r\n            purchase: {\r\n                actionField,\r\n                products\r\n            }\r\n        }\r\n    };\r\n\r\n    return purchaseTrackingEvent;\r\n};\r\n\r\ninterface IClickActionField {\r\n    list: string;\r\n}\r\n\r\ninterface IClickTrackingParams\r\n    extends Pick<IProductTileProps, \"trackingList\" | \"trackingPosition\" | \"productId\" | \"title\"> {}\r\n\r\ninterface IClickTrackingEvent\r\n    extends IEcommerceTrackingEvent<{\r\n        click: {\r\n            actionField: IClickActionField;\r\n            products: IProductImpression[];\r\n        };\r\n    }> {}\r\n\r\nconst generateClickTrackingEvent = ({\r\n    trackingList,\r\n    trackingPosition,\r\n    productId,\r\n    title\r\n}: IClickTrackingParams): IClickTrackingEvent => {\r\n    return {\r\n        event: EventTypes.CLICK,\r\n        ecommerce: {\r\n            click: {\r\n                actionField: {\r\n                    list: trackingList\r\n                },\r\n                products: [\r\n                    {\r\n                        id: productId,\r\n                        name: title,\r\n                        position: trackingPosition\r\n                    }\r\n                ]\r\n            }\r\n        }\r\n    };\r\n};\r\n\r\ninterface IDetailActionField {\r\n    list: string;\r\n}\r\n\r\ninterface IDetailViewTrackingParams extends Pick<IProduct, \"title\" | \"productId\"> {\r\n    trackingList: string;\r\n}\r\n\r\ninterface IDetailViewTrackingEvent\r\n    extends IEcommerceTrackingEvent<{\r\n        detail: {\r\n            actionField: IDetailActionField;\r\n            products: ITrackingProduct[];\r\n        };\r\n    }> {}\r\n\r\nconst generateDetailViewTrackingEvent = ({\r\n    title,\r\n    productId,\r\n    trackingList\r\n}: IDetailViewTrackingParams): IDetailViewTrackingEvent => {\r\n    return {\r\n        event: EventTypes.DETAIL_VIEW,\r\n        ecommerce: {\r\n            detail: {\r\n                actionField: {\r\n                    list: trackingList\r\n                },\r\n                products: [\r\n                    {\r\n                        id: productId,\r\n                        name: title\r\n                    }\r\n                ]\r\n            }\r\n        }\r\n    };\r\n};\r\n\r\ninterface IBasketTrackingParams {\r\n    products?: IBasketProduct[];\r\n    trackingList: string;\r\n}\r\n\r\ninterface IAddToBasketTrackingEvent\r\n    extends IEcommerceTrackingEvent<{\r\n        add: {\r\n            actionField: { list: string };\r\n            products: ITrackingProduct[] | undefined;\r\n        };\r\n    }> {}\r\n\r\nconst generateAddToBasketTrackingEvent = ({\r\n    products,\r\n    trackingList\r\n}: IBasketTrackingParams): IAddToBasketTrackingEvent => {\r\n    const basketProducts = products && products.map(product => mapProductsToTrackingProducts(product));\r\n\r\n    return {\r\n        event: EventTypes.ADD_TO_BASKET,\r\n        ecommerce: {\r\n            add: {\r\n                actionField: { list: trackingList },\r\n                products: basketProducts\r\n            }\r\n        }\r\n    };\r\n};\r\n\r\ninterface IRemoveFromBasketTrackingEvent\r\n    extends IEcommerceTrackingEvent<{\r\n        remove: {\r\n            actionField: { list: string };\r\n            products: ITrackingProduct[] | undefined;\r\n        };\r\n    }> {}\r\n\r\nconst generateRemoveFromBasketTrackingEvent = ({\r\n    products,\r\n    trackingList\r\n}: IBasketTrackingParams): IRemoveFromBasketTrackingEvent => {\r\n    const basketProducts = products && products.map(product => mapProductsToTrackingProducts(product));\r\n\r\n    return {\r\n        event: EventTypes.REMOVE_FROM_BASKET,\r\n        ecommerce: {\r\n            remove: {\r\n                actionField: { list: trackingList },\r\n                products: basketProducts\r\n            }\r\n        }\r\n    };\r\n};\r\n\r\ninterface IVoucherTrackingParams {\r\n    // summation?: IBasketSummationProps;\r\n    caller: string;\r\n    action: string;\r\n}\r\ninterface IVoucherTrackingEvent\r\n    extends IEcommerceTrackingEvent<{\r\n        // summation?: IBasketSummationProps;\r\n        caller: string;\r\n        action: string;\r\n    }> {}\r\n\r\nconst generateVoucherTrackingEvent = (props: IVoucherTrackingParams): IVoucherTrackingEvent => {\r\n    return {\r\n        event: EventTypes.VOUCHER,\r\n        ecommerce: {\r\n            // summation: props.summation,\r\n            caller: props.caller,\r\n            action: props.action\r\n        }\r\n    };\r\n};\r\n\r\ninterface IImpressionViewTrackingParams\r\n    extends Required<Pick<IProductTileProps, \"trackingList\" | \"trackingPosition\" | \"productId\" | \"title\">> {}\r\n\r\ninterface IImpressionViewTrackingEvent\r\n    extends IEcommerceTrackingEvent<{\r\n        impressions: IProductImpression[];\r\n    }> {}\r\n\r\nconst generateImpressionViewTrackingEvent = (\r\n    products: IImpressionViewTrackingParams[]\r\n): IImpressionViewTrackingEvent => {\r\n    return {\r\n        event: EventTypes.IMPRESSION_VIEW,\r\n        ecommerce: {\r\n            impressions: products.map(product => {\r\n                return {\r\n                    list: product.trackingList,\r\n                    position: product.trackingPosition,\r\n                    id: product.productId,\r\n                    name: product.title\r\n                };\r\n            })\r\n        }\r\n    };\r\n};\r\n\r\ninterface IPromoViewTrackingEvent\r\n    extends IEcommerceTrackingEvent<{\r\n        promoView: {\r\n            promotions: Array<{\r\n                id: string;\r\n                name: string;\r\n                creative: string;\r\n                position: string;\r\n            }>;\r\n        };\r\n    }> {}\r\n\r\nconst generatePromoViewTrackingEvent = (): IPromoViewTrackingEvent => {\r\n    return {\r\n        event: EventTypes.PROMO_VIEW,\r\n        ecommerce: {\r\n            promoView: {\r\n                promotions: [\r\n                    {\r\n                        id: \"\",\r\n                        name: \"Splash\",\r\n                        creative: \"\",\r\n                        position: \"\"\r\n                    }\r\n                ]\r\n            }\r\n        }\r\n    };\r\n};\r\n\r\ninterface IPromoClickTrackingEvent\r\n    extends IEcommerceTrackingEvent<{\r\n        promoClick: {\r\n            promotions: Array<{\r\n                id: string;\r\n                name: string;\r\n                creative: string;\r\n                position: string;\r\n            }>;\r\n        };\r\n    }> {}\r\n\r\nconst generatePromoClickTrackingEvent = (): IPromoClickTrackingEvent => {\r\n    return {\r\n        event: EventTypes.PROMO_CLICK,\r\n        ecommerce: {\r\n            promoClick: {\r\n                promotions: [\r\n                    {\r\n                        id: \"\",\r\n                        name: \"Splash\",\r\n                        creative: \"\",\r\n                        position: \"\"\r\n                    }\r\n                ]\r\n            }\r\n        }\r\n    };\r\n};\r\n\r\nconst ensureDataLayer = () => {\r\n    if (typeof window === \"undefined\") {\r\n        return false;\r\n    }\r\n\r\n    window.dataLayer = window.dataLayer || [];\r\n    return true;\r\n};\r\n\r\nconst pushEcommerenceTrackingEvent = (trackingEvent: IEcommerceTrackingEvent<unknown>) => {\r\n    if (ensureDataLayer()) window.dataLayer.push(trackingEvent);\r\n};\r\n\r\nexport const pushTrackingEvent = (trackingEvent: ITrackingEvent) => {\r\n    if (ensureDataLayer()) window.dataLayer.push(trackingEvent);\r\n};\r\n\r\nexport const pushAddToBasketTrackingEvent = (props: IBasketTrackingParams) =>\r\n    pushEcommerenceTrackingEvent(generateAddToBasketTrackingEvent(props));\r\n\r\nexport const pushRemoveFromBasketTrackingEvent = (props: IBasketTrackingParams) =>\r\n    pushEcommerenceTrackingEvent(generateRemoveFromBasketTrackingEvent(props));\r\n\r\nexport const pushSignupTrackingEvent = (props: ISignupTrackingParams) =>\r\n    pushEcommerenceTrackingEvent(generateSignupTrackingEvent(props));\r\n\r\nexport const pushCheckoutTrackingEvent = (props: ICheckoutTrackingParams) =>\r\n    pushEcommerenceTrackingEvent(generateCheckoutTrackingEvent(props));\r\n\r\nexport const pushPurchaseTrackingEvent = (props: IPurchaseTrackingParams) =>\r\n    pushEcommerenceTrackingEvent(generatePurchaseTrackingEvent(props));\r\n\r\nexport const pushClickTrackingEvent = (props: IClickTrackingParams) =>\r\n    pushEcommerenceTrackingEvent(generateClickTrackingEvent(props));\r\n\r\nexport const pushDetailViewTrackingEvent = (props: IDetailViewTrackingParams) =>\r\n    pushEcommerenceTrackingEvent(generateDetailViewTrackingEvent(props));\r\n\r\nexport const pushImpressionViewTrackingEvent = (props: IImpressionViewTrackingParams[]) =>\r\n    pushEcommerenceTrackingEvent(generateImpressionViewTrackingEvent(props));\r\n\r\nexport const pushPromoViewTrackingEvent = () =>\r\n    pushEcommerenceTrackingEvent(generatePromoViewTrackingEvent());\r\n\r\nexport const pushPromoClickTrackingEvent = () =>\r\n    pushEcommerenceTrackingEvent(generatePromoClickTrackingEvent());\r\n\r\nexport const pushVoucherTrackingEvent = (props: IVoucherTrackingParams) =>\r\n    pushEcommerenceTrackingEvent(generateVoucherTrackingEvent(props));\r\n","import * as React from \"react\";\r\n\r\nexport interface ProductImageProps extends Omit<React.ImgHTMLAttributes<HTMLImageElement>, \"src\" | \"srcSet\"> {\r\n    className?: string;\r\n    fallbackSrc?: string;\r\n    srcSet: string;\r\n    sizes?: string;\r\n    loading?: React.ImgHTMLAttributes<HTMLImageElement>[\"loading\"];\r\n    ref?: React.Ref<HTMLImageElement>;\r\n    width?: string | number;\r\n    height?: string | number;\r\n}\r\n\r\nconst ProductImage: React.FC<ProductImageProps> = React.forwardRef(\r\n    ({ fallbackSrc, loading = \"lazy\", ...props }, ref) => {\r\n        return <img ref={ref} src={fallbackSrc} loading={loading} {...props} />;\r\n    }\r\n);\r\n\r\nexport default ProductImage;\r\n","import classNames from \"classnames\";\r\nimport * as React from \"react\";\r\n\r\ninterface ISpinnerProps {\r\n    size?: \"small\" | \"default\";\r\n    className?: string;\r\n}\r\nconst Spinner = ({ size = \"default\", className }: ISpinnerProps) => {\r\n    const baseClass = \"spinner\";\r\n    const componentClasses = classNames(baseClass, className, {\r\n        [`${baseClass}--${size}`]: size !== \"default\"\r\n    });\r\n\r\n    return <span className={componentClasses} />;\r\n};\r\n\r\nexport default Spinner;\r\n","import * as React from \"react\";\r\nimport { IProductAuthor } from \"~/types/product\";\r\nimport TruncateMarkup from \"react-truncate-markup\";\r\nimport classNames from \"classnames\";\r\n\r\ninterface IProductAuthorProps {\r\n    authors?: IProductAuthor[];\r\n    maxLines?: number;\r\n    className?: string;\r\n}\r\n\r\nconst ProductAuthors: React.FC<IProductAuthorProps> = ({ authors, className, maxLines }) => {\r\n    if (!authors?.length) {\r\n        return null;\r\n    }\r\n\r\n    const baseClass = \"product-authors\";\r\n    const classes = classNames(baseClass, className);\r\n\r\n    const Wrapper: React.FC = ({ children }) =>\r\n        maxLines ? (\r\n            <TruncateMarkup lines={maxLines}>{children}</TruncateMarkup>\r\n        ) : (\r\n            <React.Fragment>{children}</React.Fragment>\r\n        );\r\n\r\n    return (\r\n        <Wrapper>\r\n            <ul className={classes}>\r\n                {authors.map((author, index) => {\r\n                    return (\r\n                        <li key={index} className={`${baseClass}__item`}>\r\n                            {author.url ? (\r\n                                <a href={author.url} title={author.name}>\r\n                                    {author.name}\r\n                                </a>\r\n                            ) : (\r\n                                <span>{author.name}</span>\r\n                            )}\r\n                        </li>\r\n                    );\r\n                })}\r\n            </ul>\r\n        </Wrapper>\r\n    );\r\n};\r\n\r\nexport default ProductAuthors;\r\n","import * as React from \"react\";\r\nimport classNames from \"classnames\";\r\nimport Icon, { TIconNames } from \"../icons/icon\";\r\nimport Spinner from \"~/components/spinner/spinner\";\r\n\r\ntype IOnClickFunction = (e: React.MouseEvent<HTMLButtonElement>) => void;\r\n\r\nexport interface IButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\r\n    onClick?: IOnClickFunction;\r\n    disabled?: boolean;\r\n    className?: string;\r\n    loading?: boolean;\r\n    iconId?: TIconNames;\r\n    isLarge?: boolean;\r\n    isInverted?: boolean;\r\n    isSecondary?: boolean;\r\n}\r\n\r\nconst Button: React.SFC<IButtonProps> = props => {\r\n    const baseClass = \"button\";\r\n    const componentClasses = classNames(baseClass, props.className, {\r\n        [`${baseClass}--large`]: props.isLarge,\r\n        [`${baseClass}--inverted`]: props.isInverted,\r\n        [`${baseClass}--secondary`]: props.isSecondary,\r\n        [`${baseClass}--loading`]: props.loading\r\n    });\r\n\r\n    return (\r\n        <button\r\n            className={componentClasses}\r\n            type={props.type || \"button\"}\r\n            disabled={!!(props.disabled || props.loading)}\r\n            onClick={e => {\r\n                if (props.onClick) {\r\n                    props.onClick(e);\r\n                }\r\n            }}\r\n        >\r\n            {props.iconId && <Icon iconId={props.iconId} className={`${baseClass}__icon`} />}\r\n            {props.loading && <Spinner />}\r\n            <span className={`${baseClass}__text`}>{props.children}</span>\r\n        </button>\r\n    );\r\n};\r\nexport default Button;\r\n","import { IDiscountOffer } from \"./discount-offer\";\r\n\r\nexport enum PriceTypesEnum {\r\n    \"CLUB\" = \"CLUB\",\r\n    \"VIP\" = \"VIP\",\r\n    \"SPOT\" = \"SPOT\"\r\n}\r\nexport type PriceTypes = keyof typeof PriceTypesEnum;\r\n\r\nexport enum ProductStatusEnum {\r\n    \"NEWS\" = \"NEWS\",\r\n    \"BESTSELLER\" = \"BESTSELLER\",\r\n    \"SPOT\" = \"SPOT\",\r\n    \"BOOK_OF_THE_MONTH\" = \"BOOK_OF_THE_MONTH\",\r\n    \"UPCOMING\" = \"UPCOMING\"\r\n}\r\nexport type ProductStatus = keyof typeof ProductStatusEnum;\r\n\r\nexport enum ProductStockStatusEnum {\r\n    \"LOW_IN_STOCK\" = \"warning\",\r\n    \"OUT_OF_STOCK\" = \"error\"\r\n}\r\n\r\nexport type ProductStockStatus = keyof typeof ProductStockStatusEnum;\r\n\r\nexport interface IProductAuthor {\r\n    name: string;\r\n    url?: string;\r\n}\r\n\r\nexport interface IProductDiscount {\r\n    label?: string;\r\n    value?: string;\r\n}\r\n\r\nexport interface IProduct {\r\n    productId: string;\r\n    title: string;\r\n    description?: string;\r\n    authors?: IProductAuthor[];\r\n    imageFallbackSrc?: string;\r\n    imageSrcSet?: string;\r\n    priceType?: PriceTypes;\r\n    status?: ProductStatus;\r\n    statusLabel?: string;\r\n    url?: string;\r\n    target?: string;\r\n    isCurrentBookOfTheMonth?: boolean;\r\n    bookOfTheMonthStatusLabel?: string;\r\n    materialType?: string;\r\n    ctaLink?: string;\r\n    primaryPrice?: string;\r\n}\r\n\r\nexport interface IBasketProduct extends IProduct {\r\n    quantityNumber: number;\r\n    quantity: string;\r\n    discountsModalTitle?: string;\r\n    totalLabel?: string;\r\n    priceLabel?: string;\r\n    discountLabel?: string;\r\n    calculatedPrimaryPrice: string;\r\n    calculatedPrimaryPriceNumber: number;\r\n    calculatedSecondaryPrice?: string;\r\n    calculatedSecondaryPriceNumber?: number;\r\n    isFree?: boolean;\r\n    materialType?: string;\r\n    numberOfProductsLabel?: string;\r\n    deliveryLabel?: string;\r\n    deliveryDetails?: string;\r\n    stockStatus?: ProductStockStatus;\r\n    stockStatusLabel?: string;\r\n    stockStatusDetails?: string;\r\n    discountOffer?: IDiscountOffer;\r\n    primaryPrice?: string;\r\n    primaryPriceNumber?: number;\r\n    secondaryPrice?: string;\r\n    discount?: string;\r\n    discounts?: IProductDiscount[];\r\n}\r\n","import classNames from \"classnames\";\r\nimport * as React from \"react\";\r\n// import ProductDiscountSplash from \"../product-discount-splash/product-discount-splash\";\r\nimport ProductImage, { ProductImageProps } from \"../product-image/product-image\";\r\nimport Icon from \"../icons/icon\";\r\nimport { IProductTileChildProps, IProductTileProps } from \"./product-tile\";\r\nimport Tag from \"../tag/tag\";\r\n\r\ninterface IProductTileImageProps\r\n    extends Pick<\r\n            IProductTileProps,\r\n            | \"hasQuickView\"\r\n            | \"imageSrcSet\"\r\n            | \"imageFallbackSrc\"\r\n            | \"url\"\r\n            | \"target\"\r\n            | \"title\"\r\n            // | \"discount\"\r\n            | \"status\"\r\n        >,\r\n        Pick<ProductImageProps, \"sizes\">,\r\n        IProductTileChildProps {\r\n    detailsLabel?: string;\r\n    hideStatus?: boolean;\r\n    statusLabel?: string;\r\n}\r\n\r\nconst ProductTileImage: React.FC<IProductTileImageProps> = ({\r\n    hasQuickView,\r\n    baseClass,\r\n    url,\r\n    target,\r\n    title,\r\n    imageSrcSet,\r\n    imageFallbackSrc,\r\n    sizes,\r\n    // discount,\r\n    detailsLabel,\r\n    hideStatus,\r\n    status,\r\n    statusLabel,\r\n    onClick\r\n}) => {\r\n    const imageBaseClasses = classNames(`${baseClass}__image-wrapper`, {\r\n        [`${baseClass}__image-wrapper--hasQuickView`]: hasQuickView\r\n    });\r\n\r\n    const Image = () =>\r\n        imageSrcSet ? (\r\n            <ProductImage\r\n                className=\"product-tile__image\"\r\n                srcSet={imageSrcSet}\r\n                fallbackSrc={imageFallbackSrc}\r\n                sizes={sizes || \"200px\"}\r\n                alt={title}\r\n            />\r\n        ) : null;\r\n\r\n    return hasQuickView ? (\r\n        <div className={imageBaseClasses} onClick={onClick}>\r\n            <Image />\r\n            {/* {discount && <ProductDiscountSplash discount={discount} />} */}\r\n            <button className={`${baseClass}__details-button`}>\r\n                <Icon iconId=\"24_expand\" className={`${baseClass}__details-icon`} />\r\n                <span>{detailsLabel}</span>\r\n            </button>\r\n        </div>\r\n    ) : (\r\n        <a className={imageBaseClasses} href={url} target={target} onClick={onClick}>\r\n            {!hideStatus && !!status && (\r\n                <Tag className={`${baseClass}__status-tag`} type={status}>\r\n                    {statusLabel}\r\n                </Tag>\r\n            )}\r\n            <Image />\r\n            {/* {discount && (\r\n                <ProductDiscountSplash className=\"product-tile__image-discount-splash\" discount={discount} />\r\n            )} */}\r\n        </a>\r\n    );\r\n};\r\n\r\nexport default React.memo(ProductTileImage);\r\n","import React from \"react\";\r\nimport { IProductTileChildProps, IProductTileProps } from \"./product-tile\";\r\nimport TruncateMarkup from \"react-truncate-markup\";\r\n\r\ninterface IProductTileTitleProps\r\n    extends Pick<IProductTileProps, \"hasQuickView\" | \"title\" | \"url\" | \"target\">,\r\n        IProductTileChildProps {}\r\n\r\nconst ProductTileTitle: React.FC<IProductTileTitleProps> = ({\r\n    baseClass,\r\n    title,\r\n    url,\r\n    target,\r\n    onClick,\r\n    hasQuickView\r\n}) => (\r\n    <TruncateMarkup lines={2}>\r\n        {hasQuickView ? (\r\n            <button className={`${baseClass}__title reset-button`} type=\"button\" onClick={onClick}>\r\n                {title}\r\n            </button>\r\n        ) : (\r\n            <a href={url} target={target} className={`${baseClass}__title reset-a`} onClick={onClick}>\r\n                {title}\r\n            </a>\r\n        )}\r\n    </TruncateMarkup>\r\n);\r\n\r\nexport default ProductTileTitle;\r\n","import * as React from \"react\";\r\n// import ButtonAddToBasket from \"~/components/button-add-to-basket/button-add-to-basket\";\r\nimport classNames from \"classnames\";\r\nimport { IProduct, PriceTypesEnum } from \"~/types/product\";\r\nimport CtaButton from \"~/components/cta-button/cta-button\";\r\n// import Icon from \"../icons/icon\";\r\nimport { pushClickTrackingEvent, pushImpressionViewTrackingEvent } from \"~/utils/tracking-utils\";\r\nimport { useInView } from \"react-intersection-observer\";\r\nimport ProductAuthors from \"../product-authors/product-authors\";\r\n// import { useSelector } from \"react-redux\";\r\n// import { selectIsOutOfStock } from \"~/store/reducers/basket/basket-reducer\";\r\n// import { IRootState } from \"~/store/reducers\";\r\n// import ErrorMessage from \"../error-message/error-message\";\r\nimport ProductTileImage from \"./product-tile-image\";\r\nimport ProductTileTitle from \"./product-tile-title\";\r\n// import { IDiscountOffer } from \"~/types/discount-offer\";\r\n// import DiscountModal from \"../product-details/discount-modal/discount-modal\";\r\n// import ProductDiscountSplash from \"../product-discount-splash/product-discount-splash\";\r\n// import { hasDeclinedDiscountThisOffer } from \"~/utils/discount-utils\";\r\n\r\nexport interface IProductTileProps extends IProduct {\r\n    className?: string;\r\n    hideBackground?: boolean;\r\n    hideStatus?: boolean;\r\n    hideAuthors?: boolean;\r\n    hasTopPadding?: boolean;\r\n    // bottomPaddedSubText?: boolean;\r\n    // hasBottomPaddingNumberOfProducts?: boolean;\r\n    ctaLabel?: string;\r\n    ctaLink?: string;\r\n    detailsLabel?: string;\r\n    hasQuickView?: boolean;\r\n    onQuickViewClick?: () => void;\r\n    // addToBasketWebApiUrl?: string;\r\n    // secondaryPriceLabel?: string;\r\n    sizes?: string;\r\n    trackingPosition?: number;\r\n    // discountOffer?: IDiscountOffer;\r\n    trackingList: string;\r\n    showCtaAsLink?: boolean;\r\n    singleItemHighlight?: boolean;\r\n    btnIsLarge?: boolean;\r\n    description?: string;\r\n    // showDiscountOfferModal?: boolean;\r\n}\r\n\r\nexport interface IProductTileChildProps {\r\n    baseClass: string;\r\n    onClick: () => void;\r\n}\r\n\r\nconst ProductTile: React.FC<IProductTileProps> = ({\r\n    // addToBasketWebApiUrl,\r\n    authors,\r\n    // bottomPaddedSubText,\r\n    btnIsLarge,\r\n    className,\r\n    // ctaLabel,\r\n    ctaLink,\r\n    description,\r\n    detailsLabel,\r\n    // discount,\r\n    // discountOffer,\r\n    // hasBottomPaddingNumberOfProducts,\r\n    hasQuickView,\r\n    hasTopPadding,\r\n    hideAuthors,\r\n    hideBackground,\r\n    hideStatus,\r\n    imageFallbackSrc,\r\n    imageSrcSet,\r\n    // materialType,\r\n    // numberOfProductsLabel,\r\n    onQuickViewClick,\r\n    productId,\r\n    // secondaryPrice,\r\n    // secondaryPriceLabel,\r\n    showCtaAsLink,\r\n    singleItemHighlight,\r\n    sizes,\r\n    status,\r\n    statusLabel,\r\n    // stockStatusLabel,\r\n    target,\r\n    title,\r\n    trackingList,\r\n    trackingPosition,\r\n    url\r\n    // showDiscountOfferModal = false,\r\n    // ...props\r\n}) => {\r\n    // const isOutOfStock = useSelector((state: IRootState) => selectIsOutOfStock(state, productId));\r\n    // const [discountModalOpen, setDiscountModalOpen] = React.useState(false);\r\n\r\n    // const onAddToBasket = () => {\r\n    //     if (!discountOffer) {\r\n    //         return;\r\n    //     }\r\n\r\n    //     if (hasDeclinedDiscountThisOffer(discountOffer)) {\r\n    //         return;\r\n    //     }\r\n\r\n    //     if (!showDiscountOfferModal) {\r\n    //         return;\r\n    //     }\r\n\r\n    //     setDiscountModalOpen(true);\r\n    // };\r\n\r\n    const baseClass = \"product-tile\";\r\n    const classes = classNames(baseClass, className, {\r\n        [`${baseClass}--noBackground`]: hideBackground,\r\n        [`${baseClass}--hasQuickView`]: hasQuickView,\r\n        [`${baseClass}--spot`]: status === PriceTypesEnum.SPOT,\r\n        [`${baseClass}--topPadded`]: hasTopPadding,\r\n        // [`${baseClass}--bottomPaddedSubText`]: bottomPaddedSubText,\r\n        // [`${baseClass}--bottomPaddedNumberOfProducts`]: hasBottomPaddingNumberOfProducts,\r\n        [`${baseClass}--singleProduct`]: singleItemHighlight\r\n    });\r\n\r\n    const [ref, inView] = useInView({\r\n        triggerOnce: true\r\n    });\r\n\r\n    const clickTrackingEvent = () =>\r\n        pushClickTrackingEvent({\r\n            productId,\r\n            title,\r\n            trackingList,\r\n            trackingPosition\r\n        });\r\n\r\n    React.useEffect(() => {\r\n        if (inView && trackingPosition) {\r\n            pushImpressionViewTrackingEvent([\r\n                {\r\n                    productId,\r\n                    title,\r\n                    trackingList,\r\n                    trackingPosition\r\n                }\r\n            ]);\r\n        }\r\n    }, [inView]);\r\n\r\n    const onTileClick = () => {\r\n        if (hasQuickView) {\r\n            onQuickViewClick?.();\r\n        } else {\r\n            clickTrackingEvent();\r\n        }\r\n    };\r\n    // const bottomClasses = classNames(`${baseClass}__bottom`, {\r\n    //     [`${baseClass}__bottom--subText`]: secondaryPrice || stockStatusLabel,\r\n    //     [`${baseClass}__bottom--numberOfProducts`]: numberOfProductsLabel\r\n    // });\r\n\r\n    return (\r\n        <div id={`product-${productId}`} className={classes} ref={ref}>\r\n            {/* {showDiscountOfferModal && discountOffer && (\r\n                <DiscountModal\r\n                    // disableWebApiUrl={disableDiscountOfferWebApiUrl}\r\n                    isOpen={discountModalOpen}\r\n                    setOpen={setDiscountModalOpen}\r\n                    addToBasketWebApiUrl={addToBasketWebApiUrl}\r\n                    discount={discountOffer}\r\n                    secondaryPriceLabel={secondaryPriceLabel}\r\n                    {...props}\r\n                />\r\n            )} */}\r\n            <ProductTileImage\r\n                status={status}\r\n                statusLabel={statusLabel}\r\n                hideStatus={hideStatus}\r\n                hasQuickView={hasQuickView}\r\n                onClick={onTileClick}\r\n                baseClass={baseClass}\r\n                url={url}\r\n                target={target}\r\n                title={title}\r\n                detailsLabel={detailsLabel}\r\n                imageSrcSet={imageSrcSet}\r\n                imageFallbackSrc={imageFallbackSrc}\r\n                sizes={sizes}\r\n                // discount={discount}\r\n            />\r\n            {/* {singleItemHighlight && discount && (\r\n                <ProductDiscountSplash className={`${baseClass}__discount-splash`} discount={discount} />\r\n            )} */}\r\n            <div className={`${baseClass}__info-container`}>\r\n                <div className={`${baseClass}__info`}>\r\n                    <ProductTileTitle\r\n                        hasQuickView={hasQuickView}\r\n                        baseClass={baseClass}\r\n                        title={title}\r\n                        url={url}\r\n                        target={target}\r\n                        onClick={onTileClick}\r\n                    />\r\n                    {!hideAuthors && (\r\n                        <ProductAuthors\r\n                            className={`${baseClass}__product-authors`}\r\n                            authors={authors}\r\n                            maxLines={1}\r\n                        />\r\n                    )}\r\n                    {/* {materialType && <span className={`${baseClass}__material-type`}>{materialType}</span>} */}\r\n                    {singleItemHighlight && description && (\r\n                        <div\r\n                            className={`${baseClass}__description`}\r\n                            dangerouslySetInnerHTML={{ __html: description }}\r\n                        />\r\n                    )}\r\n                </div>\r\n                {ctaLink && (\r\n                    <>\r\n                        {showCtaAsLink ? (\r\n                            <div\r\n                                onClick={() => {\r\n                                    if (!hasQuickView) {\r\n                                        clickTrackingEvent();\r\n                                    }\r\n                                }}\r\n                                className={`${baseClass}__cta-link`}\r\n                                dangerouslySetInnerHTML={{ __html: ctaLink }}\r\n                            />\r\n                        ) : (\r\n                            <CtaButton\r\n                                onClick={() => {\r\n                                    if (!hasQuickView) {\r\n                                        clickTrackingEvent();\r\n                                    }\r\n                                }}\r\n                                className={`${baseClass}__button`}\r\n                                link={ctaLink}\r\n                                isLarge={btnIsLarge ?? true}\r\n                            />\r\n                        )}\r\n                    </>\r\n                )}\r\n                {/* {addToBasketWebApiUrl && !ctaLink && (\r\n                    <ButtonAddToBasket\r\n                        className={`${baseClass}__button`}\r\n                        addToBasketWebApiUrl={addToBasketWebApiUrl}\r\n                        productId={productId}\r\n                        trackingList={trackingList}\r\n                        disabled={isOutOfStock.value}\r\n                        isLarge={btnIsLarge ?? true}\r\n                        onAdd={onAddToBasket}\r\n                    >\r\n                        {ctaLabel}\r\n                    </ButtonAddToBasket>\r\n                )} */}\r\n                {/* {(secondaryPrice || stockStatusLabel || numberOfProductsLabel) && (\r\n                    <div className={bottomClasses}>\r\n                        {isOutOfStock.value && isOutOfStock.error && (\r\n                            <ErrorMessage\r\n                                className={`${baseClass}__sub-text`}\r\n                                errorSeverity=\"error\"\r\n                                errorMessage={isOutOfStock.error}\r\n                            />\r\n                        )}\r\n                        {secondaryPriceLabel && secondaryPrice && (\r\n                            <div className={`${baseClass}__sub-text ${baseClass}__secondary-price`}>\r\n                                {secondaryPriceLabel} {secondaryPrice}\r\n                            </div>\r\n                        )}\r\n                        {stockStatusLabel && (\r\n                            <div className={`${baseClass}__sub-text ${baseClass}__stock-status`}>\r\n                                {stockStatusLabel}\r\n                            </div>\r\n                        )}\r\n\r\n                        {numberOfProductsLabel && (\r\n                            <div className={`${baseClass}__number-of-products`}>\r\n                                <Icon iconId=\"32_katalog\" />\r\n                                <span>{numberOfProductsLabel}</span>\r\n                            </div>\r\n                        )}\r\n                    </div>\r\n                )} */}\r\n            </div>\r\n        </div>\r\n    );\r\n};\r\n\r\nexport default React.memo(ProductTile);\r\n","import * as React from \"react\";\r\nimport { WrappedFieldProps } from \"redux-form\";\r\nimport Icon from \"../icons/icon\";\r\nimport classNames from \"classnames\";\r\nimport useShuffleIndex from \"~/hooks/useShuffleIndex\";\r\n\r\nexport interface IInputSelectProps {\r\n    fieldName: string;\r\n    label?: string;\r\n    disabled?: boolean;\r\n    className?: string;\r\n    type?: string;\r\n    required?: boolean;\r\n    options: Array<{\r\n        label: string;\r\n        value: string;\r\n    }>;\r\n    defaultLabel?: string;\r\n    enableInlineError?: boolean;\r\n    forceErrorStyling?: boolean;\r\n    excludeDefaultOption?: boolean;\r\n    readyForSorting?: boolean;\r\n}\r\n\r\nconst InputSelect: React.FC<IInputSelectProps & WrappedFieldProps> = props => {\r\n    const {\r\n        className,\r\n        options,\r\n        label,\r\n        meta: { touched, error },\r\n        defaultLabel,\r\n        excludeDefaultOption,\r\n        readyForSorting,\r\n        enableInlineError,\r\n        forceErrorStyling\r\n    } = props;\r\n    const DEFAULT_OPTION = \"\";\r\n    const { onChange, ...input } = props.input;\r\n    const allOptions =\r\n        defaultLabel && !excludeDefaultOption\r\n            ? [{ label: defaultLabel, value: DEFAULT_OPTION }, ...options]\r\n            : options;\r\n    const inputHasError = enableInlineError && touched && error;\r\n    const [dropdownVisible, setDropdownVisible] = React.useState(false);\r\n    const [currentIndex, shuffle] = useShuffleIndex(allOptions.length);\r\n    const dropdownRef = React.useRef<HTMLDivElement>(null);\r\n    const isAValueSelected = input.value !== DEFAULT_OPTION;\r\n    const currentlySelectedOption =\r\n        isAValueSelected &&\r\n        allOptions.find(option => {\r\n            return option.value === input.value;\r\n        });\r\n    const toggleDropdown = (toggleState = !dropdownVisible) => {\r\n        if (!toggleState) {\r\n            shuffle(\"reset\");\r\n        }\r\n        setDropdownVisible(toggleState);\r\n    };\r\n    const rootClasses = classNames(\"input-wrapper\", className, {\r\n        \"input-select-label--float\": isAValueSelected,\r\n        \"input-select--dropdownVisible\": dropdownVisible,\r\n        \"input-select--readyForSorting\": readyForSorting,\r\n        \"input-wrapper--hasError\": inputHasError || forceErrorStyling\r\n    });\r\n\r\n    return (\r\n        <div\r\n            className={rootClasses}\r\n            onBlur={(event: React.FocusEvent) => {\r\n                // Only close dropdown if focus moves to element outside component in order allow click events\r\n                if (!dropdownRef.current?.contains((event.relatedTarget || document.activeElement) as Node)) {\r\n                    toggleDropdown(false);\r\n                }\r\n            }}\r\n            ref={dropdownRef}\r\n        >\r\n            {label && (\r\n                <label className=\"input-select-label\" htmlFor={input.name}>\r\n                    {label}\r\n                </label>\r\n            )}\r\n            <button\r\n                id={input.name}\r\n                className=\"input-select\"\r\n                onClick={() => toggleDropdown()}\r\n                type=\"button\"\r\n                onKeyPress={(event: React.KeyboardEvent<HTMLButtonElement>) => {\r\n                    // Tab\r\n                    if (event.key !== \"Tab\") {\r\n                        event.preventDefault();\r\n                    }\r\n                    // Enter\r\n                    if (event.key === \"Enter\") {\r\n                        if (dropdownVisible) {\r\n                            // An option was selected\r\n                            onChange(allOptions[currentIndex].value);\r\n                        }\r\n                        toggleDropdown();\r\n                    }\r\n                }}\r\n                onKeyDown={(event: React.KeyboardEvent<HTMLButtonElement>) => {\r\n                    // ScrollIntoView with options does not work in all browsers.\r\n                    // Hence this check which means no support in IE/Edge/Safari.\r\n                    const supportsNativeSmoothScroll = \"scrollBehavior\" in document.documentElement.style;\r\n\r\n                    // Escape\r\n                    if (event.keyCode === 27) {\r\n                        toggleDropdown(false);\r\n                    }\r\n                    // ArrowDown\r\n                    if (event.keyCode === 40) {\r\n                        event.preventDefault();\r\n                        if (!dropdownVisible) {\r\n                            toggleDropdown(true);\r\n                        } else {\r\n                            shuffle(\"increment\");\r\n\r\n                            if (supportsNativeSmoothScroll) {\r\n                                const nextIndex = (currentIndex + 1) % allOptions.length;\r\n                                const currentElement = document.querySelector(\r\n                                    `[data-value=\"${allOptions[nextIndex].value}\"]`\r\n                                );\r\n                                currentElement?.scrollIntoView({ behavior: \"smooth\", block: \"nearest\" });\r\n                            }\r\n                        }\r\n                    }\r\n                    // ArrowUp\r\n                    if (event.keyCode === 38) {\r\n                        event.preventDefault();\r\n                        if (!dropdownVisible) {\r\n                            toggleDropdown(true);\r\n                        } else {\r\n                            shuffle(\"decrement\");\r\n\r\n                            if (supportsNativeSmoothScroll) {\r\n                                const nextIndex =\r\n                                    (currentIndex + (allOptions.length - 1)) % allOptions.length;\r\n                                const currentElement = document.querySelector(\r\n                                    `[data-value=\"${allOptions[nextIndex].value}\"]`\r\n                                );\r\n                                currentElement?.scrollIntoView({ behavior: \"smooth\", block: \"nearest\" });\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    // Space (Edge browser only): In Edge 'Space' does not trigger and onClick event\r\n                    // as it does in other browsers. Hence we need to add this specifically.\r\n                    const isBrowserEdge = navigator.userAgent.toLowerCase().indexOf(\"edge\") !== -1;\r\n                    if (isBrowserEdge && event.keyCode === 32) {\r\n                        if (dropdownVisible) {\r\n                            // An option was selected\r\n                            onChange(allOptions[currentIndex].value);\r\n                        }\r\n                        toggleDropdown();\r\n                    }\r\n                }}\r\n                role=\"button\"\r\n            >\r\n                {currentlySelectedOption && currentlySelectedOption.label}\r\n            </button>\r\n            {dropdownVisible && (\r\n                <ul className=\"input-select__dropdown\" id={`${input.name}-dropdown`}>\r\n                    {allOptions.map((option, index) => {\r\n                        const isOptionSelected = input.value === option.value;\r\n\r\n                        return (\r\n                            <li key={index} className=\"input-select__option\">\r\n                                <button\r\n                                    className=\"input-select__option-button reset-button\"\r\n                                    aria-label={option.label}\r\n                                    tabIndex={-1}\r\n                                    type=\"button\"\r\n                                    data-value={option.value}\r\n                                    onClick={(event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\r\n                                        const { target } = event;\r\n                                        const dataValue = (target as Element).getAttribute(\"data-value\");\r\n                                        let value;\r\n                                        if (typeof option.value === \"number\") {\r\n                                            // Make sure that the value is parsed as number\r\n                                            // if that is what the options value is\r\n                                            value = dataValue && parseInt(dataValue, 10);\r\n                                        } else {\r\n                                            value = dataValue;\r\n                                        }\r\n                                        toggleDropdown(false);\r\n                                        onChange(value);\r\n                                    }}\r\n                                    data-active={currentIndex === index}\r\n                                    disabled={isOptionSelected}\r\n                                >\r\n                                    {option.label}\r\n                                </button>\r\n                            </li>\r\n                        );\r\n                    })}\r\n                </ul>\r\n            )}\r\n            <Icon iconId=\"icon_16_arrow-down\" className=\"input-select__icon\" />\r\n\r\n            {inputHasError && <div className=\"input__error\" dangerouslySetInnerHTML={{ __html: error }} />}\r\n        </div>\r\n    );\r\n};\r\n\r\nexport default InputSelect;\r\n","import * as React from \"react\";\r\n\r\ntype ShuffleAction = \"increment\" | \"decrement\" | \"reset\";\r\n\r\nexport default function useShuffleIndex(\r\n    length: number,\r\n    initial = 0\r\n): [number, (shuffleAction: ShuffleAction) => void] {\r\n    const [currentIndex, setCurrentIndex] = React.useState(initial);\r\n\r\n    const shuffle = (shuffleAction: ShuffleAction) => {\r\n        switch (shuffleAction) {\r\n            case \"increment\":\r\n                setCurrentIndex((currentIndex + 1) % length);\r\n                break;\r\n            case \"decrement\":\r\n                setCurrentIndex((currentIndex + (length - 1)) % length);\r\n                break;\r\n            case \"reset\":\r\n                setCurrentIndex(initial);\r\n                break;\r\n            default:\r\n                return;\r\n        }\r\n    };\r\n\r\n    return [currentIndex, shuffle];\r\n}\r\n","import * as React from \"react\";\r\nimport classNames from \"classnames\";\r\n\r\nconst Gallery: React.FC<{ isCentered?: boolean }> = ({ children, isCentered }) => {\r\n    return (\r\n        <div\r\n            className={classNames(\"gallery\", {\r\n                \"gallery--isCentered\": isCentered\r\n            })}\r\n        >\r\n            {children}\r\n        </div>\r\n    );\r\n};\r\n\r\nexport default Gallery;\r\n","import { useState } from \"react\";\r\n\r\nexport type AccordionIndex = number | string | undefined;\r\n\r\nexport function useAccordion(\r\n    defaultIndex?: AccordionIndex\r\n): [AccordionIndex, (index: AccordionIndex) => void] {\r\n    const [activeIndex, setActiveIndex] = useState<AccordionIndex>(defaultIndex);\r\n\r\n    const toggleActiveIndex = (index: AccordionIndex) => {\r\n        if (activeIndex === index) {\r\n            return setActiveIndex(undefined);\r\n        }\r\n        setActiveIndex(index);\r\n    };\r\n\r\n    return [activeIndex, toggleActiveIndex];\r\n}\r\n","import * as React from \"react\";\r\nimport AnimateHeight from \"react-animate-height\";\r\nimport classNames from \"classnames\";\r\n\r\nexport interface IAccordionItemProps {\r\n    isActive?: boolean;\r\n    className?: string;\r\n    renderHeader: React.ReactNode;\r\n    renderContent?: React.ReactNode;\r\n    duration?: number;\r\n}\r\n\r\nconst AccordionItem: React.FC<IAccordionItemProps> = props => {\r\n    const baseRootClass = \"accordion-item\";\r\n    const rootClasses = classNames(baseRootClass, props.className, {\r\n        [`${baseRootClass}--isExpanded`]: props.isActive\r\n    });\r\n\r\n    return (\r\n        <div className={rootClasses}>\r\n            {props.renderHeader}\r\n            {props.renderContent && (\r\n                <AnimateHeight\r\n                    className=\"accordion-rah-content\"\r\n                    contentClassName=\"accordion-content-wrapper\"\r\n                    duration={props.duration || 300}\r\n                    applyInlineTransitions={false}\r\n                    height={props.isActive ? \"auto\" : 0}\r\n                >\r\n                    {props.renderContent}\r\n                </AnimateHeight>\r\n            )}\r\n        </div>\r\n    );\r\n};\r\n\r\nexport default AccordionItem;\r\n","import * as React from \"react\";\r\nimport classNames from \"classnames\";\r\nimport Icon from \"../../icons/icon\";\r\nimport Spinner from \"~/components/spinner/spinner\";\r\n\r\ninterface IAccordionHeaderProps {\r\n    onClick?: (activeIndex: number | undefined) => void;\r\n    isActive?: boolean;\r\n    isDisabled?: boolean;\r\n    isLoading?: boolean;\r\n    hideIcon?: boolean;\r\n    index?: number;\r\n    className?: string;\r\n    tabIndex?: number | undefined;\r\n}\r\n\r\nconst AccordionHeader: React.FC<IAccordionHeaderProps> = props => {\r\n    const baseClass = \"accordion-header\";\r\n    const rootClasses = classNames(baseClass, props.className, {\r\n        [`${baseClass}--isActive`]: props.isActive,\r\n        [`${baseClass}--isDisabled`]: props.isDisabled,\r\n        [`${baseClass}--isLoading`]: props.isLoading\r\n    });\r\n\r\n    return (\r\n        <div\r\n            className={rootClasses}\r\n            tabIndex={props.tabIndex}\r\n            onClick={() => props.onClick && props.onClick(props.index)}\r\n            onKeyPress={event => {\r\n                if (event.key === \"Enter\") {\r\n                    return props.onClick && props.onClick(props.index);\r\n                }\r\n            }}\r\n        >\r\n            {props.children}\r\n\r\n            {!props.hideIcon && (\r\n                <div className={`${baseClass}__icon-wrapper`}>\r\n                    <Spinner />\r\n\r\n                    <Icon\r\n                        className={`${baseClass}__icon`}\r\n                        iconId={props.isActive ? \"icon_16_arrow-up\" : \"icon_16_arrow-down\"}\r\n                    />\r\n                </div>\r\n            )}\r\n        </div>\r\n    );\r\n};\r\n\r\nexport default AccordionHeader;\r\n","import * as React from \"react\";\r\nimport classNames from \"classnames\";\r\n\r\ninterface IAccordionContentProps {\r\n    className?: string;\r\n}\r\n\r\nconst AccordionContent: React.FC<IAccordionContentProps> = props => {\r\n    const rootClasses = classNames(\"accordion-content\", props.className);\r\n    return <div className={rootClasses}>{props.children}</div>;\r\n};\r\n\r\nexport default AccordionContent;\r\n","import * as React from \"react\";\r\nimport classNames from \"classnames\";\r\n\r\nexport interface IAccordionProps {\r\n    className?: string;\r\n}\r\n\r\nconst Accordion: React.FC<IAccordionProps> = props => {\r\n    const rootClasses = classNames(\"accordion\", props.className);\r\n    return <div className={rootClasses}>{props.children}</div>;\r\n};\r\n\r\nexport default Accordion;\r\n"],"sourceRoot":""}