{"version":3,"sources":["webpack:///./src/Frontend/app/utils/body-class-util.ts","webpack:///./src/Frontend/app/components/navigation/navigation-primary-links/navigation-primary-links.tsx","webpack:///./src/Frontend/app/components/navigation/navigation-site-logo/navigation-site-logo.tsx","webpack:///./src/Frontend/app/components/navigation/navigation-dropdown/navigation-dropdown.tsx","webpack:///./src/Frontend/app/utils/input-detection-utils.ts","webpack:///./src/Frontend/app/components/navigation/navigation-dropdown/navigation-dropdown-section/navigation-dropdown-section.tsx","webpack:///./src/Frontend/app/components/navigation/navigation-dropdown/navigation-spot/navigation-spot.tsx","webpack:///./src/Frontend/app/components/navigation/navigation-dropdown/navigation-list/navigation-list.tsx","webpack:///./src/Frontend/app/components/navigation/navigation-search/navigation-search.tsx","webpack:///./src/Frontend/app/components/navigation/navigation-global-sites/navigation-global-sites.tsx","webpack:///./src/Frontend/app/components/navigation/navigation.tsx","webpack:///./src/Frontend/app/views/navigation/navigation-view.tsx","webpack:///./src/Frontend/app/components/icons/icon.tsx","webpack:///./src/Frontend/app/utils/image-utils.ts","webpack:///./src/Frontend/app/components/responsive-image/responsive-image.tsx","webpack:///./src/Frontend/app/utils/breakpoint-utils.ts","webpack:///./src/Frontend/app/utils/tracking-utils.ts"],"names":["toggleBodyClass","bodyClass","toggleOn","hasBodyClass","document","body","classList","contains","add","remove","NavigationLinkType","props","className","href","logoLinkUrl","src","logoSrc","alt","logoAlt","state","isOpen","offsetX","handleClickOutside","bind","keyEventHandler","open","close","componentDidMount","addEventListener","this","componentWillUnmount","removeEventListener","event","domNode","container","target","key","handleDropdownClick","ask","wolfMax","preventDefault","stopPropagation","toggle","handleMouseOver","handleMouseLeave","setState","render","rootClasses","ref","node","onMouseLeave","url","onClick","onMouseEnter","onKeyPress","e","label","iconId","height","duration","CSSTransition","in","timeout","classNames","children","rootclasses","srcUrl","imgSrc","imgAlt","title","imgTitle","sizes","srcSetSizes","defaultSize","level","style","minHeight","Math","ceil","linkList","length","reduce","generatedLinks","link","index","type","push","itemClasses","links","item","spotContent","navigationSearchLabel","visibility","baseClass","role","tabIndex","window","toggeNavigationSearch","cursor","backgroundColor","border","logoLinkTarget","loading","dangerouslySetInnerHTML","__html","richText","sites","map","site","eventData","category","action","drawerIsOpen","globalSitesNavigationIsOpen","toggleDrawer","setValue","setStateToOpen","undefined","toggleGlobalSitesNavigation","setBodyOverlay","handleClick","drawerDomNode","drawer","navigationGlobalSitesConfig","navigationSiteLogoConfig","navigationPrimaryLinksConfig","navigationSearchConfig","navigationSearchOverlayConfig","navigationClasses","navigationLinksClasses","navigationButtonClasses","hasAnyNavigation","contentClassName","applyInlineTransitions","id","inputTitle","name","autoComplete","placeholder","searchText","suggestions","suggestion","searchOn","contextModel","spriteUrl","viewBox","preserveAspectRatio","xmlnsXlink","xlinkHref","getQueryParamDelimiter","indexOf","hasExistingQueryParam","generateSrcSet","srcSetSize","parameterDelimiter","srcSetSizeHighDensity","round","join","generateColumnImageProps","maxColumns","isFullWidth","gridMaxWidthFactor","ResponsiveImage","srcSet","breakpoints","rat","rabbit","cat","dog","wolf","lion","horse","rhino","elephant","mediaQueries","Object","keys","queryStrings","currentMediaQueries","handleMediaMatch","isMatching","forEach","mediaQuery","matchMedia","matches","addListener","EventTypes","CurrencyCodes","TrackingDimensions","ensureDataLayer","dataLayer","pushEcommerenceTrackingEvent","trackingEvent","pushTrackingEvent","pushClickTrackingEvent","trackingList","trackingPosition","productId","CLICK","ecommerce","click","actionField","list","products","position","pushDetailViewTrackingEvent","DETAIL_VIEW","detail","pushImpressionViewTrackingEvent","IMPRESSION_VIEW","impressions","product"],"mappings":"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","file":"32.743dcc65875a16fde67e.js","sourcesContent":["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\n\r\nimport NavigationDropdown from \"~/components/navigation/navigation-dropdown/navigation-dropdown\";\r\nimport NavigationDropdownSection from \"~/components/navigation/navigation-dropdown/navigation-dropdown-section/navigation-dropdown-section\";\r\nimport NavigationSpot, {\r\n INavigationSpotProps\r\n} from \"~/components/navigation/navigation-dropdown/navigation-spot/navigation-spot\";\r\nimport NavigationList from \"~/components/navigation/navigation-dropdown/navigation-list/navigation-list\";\r\nimport { IBaseLink } from \"~/types/link\";\r\n\r\nexport enum NavigationLinkType {\r\n SUBMENU = \"submenu\",\r\n LINK = \"link\",\r\n DIVIDER = \"divider\"\r\n}\r\n\r\nexport interface INavigationLink extends IBaseLink {\r\n type: NavigationLinkType;\r\n spotContent?: INavigationSpotProps;\r\n links?: INavigationLink[];\r\n}\r\n\r\nexport interface INavigationPrimaryLinksProps {\r\n links: INavigationLink[];\r\n}\r\n\r\nconst NavigationPrimaryLinks: React.SFC<INavigationPrimaryLinksProps> = props => {\r\n const wrapperClasses = \"navigation-primary-links\";\r\n const itemClasses = \"navigation-primary-links__list-item\";\r\n const generateLinks = (links: INavigationLink[]): React.ReactNode[] => {\r\n return links.reduce((generatedLinks: React.ReactNode[], item: INavigationLink, index: number) => {\r\n if (item.type === \"link\") {\r\n generatedLinks.push(\r\n <li key={index} className={itemClasses}>\r\n <a\r\n className=\"navigation-primary-links__link reset-a\"\r\n href={item.url}\r\n target={item.target}\r\n >\r\n <div className=\"navigation-primary-links__link-inner\">\r\n <span>{item.label}</span>\r\n </div>\r\n </a>\r\n </li>\r\n );\r\n }\r\n\r\n if (item.type === \"submenu\") {\r\n generatedLinks.push(\r\n <li key={index} className={itemClasses}>\r\n <NavigationDropdown {...item}>\r\n {item.spotContent && (\r\n <NavigationDropdownSection\r\n className=\"navigation-dropdown__section--spot\"\r\n {...item.spotContent}\r\n >\r\n <NavigationSpot {...item.spotContent} />\r\n </NavigationDropdownSection>\r\n )}\r\n <NavigationDropdownSection {...item}>\r\n {item.links && <NavigationList linkList={item.links} />}\r\n </NavigationDropdownSection>\r\n </NavigationDropdown>\r\n </li>\r\n );\r\n }\r\n return generatedLinks;\r\n }, []);\r\n };\r\n\r\n return (\r\n <div className=\"navigation-primary-links-wrapper\">\r\n <ul className={wrapperClasses}>{generateLinks(props.links)}</ul>\r\n </div>\r\n );\r\n};\r\n\r\nexport default NavigationPrimaryLinks;\r\n","import * as React from \"react\";\r\n\r\nexport interface INavigationSiteLogoProps {\r\n logoSrc: string;\r\n logoAlt: string;\r\n logoLinkUrl: string;\r\n}\r\n\r\nconst NavigationSiteLogo: React.SFC<INavigationSiteLogoProps> = props => {\r\n return (\r\n <a className=\"navigation-site-logo__link\" href={props.logoLinkUrl}>\r\n <img className=\"navigation-site-logo__img\" src={props.logoSrc} alt={props.logoAlt} />\r\n </a>\r\n );\r\n};\r\n\r\nexport default NavigationSiteLogo;\r\n","import * as React from \"react\";\r\nimport Icon from \"~/components/icons/icon\";\r\nimport classNames from \"classnames\";\r\nimport { debounce } from \"~/utils/function-utils\";\r\nimport { CSSTransition } from \"react-transition-group\";\r\nimport { currentMediaQueries } from \"~/utils/breakpoint-utils\";\r\nimport AnimateHeight from \"react-animate-height\";\r\nimport { isTouchInput } from \"~/utils/input-detection-utils\";\r\nimport { IBaseLink } from \"~/types/link\";\r\n\r\nexport interface INavigationDropdownState {\r\n isOpen: boolean;\r\n offsetX: number;\r\n}\r\n\r\nclass NavigationDropdown extends React.Component<IBaseLink, INavigationDropdownState> {\r\n private container: HTMLDivElement | null;\r\n public state: INavigationDropdownState = {\r\n isOpen: false,\r\n offsetX: 0\r\n };\r\n\r\n constructor(props: IBaseLink) {\r\n super(props);\r\n\r\n this.handleClickOutside = this.handleClickOutside.bind(this);\r\n this.keyEventHandler = this.keyEventHandler.bind(this);\r\n this.open = this.open.bind(this);\r\n this.close = this.close.bind(this);\r\n }\r\n\r\n public componentDidMount() {\r\n document.addEventListener(\"click\", this.handleClickOutside);\r\n document.addEventListener(\"keyup\", this.keyEventHandler);\r\n }\r\n\r\n public componentWillUnmount() {\r\n document.removeEventListener(\"click\", this.handleClickOutside);\r\n document.removeEventListener(\"keyup\", this.keyEventHandler);\r\n }\r\n\r\n private handleClickOutside(event: Event) {\r\n const domNode = this.container;\r\n if (!domNode || (event.target && !domNode.contains(event.target as Node))) {\r\n this.close();\r\n }\r\n }\r\n\r\n private keyEventHandler(event: KeyboardEvent) {\r\n if (event.key === \"Escape\") {\r\n this.close();\r\n }\r\n }\r\n\r\n private handleDropdownClick(event: React.MouseEvent<HTMLAnchorElement>) {\r\n if (isTouchInput() || currentMediaQueries.wolfMax) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.toggle();\r\n }\r\n }\r\n\r\n private handleMouseOver() {\r\n if (currentMediaQueries.wolfMax) {\r\n return;\r\n }\r\n this.open();\r\n }\r\n\r\n private handleMouseLeave() {\r\n if (currentMediaQueries.wolfMax) {\r\n return;\r\n }\r\n this.close();\r\n }\r\n\r\n private open() {\r\n this.setState({\r\n isOpen: true\r\n });\r\n }\r\n\r\n private close() {\r\n this.setState({\r\n isOpen: false\r\n });\r\n }\r\n\r\n private toggle() {\r\n this.setState({\r\n isOpen: !this.state.isOpen\r\n });\r\n }\r\n\r\n public render() {\r\n const rootClasses = classNames(\"navigation-dropdown\", {\r\n \"navigation-dropdown--isOpen\": this.state.isOpen\r\n });\r\n\r\n return (\r\n <div\r\n className={rootClasses}\r\n ref={node => (this.container = node)}\r\n onMouseLeave={debounce(() => this.handleMouseLeave(), 200)}\r\n >\r\n <div className=\"navigation-dropdown__togglewrap\">\r\n <a\r\n href={this.props.url}\r\n className=\"navigation-primary-links__link navigation-dropdown__link reset-a\"\r\n target={this.props.target}\r\n onClick={(event: React.MouseEvent<HTMLAnchorElement>) =>\r\n this.handleDropdownClick(event)\r\n }\r\n onMouseEnter={debounce(() => this.handleMouseOver(), 200)}\r\n onKeyPress={e => {\r\n if (e.key === \" \") {\r\n e.preventDefault();\r\n this.toggle();\r\n }\r\n }}\r\n >\r\n <div className=\"navigation-primary-links__link-inner\">\r\n <span>{this.props.label}</span>\r\n <div className=\"navigation-dropdown__indicator\">\r\n <Icon\r\n iconId={this.state.isOpen ? \"icon_16_arrow-up\" : \"icon_16_arrow-down\"}\r\n />\r\n </div>\r\n </div>\r\n </a>\r\n </div>\r\n <AnimateHeight height={this.state.isOpen ? \"auto\" : 0} duration={300}>\r\n <CSSTransition\r\n in={this.state.isOpen}\r\n timeout={300}\r\n classNames=\"navigation-dropdown__dropdown-wrapper\"\r\n >\r\n <div className=\"navigation-dropdown__dropdown-wrapper\">\r\n <div className=\"navigation-dropdown__dropdown\">{this.props.children}</div>\r\n </div>\r\n </CSSTransition>\r\n </AnimateHeight>\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nexport default NavigationDropdown;\r\n","import whatInput from \"what-input\";\r\n\r\nexport const isTouchInput = (): boolean => {\r\n return whatInput.ask(\"intent\") === \"touch\";\r\n};\r\n\r\nexport const isKeyboardInput = (): boolean => {\r\n return whatInput.ask(\"intent\") === \"keyboard\";\r\n};\r\n\r\nexport const isMouseInput = (): boolean => {\r\n return whatInput.ask(\"intent\") === \"mouse\";\r\n};\r\n\r\nconst getCurrentInput = (): string => {\r\n return whatInput.ask(\"intent\");\r\n};\r\n\r\nexport default getCurrentInput;\r\n","import * as React from \"react\";\r\nimport Icon from \"~/components/icons/icon\";\r\nimport classNames from \"classnames\";\r\nimport { IBaseLink } from \"~/types/link\";\r\n\r\nexport interface INavigationDropdownSectionProps extends IBaseLink {\r\n className?: string;\r\n}\r\n\r\nconst NavigationDropdownSection: React.SFC<INavigationDropdownSectionProps> = props => {\r\n const rootclasses = classNames(\"navigation-dropdown__section\", props.className);\r\n\r\n return (\r\n <div className={rootclasses}>\r\n <div className=\"navigation-dropdown__section-header\">\r\n <a className=\"navigation-dropdown__section-link\" href={props.url} target={props.target}>\r\n {props.label}\r\n <Icon iconId=\"icon_16_arrow-right-bold\" />\r\n </a>\r\n </div>\r\n {props.children}\r\n </div>\r\n );\r\n};\r\n\r\nexport default NavigationDropdownSection;\r\n","import * as React from \"react\";\r\nimport ResponsiveImage from \"~/components/responsive-image/responsive-image\";\r\nimport { IBaseLink } from \"~/types/link\";\r\n\r\nexport interface INavigationSpotProps extends IBaseLink {\r\n imgTitle: string;\r\n imgAlt: string;\r\n imgSrc: string;\r\n}\r\n\r\nconst NavigationSpot: React.SFC<INavigationSpotProps> = props => {\r\n return (\r\n <div className=\"navigation-spot\">\r\n <div className=\"navigation-spot__content\">\r\n <a href={props.url} target={props.target}>\r\n <ResponsiveImage\r\n className=\"navigation-spot__img\"\r\n srcUrl={props.imgSrc}\r\n alt={props.imgAlt}\r\n title={props.imgTitle}\r\n sizes=\"(max-width: 1366px) calc((100vw - 64px) / 2), 650px\"\r\n srcSetSizes={[480, 550, 600, 650]}\r\n defaultSize={650}\r\n />\r\n </a>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default NavigationSpot;\r\n","import * as React from \"react\";\r\nimport { INavigationLink } from \"~/components/navigation/navigation-primary-links/navigation-primary-links\";\r\n\r\nexport interface INavigationListProps {\r\n linkList: INavigationLink[];\r\n level?: number;\r\n target?: string;\r\n label?: string;\r\n type?: string;\r\n}\r\n\r\nconst NavigationList: React.SFC<INavigationListProps> = props => {\r\n const level = props.level || 0;\r\n\r\n const generateLinks = (links: INavigationLink[]): React.ReactNode[] => {\r\n return links.reduce((generatedLinks: React.ReactNode[], link: INavigationLink, index: number) => {\r\n if (link.type === \"divider\") {\r\n generatedLinks.push(\r\n <li key={index} className={\"navigation-item level-\" + level}>\r\n <div className=\"navigation-item__divider\">\r\n <span>{link.label}</span>\r\n </div>\r\n </li>\r\n );\r\n }\r\n if (link.type === \"link\") {\r\n generatedLinks.push(\r\n <li key={index} className={\"navigation-item level-\" + level}>\r\n <a className=\"navigation-item__link\" href={link.url} target={link.target}>\r\n <span>{link.label}</span>\r\n </a>\r\n </li>\r\n );\r\n }\r\n return generatedLinks;\r\n }, []);\r\n };\r\n\r\n const getNavStyling = () => {\r\n const columns = 2;\r\n const rowHeight = 42;\r\n const minHeight = Math.ceil(props.linkList.length / columns) * rowHeight;\r\n const navigationListStyling: React.CSSProperties = {\r\n minHeight: minHeight + \"px\"\r\n };\r\n return navigationListStyling;\r\n };\r\n\r\n return (\r\n <div className=\"navigation-list-wrapper\" style={getNavStyling()}>\r\n <ul className={\"navigation-list\"}>{generateLinks(props.linkList)}</ul>\r\n </div>\r\n );\r\n};\r\n\r\nexport default NavigationList;\r\n","import * as React from \"react\";\r\nimport Icon from \"~/components/icons/icon\";\r\nimport classNames from \"classnames\";\r\n\r\ntype TSearchIconVisibility = \"mobile\" | \"desktop\";\r\n\r\nexport interface INavigationSearchProps {\r\n searchPageUrl: string;\r\n navigationSearchLabel: string;\r\n visibility?: TSearchIconVisibility;\r\n}\r\n\r\nconst NavigationSearch: React.SFC<INavigationSearchProps> = ({\r\n navigationSearchLabel,\r\n visibility\r\n}: INavigationSearchProps) => {\r\n const baseClass = \"navigation-search\";\r\n return (\r\n <div\r\n className={classNames(baseClass, {\r\n [`${baseClass}--${visibility}`]: !!visibility\r\n })}\r\n >\r\n <button\r\n className=\"navigation-search__link\"\r\n role=\"button\"\r\n title={navigationSearchLabel}\r\n tabIndex={0}\r\n onClick={event => window.toggeNavigationSearch(event)}\r\n style={{ cursor: \"pointer\", backgroundColor: \"transparent\", border: \"none\" }}\r\n >\r\n <Icon iconId=\"32_search\" />\r\n </button>\r\n </div>\r\n );\r\n};\r\n\r\nexport default NavigationSearch;\r\n","import * as React from \"react\";\r\nimport { pushTrackingEvent } from \"~/utils/tracking-utils\";\r\nimport { INavigationSiteLogoProps } from \"../navigation-site-logo/navigation-site-logo\";\r\n\r\ninterface GlobalSiteProps extends INavigationSiteLogoProps {\r\n logoLinkTarget?: string;\r\n}\r\n\r\nexport interface NavigationGlobalSitesProps extends GlobalSiteProps {\r\n richText: string;\r\n sites: GlobalSiteProps[];\r\n}\r\n\r\nconst NavigationGlobalSites: React.SFC<NavigationGlobalSitesProps> = props => {\r\n const baseClass = \"navigation-global-sites\";\r\n\r\n return (\r\n <div className={baseClass}>\r\n <a className={`${baseClass}__logo-link`} href={props.logoLinkUrl} target={props.logoLinkTarget}>\r\n <img\r\n className={`${baseClass}__logo`}\r\n src={props.logoSrc}\r\n alt={props.logoAlt}\r\n loading=\"lazy\"\r\n />\r\n </a>\r\n <div\r\n className={`${baseClass}__rich-text content-rich-text`}\r\n dangerouslySetInnerHTML={{ __html: props.richText }}\r\n />\r\n <div className={`${baseClass}__site-list-wrapper`}>\r\n <div className={`${baseClass}__site-list`}>\r\n {props.sites.map((site, index) => (\r\n <div className={`${baseClass}__site-item`} key={index}>\r\n <a\r\n className={`${baseClass}__site-link`}\r\n href={site.logoLinkUrl}\r\n target={site.logoLinkTarget}\r\n onClick={() =>\r\n pushTrackingEvent({\r\n event: \"trackEvent\",\r\n eventData: {\r\n category: \"GLOBAL_NAVIGATION\",\r\n action: \"CLICK\",\r\n label: site.logoAlt\r\n }\r\n })\r\n }\r\n >\r\n <img\r\n className={`${baseClass}__logo`}\r\n src={site.logoSrc}\r\n alt={site.logoAlt}\r\n loading=\"lazy\"\r\n />\r\n </a>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default NavigationGlobalSites;","import * as React from \"react\";\r\nimport NavigationSiteLogo, {\r\n INavigationSiteLogoProps\r\n} from \"~/components/navigation/navigation-site-logo/navigation-site-logo\";\r\nimport NavigationPrimaryLinks, {\r\n INavigationPrimaryLinksProps\r\n} from \"~/components/navigation/navigation-primary-links/navigation-primary-links\";\r\nimport classNames from \"classnames\";\r\n// import NavigationProfile, {\r\n// INavigationProfileProps\r\n// } from \"~/components/navigation/navigation-profile/navigation-profile\";\r\n// import LoginFormContainer, { ILoginFormContainerProps } from \"../login-form-container/login-form-container\";\r\n// import NavigationMiniBasket, {\r\n// INavigationMiniBasketProps\r\n// } from \"./navigation-mini-basket/navigation-mini-basket\";\r\n// import BasketCount, { IBasketCountProps } from \"../basket-count/basket-count\";\r\nimport NavigationSearch, { INavigationSearchProps } from \"./navigation-search/navigation-search\";\r\nimport AnimateHeight from \"react-animate-height\";\r\nimport NavigationGlobalSites, {\r\n NavigationGlobalSitesProps\r\n} from \"./navigation-global-sites/navigation-global-sites\";\r\nimport { toggleBodyClass } from \"~/utils/body-class-util\";\r\n\r\nexport interface INavigationProps {\r\n navigationGlobalSitesConfig?: NavigationGlobalSitesProps;\r\n navigationSiteLogoConfig?: INavigationSiteLogoProps;\r\n navigationPrimaryLinksConfig?: INavigationPrimaryLinksProps;\r\n // navigationProfileConfig?: INavigationProfileProps;\r\n navigationSearchConfig?: INavigationSearchProps;\r\n navigationSearchOverlayConfig?: {\r\n title: string;\r\n inputTitle: string;\r\n searchText: string;\r\n suggestions: string[];\r\n };\r\n // navigationMiniBasketConfig?: INavigationMiniBasketProps;\r\n // loginFormConfig?: ILoginFormContainerProps;\r\n // basketCount: IBasketCountProps[\"count\"];\r\n // isLoggedIn: boolean;\r\n}\r\n\r\nexport interface INavigationState {\r\n drawerIsOpen: boolean;\r\n globalSitesNavigationIsOpen: boolean;\r\n}\r\n\r\nclass Navigation extends React.Component<INavigationProps, INavigationState> {\r\n private drawer: HTMLDivElement | null;\r\n public state: INavigationState = {\r\n drawerIsOpen: false,\r\n globalSitesNavigationIsOpen: false\r\n };\r\n\r\n public componentDidMount() {\r\n document.addEventListener(\"click\", (event: MouseEvent) => this.handleClick(event));\r\n }\r\n\r\n public componentWillUnmount() {\r\n document.removeEventListener(\"click\", (event: MouseEvent) => this.handleClick(event));\r\n }\r\n\r\n private setBodyOverlay(toggleOn: boolean) {\r\n toggleBodyClass(\"body--navigationOverlayOpen\", toggleOn);\r\n }\r\n\r\n private toggleDrawer = (setValue?: boolean) => {\r\n const setStateToOpen = setValue !== undefined ? setValue : !this.state.drawerIsOpen;\r\n if (this.state.globalSitesNavigationIsOpen) {\r\n this.toggleGlobalSitesNavigation(false);\r\n }\r\n this.setBodyOverlay(setStateToOpen);\r\n this.setState({ drawerIsOpen: setStateToOpen });\r\n };\r\n private toggleGlobalSitesNavigation = (setValue?: boolean) => {\r\n const setStateToOpen = setValue !== undefined ? setValue : !this.state.globalSitesNavigationIsOpen;\r\n if (this.state.drawerIsOpen) {\r\n this.toggleDrawer(false);\r\n }\r\n this.setBodyOverlay(setStateToOpen);\r\n this.setState({\r\n globalSitesNavigationIsOpen: setStateToOpen\r\n });\r\n };\r\n\r\n private handleClick(event: MouseEvent) {\r\n if (!this.state.drawerIsOpen && !this.state.globalSitesNavigationIsOpen) {\r\n return;\r\n }\r\n const drawerDomNode = this.drawer;\r\n\r\n if (!drawerDomNode || (event.target && !drawerDomNode.contains(event.target as Node))) {\r\n this.toggleDrawer(false);\r\n this.toggleGlobalSitesNavigation(false);\r\n }\r\n }\r\n\r\n public render() {\r\n const {\r\n navigationGlobalSitesConfig,\r\n navigationSiteLogoConfig,\r\n navigationPrimaryLinksConfig,\r\n // navigationProfileConfig,\r\n // navigationMiniBasketConfig,\r\n navigationSearchConfig,\r\n navigationSearchOverlayConfig\r\n // loginFormConfig,\r\n // isLoggedIn\r\n } = this.props;\r\n\r\n const navigationClasses = classNames(\"navigation\", {\r\n \"navigation--site-logo-only\":\r\n navigationSiteLogoConfig &&\r\n !(\r\n navigationGlobalSitesConfig ||\r\n navigationPrimaryLinksConfig ||\r\n // navigationProfileConfig ||\r\n // navigationMiniBasketConfig ||\r\n navigationSearchConfig\r\n )\r\n });\r\n const navigationLinksClasses = classNames(\"navigation-links\", {\r\n \"navigation-links--open\": this.state.drawerIsOpen\r\n });\r\n const navigationButtonClasses = classNames(\"navigation-burger-button__icon\", {\r\n \"navigation-burger-button__icon--isOpen\": this.state.drawerIsOpen\r\n });\r\n // const basketCountClasses = classNames(\"navigation__basket-count\", {\r\n // \"navigation__basket-count--drawerIsOpen\": this.state.drawerIsOpen\r\n // });\r\n\r\n const hasAnyNavigation = !!(\r\n navigationPrimaryLinksConfig\r\n // navigationProfileConfig ||\r\n // loginFormConfig\r\n );\r\n\r\n return (\r\n <div className=\"navigation-wrapper\" ref={node => (this.drawer = node)}>\r\n {navigationGlobalSitesConfig && (\r\n <div className=\"navigation-global-sites-wrapper\">\r\n <AnimateHeight\r\n className=\"accordion-rah-content\"\r\n contentClassName=\"navigation-global-sites-rah\"\r\n duration={300}\r\n applyInlineTransitions={false}\r\n height={this.state.globalSitesNavigationIsOpen ? \"auto\" : 0}\r\n >\r\n <NavigationGlobalSites {...navigationGlobalSitesConfig} />\r\n </AnimateHeight>\r\n </div>\r\n )}\r\n <nav className={navigationClasses} role=\"navigation\" aria-label=\"navigation\">\r\n <div className=\"navigation__inner\">\r\n {hasAnyNavigation && (\r\n <button\r\n className=\"navigation-burger-button\"\r\n type=\"button\"\r\n onClick={() => this.toggleDrawer()}\r\n >\r\n <div className={navigationButtonClasses}>\r\n <span />\r\n <span />\r\n <span />\r\n </div>\r\n {/* <BasketCount className={basketCountClasses} count={this.props.basketCount} /> */}\r\n </button>\r\n )}\r\n\r\n <div className=\"navigation-site-logo\">\r\n {navigationGlobalSitesConfig && (\r\n <button\r\n className={classNames(\"navigation-global-sites-button reset-button\", {\r\n \"navigation-global-sites-button--isOpen\": this.state\r\n .globalSitesNavigationIsOpen\r\n })}\r\n type=\"button\"\r\n onClick={() => this.toggleGlobalSitesNavigation()}\r\n >\r\n <span />\r\n <span />\r\n </button>\r\n )}\r\n\r\n {navigationSiteLogoConfig && <NavigationSiteLogo {...navigationSiteLogoConfig} />}\r\n </div>\r\n {navigationSearchConfig && (\r\n <NavigationSearch visibility=\"mobile\" {...navigationSearchConfig} />\r\n )}\r\n\r\n {hasAnyNavigation && (\r\n <div className={navigationLinksClasses}>\r\n {/* {navigationProfileConfig && (\r\n <NavigationProfile {...navigationProfileConfig} isLoggedIn={isLoggedIn}>\r\n {loginFormConfig && <LoginFormContainer {...loginFormConfig} />}\r\n </NavigationProfile>\r\n )}\r\n {navigationMiniBasketConfig && (\r\n <NavigationMiniBasket\r\n {...navigationMiniBasketConfig}\r\n basketCount={this.props.basketCount}\r\n />\r\n )} */}\r\n {navigationSearchConfig && (\r\n <NavigationSearch visibility=\"desktop\" {...navigationSearchConfig} />\r\n )}\r\n {navigationPrimaryLinksConfig && (\r\n <NavigationPrimaryLinks {...navigationPrimaryLinksConfig} />\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n <div className=\"cludo-nav-search\" id=\"cludo-nav-search\" aria-hidden=\"true\">\r\n <button\r\n className=\"cludo-nav-search__close\"\r\n onClick={event => window.toggeNavigationSearch(event)}\r\n aria-label=\"Luk overlay\"\r\n >\r\n <span></span>\r\n <span></span>\r\n </button>\r\n <div className=\"cludo-nav-search__inner\">\r\n <h2>{navigationSearchOverlayConfig?.title}</h2>\r\n <form\r\n className=\"cludo-nav-search__form\"\r\n role=\"search\"\r\n action=\"javascript:void(0)\"\r\n >\r\n <input\r\n className=\"cludo-nav-search__input\"\r\n title={navigationSearchOverlayConfig?.inputTitle}\r\n name=\"searchrequest\"\r\n type=\"search\"\r\n autoComplete=\"off\"\r\n placeholder={navigationSearchOverlayConfig?.inputTitle}\r\n aria-autocomplete=\"list\"\r\n aria-haspopup=\"true\"\r\n aria-expanded=\"false\"\r\n />\r\n <button\r\n type=\"submit\"\r\n title={navigationSearchOverlayConfig?.searchText}\r\n className=\"cludo-nav-search__button\"\r\n aria-label={navigationSearchOverlayConfig?.searchText}\r\n ></button>\r\n </form>\r\n </div>\r\n <div className=\"cludo-nav-search__suggestions\">\r\n <div className=\"cludo-nav-search__suggestions-container\">\r\n {navigationSearchOverlayConfig?.suggestions.map(suggestion => {\r\n return (\r\n <button\r\n type=\"button\"\r\n key={suggestion}\r\n className=\"cludo-nav-search__suggestion\"\r\n onClick={event => window.searchOn(event)}\r\n >\r\n {suggestion}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n </div>\r\n </nav>\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nexport default Navigation;\r\n","import * as React from \"react\";\r\nimport Navigation, { INavigationProps } from \"~/components/navigation/navigation\";\r\n\r\nexport interface INavigationViewProps {\r\n contextModel: INavigationProps;\r\n}\r\n\r\nclass NavigationView extends React.Component<INavigationViewProps> {\r\n public render() {\r\n return <Navigation {...this.props.contextModel} />;\r\n }\r\n}\r\n\r\nexport default NavigationView;\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","const hasExistingQueryParam = (url: string) => url.indexOf(\"?\") !== -1;\r\n\r\nexport const getQueryParamDelimiter = (url: string) => (hasExistingQueryParam(url) ? \"&\" : \"?\");\r\n\r\nexport const generateSrcSet = (srcSetSizes: number[], srcUrl: string) => {\r\n const generateSrcSetString = (srcSetSize: number) => {\r\n const parameterDelimiter = getQueryParamDelimiter(srcUrl);\r\n const srcSetSizeHighDensity = Math.round(srcSetSize * 1.5);\r\n\r\n return `\r\n ${srcUrl}${parameterDelimiter}w=${srcSetSize} ${srcSetSize}w,\r\n ${srcUrl}${parameterDelimiter}w=${srcSetSizeHighDensity} ${srcSetSizeHighDensity}w\r\n `;\r\n };\r\n\r\n return srcSetSizes.map(generateSrcSetString).join(\", \");\r\n};\r\n\r\nexport const generateColumnImageProps = (maxColumns: number, isFullWidth?: boolean) => {\r\n // The sizes are column-widths and are not considering padding\r\n const gridMaxWidthFactor = isFullWidth ? 1 : 0.75;\r\n const gridMaxWidth = 1366 * gridMaxWidthFactor;\r\n const defaultSize = gridMaxWidth / maxColumns;\r\n let sizes;\r\n\r\n switch (maxColumns) {\r\n case 5:\r\n sizes = `(max-width: 479px) 100vw, \r\n (max-width: 639px) 75vw,\r\n (max-width: 767px) 50vw,\r\n (max-width: 1023px) ${100 / 3}vw,\r\n (max-width: 1099px) ${(100 / 3) * gridMaxWidthFactor}vw,\r\n (max-width: 1279px) ${(100 / 4) * gridMaxWidthFactor}vw,\r\n ${defaultSize}px`;\r\n case 4:\r\n sizes = `(max-width: 479px) 100vw, \r\n (max-width: 639px) 75vw,\r\n (max-width: 767px) 50vw,\r\n (max-width: 1023px) ${100 / 3}vw,\r\n (max-width: 1099px) ${(100 / 3) * gridMaxWidthFactor}vw,\r\n (max-width: 1279px) ${(100 / 4) * gridMaxWidthFactor}vw,\r\n ${defaultSize}px`;\r\n case 3:\r\n sizes = `(max-width: 479px) 100vw,\r\n (max-width: 639px) 75vw,\r\n (max-width: 767px) 50vw,\r\n (max-width: 1023px) ${100 / 3}vw,\r\n (max-width: 1279px) ${(100 / 3) * gridMaxWidthFactor}vw,\r\n ${defaultSize}px`;\r\n case 2:\r\n sizes = `(max-width: 479px) 100vw,\r\n (max-width: 639px) 75vw,\r\n (max-width: 1023px) ${100 / 2}vw,\r\n (max-width: 1279px) ${(100 / 2) * gridMaxWidthFactor}vw, \r\n ${defaultSize}px`;\r\n case 1:\r\n sizes = `(max-width: 479px) 100vw,\r\n (max-width: 1023px) ${100 * 0.75}vw,\r\n (max-width: 1279px) ${100 * 0.75 * gridMaxWidthFactor}vw,\r\n ${defaultSize * 0.75}px`;\r\n }\r\n\r\n return {\r\n // The sizes are column-widths and are not considering padding\r\n defaultSize: defaultSize,\r\n srcSetSizes: [205, 257, 274, 342, 456, 513, 683, 769, 1025],\r\n sizes: sizes\r\n };\r\n};\r\n","import * as React from \"react\";\r\nimport { generateSrcSet, getQueryParamDelimiter } from \"~/utils/image-utils\";\r\n\r\nexport interface IResponsiveImageProps extends Omit<React.ImgHTMLAttributes<HTMLImageElement>, \"src\"> {\r\n className?: string;\r\n srcUrl: string;\r\n defaultSize: number;\r\n srcSetSizes?: number[];\r\n sizes?: string;\r\n ref?: React.Ref<HTMLImageElement>;\r\n}\r\n\r\nconst ResponsiveImage: React.FC<IResponsiveImageProps> = React.forwardRef(\r\n ({ srcUrl, defaultSize, srcSetSizes, ...props }, ref: React.Ref<HTMLImageElement>) => {\r\n const src = `${srcUrl}${getQueryParamDelimiter(srcUrl)}w=${defaultSize}`;\r\n const srcSet = srcSetSizes ? generateSrcSet(srcSetSizes, srcUrl) : \"\";\r\n\r\n return <img ref={ref} src={src} srcSet={srcSet} {...props} loading=\"lazy\" />;\r\n }\r\n);\r\n\r\nexport default ResponsiveImage;\r\n","interface IBreakpoints {\r\n [key: string]: number;\r\n}\r\n\r\ninterface IMediaQueryStrings {\r\n [key: string]: string;\r\n}\r\n\r\nexport type IMatchingQueries = { [key in Breakpoints]?: boolean };\r\n\r\nexport type Breakpoints =\r\n | \"ratMin\"\r\n | \"ratMax\"\r\n | \"rabbitMin\"\r\n | \"rabbitMax\"\r\n | \"catMin\"\r\n | \"catMax\"\r\n | \"dogMin\"\r\n | \"dogMax\"\r\n | \"wolfMin\"\r\n | \"wolfMax\"\r\n | \"lionMin\"\r\n | \"horseMin\"\r\n | \"horseMax\"\r\n | \"rhinoMin\"\r\n | \"rhinoMax\"\r\n | \"elephantMin\"\r\n | \"elephantMax\";\r\n\r\nexport const breakpoints: IBreakpoints = {\r\n rat: 360,\r\n rabbit: 480,\r\n cat: 640,\r\n dog: 768,\r\n wolf: 1024,\r\n lion: 1100,\r\n horse: 1400,\r\n rhino: 1520,\r\n elephant: 1670\r\n};\r\n\r\nconst mediaQueries: IMediaQueryStrings = Object.keys(breakpoints).reduce(\r\n (queryStrings: IMediaQueryStrings, key) => {\r\n queryStrings[`${key}Min`] = `(min-width: ${breakpoints[key]}px)`;\r\n queryStrings[`${key}Max`] = `(max-width: ${breakpoints[key] - 1}px)`;\r\n return queryStrings;\r\n },\r\n {}\r\n);\r\n\r\nconst setupMediaQueryListeners = () => {\r\n Object.keys(mediaQueries).forEach((key: string) => {\r\n const mediaQuery = matchMedia(mediaQueries[key]);\r\n\r\n handleMediaMatch(mediaQuery.matches, key as Breakpoints); // Initial values\r\n mediaQuery.addListener(event => handleMediaMatch(event.matches, key as Breakpoints));\r\n });\r\n};\r\n\r\nconst currentMediaQueries: IMatchingQueries = {};\r\nconst handleMediaMatch = (isMatching: boolean, key: Breakpoints) => (currentMediaQueries[key] = isMatching);\r\n\r\nif (!__SERVER__) {\r\n setupMediaQueryListeners();\r\n}\r\n\r\nexport { currentMediaQueries };\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"],"sourceRoot":""}