{"version":3,"file":"static/js/788.d05297ea.chunk.js","mappings":"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","sources":["assets/images/prev-arrow.svg","assets/images/next-arrow.svg","configurations/appSettings.ts","utils/product.ts","types/analytics/index.ts","configurations/theme/device.ts","configurations/theme/index.ts","components/ProductSlider/ProductSliderProduct.styles.tsx","components/ProductSlider/ProductDiscount.tsx","components/ProductSlider/ProductSliderProduct.tsx","components/ProductSlider/ProductSlider.styles.tsx","components/ProductSlider/ProductSlider.tsx","utils/hooks/useDragDetection.tsx","utils/analytics/index.ts","components/CustomersAlsoViewed/CustomersAlsoViewed.styles.tsx","types/api/recAi.ts","components/CustomersAlsoViewed/CustomersAlsoViewed.tsx","utils/recAiFactory.ts","utils/global.ts","views/CustomersAlsoViewedWidget/CustomersAlsoViewedWidget.tsx"],"sourcesContent":["var _polyline;\n\nvar _excluded = [\"title\", \"titleId\"];\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport * as React from \"react\";\n\nfunction SvgPrevArrow(_ref, svgRef) {\n var title = _ref.title,\n titleId = _ref.titleId,\n props = _objectWithoutProperties(_ref, _excluded);\n\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 50 80\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _polyline || (_polyline = /*#__PURE__*/React.createElement(\"polyline\", {\n fill: \"none\",\n strokeWidth: 8,\n points: \"45.63,75.8 0.375,38.087 45.63,0.375 \"\n })));\n}\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(SvgPrevArrow);\nexport default __webpack_public_path__ + \"static/media/prev-arrow.80328610d918e7a53f33f82baab268e0.svg\";\nexport { ForwardRef as ReactComponent };","var _polyline;\n\nvar _excluded = [\"title\", \"titleId\"];\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport * as React from \"react\";\n\nfunction SvgNextArrow(_ref, svgRef) {\n var title = _ref.title,\n titleId = _ref.titleId,\n props = _objectWithoutProperties(_ref, _excluded);\n\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 50 80\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _polyline || (_polyline = /*#__PURE__*/React.createElement(\"polyline\", {\n fill: \"none\",\n strokeWidth: 8,\n points: \"0.375,0.375 45.63,38.087 0.375,75.8 \"\n })));\n}\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(SvgNextArrow);\nexport default __webpack_public_path__ + \"static/media/next-arrow.9cb3235c13d3ccdbd8545b7f3b10d05e.svg\";\nexport { ForwardRef as ReactComponent };","export enum KnownEnvironmentDomains {\n 'www.chemistwarehouse.com.au',\n 'www1.chemistwarehouse.com.au',\n 'www2.chemistwarehouse.com.au',\n 'feature1.chemistwarehouse.com.au',\n 'feature2.chemistwarehouse.com.au',\n 'kentico.chemistwarehouse.com.au',\n 'localhost'\n}\n\nconst disallowedDiscountSchedules = [2, 3, 4, 8];\n\nexport const appSettings = {\n disallowedDiscountSchedules\n};\n","import { KnownEnvironmentDomains } from 'configurations/appSettings';\nimport { URLReference as URL } from './polyfills';\n\nexport function getFormattedPrice(price: string): string {\n return !isNaN(Number(price)) ? Number(price).toFixed(2).toString() : price;\n}\n\nexport const getFormattedDiscount = (retailPrice: string, currentPrice: string): string | null => {\n const numRetailPrice = Number(retailPrice);\n const numCurrentPrice = Number(currentPrice);\n\n if (isNaN(numRetailPrice) || isNaN(numCurrentPrice)) {\n return null;\n }\n\n if (numRetailPrice <= numCurrentPrice) {\n return null;\n }\n\n return (numRetailPrice - numCurrentPrice).toFixed(2);\n};\n\nexport const getEnvironmentAwareUrl = (productUrl: string): string => {\n const { hostname, port, protocol } = new URL(window.location.toString());\n const targetURL = new URL(productUrl);\n\n if (!(targetURL.hostname in KnownEnvironmentDomains)) {\n return targetURL.toString();\n }\n\n if (\n targetURL.protocol === protocol &&\n targetURL.hostname === hostname &&\n targetURL.port === port\n ) {\n return targetURL.toString();\n }\n\n targetURL.protocol = protocol;\n targetURL.hostname = hostname;\n targetURL.port = port;\n\n return targetURL.toString();\n};\n\nexport const ensureHttpsUrl = (url: string): string => {\n const targetURL = new URL(url);\n if (targetURL.protocol === 'https:') {\n return url;\n }\n targetURL.protocol = 'https:';\n return targetURL.toString();\n};\n","export enum KnownCampaigns {\n CustomersAlsoViewed = 'recai_customers_also_viewed'\n}\n","export const device = {\n desktop: '(min-width: 668px)',\n mobile: '(max-width: 667px)'\n};\n","import { device } from './device';\n\nconst theme = {\n fontFamily: 'Arial, Helvetica, sans-serif'\n};\n\nexport default theme;\nexport { device };\n","import styled from 'styled-components';\nimport { device } from 'configurations/theme';\n\nexport const BuyButton = styled.div`\n display: inline-block;\n margin-top: 12px;\n color: #fff;\n font-size: 10px;\n font-weight: bold;\n border: 1px solid #00af0d;\n background: linear-gradient(180deg, #00dc00 0%, #00af0d 100%), #00af0d;\n box-shadow: 0px 1px 0px #007d07;\n border-radius: 4px;\n cursor: pointer;\n width: 100%;\n padding: 4px 3px;\n text-shadow: 0.3px 0.5px 0px #007d07;\n max-width: 135px;\n text-transform: uppercase;\n`;\n\nexport const ProductContainer = styled.a`\n border: 2px solid transparent;\n outline: 0px;\n text-align: center;\n float: left;\n height: 100%;\n box-sizing: border-box;\n width: 100%;\n padding: 15px 9px 17px;\n color: #464646;\n font-weight: 700;\n text-decoration: none;\n position: relative;\n cursor: pointer;\n\n &:hover {\n border: 2px solid rgb(229, 229, 229);\n outline: 0px;\n text-decoration: none;\n }\n`;\n\nexport const ProductImage = styled.div`\n position: relative;\n clear: both;\n height: 120px;\n display: flex;\n align-items: center;\n justify-content: center;\n\n @media ${device.desktop} {\n height: 150px;\n }\n\n img {\n max-width: 100%;\n max-height: 100%;\n }\n`;\nexport const ProductName = styled.div`\n overflow: hidden;\n margin: 3px 3px 5px;\n font-weight: normal;\n color: #000;\n font-size: 12px;\n line-height: 14px;\n height: 42px;\n\n @media ${device.desktop} {\n margin-bottom: 10px;\n }\n`;\nexport const ActualPrice = styled.div`\n color: #535353;\n font-size: 30px;\n font-weight: 700;\n letter-spacing: -2px;\n`;\nexport const ProductPrice = styled.div`\n height: 53px;\n display: flex;\n flex-flow: column;\n`;\n\nexport const Discount = styled.div`\n color: #f1383a;\n font-style: normal;\n font-weight: bold;\n font-size: 14px;\n margin-top: 3px;\n letter-spacing: -0.7px;\n`;\n","import { Product } from 'types/Product';\nimport { getFormattedDiscount } from 'utils/product';\nimport { appSettings } from 'configurations/appSettings';\nimport { Discount } from './ProductSliderProduct.styles';\n\ninterface ProductDiscountProps {\n product: Product;\n}\n\nconst ProductDiscount = ({ product }: ProductDiscountProps): JSX.Element | null => {\n const priceDiscount = getFormattedDiscount(product.retailPrice, product.price);\n\n if (priceDiscount === null) {\n return null;\n }\n\n if (appSettings.disallowedDiscountSchedules.includes(product.schedule)) {\n return null;\n }\n\n return {`$${priceDiscount} Off RRP!`};\n};\n\nexport { ProductDiscount };\n","import { Product } from 'types/Product';\nimport { getFormattedPrice } from 'utils/product';\nimport { ProductDiscount } from './ProductDiscount';\nimport {\n ActualPrice,\n BuyButton,\n ProductContainer,\n ProductImage,\n ProductName,\n ProductPrice\n} from './ProductSliderProduct.styles';\n\ninterface ProductSliderProductProps {\n product: Product;\n}\n\nconst ProductSliderProduct = ({ product }: ProductSliderProductProps): JSX.Element => {\n return (\n \n \n \n \n \n {product.name}\n \n \n ${getFormattedPrice(product.price)}\n \n \n \n \n Buy now\n \n );\n};\n\nexport default ProductSliderProduct;\n","import styled from 'styled-components';\nimport theme, { device } from 'configurations/theme';\n\nexport const SliderHeader = styled.div`\n background: #ed0037;\n padding: 1px;\n border-radius: 0;\n width: 94%;\n box-shadow: none;\n overflow: visible;\n position: relative;\n color: #fff;\n font-weight: 800;\n min-height: 34px;\n margin-bottom: 15px;\n box-sizing: border-box;\n text-transform: uppercase;\n\n &:after {\n content: '';\n position: absolute;\n top: 0px;\n right: -17px;\n border-left: 17px solid rgb(237, 0, 55);\n border-top: 17px solid rgba(0, 0, 0, 0);\n border-bottom: 17px solid rgba(0, 0, 0, 0);\n }\n\n h2 {\n margin: 0;\n font-size: 18px;\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n line-height: 33px;\n padding-left: 40px;\n }\n`;\nexport const ArrowSpan = styled.span`\n width: 10px;\n height: 100%;\n position: absolute;\n top: 0;\n left: 0;\n background: #ffee00;\n\n &:after {\n content: '';\n border-left: 20px solid rgb(249, 242, 0);\n border-top: 17px solid rgba(0, 0, 0, 0);\n border-bottom: 17px solid rgba(0, 0, 0, 0);\n position: absolute;\n top: 0px;\n right: -20px;\n }\n`;\n\nexport const SliderContainer = styled.div`\n /* Slider */\n font-family: ${theme.fontFamily};\n\n .slick-slider {\n position: relative;\n display: block;\n box-sizing: border-box;\n -webkit-touch-callout: none;\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n -ms-touch-action: pan-y;\n touch-action: pan-y;\n -webkit-tap-highlight-color: transparent;\n }\n\n .slick-list {\n position: relative;\n overflow: hidden;\n display: block;\n margin: 0;\n padding: 0;\n\n &:focus {\n outline: none;\n }\n\n &.dragging {\n cursor: pointer;\n cursor: hand;\n }\n }\n\n .slick-slider .slick-track,\n .slick-slider .slick-list {\n -webkit-transform: translate3d(0, 0, 0);\n -moz-transform: translate3d(0, 0, 0);\n -ms-transform: translate3d(0, 0, 0);\n -o-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n }\n\n .slick-track {\n position: relative;\n left: 0;\n top: 0;\n display: block;\n\n &:before,\n &:after {\n content: '';\n display: table;\n }\n\n &:after {\n clear: both;\n }\n\n .slick-loading & {\n visibility: hidden;\n }\n }\n\n .slick-slide {\n float: left;\n height: 100%;\n min-height: 1px;\n\n img {\n display: block;\n }\n\n &.slick-loading img {\n display: none;\n }\n\n display: none;\n\n &.dragging img {\n pointer-events: none;\n }\n }\n [dir='rtl'] .slick-slide {\n float: right;\n }\n .slick-slide.dragging img {\n pointer-events: none;\n }\n .slick-initialized .slick-slide {\n display: block;\n }\n .slick-loading .slick-slide {\n visibility: hidden;\n }\n .slick-vertical .slick-slide {\n display: block;\n height: auto;\n border: 1px solid transparent;\n }\n .slick-arrow.slick-hidden {\n display: none;\n }\n\n // Default Variables\n\n // Slick icon entity codes outputs the following\n // \"\\\\2190\" outputs ascii character \"←\"\n // \"\\\\2192\" outputs ascii character \"→\"\n // \"\\\\2022\" outputs ascii character \"•\"\n\n /* Arrows */\n\n .slick-prev,\n .slick-next {\n position: absolute;\n display: block;\n height: 30px;\n width: 30px;\n line-height: 0px;\n font-size: 0px;\n cursor: pointer;\n background: transparent;\n color: transparent;\n top: 27%;\n transform: translate(0, -50%);\n padding: 0;\n border: none;\n outline: none;\n z-index: 1;\n\n @media ${device.desktop} {\n height: 40px;\n width: 40px;\n }\n\n svg {\n stroke: rgb(149, 167, 205);\n cursor: pointer;\n width: 30px;\n height: 30px;\n\n @media ${device.desktop} {\n height: 40px;\n width: 40px;\n }\n }\n\n &:hover,\n &:focus {\n outline: none;\n background: transparent;\n color: transparent;\n\n &:before {\n opacity: 1;\n }\n }\n\n &.slick-disabled,\n &.slick-disabled:before {\n opacity: 0;\n }\n }\n\n .slick-prev {\n left: 0px;\n }\n\n .slick-next {\n right: 0px;\n }\n`;\n","import React, { useCallback, MouseEvent } from 'react';\nimport Slider from 'react-slick';\nimport { Product } from 'types/Product';\nimport { useDragDetection } from 'utils/hooks/useDragDetection';\nimport { ReactComponent as PrevArrow } from 'assets/images/prev-arrow.svg';\nimport { ReactComponent as NextArrow } from 'assets/images/next-arrow.svg';\nimport { KnownCampaigns } from 'types/analytics';\nimport { emitProductClickEvent } from 'utils/analytics';\nimport ProductSliderProduct from './ProductSliderProduct';\nimport { ArrowSpan, SliderContainer, SliderHeader } from './ProductSlider.styles';\n\nconst sliderSettings = {\n dots: false,\n infinite: false,\n speed: 500,\n slidesToShow: 3,\n slidesToScroll: 3,\n responsive: [\n {\n breakpoint: 470,\n settings: {\n slidesToShow: 2,\n slidesToScroll: 2\n }\n }\n ]\n};\n\ntype ArrowProps = { className?: string; onClick?: () => void; children?: React.ReactNode };\nconst ArrowButton = ({ className, onClick, children }: ArrowProps): JSX.Element => (\n \n {children}\n \n);\n\ninterface ProductSliderProps {\n products: Product[];\n title?: string;\n analyticsCampaignName?: KnownCampaigns;\n}\n\nconst ProductSlider = ({\n products,\n title,\n analyticsCampaignName\n}: ProductSliderProps): JSX.Element => {\n const { handleMouseDown, dragging } = useDragDetection();\n\n const handleChildClick = useCallback(\n (e: MouseEvent) => {\n if (dragging) {\n e.preventDefault();\n e.stopPropagation();\n }\n },\n [dragging]\n );\n\n const handleClick = (product: Product) => {\n emitProductClickEvent(product, analyticsCampaignName);\n };\n\n return (\n \n {title && (\n \n {title}\n \n \n )}\n \n \n \n }\n prevArrow={\n \n \n \n }\n >\n {products.map(product => (\n handleClick(product)}\n >\n \n \n ))}\n \n \n );\n};\n\nexport default ProductSlider;\n","import { useState, useEffect } from 'react';\n\nconst MOVE_THRESHOLD = 10;\n\nfunction useDragDetection(): {\n handleMouseDown: () => void;\n dragging: boolean;\n} {\n const [mouseDown, setMouseDown] = useState(false);\n const [dragging, setDragging] = useState(false);\n\n useEffect(() => {\n let mouseMove = 0;\n\n function handleMouseUp(): void {\n setMouseDown(false);\n }\n\n function handleMouseMove(e: MouseEvent): void {\n mouseMove += Math.abs(e.movementX) + Math.abs(e.movementY);\n setDragging(mouseMove > MOVE_THRESHOLD);\n }\n\n if (mouseDown) {\n document.addEventListener('mouseup', handleMouseUp);\n document.addEventListener('mousemove', handleMouseMove);\n }\n\n return () => {\n document.removeEventListener('mouseup', handleMouseUp);\n document.removeEventListener('mousemove', handleMouseMove);\n };\n }, [mouseDown]);\n\n function handleMouseDown(): void {\n setMouseDown(true);\n setDragging(false);\n }\n\n return {\n handleMouseDown,\n dragging\n };\n}\n\nexport { useDragDetection };\n","import { Product } from 'types/Product';\nimport { KnownCampaigns } from 'types/analytics';\n\nexport const emitProductClickEvent = (product: Product, campaignName?: KnownCampaigns) => {\n document.dispatchEvent(\n new CustomEvent('cw-analytics-event--recai-campaign-product-select', {\n detail: {\n campaignName,\n product\n }\n })\n );\n};\n","import styled from 'styled-components';\nimport { device } from 'configurations/theme';\n\nexport const CustomersAlsoViewedContainer = styled.div`\n margin: 0 10px 20px;\n\n @media ${device.desktop} {\n margin: 0 0 20px;\n }\n`;\n","export interface RecAiResult {\n attribution_token: string;\n validate_only: boolean;\n results: RecAiResultProduct[];\n}\n\nexport interface RecAiResultProduct {\n id: string;\n price: number;\n sale_price: number;\n title: string;\n uri: string;\n img: string;\n score?: number;\n schedule: number;\n}\n\nexport enum RecAiPlacementEnum {\n FreqBoughtTogether = 'cw-fbt-rps-prod-placement',\n OthersYouMayLike = 'cw-oyml-cvr-prod-placement',\n SimilarItems = 'cw-si-sku-prod-placement',\n RecForYou = 'cw-rfy-cvr-prod-placement',\n RecentlyViewed = 'recently_viewed_default'\n}\n\nexport type RecAiEvent = 'detail-page-view' | 'add-to-cart' | 'home-page-view';\n\nexport interface RecAiRequest {\n placement: RecAiPlacementEnum;\n visitor_id: string;\n event_type: RecAiEvent;\n page_size: number;\n validate_only: boolean;\n return_product: boolean;\n return_score: boolean;\n product_id?: string;\n}\n","import React, { useEffect } from 'react';\nimport { Product } from 'types/Product';\nimport ProductSlider from 'components/ProductSlider/ProductSlider';\nimport { KnownCampaigns } from 'types/analytics';\nimport { CustomersAlsoViewedContainer } from './CustomersAlsoViewed.styles';\n\ninterface CustomersAlsoViewedProps {\n products: Product[];\n}\n\nconst CustomersAlsoViewed = ({ products }: CustomersAlsoViewedProps): JSX.Element => {\n useEffect(() => {\n if (products.length < 1) {\n return;\n }\n\n document.dispatchEvent(\n new CustomEvent('cw-analytics-event--recai-campaign-updated', {\n detail: {\n name: KnownCampaigns.CustomersAlsoViewed,\n products: products\n }\n })\n );\n }, [products]);\n\n return (\n \n \n \n );\n};\n\nexport default CustomersAlsoViewed;\n","import { RecAiProduct } from 'types/Product';\nimport { RecAiEvent, RecAiPlacementEnum, RecAiRequest, RecAiResult } from 'types/api/recAi';\nimport { ensureHttpsUrl, getEnvironmentAwareUrl } from './product';\nimport { getGaClientId } from './global';\nimport log from './log';\n\nexport const createRecAiProductModel = (data: RecAiResult): RecAiProduct[] => {\n return data.results.map(product => ({\n name: product.title,\n productUrl: getEnvironmentAwareUrl(product.uri),\n price: product.sale_price.toString(),\n retailPrice: product.price.toString(),\n id: product.id,\n thumbUrl: ensureHttpsUrl(product.img),\n score: product.score || 0,\n schedule: product.schedule\n }));\n};\n\nexport const createRecAiRequestBody = (\n eventType: RecAiEvent,\n placement: RecAiPlacementEnum,\n productId: string\n): RecAiRequest | null => {\n const gaClientId = getGaClientId();\n\n if (!gaClientId) {\n log.warn('Google Analytics client id is not available');\n return null;\n }\n\n return {\n event_type: eventType,\n page_size: 9,\n placement: placement,\n product_id: productId,\n return_product: true,\n return_score: true,\n validate_only: process.env.REACT_APP_REAL_RESULTS !== 'true',\n visitor_id: gaClientId\n };\n};\n","import log from './log';\n\nexport const setGaCallback = (callback: () => void): void => {\n let retryCounter = 0;\n\n const checkIfAnalyticsLoaded = () => {\n if (retryCounter++ > 20) {\n console.warn(\n 'Google Analytics is not initialized after numerous attempts. Callback will not be executed.'\n );\n return;\n }\n\n if (typeof ga === 'function' && (ga as UniversalAnalytics.ga & { loaded: boolean }).loaded) {\n ga(callback);\n } else {\n setTimeout(checkIfAnalyticsLoaded, 500);\n }\n };\n\n checkIfAnalyticsLoaded();\n};\n\nexport const getGaClientId = (): string | null => {\n try {\n const gaTracker = ga.getAll();\n\n if (!gaTracker.length) {\n log.error('Error: Unable to find tracker in GA using ga.getAll()');\n return null;\n }\n\n return gaTracker[0].get('clientId');\n } catch (e) {\n log.error('An error occurred: \\n', e);\n return null;\n }\n};\n","import { useCallback, useEffect, useState } from 'react';\nimport CustomersAlsoViewed from 'components/CustomersAlsoViewed/CustomersAlsoViewed';\nimport { createRecAiProductModel, createRecAiRequestBody } from 'utils/recAiFactory';\nimport { RecAiPlacementEnum, RecAiResult } from 'types/api/recAi';\nimport log from 'utils/log';\nimport { setGaCallback } from 'utils/global';\n\ninterface CustomersAlsoViewedWidgetProps {\n productId: string;\n}\n\nconst CustomersAlsoViewedWidget = ({ productId }: CustomersAlsoViewedWidgetProps) => {\n const [productsResult, setProductsResult] = useState();\n\n const getProducts = useCallback(async () => {\n const body = createRecAiRequestBody(\n 'detail-page-view',\n RecAiPlacementEnum.FreqBoughtTogether,\n productId\n );\n\n if (!body) return;\n\n try {\n const request = await fetch(`${process.env.REACT_APP_RECAI_API_PATH}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(body)\n });\n\n const response = await request.json();\n\n setProductsResult(response);\n } catch (e) {\n log.error('Error occurred while requesting recommendations \\n', e);\n }\n }, [productId]);\n\n useEffect(() => {\n setGaCallback(getProducts);\n }, [getProducts]);\n\n if (productsResult) {\n return ;\n } else {\n return ;\n }\n};\n\nexport default CustomersAlsoViewedWidget;\n"],"names":["_polyline","_excluded","_extends","Object","assign","target","i","arguments","length","source","key","prototype","hasOwnProperty","call","apply","this","_objectWithoutProperties","excluded","sourceKeys","keys","indexOf","_objectWithoutPropertiesLoose","getOwnPropertySymbols","sourceSymbolKeys","propertyIsEnumerable","SvgPrevArrow","_ref","svgRef","title","titleId","props","xmlns","viewBox","ref","id","fill","strokeWidth","points","ForwardRef","SvgNextArrow","KnownEnvironmentDomains","appSettings","disallowedDiscountSchedules","KnownCampaigns","getEnvironmentAwareUrl","productUrl","URL","window","location","toString","hostname","port","protocol","targetURL","ensureHttpsUrl","url","device","fontFamily","BuyButton","styled","ProductContainer","ProductImage","ProductName","ActualPrice","ProductPrice","Discount","ProductDiscount","product","priceDiscount","retailPrice","currentPrice","numRetailPrice","Number","numCurrentPrice","isNaN","toFixed","getFormattedDiscount","price","includes","schedule","href","name","draggable","alt","src","thumbUrl","SliderHeader","ArrowSpan","SliderContainer","theme","sliderSettings","dots","infinite","speed","slidesToShow","slidesToScroll","responsive","breakpoint","settings","ArrowButton","className","onClick","children","type","products","analyticsCampaignName","useState","mouseDown","setMouseDown","dragging","setDragging","useEffect","mouseMove","handleMouseUp","handleMouseMove","e","Math","abs","movementX","movementY","document","addEventListener","removeEventListener","handleMouseDown","useDragDetection","handleChildClick","useCallback","preventDefault","stopPropagation","handleClick","campaignName","dispatchEvent","CustomEvent","detail","emitProductClickEvent","nextArrow","prevArrow","map","onMouseDownCapture","onClickCapture","RecAiPlacementEnum","CustomersAlsoViewedContainer","CustomersAlsoViewed","createRecAiRequestBody","eventType","placement","productId","gaClientId","gaTracker","ga","getAll","get","log","getGaClientId","event_type","page_size","product_id","return_product","return_score","validate_only","process","visitor_id","data","productsResult","setProductsResult","getProducts","body","FreqBoughtTogether","fetch","method","headers","JSON","stringify","request","json","response","callback","retryCounter","checkIfAnalyticsLoaded","console","warn","loaded","setTimeout","setGaCallback","results","uri","sale_price","img","score","style","display"],"sourceRoot":""}