{"version":3,"sources":["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/product-authors/product-authors.tsx","webpack:///./src/Frontend/app/components/spinner/spinner.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","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"],"names":["props","label","required","requiredIndicatorOnly","rootClasses","className","baseClass","switchStyle","inputId","idPrefix","fieldName","htmlFor","input","type","id","checked","value","autoComplete","role","iconId","dangerouslySetInnerHTML","__html","facets","index","handleSubmit","seeLessLabel","seeMoreLabel","useAccordion","activeIndex","setActiveIndex","isActive","isOverflowHidden","setIsOverflowHidden","hasOverflow","length","classes","renderHeader","onClick","renderContent","map","facet","key","Field","component","count","name","onChange","event","preventDefault","formConfig","form","values","dispatch","selectedFacets","Object","entries","push","anyTouched","apiUrl","loadMoreWebApiUrl","page","touchOnChange","reduxForm","facetGroups","facetsSeeMoreBtnLabel","facetsSeeLessBtnLabel","isFacetModalOpen","closeFacetModal","facetGroupsTitle","facetGroupsConfirmButtonLabel","componentClasses","group","i","sorting","excludeDefaultOption","readyForSorting","options","sortingOptions","search","isSearchPending","productsFromStore","displayedProductsOutOfTotalLabelFromStore","pageFromStore","sortingFromStore","facetsFromStore","productsTotalCountFromStore","productsTotalCountLabelFromStore","loadMoreBtnLabel","loadMorePageSize","secondaryPriceLabel","searchQueryRichText","themeCodes","searchString","complexQuery","facetsNoResultsRichText","facetModalButtonLabel","anchorId","initialLoad","setInitialLoad","setIsFacetModalOpen","toggleFacetModal","toggleOn","products","undefined","displayedProductsOutOfTotalLabel","productsTotalCountLabel","showLoadMoreBtn","productsTotalCount","searchParams","store","searchUrlParams","String","updateUrlParametersOnEffect","facetUrlString","reduce","accumulator","currentValue","existingUrlParams","facetsInitialValues","forEach","sortingInitialValues","initialValues","e","trackingList","disableCentering","isLarge","params","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","window","dataLayer","pushEcommerenceTrackingEvent","trackingEvent","pushTrackingEvent","pushClickTrackingEvent","trackingPosition","productId","title","CLICK","ecommerce","click","actionField","list","position","pushDetailViewTrackingEvent","DETAIL_VIEW","detail","pushImpressionViewTrackingEvent","IMPRESSION_VIEW","impressions","product","ProductImage","ref","fallbackSrc","loading","src","authors","maxLines","Wrapper","lines","author","url","href","size","PriceTypesEnum","ProductStatusEnum","ProductStockStatusEnum","ProductTileImage","hasQuickView","target","imageSrcSet","imageFallbackSrc","sizes","detailsLabel","hideStatus","status","statusLabel","imageBaseClasses","Image","srcSet","alt","ProductTile","btnIsLarge","ctaLink","description","hasTopPadding","hideAuthors","hideBackground","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","contains","relatedTarget","document","activeElement","onKeyPress","onKeyDown","supportsNativeSmoothScroll","documentElement","style","keyCode","nextIndex","currentElement","querySelector","scrollIntoView","behavior","block","navigator","userAgent","toLowerCase","indexOf","isOptionSelected","tabIndex","dataValue","getAttribute","parseInt","isCentered","defaultIndex","baseRootClass","contentClassName","duration","applyInlineTransitions","height","isDisabled","isLoading","hideIcon","getUrlParameters","global","location","toString","query","replace","split","l","aux","decodeURIComponent","keys","getUrlParameterByName","updateUrlParameters","parameters","parameterKeys","parameterString","p","encodeURIComponent","join","history","replaceState","pushState","toggleBodyClass","bodyClass","hasBodyClass","body","classList","add","remove","someProductsHaveStatus","some","productListClasses"],"mappings":"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","file":"8.ef9ad0ed24239368bca9.js","sourcesContent":["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 = 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 \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;\r\n}\r\n\r\nconst FacetGroup: React.FC = ({\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 \r\n setActiveIndex(index)}>\r\n

{label}

\r\n \r\n }\r\n renderContent={\r\n \r\n {facets.map(facet => {\r\n return (\r\n
\r\n ${facet.label}\r\n (${facet.count})\r\n `}\r\n name={facet.id}\r\n fieldName={facet.id}\r\n onChange={handleSubmit}\r\n />\r\n
\r\n );\r\n })}\r\n
\r\n }\r\n />\r\n {hasOverflow && isActive && (\r\n ) => {\r\n event.preventDefault();\r\n setIsOverflowHidden(!isOverflowHidden);\r\n }}\r\n >\r\n {isOverflowHidden ? seeMoreLabel : seeLessLabel}\r\n \r\n )}\r\n
\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,\r\n Pick {\r\n isFacetModalOpen: boolean;\r\n closeFacetModal: (event: React.MouseEvent) => void;\r\n}\r\n\r\nexport interface IFacetFormData {}\r\n\r\ntype FacetFormPropsUnion = IFacetFormAllProps & InjectedFormProps;\r\n\r\nconst FacetForm: React.FC = ({\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
\r\n \r\n

{facetGroupsTitle}

\r\n
\r\n {facetGroups?.map((group, i) => (\r\n \r\n ))}\r\n
\r\n \r\n
\r\n );\r\n};\r\n\r\nconst formConfig: ConfigProps = {\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(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,\r\n Pick {}\r\n\r\nexport interface ISortingFormData {\r\n sorting: string;\r\n}\r\n\r\ntype SortingFormPropsUnion = ISortingFormAllProps & InjectedFormProps;\r\n\r\nconst SortingForm: React.FC = props => {\r\n return (\r\n
\r\n \r\n \r\n );\r\n};\r\n\r\nconst formConfig: ConfigProps = {\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(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,\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 = ({\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, 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
\r\n {anchorId && }\r\n {searchQueryRichText && (\r\n
\r\n \r\n
\r\n )}\r\n
\r\n {facetGroups && (\r\n 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
\r\n
\r\n
\r\n {productsTotalCountLabel && (\r\n
{productsTotalCountLabel}
\r\n )}\r\n toggleFacetModal(e, true)}\r\n >\r\n \r\n {facetModalButtonLabel}\r\n \r\n {sortingOptions && (\r\n
\r\n \r\n
\r\n )}\r\n
\r\n
\r\n {products.length > 0 ? (\r\n <>\r\n \r\n {displayedProductsOutOfTotalLabel && (\r\n
\r\n {displayedProductsOutOfTotalLabel}\r\n
\r\n )}\r\n {showLoadMoreBtn && (\r\n
\r\n \r\n {loadMoreBtnLabel}\r\n \r\n
\r\n )}\r\n \r\n ) : (\r\n
\r\n {facetsNoResultsRichText && (\r\n
\r\n )}\r\n
\r\n )}\r\n
\r\n
\r\n
\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 {\r\n public render() {\r\n return ;\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_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 = props => {\r\n const spriteUrl = props.spriteUrl || \"\";\r\n const viewBox = props.viewBox || \"0 0 32 32\";\r\n\r\n return (\r\n props.onClick && props.onClick()}\r\n >\r\n \r\n \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
;\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
;\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 = 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
\r\n {props.children}\r\n
\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 {\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 {}\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 {\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> {}\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) => {\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, \"src\" | \"srcSet\"> {\r\n className?: string;\r\n fallbackSrc?: string;\r\n srcSet: string;\r\n sizes?: string;\r\n loading?: React.ImgHTMLAttributes[\"loading\"];\r\n ref?: React.Ref;\r\n}\r\n\r\nconst ProductImage: React.FC = React.forwardRef(\r\n ({ fallbackSrc, loading = \"lazy\", ...props }, ref) => {\r\n return ;\r\n }\r\n);\r\n\r\nexport default ProductImage;\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 = ({ 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 {children}\r\n ) : (\r\n {children}\r\n );\r\n\r\n return (\r\n \r\n
    \r\n {authors.map((author, index) => {\r\n return (\r\n
  • \r\n {author.url ? (\r\n \r\n {author.name}\r\n \r\n ) : (\r\n {author.name}\r\n )}\r\n
  • \r\n );\r\n })}\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default ProductAuthors;\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 ;\r\n};\r\n\r\nexport default Spinner;\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) => void;\r\n\r\nexport interface IButtonProps extends React.ButtonHTMLAttributes {\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 = 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 {\r\n if (props.onClick) {\r\n props.onClick(e);\r\n }\r\n }}\r\n >\r\n {props.iconId && }\r\n {props.loading && }\r\n {props.children}\r\n \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}\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,\r\n IProductTileChildProps {\r\n detailsLabel?: string;\r\n hideStatus?: boolean;\r\n statusLabel?: string;\r\n}\r\n\r\nconst ProductTileImage: React.FC = ({\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 \r\n ) : null;\r\n\r\n return hasQuickView ? (\r\n
\r\n \r\n {/* {discount && } */}\r\n \r\n
\r\n ) : (\r\n \r\n {!hideStatus && !!status && (\r\n \r\n {statusLabel}\r\n \r\n )}\r\n \r\n {/* {discount && (\r\n \r\n )} */}\r\n \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,\r\n IProductTileChildProps {}\r\n\r\nconst ProductTileTitle: React.FC = ({\r\n baseClass,\r\n title,\r\n url,\r\n target,\r\n onClick,\r\n hasQuickView\r\n}) => (\r\n \r\n {hasQuickView ? (\r\n \r\n ) : (\r\n \r\n {title}\r\n \r\n )}\r\n \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 = ({\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
\r\n {/* {showDiscountOfferModal && discountOffer && (\r\n \r\n )} */}\r\n \r\n {/* {singleItemHighlight && discount && (\r\n \r\n )} */}\r\n
\r\n
\r\n \r\n {!hideAuthors && (\r\n \r\n )}\r\n {/* {materialType && {materialType}} */}\r\n {singleItemHighlight && description && (\r\n \r\n )}\r\n
\r\n {ctaLink && (\r\n <>\r\n {showCtaAsLink ? (\r\n {\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 {\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 \r\n {ctaLabel}\r\n \r\n )} */}\r\n {/* {(secondaryPrice || stockStatusLabel || numberOfProductsLabel) && (\r\n
\r\n {isOutOfStock.value && isOutOfStock.error && (\r\n \r\n )}\r\n {secondaryPriceLabel && secondaryPrice && (\r\n
\r\n {secondaryPriceLabel} {secondaryPrice}\r\n
\r\n )}\r\n {stockStatusLabel && (\r\n
\r\n {stockStatusLabel}\r\n
\r\n )}\r\n\r\n {numberOfProductsLabel && (\r\n
\r\n \r\n {numberOfProductsLabel}\r\n
\r\n )}\r\n
\r\n )} */}\r\n
\r\n
\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 = 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(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 {\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 \r\n )}\r\n toggleDropdown()}\r\n type=\"button\"\r\n onKeyPress={(event: React.KeyboardEvent) => {\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) => {\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 \r\n {dropdownVisible && (\r\n
    \r\n {allOptions.map((option, index) => {\r\n const isOptionSelected = input.value === option.value;\r\n\r\n return (\r\n
  • \r\n ) => {\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 \r\n
  • \r\n );\r\n })}\r\n
\r\n )}\r\n \r\n\r\n {inputHasError &&
}\r\n
\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 \r\n {children}\r\n
\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(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 = 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
\r\n {props.renderHeader}\r\n {props.renderContent && (\r\n \r\n {props.renderContent}\r\n \r\n )}\r\n
\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 = 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 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
\r\n \r\n\r\n \r\n
\r\n )}\r\n
\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 = props => {\r\n const rootClasses = classNames(\"accordion-content\", props.className);\r\n return
{props.children}
;\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 = props => {\r\n const rootClasses = classNames(\"accordion\", props.className);\r\n return
{props.children}
;\r\n};\r\n\r\nexport default Accordion;\r\n","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 = ({\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
\r\n {anchorId && }\r\n
\r\n
\r\n \r\n {products.map((product, index) => (\r\n
\r\n \r\n
\r\n ))}\r\n
\r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default ProductGallery;\r\n"],"sourceRoot":""}