{"version":3,"file":"productresults.bundle.js","mappings":"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,KAAMC,QAAS,MACvB,CACID,KAAM,IACNC,QACI,kCAER,CAAED,KAAM,IAAKC,QAAS,UACtB,CACID,KAAM,IACNC,QAAS,mBAEb,CAAED,KAAM,IAAKC,QAAS,kBACtB,CACID,KAAM,IACNC,QACI,wBAER,CAAED,KAAM,IAAKC,QAAS,SACtB,CAAED,KAAM,IAAKC,QAAS,kBACtB,CACID,KAAM,IACNC,QACI,sBAER,CAAED,KAAM,KAAMC,QAAS,KACvB,CAAED,KAAM,KAAMC,QAAS,KACvB,CAAED,KAAM,IAAKC,QAAS,YACtB,CACID,KAAM,IACNC,QAAS,oBAEb,CAAED,KAAM,KAAMC,QAAS,KACvB,CAAED,KAAM,KAAMC,QAAS,KACvB,CACID,KAAM,IACNC,QACI,+CAER,CAAED,KAAM,KAAMC,QAAS,KACvB,CAAED,KAAM,KAAMC,QAAS,KACvB,CAAED,KAAM,KAAMC,QAAS,KACvB,CAAED,KAAM,KAAMC,QAAS,MACvB,CAAED,KAAM,KAAMC,QAAS,MACvB,CAAED,KAAM,IAAKC,QAAS,cACtB,CAAED,KAAM,IAAKC,QAAS,UACtB,CACID,KAAM,IACNC,QACI,qBAER,CACID,KAAM,IACNC,QACI,qBAER,CACID,KAAM,IACNC,QAAS,mBAEb,CAAED,KAAM,KAAMC,QAAS,KACvB,CACID,KAAM,IACNC,QACI,sCAER,CAAED,KAAM,IAAKC,QAAS,YACtB,CAAED,KAAM,KAAMC,QAAS,KACvB,CAAED,KAAM,IAAKC,QAAS,cACtB,CAAED,KAAM,IAAKC,QAAS,SACtB,CACID,KAAM,IACNC,QAAS,mBAEb,CAAED,KAAM,IAAKC,QAAS,kBACtB,CACID,KAAM,IACNC,QACI,uCAER,CAAED,KAAM,KAAMC,QAAS,KACvB,CAAED,KAAM,KAAMC,QAAS,OACvB,CAAED,KAAM,KAAMC,QAAS,KACvB,CAAED,KAAM,KAAMC,QAAS,KACvB,CAAED,KAAM,KAAMC,QAAS,MACvB,CAAED,KAAM,KAAMC,QAAS,KACvB,CAAED,KAAM,IAAKC,QAAS,aACtB,CAAED,KAAM,IAAKC,QAAS,iBACtB,CA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","sources":["webpack:///webpack/runtime/chunk loaded","webpack:///webpack/runtime/create fake namespace object","webpack:///webpack/runtime/load script","webpack:///webpack/runtime/css loading","webpack:///./components/v2/AdCard/AdCard.tsx","webpack:///./components/v2/NiceSelect/NiceSelect.tsx","webpack:///./components/v2/utils/SizeHelpers.ts","webpack:///./components/v2/ProductCard/productCardi18n.ts","webpack:///./components/v2/ProductCard/productCardModali18n.ts","webpack:///./components/v2/ProductCard/ProductCardModal.tsx","webpack:///./components/v2/ProductCard/ProductCard.tsx","webpack:///./components/v2/PrpFilterPanel/i18n.ts","webpack:///./components/v2/PrpFilterPanel/OnAirButtons.tsx","webpack:///./components/v2/utils/removeDiacritic.ts","webpack:///./components/v2/PrpFilterPanel/PrpFilterPanel.tsx","webpack:///./components/v2/PrpNoSearchResults/PrpNoSearchResults.tsx","webpack:///./components/v2/Prp/i18n.ts","webpack:///./components/v2/Prp/Prp.mock.tsx","webpack:///./components/v2/Prp/Prp.tsx","webpack:///./components/v2/Prp/index.tsx","webpack:///./entry/productresults.ts","webpack:///external var \"jQuery\"","webpack:///webpack/bootstrap","webpack:///webpack/runtime/compat get default export","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/ensure chunk","webpack:///webpack/runtime/get javascript chunk filename","webpack:///webpack/runtime/get mini-css chunk filename","webpack:///webpack/runtime/global","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///webpack/runtime/make namespace object","webpack:///webpack/runtime/runtimeId","webpack:///webpack/runtime/publicPath","webpack:///webpack/runtime/jsonp chunk loading","webpack:///webpack/runtime/nonce","webpack:///webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var getProto = Object.getPrototypeOf ? function(obj) { return Object.getPrototypeOf(obj); } : function(obj) { return obj.__proto__; };\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach(function(key) { def[key] = function() { return value[key]; }; });\n\t}\n\tdef['default'] = function() { return value; };\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"tsc-react:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = function(url, done, key, chunkId) {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = function(prev, event) {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach(function(fn) { return fn(event); });\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","var createStylesheet = function(chunkId, fullhref, resolve, reject) {\n\tvar linkTag = document.createElement(\"link\");\n\n\tlinkTag.rel = \"stylesheet\";\n\tlinkTag.type = \"text/css\";\n\tvar onLinkComplete = function(event) {\n\t\t// avoid mem leaks.\n\t\tlinkTag.onerror = linkTag.onload = null;\n\t\tif (event.type === 'load') {\n\t\t\tresolve();\n\t\t} else {\n\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\tvar realHref = event && event.target && event.target.href || fullhref;\n\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + realHref + \")\");\n\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n\t\t\terr.type = errorType;\n\t\t\terr.request = realHref;\n\t\t\tlinkTag.parentNode.removeChild(linkTag)\n\t\t\treject(err);\n\t\t}\n\t}\n\tlinkTag.onerror = linkTag.onload = onLinkComplete;\n\tlinkTag.href = fullhref;\n\n\tdocument.head.appendChild(linkTag);\n\treturn linkTag;\n};\nvar findStylesheet = function(href, fullhref) {\n\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n\tfor(var i = 0; i < existingLinkTags.length; i++) {\n\t\tvar tag = existingLinkTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return tag;\n\t}\n\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n\tfor(var i = 0; i < existingStyleTags.length; i++) {\n\t\tvar tag = existingStyleTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\");\n\t\tif(dataHref === href || dataHref === fullhref) return tag;\n\t}\n};\nvar loadStylesheet = function(chunkId) {\n\treturn new Promise(function(resolve, reject) {\n\t\tvar href = __webpack_require__.miniCssF(chunkId);\n\t\tvar fullhref = __webpack_require__.p + href;\n\t\tif(findStylesheet(href, fullhref)) return resolve();\n\t\tcreateStylesheet(chunkId, fullhref, resolve, reject);\n\t});\n}\n// object to store loaded CSS chunks\nvar installedCssChunks = {\n\t9196: 0\n};\n\n__webpack_require__.f.miniCss = function(chunkId, promises) {\n\tvar cssChunks = {\"7867\":1,\"8652\":1};\n\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n\t\tpromises.push(installedCssChunks[chunkId] = loadStylesheet(chunkId).then(function() {\n\t\t\tinstalledCssChunks[chunkId] = 0;\n\t\t}, function(e) {\n\t\t\tdelete installedCssChunks[chunkId];\n\t\t\tthrow e;\n\t\t}));\n\t}\n};\n\n// no hmr","import React from 'react';\r\n\r\n/**\r\n * AdCard component props\r\n *\r\n * @interface AdCardProps\r\n */\r\nexport interface AdCardProps {\r\n /** @member {string} `image` Source of the background image */\r\n image: string;\r\n /** @member {string} `title` Title text */\r\n title: string;\r\n /** @member {string} `text` Main content */\r\n text: string;\r\n /** @member {string} `href` Redirect URLs */\r\n href: string;\r\n /** @member {string} `text` Call to action text */\r\n ctaText: string;\r\n /** @member {string} `imageAlt` Alt tag for the image */\r\n imageAlt: string;\r\n /** @member {string} `textColour` Text colour in RGB format like `A1A1A1` */\r\n textColour: string;\r\n /** @member {string} `textBackgroundColour` Text background colour in RGB format like `A1A1A1` */\r\n textBackgroundColour: string;\r\n /** @member {number} `textBackgroundOpacity` Text background opacity. Range 0-1 */\r\n textBackgroundOpacity: number;\r\n /** @member {string | undefined} `className` CSS classname */\r\n className?: string;\r\n}\r\n\r\nconst AdCard = ({ image, title, text, ctaText, href, imageAlt, textColour, textBackgroundColour, textBackgroundOpacity, className = '' }: AdCardProps) => {\r\n return (\r\n
\r\n \r\n
\r\n {imageAlt}\r\n
\r\n {title}\r\n {text}\r\n {ctaText}\r\n
\r\n \r\n
\r\n );\r\n};\r\n\r\nexport default AdCard;\r\n","import React, { useState, useLayoutEffect, useEffect, useRef, MouseEvent, Fragment } from 'react';\r\n\r\ntype OptionProps = {\r\n option: string;\r\n value: string;\r\n disabled?: boolean;\r\n};\r\n\r\ntype NiceSelectProps = {\r\n id: string;\r\n options: OptionProps[];\r\n selectedIndex?: number;\r\n label?: string;\r\n selectClassName?: string;\r\n selectDefaultValue?: string;\r\n selectOnLoad?: () => any;\r\n selectOnChange?: Function;\r\n};\r\n\r\ntype SelectedOption = {\r\n option: string;\r\n value: string;\r\n};\r\n\r\nconst NiceSelect = ({\r\n id,\r\n options,\r\n selectedIndex,\r\n label,\r\n selectClassName,\r\n selectDefaultValue,\r\n selectOnLoad,\r\n selectOnChange,\r\n}: NiceSelectProps) => {\r\n const [selectedOption, setSelectedOption] = useState({\r\n option: options[0].option,\r\n value: options[0].value,\r\n });\r\n const [isNiceSelectOpen, setIsNiceSelectOpen] = useState(false);\r\n const [isMobileDevice, setIsMobileDevice] = useState(true);\r\n\r\n const selectInput = useRef(null);\r\n const niceSelectContainer = useRef(null);\r\n const niceSelectRef = useRef(null);\r\n const currentlySelected = useRef(null);\r\n\r\n const isTouchDevice = () =>\r\n /(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|ipad|iris|kindle|Android|Silk|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(\r\n navigator.userAgent,\r\n ) ||\r\n /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i.test(\r\n navigator.userAgent.substr(0, 4),\r\n );\r\n //const isTouchDevice = () => 'ontouchstart' in window || navigator.maxTouchPoints > 0;\r\n\r\n const setSelectOption = (val: string) => {\r\n const selected = options.find((opt) => opt.value === val);\r\n if (selected) {\r\n const formatSelected = { option: selected.option, value: selected.value };\r\n setSelectedOption(formatSelected);\r\n }\r\n };\r\n\r\n const showHideNiceSelect = (event: MouseEvent, isOpen: boolean) => {\r\n event.preventDefault();\r\n setIsNiceSelectOpen(isOpen);\r\n setTimeout(() => currentlySelected.current?.focus(), 10);\r\n };\r\n\r\n const setNiceSelectOption = (event: MouseEvent, selected: SelectedOption) => {\r\n event.preventDefault();\r\n setSelectedOption(selected);\r\n setIsNiceSelectOpen(false);\r\n niceSelectRef.current?.focus();\r\n };\r\n\r\n const blurNiceSelect = () => {\r\n setTimeout(() => {\r\n if (!niceSelectContainer.current?.contains(document.activeElement)) setIsNiceSelectOpen(false);\r\n }, 150);\r\n };\r\n\r\n useLayoutEffect(() => {\r\n setIsMobileDevice(isTouchDevice);\r\n if (selectDefaultValue) {\r\n const defaultValueIndex = options.findIndex((opt) => opt.value === selectDefaultValue);\r\n setSelectedOption({\r\n option: options[defaultValueIndex].option,\r\n value: options[defaultValueIndex].value,\r\n });\r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (selectedIndex > -1) {\r\n setSelectedOption({\r\n value: options[selectedIndex].value,\r\n option: options[selectedIndex].option,\r\n });\r\n }\r\n }, [selectedIndex]);\r\n\r\n return (\r\n
\r\n \r\n {label}\r\n \r\n {isMobileDevice &&
}\r\n {\r\n setSelectOption(e.currentTarget.value);\r\n if (selectOnChange) selectOnChange(e.currentTarget.value);\r\n }}\r\n tabIndex={!isMobileDevice ? -1 : 0}\r\n aria-hidden={isMobileDevice}\r\n >\r\n {options.map((opt, i) => {\r\n const { option, value, disabled } = opt;\r\n return (\r\n \r\n );\r\n })}\r\n \r\n {!isMobileDevice && (\r\n
\r\n {label && (\r\n \r\n \r\n
\r\n
\r\n )}\r\n showHideNiceSelect(e, true)}\r\n aria-labelledby={`niceSelect-${id}-label niceSelect-${id}-selected`}\r\n aria-describedby={`niceSelect-${id}-selected-desc`}\r\n aria-haspopup=\"listbox\"\r\n aria-controls={`niceSelect-${id}-ul`}\r\n aria-expanded={isNiceSelectOpen}\r\n >\r\n {selectedOption.option}\r\n \r\n \r\n Select to choose a different option.\r\n

\r\n {isNiceSelectOpen && (\r\n \r\n {options.map((opt, i) => {\r\n const { option, value, disabled } = opt;\r\n return (\r\n
  • \r\n {\r\n setNiceSelectOption(e, { option, value });\r\n if (selectOnChange) selectOnChange(value);\r\n }}\r\n aria-selected={value === selectedOption.value}\r\n >\r\n {option}\r\n \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 NiceSelect;\r\n","/**\r\n * Type union definition of available label sizes.\r\n * This sizes are human readable format of the character limits.\r\n * These values don't represent the \"size labels\" of the products.\r\n */\r\nexport type Size =\r\n | 'sm'\r\n | 'md'\r\n | 'lg'\r\n | 'xl'\r\n | 'select';\r\n\r\ntype SizesWithoutSelect = Exclude\r\n\r\ntype SizeCharMapping = 'sm' | 'md' | 'lg' | 'max';\r\n\r\ntype SizeDimension = {\r\n DimensionId: string;\r\n DisplayName: string;\r\n};\r\n\r\n/**\r\n * Values for each label size that determines when the label size\r\n * should go up one size.\r\n */\r\nexport const thresholds: Record = {\r\n 'sm': 3,\r\n 'md': 2.25,\r\n 'lg': 2,\r\n 'xl': 1.5,\r\n};\r\n\r\n/**\r\n * Actual character limits for each label size\r\n */\r\nexport const charLimit: Record = {\r\n 'sm': 2,\r\n 'md': 5,\r\n 'lg': 8,\r\n 'max': 20,\r\n};\r\n\r\n/**\r\n * How many items can fit into one row\r\n */\r\nexport const maxItems: Record = {\r\n 'sm': 12,\r\n 'md': 10,\r\n 'lg': 8,\r\n 'xl': 4,\r\n};\r\n\r\nexport default class SizeHelpers {\r\n // public static sortLabels = (labels: SizeDimension[]): SizeDimension[] => {\r\n // const sorted: SizeDimension[] = [].concat(labels);\r\n // sorted.sort((a, b) => a.DisplayName.length - b.DisplayName.length);\r\n // return sorted;\r\n // }\r\n\r\n public static determineSize = (labels: SizeDimension[]): Size => {\r\n const max = SizeHelpers.maxLength(labels);\r\n const mean = SizeHelpers.meanLength(labels);\r\n const diff = max / mean;\r\n\r\n // If any label is super-long, don't display as tiles\r\n // Use select (dropdown) variation\r\n if (max >= charLimit['max']) {\r\n return 'select';\r\n }\r\n\r\n if (max <= charLimit['sm']) {\r\n return 'sm';\r\n }\r\n\r\n if (mean <= charLimit['md'] && max <= charLimit['md']) {\r\n return 'md';\r\n }\r\n\r\n if (mean <= charLimit['lg'] && max <= charLimit['lg']) {\r\n return 'lg';\r\n }\r\n\r\n if (mean <= charLimit['max'] && max < charLimit['max']) {\r\n return 'xl';\r\n }\r\n\r\n // Select a size\r\n const size = SizeHelpers.compareMeanWithCharLimits(mean);\r\n const bumpedSize = SizeHelpers.bumpIfExceedsThreshold(size, diff);\r\n\r\n return bumpedSize;\r\n }\r\n\r\n private static maxLength = (labels: SizeDimension[]): number => {\r\n const lengths = labels.map((label) => label.DisplayName.length);\r\n let max: number = -1;\r\n\r\n for (let length of lengths) {\r\n max = length > max ? length : max;\r\n }\r\n\r\n return max;\r\n }\r\n\r\n private static meanLength = (labels: SizeDimension[]): number => {\r\n if (labels.length === 0) {\r\n return 0;\r\n }\r\n\r\n const total = labels.reduce((acc, curr) => acc + curr.DisplayName.length, 0);\r\n const mean = total / labels.length;\r\n return mean;\r\n }\r\n\r\n private static compareMeanWithCharLimits = (mean: number): Size => {\r\n let size: Size = 'xl';\r\n\r\n if (mean <= charLimit['lg']) {\r\n size = 'lg';\r\n }\r\n\r\n if (mean <= charLimit['md']) {\r\n size = 'md';\r\n }\r\n\r\n if (mean <= charLimit['sm']) {\r\n size = 'sm';\r\n }\r\n\r\n return size;\r\n }\r\n\r\n private static bumpIfExceedsThreshold = (initial: Size, diff: number): Size => {\r\n let size = initial;\r\n\r\n // Bump up if the mean/max diff exceeds a threshold\r\n if (size === 'sm' && diff > thresholds['sm']) {\r\n size = 'md';\r\n }\r\n\r\n if (size === 'md' && diff > thresholds['md']) {\r\n size = 'lg';\r\n }\r\n\r\n if (size === 'lg' && diff > thresholds['lg']) {\r\n size = 'xl';\r\n }\r\n\r\n if (size === 'xl' && diff > thresholds['xl']) {\r\n size = 'select';\r\n }\r\n\r\n return size;\r\n }\r\n}","export const en = {\r\n styles: 'styles',\r\n tastes: 'tastes',\r\n sizes: 'sizes',\r\n frequency: 'frequency',\r\n addedToBag: 'Added to bag',\r\n addToBag: 'Add to bag',\r\n selectSize: 'Select size',\r\n selectStyle: 'Select style',\r\n optionsAvailable: 'Options available',\r\n selectSizeAndStyle: 'Select size & style',\r\n oneTimeShipment: '1 Time Shipment',\r\n autoDelivery: 'Auto Delivery',\r\n size: 'Size',\r\n viewAllSizes: 'View all sizes',\r\n viewAll: 'View all',\r\n was: 'Was',\r\n reviews: 'reviews',\r\n by: 'By',\r\n like: 'Like',\r\n currentPrice: 'Current price:',\r\n previousPrice: 'Previous price:',\r\n goToDetailPage: 'Go to detail page',\r\n freeShipping: 'Free Shipping',\r\n onlyXLeft: 'Only {{inventory}} item(s) left',\r\n outOf: 'out of',\r\n outOfStock: 'Out of stock',\r\n rating: 'Rating:',\r\n stars: 'stars'\r\n};\r\n\r\nexport const fr = {\r\n styles: 'styles',\r\n tastes: 'tastes',\r\n sizes: 'sizes',\r\n frequency: 'frequency',\r\n addedToBag: 'Added to bag',\r\n addToBag: 'Add to bag',\r\n selectSize: 'Select size',\r\n selectStyle: 'Select style',\r\n optionsAvailable: 'Options available',\r\n selectSizeAndStyle: 'Select size & style',\r\n oneTimeShipment: '1 Time Shipment',\r\n autoDelivery: 'Auto Delivery',\r\n size: 'Size',\r\n viewAllSizes: 'View all sizes',\r\n viewAll: 'View all',\r\n was: 'Was',\r\n reviews: 'reviews',\r\n by: 'By',\r\n like: 'Comme',\r\n currentPrice: 'Prix actuel :',\r\n previousPrice: 'Prix précédent :',\r\n goToDetailPage: 'Go to detail page',\r\n freeShipping: 'Livraison Gratuite',\r\n onlyXLeft: 'Stock limité: seulement {{inventory}} unité(s)',\r\n outOf: 'sur',\r\n outOfStock: 'Stock épuisé',\r\n rating: 'Note :',\r\n stars: 'étoiles'\r\n};\r\n","export const en = {\r\n colours: 'colours',\r\n tastes: 'tastes',\r\n sizes: 'sizes',\r\n frequency: 'frequency',\r\n addedToBag: 'Added to bag',\r\n addToBag: 'Add to bag',\r\n selectSize: 'Select size',\r\n selectStyle: 'Select style',\r\n optionsAvailable: 'Options available',\r\n selectSizeAndStyle: 'Select size & style',\r\n oneTimeShipment: '1 Time Shipment',\r\n autoDelivery: 'Auto Delivery',\r\n size: 'Size',\r\n viewAllSizes: 'View all sizes',\r\n viewAll: 'View all',\r\n was: 'Was',\r\n reviews: 'reviews',\r\n by: 'By',\r\n goToDetailPage: 'Go to detail page',\r\n};\r\n\r\nexport const fr = {\r\n colours: 'colours',\r\n tastes: 'tastes',\r\n sizes: 'sizes',\r\n frequency: 'frequency',\r\n addedToBag: 'Added to bag',\r\n addToBag: 'Add to bag',\r\n selectSize: 'Select size',\r\n selectStyle: 'Select style',\r\n optionsAvailable: 'Options available',\r\n selectSizeAndStyle: 'Select size & style',\r\n oneTimeShipment: '1 Time Shipment',\r\n autoDelivery: 'Auto Delivery',\r\n size: 'Size',\r\n viewAllSizes: 'View all sizes',\r\n viewAll: 'View all',\r\n was: 'Was',\r\n reviews: 'reviews',\r\n by: 'By',\r\n goToDetailPage: 'Go to detail page',\r\n};\r\n","import classNames from 'classnames';\r\nimport React, { useState, useMemo, useCallback, useEffect, useRef, KeyboardEvent } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport insightsClient from 'search-insights';\r\n\r\nimport { IEdp } from '../Prp/IProduct';\r\nimport { ProductHelpers } from '../utils/ProductHelpers';\r\nimport { Size } from '../utils/SizeHelpers';\r\nimport { SwatchHelpers } from '../utils/SwatchHelpers';\r\n\r\nimport { ProductCategoryType, StyleAndSize, deriveFreqAutoDelivery } from './ProductCard';\r\nimport { en, fr } from './productCardModali18n';\r\n\r\nexport interface ProductCardModalProps {\r\n onCloseListener: () => void;\r\n colorOrTasteText: string;\r\n styles: Array<{\r\n DimensionId: string;\r\n DisplayName: string;\r\n }>;\r\n sizes: Array<{\r\n DimensionId: string;\r\n DisplayName: string;\r\n }>;\r\n productImage: string;\r\n edps: Array;\r\n edp: number;\r\n AvailableSwatches: string[];\r\n //onAddToBagClickListener: (sizeIndex: number, styleIndex: number) => Promise;\r\n onAddToBagClickListener: (styleIndex: number, sizeIndex: number) => void;\r\n productHref: string;\r\n categoryPath: ProductCategoryType;\r\n updateSizeIndex: (value: React.SetStateAction) => void;\r\n updateColorOrTasteIndex: (value: React.SetStateAction) => void;\r\n mainIsAddedToBag: boolean;\r\n updateIsAddToBagLoading: (value: React.SetStateAction) => void;\r\n itemNo?: string;\r\n position?: number;\r\n currentPage?: number;\r\n pageSize?: number;\r\n queryId?: string;\r\n showSwatches: boolean;\r\n labelSize: Size;\r\n displayedSizeLabels: StyleAndSize[];\r\n}\r\n\r\nconst ProductCardModal = ({\r\n onCloseListener,\r\n colorOrTasteText,\r\n AvailableSwatches,\r\n styles,\r\n sizes,\r\n productImage,\r\n edps,\r\n onAddToBagClickListener,\r\n productHref,\r\n categoryPath,\r\n updateSizeIndex,\r\n updateColorOrTasteIndex,\r\n mainIsAddedToBag,\r\n updateIsAddToBagLoading,\r\n itemNo,\r\n edp,\r\n position,\r\n currentPage,\r\n pageSize,\r\n queryId,\r\n showSwatches,\r\n labelSize,\r\n displayedSizeLabels,\r\n}: ProductCardModalProps) => {\r\n const { i18n, t } = useTranslation('product-card-modal');\r\n i18n.addResourceBundle('en', 'product-card-modal', en, true, true);\r\n i18n.addResourceBundle('fr', 'product-card-modal', fr, true, true);\r\n\r\n const [selectedSizeIndex, _setSelectedSizeIndex] = useState(-1);\r\n const [selectedColorOrTasteIndex, _setSelectedColorOrTasteIndex] = useState(-1);\r\n const [isAddedToBag, setIsAddedToBag] = useState(false);\r\n const [isAddToBagLoading, _setIsAddToBagLoading] = useState(false);\r\n const IMAGE_URL_PREFIX = 'https://item.tscimg.ca/TSC/';\r\n const LOADING_ASSET_PATH = '/App_Assets/public/loading.gif';\r\n const SIZE_COUNT_LIMIT = 10;\r\n const STYLE_COUNT_LIMIT = 16;\r\n const productCardOverlay = useRef(null);\r\n\r\n const setSelectedSizeIndex = (value: React.SetStateAction) => {\r\n _setSelectedSizeIndex(value);\r\n updateSizeIndex(value);\r\n };\r\n\r\n const setSelectedColorOrTasteIndex = (value: React.SetStateAction) => {\r\n _setSelectedColorOrTasteIndex(value);\r\n updateColorOrTasteIndex(value);\r\n };\r\n\r\n const setIsAddToBagLoading = (value: React.SetStateAction) => {\r\n _setIsAddToBagLoading(value);\r\n updateIsAddToBagLoading(value);\r\n };\r\n\r\n const buttonText = useMemo(() => {\r\n if (isAddedToBag) {\r\n return t('addedToBag');\r\n }\r\n\r\n if (styles.length === 0 && sizes.length === 0) {\r\n return t('addToBag');\r\n }\r\n\r\n if (styles.length === 0 && sizes.length !== 0) {\r\n if (selectedSizeIndex === -1) {\r\n return t('selectSize');\r\n }\r\n }\r\n\r\n if (styles.length !== 0 && sizes.length === 0) {\r\n if (selectedColorOrTasteIndex === -1) {\r\n return t('selectStyle');\r\n }\r\n }\r\n\r\n if (styles.length !== 0 && sizes.length !== 0) {\r\n if (selectedSizeIndex === -1 && selectedColorOrTasteIndex === -1) {\r\n return t('selectSizeAndStyle');\r\n }\r\n\r\n if (selectedSizeIndex !== -1 && selectedColorOrTasteIndex === -1) {\r\n return t('selectStyle');\r\n }\r\n\r\n if (selectedSizeIndex === -1 && selectedColorOrTasteIndex !== -1) {\r\n return t('selectSize');\r\n }\r\n }\r\n\r\n return t('addToBag');\r\n }, [isAddedToBag, selectedSizeIndex, selectedColorOrTasteIndex, styles, sizes, categoryPath]);\r\n\r\n function getDefaultEdpItem() {\r\n return edps.find((edpItem) => edpItem.EdpNo === edp);\r\n }\r\n\r\n const isFreqAutoDelivery = deriveFreqAutoDelivery(\r\n sizes,\r\n styles,\r\n getDefaultEdpItem,\r\n selectedSizeIndex,\r\n edps,\r\n selectedColorOrTasteIndex,\r\n );\r\n\r\n const ctaText = useMemo(() => {\r\n if (styles.length === 0 && sizes.length === 0) {\r\n return t('goToDetailPage');\r\n }\r\n\r\n if (styles.length === 0 && sizes.length !== 0) {\r\n if (selectedSizeIndex === -1) {\r\n return t('selectSize');\r\n }\r\n }\r\n\r\n if (styles.length !== 0 && sizes.length === 0) {\r\n if (selectedColorOrTasteIndex === -1) {\r\n return t('selectStyle');\r\n }\r\n }\r\n\r\n if (styles.length !== 0 && sizes.length !== 0) {\r\n if (selectedSizeIndex === -1 && selectedColorOrTasteIndex === -1) {\r\n return t('selectSizeAndStyle');\r\n }\r\n\r\n if (selectedSizeIndex !== -1 && selectedColorOrTasteIndex === -1) {\r\n return t('selectStyle');\r\n }\r\n\r\n if (selectedSizeIndex === -1 && selectedColorOrTasteIndex !== -1) {\r\n return t('selectSize');\r\n }\r\n }\r\n\r\n if (!showSwatches && labelSize === 'select') {\r\n return t('selectSizeAndStyle');\r\n }\r\n\r\n return t('goToDetailPage');\r\n }, [\r\n isAddedToBag,\r\n selectedSizeIndex,\r\n selectedColorOrTasteIndex,\r\n styles,\r\n sizes,\r\n categoryPath,\r\n showSwatches,\r\n labelSize,\r\n ]);\r\n\r\n const isSOEligible = useMemo(() => {\r\n let isSOEligible = false;\r\n\r\n for (const edp of edps) {\r\n if (edp.IsSOEligible == true) {\r\n isSOEligible = true;\r\n break;\r\n }\r\n }\r\n return isSOEligible;\r\n }, [edps]);\r\n\r\n const onSizeKeyDownListener = (e: React.KeyboardEvent, i: number) => {\r\n if (e.key === 'Enter') {\r\n // console.log('%c onSizeKeyDownListener.', 'color: purple; font-weight: bold;');\r\n e.preventDefault();\r\n setSelectedSizeIndex((prev) => (prev === i ? -1 : i));\r\n }\r\n };\r\n\r\n const onSizeClickListener = (e: React.MouseEvent, i: number) => {\r\n e.preventDefault();\r\n setSelectedSizeIndex((prev) => (prev === i ? -1 : i));\r\n };\r\n\r\n const onColorOrTasteKeyDownListener = (e: React.KeyboardEvent, i: number) => {\r\n // console.log('%c onColorOrTasteKeyDownListener.', 'color: purple; font-weight: bold;');\r\n if (e.key === 'Enter') {\r\n e.preventDefault();\r\n setSelectedColorOrTasteIndex((prev) => (prev === i ? -1 : i));\r\n }\r\n };\r\n\r\n const onColorOrTasteClickListener = (e: React.MouseEvent, i: number) => {\r\n e.preventDefault();\r\n setSelectedColorOrTasteIndex((prev) => (prev === i ? -1 : i));\r\n };\r\n\r\n const keyboardControls = (event: KeyboardEvent) => {\r\n /*\r\n console.log('%c event.code:', 'color: red; font-weight: bold;');\r\n console.log({ eventCode: event.code });\r\n */\r\n if (event.code === 'Escape') {\r\n event.preventDefault();\r\n setIsAddedToBag(false);\r\n onCloseListener();\r\n return;\r\n }\r\n const isTabPressed = event.key === 'Tab';\r\n if (!isTabPressed) {\r\n return;\r\n }\r\n const focusableElements = 'button:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\r\n const firstFocusableElement = productCardOverlay?.current?.querySelectorAll(\r\n focusableElements,\r\n )[0] as HTMLElement;\r\n const focusableContent = productCardOverlay?.current?.querySelectorAll(focusableElements);\r\n /*\r\n console.log('%c firstFousableElement, focusableContent:', 'color: blue; font-weight: bold;');\r\n console.log({ firstFocusableElement, focusableContent });\r\n */\r\n if (!focusableContent) {\r\n return;\r\n }\r\n\r\n const lastFocusableElement = focusableContent[focusableContent.length - 1] as HTMLElement;\r\n if (event.shiftKey) {\r\n if (document.activeElement === firstFocusableElement) {\r\n event.preventDefault();\r\n lastFocusableElement.focus();\r\n }\r\n } else {\r\n if (document.activeElement === lastFocusableElement) {\r\n event.preventDefault();\r\n firstFocusableElement.focus();\r\n }\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n const firstParagraph = productCardOverlay?.current?.querySelector('p[tabindex=\"0\"]') as HTMLParagraphElement;\r\n firstParagraph?.focus();\r\n }, []);\r\n\r\n const onAddToBagClick = () => {\r\n setIsAddToBagLoading(true);\r\n };\r\n\r\n // useEffect(() => {\r\n // if (isAddToBagLoading) {\r\n // onAddToBagClickListener(selectedSizeIndex, selectedColorOrTasteIndex)\r\n // .then(() => {\r\n // setIsAddedToBag(true);\r\n // setIsAddToBagLoading(false);\r\n // });\r\n // }\r\n // }, [isAddToBagLoading]);\r\n\r\n const trackSearchEventClick = (itemNo: string, position: number) => {\r\n /*\r\n console.log('%c insightsClientObject:', 'color: red; font-weight: bold;');\r\n console.log({ insightsClientObject: {\r\n eventName: 'Items clicked',\r\n index: 'products',\r\n objectIDs: [itemNo],\r\n positions: [position + 1 + (currentPage - 1) * pageSize],\r\n queryID: queryId ? queryId : '',\r\n } });\r\n */\r\n insightsClient('clickedObjectIDsAfterSearch', {\r\n eventName: 'Items clicked',\r\n index: 'products',\r\n objectIDs: [itemNo],\r\n positions: [position + 1 + (currentPage - 1) * pageSize],\r\n queryID: queryId ? queryId : '',\r\n });\r\n };\r\n\r\n const isSizeDisabled = useCallback(\r\n (i: number): boolean => {\r\n return ProductHelpers.isSizeDisabled(i, selectedColorOrTasteIndex, edps, styles, sizes);\r\n },\r\n [selectedColorOrTasteIndex, edps, styles, sizes],\r\n );\r\n\r\n const isStyleDisabled = useCallback(\r\n (i: number): boolean => {\r\n return ProductHelpers.isStyleDisabled(i, selectedSizeIndex, edps, styles, sizes);\r\n },\r\n [selectedSizeIndex, edps, styles, sizes],\r\n );\r\n\r\n const firstAvailableStyleIndex = useMemo(() => {\r\n for (let i = 0; i < styles.length; i++) {\r\n if (!isStyleDisabled(i)) {\r\n return i;\r\n }\r\n }\r\n\r\n return -1;\r\n }, [styles, isStyleDisabled]);\r\n\r\n const firstAvailableSizeIndex = useMemo(() => {\r\n for (let i = 0; i < sizes.length; i++) {\r\n if (!isSizeDisabled(i)) {\r\n return i;\r\n }\r\n }\r\n\r\n return -1;\r\n }, [sizes, isSizeDisabled]);\r\n\r\n useEffect(() => {\r\n if (!showSwatches) {\r\n setSelectedColorOrTasteIndex(firstAvailableStyleIndex);\r\n }\r\n\r\n if (labelSize === 'select') {\r\n setSelectedSizeIndex(firstAvailableSizeIndex);\r\n }\r\n }, []);\r\n\r\n const getSwatchUrl = (index: number) => {\r\n const resource = AvailableSwatches[index];\r\n if (!resource) {\r\n return '';\r\n }\r\n return IMAGE_URL_PREFIX + resource;\r\n };\r\n\r\n const renderStyleSwatch = useCallback(() => {\r\n if (!showSwatches) {\r\n return <>;\r\n }\r\n\r\n return styles.slice(0, STYLE_COUNT_LIMIT).map((style, styleIndex) => (\r\n onColorOrTasteKeyDownListener(e, styleIndex)}\r\n onClick={(e) => onColorOrTasteClickListener(e, styleIndex)}\r\n disabled={isStyleDisabled(styleIndex)}\r\n aria-pressed={styleIndex === selectedColorOrTasteIndex}\r\n >\r\n setSelectedColorOrTasteIndex(styleIndex)}\r\n />\r\n \r\n \r\n {colorOrTasteText} {style.DisplayName}\r\n \r\n \r\n \r\n ));\r\n }, [\r\n showSwatches,\r\n styles,\r\n STYLE_COUNT_LIMIT,\r\n onColorOrTasteKeyDownListener,\r\n onColorOrTasteClickListener,\r\n isStyleDisabled,\r\n selectedColorOrTasteIndex,\r\n setSelectedColorOrTasteIndex,\r\n name,\r\n SwatchHelpers,\r\n SwatchHelpers.getSwatchUrl,\r\n colorOrTasteText,\r\n ]);\r\n\r\n const renderStyleDropdown = useCallback(() => {\r\n if (styles.length === 0) {\r\n return <>;\r\n }\r\n\r\n return (\r\n setSelectedColorOrTasteIndex(firstAvailableStyleIndex)}\r\n onChange={(e) => {\r\n const index = styles.findIndex((style) => {\r\n return style.DimensionId === e.target.value;\r\n });\r\n setSelectedColorOrTasteIndex(index);\r\n }}\r\n value={styles[selectedColorOrTasteIndex]?.DimensionId}\r\n >\r\n {styles.slice(0, STYLE_COUNT_LIMIT).map((style, styleIndex) => (\r\n \r\n ))}\r\n \r\n );\r\n }, [styles, setSelectedColorOrTasteIndex, selectedColorOrTasteIndex, isStyleDisabled]);\r\n\r\n const renderStyles = () => {\r\n return (\r\n
    \r\n {colorOrTasteText}\r\n {/* Color and Taste */}\r\n {styles.length !== 0 && (\r\n
    \r\n

    \r\n {t('selectStyle')}:{' '}\r\n {selectedColorOrTasteIndex !== -1 && (\r\n {styles[selectedColorOrTasteIndex].DisplayName}\r\n )}\r\n

    \r\n {showSwatches && (\r\n
    {renderStyleSwatch()}
    \r\n )}\r\n {!showSwatches && renderStyleDropdown()}\r\n {styles.length >= STYLE_COUNT_LIMIT && (\r\n trackSearchEventClick(itemNo, position)\r\n : null\r\n }\r\n >\r\n {`${t('viewAll')} ${colorOrTasteText}`}\r\n \r\n )}\r\n
    \r\n )}\r\n
    \r\n );\r\n };\r\n\r\n const renderSizeDropdown = useCallback(() => {\r\n if (sizes.length === 0) {\r\n return <>;\r\n }\r\n\r\n return (\r\n setSelectedSizeIndex(firstAvailableSizeIndex)}\r\n onChange={(e) => {\r\n const index = sizes.findIndex((size) => {\r\n return size.DimensionId === e.target.value;\r\n });\r\n setSelectedSizeIndex(index);\r\n }}\r\n value={sizes[selectedSizeIndex]?.DimensionId}\r\n >\r\n {sizes.map((size, sizeIndex) => (\r\n \r\n ))}\r\n \r\n );\r\n }, [sizes, firstAvailableSizeIndex, selectedSizeIndex, setSelectedSizeIndex, isSizeDisabled]);\r\n\r\n return (\r\n <>\r\n {\r\n setIsAddedToBag(false);\r\n onCloseListener();\r\n }}\r\n />\r\n {/* Mobile Modal */}\r\n keyboardControls(e)}\r\n >\r\n {\r\n setIsAddedToBag(false);\r\n onCloseListener();\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n
    \r\n
    \r\n {t('sizes')}\r\n\r\n {/* Size */}\r\n {/* Size */}\r\n {displayedSizeLabels.length !== 0 && (\r\n
    \r\n \r\n {t('selectSize')}:{' '}\r\n {selectedSizeIndex !== -1 && (\r\n {displayedSizeLabels[selectedSizeIndex].DisplayName}\r\n )}\r\n \r\n \r\n {labelSize === 'select' && renderSizeDropdown()}\r\n {labelSize !== 'select' &&\r\n displayedSizeLabels.map((size, sizeIndex) => (\r\n onSizeKeyDownListener(e, sizeIndex)}\r\n onClick={(e) => onSizeClickListener(e, sizeIndex)}\r\n disabled={isSizeDisabled(sizeIndex)}\r\n aria-pressed={sizeIndex === selectedSizeIndex}\r\n >\r\n setSelectedSizeIndex(sizeIndex)}\r\n disabled={isSizeDisabled(sizeIndex)}\r\n tabIndex={0}\r\n />\r\n \r\n Size\r\n {size.DisplayName}\r\n \r\n \r\n ))}\r\n
    \r\n {sizes.length > displayedSizeLabels.length && (\r\n trackSearchEventClick(itemNo, position)\r\n : null\r\n }\r\n >\r\n {t('viewAllSizes')}\r\n \r\n )}\r\n \r\n )}\r\n
    \r\n\r\n {renderStyles()}\r\n\r\n
    \r\n \r\n\r\n {/* Frequency Options */}\r\n {isSOEligible && (\r\n
    \r\n {t('optionsAvailable')}: \r\n \r\n
    \r\n \r\n {t('autoDelivery')}\r\n \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n )}\r\n
    \r\n
    \r\n\r\n {\r\n onAddToBagClickListener(selectedColorOrTasteIndex, selectedSizeIndex);\r\n }}\r\n >\r\n {(isAddedToBag || mainIsAddedToBag) && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n \r\n \"\"\r\n \r\n {ctaText}\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default ProductCardModal;\r\n","import classNames from 'classnames';\r\nimport React, { useState, useMemo, useCallback, useEffect, useRef } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport insightsClient from 'search-insights';\r\n\r\nimport { TmCart } from '@/tscapi/model/cart';\r\nimport { TmCartLineRequest } from '@/tscapi/model/request/cart-request';\r\nimport { WebApi } from '@/tscapi/service/webapi.service';\r\nimport { Storage } from '@/tscapi/utils/browser-storage';\r\nimport { Cookie } from '@/tscapi/utils/cookie';\r\n\r\nimport { TmFavourite } from '@@/App_Assets/scripts/tscapi/model/favourite';\r\n\r\nimport { FavouriteUtility } from '../../favorite/favshare.utility';\r\nimport NiceSelect from '../NiceSelect/NiceSelect';\r\nimport { IProduct, IEdp } from '../Prp/IProduct';\r\nimport { ProductHelpers } from '../utils/ProductHelpers';\r\nimport SizeHelpers, { maxItems, Size } from '../utils/SizeHelpers';\r\nimport { SwatchHelpers } from '../utils/SwatchHelpers';\r\n\r\nimport { en, fr } from './productCardi18n';\r\nimport ProductCardModal from './ProductCardModal';\r\n\r\nexport type ProductCategoryType =\r\n | 'Clothing & Shoes'\r\n | 'Jewellery'\r\n | 'Beauty'\r\n | 'Home & Garden'\r\n | 'Kitchen'\r\n | 'Health & Fitness'\r\n | 'Electronics'\r\n | 'Coins & Hobbies';\r\n\r\nexport type StyleAndSize = {\r\n DimensionId: string;\r\n DisplayName: string;\r\n};\r\n\r\nexport interface ProductCardProps {\r\n header: {\r\n title?: string;\r\n isLiked: boolean;\r\n };\r\n productObj: IProduct;\r\n productHref: string;\r\n productImage: string;\r\n AvailableSwatches: string[];\r\n priceIsLabel: string;\r\n name: string;\r\n brandName: string;\r\n isPriceRange: string;\r\n wasPriceRange: string;\r\n reviewCount: number;\r\n rating: number;\r\n styles: Array;\r\n sizes: Array;\r\n edps: Array;\r\n categoryPath: ProductCategoryType;\r\n enabledAddToCart: boolean;\r\n isShowstopper: boolean;\r\n showBadgeImage: boolean;\r\n badgeImagePath: string;\r\n itemNo: string;\r\n edp: number;\r\n position?: number;\r\n currentPage?: number;\r\n pageSize?: number;\r\n queryId?: string;\r\n sellerType?: 'TSC' | 'TSCPartner' | 'Marketplace';\r\n showFraudModal: () => void;\r\n}\r\ntype FavoriteEventDetail = {\r\n productData: IProduct;\r\n selectedEdp: number;\r\n};\r\n\r\nconst ProductCard = ({\r\n AvailableSwatches,\r\n header,\r\n productObj,\r\n productHref,\r\n productImage,\r\n name,\r\n brandName,\r\n isPriceRange,\r\n wasPriceRange,\r\n reviewCount,\r\n rating,\r\n styles,\r\n sizes,\r\n edps,\r\n categoryPath,\r\n enabledAddToCart,\r\n isShowstopper,\r\n showBadgeImage,\r\n badgeImagePath,\r\n itemNo,\r\n priceIsLabel,\r\n edp,\r\n position,\r\n currentPage,\r\n pageSize,\r\n queryId,\r\n sellerType,\r\n showFraudModal,\r\n}: ProductCardProps) => {\r\n const { i18n, t } = useTranslation('product-card');\r\n i18n.addResourceBundle('en', 'product-card', en, true, true);\r\n i18n.addResourceBundle('fr', 'product-card', fr, true, true);\r\n\r\n const [selectedSizeIndex, setSelectedSizeIndex] = useState(-1);\r\n const [isLikedCurrent, setIsLikedCurrent] = useState(header.isLiked);\r\n const [selectedColorOrTasteIndex, setSelectedColorOrTasteIndex] = useState(-1);\r\n const [isMobileModalEnabled, setIsMobileModalEnabled] = useState(false);\r\n const [width, setWidth] = useState(window.innerWidth);\r\n const [isAddedToBag, setIsAddedToBag] = useState(false);\r\n const [isAddToBagLoading, setIsAddToBagLoading] = useState(false);\r\n const [showSwatches, setShowSwatches] = useState(true);\r\n const [displayedSizeLabels, setDisplayedSizeLabels] = useState(sizes);\r\n const [labelSize, setLabelSize] = useState('md');\r\n\r\n const BREAKPOINT = 1023;\r\n const SIZE_COUNT_LIMIT = 10;\r\n const STYLE_COUNT_LIMIT = 16;\r\n const IMAGE_URL_PREFIX = 'https://item.tscimg.ca/TSC/';\r\n const IMAGE_URL_SUFFIX = '?impolicy=L';\r\n const LOADING_ASSET_PATH = '/App_Assets/public/loading.gif';\r\n const productCardAddButton = useRef(null);\r\n\r\n useEffect(() => {\r\n const body = document.querySelector('body');\r\n if (isMobileModalEnabled) {\r\n body.classList.add('bodyScrollOff');\r\n } else {\r\n body.classList.remove('bodyScrollOff');\r\n }\r\n }, [isMobileModalEnabled]);\r\n\r\n useEffect(() => {\r\n setIsLikedCurrent(header.isLiked);\r\n }, [header.isLiked]);\r\n\r\n useEffect(() => {\r\n const interval = setInterval(() => {\r\n setWidth(window.innerWidth);\r\n }, 300);\r\n\r\n return () => {\r\n clearInterval(interval);\r\n };\r\n }, [setWidth]);\r\n\r\n const isMobileOrTablet = useMemo(() => {\r\n return width <= BREAKPOINT;\r\n }, [width, BREAKPOINT]);\r\n\r\n const colorOrTasteText = useMemo(() => {\r\n return t('styles');\r\n }, [categoryPath, t]);\r\n\r\n function getDefaultEdpItem() {\r\n return edps.find((edpItem) => edpItem.EdpNo === edp);\r\n }\r\n\r\n const colorsAndSizesText = useMemo(() => {\r\n /**\r\n let currentEdp: IEdp | undefined = undefined;\r\n\r\n if (sizes.length === 0 && styles.length === 0) {\r\n const tmp = getDefaultEdpItem();\r\n currentEdp = tmp && tmp.Inventory > 0 && tmp.Inventory < 10 ? tmp : undefined;\r\n } else if (sizes.length > 0 && styles.length === 0) {\r\n if (selectedSizeIndex !== -1) {\r\n currentEdp = edps.find((edpItem) => {\r\n return edpItem.SizeDimensionId === sizes[selectedSizeIndex].DimensionId;\r\n });\r\n } else {\r\n const tmp = getDefaultEdpItem();\r\n currentEdp = tmp && tmp.Inventory > 0 && tmp.Inventory < 10 ? tmp : undefined;\r\n }\r\n } else if (styles.length > 0 && sizes.length === 0) {\r\n if (selectedColorOrTasteIndex !== -1) {\r\n currentEdp = edps.find((edpItem) => {\r\n return edpItem.StyleDimensionId === styles[selectedColorOrTasteIndex].DimensionId;\r\n });\r\n } else {\r\n const tmp = getDefaultEdpItem();\r\n currentEdp = tmp && tmp.Inventory > 0 && tmp.Inventory < 10 ? tmp : undefined;\r\n }\r\n } else if (selectedSizeIndex === -1 && selectedColorOrTasteIndex === -1) {\r\n const tmp = getDefaultEdpItem();\r\n currentEdp = tmp && tmp.Inventory > 0 && tmp.Inventory < 10 ? tmp : undefined;\r\n //} else if (selectedSizeIndex === -1 && selectedColorOrTasteIndex !== -1) {\r\n // currentEdp = edps.find((edpItem) => {\r\n // return edpItem.StyleDimensionId === styles[selectedColorOrTasteIndex].DimensionId;\r\n // });\r\n // } else if (selectedSizeIndex !== -1 && selectedColorOrTasteIndex === -1) {\r\n // currentEdp = edps.find((edpItem) => {\r\n // return edpItem.SizeDimensionId === sizes[selectedSizeIndex].DimensionId;\r\n // });\r\n } else if (selectedSizeIndex !== -1 && selectedColorOrTasteIndex !== -1) {\r\n currentEdp = edps.find((edpItem) => {\r\n return edpItem.SizeDimensionId === sizes[selectedSizeIndex].DimensionId && edpItem.StyleDimensionId === styles[selectedColorOrTasteIndex].DimensionId;\r\n });\r\n }\r\n\r\n if (currentEdp && currentEdp.Inventory < 10 && currentEdp.Inventory > 0) {\r\n return (\r\n
      \r\n
    • {t('onlyXLeft', { inventory: currentEdp.Inventory })}
    • \r\n
    \r\n );\r\n }\r\n\r\n if (edps.every((edp) => edp.Inventory === 0) || (currentEdp && currentEdp.Inventory <= 0)) {\r\n return (\r\n
      \r\n
    • {t('outOfStock')}
    • \r\n
    \r\n );\r\n }*/\r\n\r\n if (styles.length > 0 && sizes.length > 0) {\r\n return (\r\n \r\n
  • \r\n {styles.length} {colorOrTasteText} |\r\n
  • \r\n
  • \r\n {' '}\r\n {`${sizes.length} ${t('sizes')}`}\r\n
  • \r\n \r\n );\r\n }\r\n\r\n if (styles.length > 0 && sizes.length === 0) {\r\n return (\r\n
      \r\n
    • \r\n {styles.length} {colorOrTasteText}\r\n
    • \r\n
    \r\n );\r\n }\r\n\r\n if (styles.length === 0 && sizes.length > 0) {\r\n return (\r\n
      \r\n
    • {`${sizes.length} ${t('sizes')}`}
    • \r\n
    \r\n );\r\n }\r\n\r\n return (\r\n
      \r\n
    • \r\n
    \r\n );\r\n }, [styles, sizes, selectedColorOrTasteIndex, selectedSizeIndex, getDefaultEdpItem, edps, colorOrTasteText, t]);\r\n\r\n const colorsAndSizesTextOld = useMemo(() => {\r\n let currentEdp: IEdp | undefined = undefined;\r\n let outOfStockFlag = false;\r\n\r\n if (\r\n // (styles.length > 0 && selectedColorOrTasteIndex === -1) ||\r\n // (sizes.length > 0 && selectedSizeIndex === -1) ||\r\n selectedSizeIndex === -1 &&\r\n selectedColorOrTasteIndex === -1\r\n ) {\r\n currentEdp = getDefaultEdpItem();\r\n } else if (styles[selectedColorOrTasteIndex]) {\r\n const filtered = edps.filter((edpItem) => {\r\n return edpItem.StyleDimensionId === styles[selectedColorOrTasteIndex].DimensionId;\r\n });\r\n outOfStockFlag = filtered.every((edpItem) => {\r\n return edpItem.Inventory <= 0;\r\n });\r\n\r\n currentEdp = edps.find((edpItem) => {\r\n const styleCond = styles[selectedColorOrTasteIndex]?.DimensionId === edpItem.StyleDimensionId;\r\n const condition =\r\n sizes.length > 0\r\n ? styleCond && sizes[selectedSizeIndex]?.DimensionId === edpItem.SizeDimensionId\r\n : styleCond;\r\n return condition;\r\n });\r\n } else if (sizes[selectedSizeIndex]) {\r\n const filtered = edps.filter((edpItem) => {\r\n return edpItem.SizeDimensionId === sizes[selectedSizeIndex].DimensionId;\r\n });\r\n outOfStockFlag = filtered.every((edpItem) => {\r\n return edpItem.Inventory <= 0;\r\n });\r\n currentEdp = edps.find((edpItem) => {\r\n const sizeCond = sizes[selectedSizeIndex]?.DimensionId === edpItem.SizeDimensionId;\r\n const condition =\r\n styles.length > 0\r\n ? sizeCond && styles[selectedColorOrTasteIndex]?.DimensionId === edpItem.StyleDimensionId\r\n : sizeCond;\r\n return condition;\r\n });\r\n } else {\r\n currentEdp = edps.find((edpItem) => {\r\n return (\r\n styles[selectedColorOrTasteIndex]?.DimensionId === edpItem.StyleDimensionId &&\r\n sizes[selectedSizeIndex]?.DimensionId === edpItem.SizeDimensionId\r\n );\r\n });\r\n }\r\n\r\n if (currentEdp && currentEdp.Inventory < 10 && currentEdp.Inventory > 0) {\r\n return (\r\n
      \r\n
    • \r\n {t('onlyXLeft', { inventory: currentEdp.Inventory })}\r\n
    • \r\n
    \r\n );\r\n }\r\n\r\n if (edps.every((edp) => edp.Inventory === 0) || (currentEdp && currentEdp.Inventory <= 0) || outOfStockFlag) {\r\n return (\r\n
      \r\n
    • \r\n {t('outOfStock')}\r\n
    • \r\n
    \r\n );\r\n }\r\n\r\n if (styles.length > 0 && sizes.length > 0) {\r\n return (\r\n \r\n
  • \r\n {styles.length} {colorOrTasteText} |\r\n
  • \r\n
  • \r\n {' '}\r\n {`${sizes.length} ${t('sizes')}`}\r\n
  • \r\n \r\n );\r\n }\r\n\r\n if (styles.length > 0 && sizes.length === 0) {\r\n return (\r\n
      \r\n
    • \r\n {styles.length} {colorOrTasteText}\r\n
    • \r\n
    \r\n );\r\n }\r\n\r\n if (styles.length === 0 && sizes.length > 0) {\r\n return (\r\n
      \r\n
    • {`${sizes.length} ${t('sizes')}`}
    • \r\n
    \r\n );\r\n }\r\n\r\n return (\r\n
      \r\n
    • \r\n
    \r\n );\r\n }, [styles, sizes, colorOrTasteText, edps, t, selectedSizeIndex, selectedColorOrTasteIndex]);\r\n\r\n const currentProductImage = useMemo(() => {\r\n if (selectedColorOrTasteIndex === -1) {\r\n return productImage;\r\n }\r\n\r\n const edp = edps.find((edpItem) => {\r\n const sizeIndex = selectedSizeIndex === -1 ? 0 : selectedSizeIndex;\r\n if (styles[selectedColorOrTasteIndex] && sizes[sizeIndex]) {\r\n return (\r\n edpItem.StyleDimensionId === styles[selectedColorOrTasteIndex].DimensionId &&\r\n edpItem.SizeDimensionId === sizes[sizeIndex].DimensionId\r\n );\r\n } else if (styles[selectedColorOrTasteIndex]) {\r\n return edpItem.StyleDimensionId === styles[selectedColorOrTasteIndex].DimensionId;\r\n } else if (sizes[sizeIndex]) {\r\n return edpItem.SizeDimensionId === sizes[sizeIndex].DimensionId;\r\n } else {\r\n return false;\r\n }\r\n });\r\n\r\n if (!edp) {\r\n return productImage;\r\n }\r\n\r\n return edp.ImageUrl;\r\n }, [productImage, selectedColorOrTasteIndex, edps, styles, sizes, selectedSizeIndex]);\r\n\r\n const ratingAsString = useMemo(() => {\r\n return (Math.round(rating * 2) / 2).toString();\r\n }, [rating]);\r\n\r\n const ctaText = useMemo(() => {\r\n if (styles.length === 0 && sizes.length === 0) {\r\n return t('goToDetailPage');\r\n }\r\n\r\n if (styles.length === 0 && sizes.length !== 0) {\r\n if (selectedSizeIndex === -1) {\r\n return t('selectSize');\r\n }\r\n }\r\n\r\n if (styles.length !== 0 && sizes.length === 0) {\r\n if (selectedColorOrTasteIndex === -1) {\r\n return t('selectStyle');\r\n }\r\n }\r\n\r\n if (styles.length !== 0 && sizes.length !== 0) {\r\n if (selectedSizeIndex === -1 && selectedColorOrTasteIndex === -1) {\r\n return t('selectSizeAndStyle');\r\n }\r\n\r\n if (selectedSizeIndex !== -1 && selectedColorOrTasteIndex === -1) {\r\n return t('selectStyle');\r\n }\r\n\r\n if (selectedSizeIndex === -1 && selectedColorOrTasteIndex !== -1) {\r\n return t('selectSize');\r\n }\r\n }\r\n\r\n if (!showSwatches && labelSize === 'select') {\r\n return t('selectSizeAndStyle');\r\n }\r\n\r\n return t('goToDetailPage');\r\n }, [\r\n isAddedToBag,\r\n selectedSizeIndex,\r\n selectedColorOrTasteIndex,\r\n styles,\r\n sizes,\r\n categoryPath,\r\n showSwatches,\r\n labelSize,\r\n ]);\r\n\r\n const buttonText = useMemo(() => {\r\n if (isAddedToBag) {\r\n return t('addedToBag');\r\n }\r\n\r\n if (styles.length === 0 && sizes.length === 0) {\r\n return t('addToBag');\r\n }\r\n\r\n if (styles.length === 0 && sizes.length !== 0) {\r\n if (selectedSizeIndex === -1) {\r\n return t('selectSize');\r\n }\r\n }\r\n\r\n if (styles.length !== 0 && sizes.length === 0) {\r\n if (selectedColorOrTasteIndex === -1) {\r\n return t('selectStyle');\r\n }\r\n }\r\n\r\n if (styles.length !== 0 && sizes.length !== 0) {\r\n if (selectedSizeIndex === -1 && selectedColorOrTasteIndex === -1) {\r\n return t('selectSizeAndStyle');\r\n }\r\n\r\n if (selectedSizeIndex !== -1 && selectedColorOrTasteIndex === -1) {\r\n return t('selectStyle');\r\n }\r\n\r\n if (selectedSizeIndex === -1 && selectedColorOrTasteIndex !== -1) {\r\n return t('selectSize');\r\n }\r\n }\r\n\r\n if (!showSwatches && labelSize === 'select') {\r\n return t('selectSizeAndStyle');\r\n }\r\n\r\n return t('addToBag');\r\n }, [\r\n isAddedToBag,\r\n selectedSizeIndex,\r\n selectedColorOrTasteIndex,\r\n styles,\r\n sizes,\r\n categoryPath,\r\n showSwatches,\r\n labelSize,\r\n ]);\r\n\r\n const isSizeDisabled = useCallback(\r\n (i: number): boolean => {\r\n return ProductHelpers.isSizeDisabled(i, selectedColorOrTasteIndex, edps, styles, sizes);\r\n },\r\n [selectedColorOrTasteIndex, edps, styles, sizes],\r\n );\r\n\r\n const isFreqAutoDelivery = deriveFreqAutoDelivery(\r\n sizes,\r\n styles,\r\n getDefaultEdpItem,\r\n selectedSizeIndex,\r\n edps,\r\n selectedColorOrTasteIndex,\r\n );\r\n\r\n const isStyleDisabled = useCallback(\r\n (i: number): boolean => {\r\n return ProductHelpers.isStyleDisabled(i, selectedSizeIndex, edps, styles, sizes);\r\n },\r\n [selectedSizeIndex, edps, styles, sizes],\r\n );\r\n\r\n const firstAvailableStyleIndex = useMemo(() => {\r\n for (let i = 0; i < styles.length; i++) {\r\n if (!isStyleDisabled(i)) {\r\n return i;\r\n }\r\n }\r\n\r\n return -1;\r\n }, [styles, isStyleDisabled]);\r\n\r\n const firstAvailableSizeIndex = useMemo(() => {\r\n for (let i = 0; i < sizes.length; i++) {\r\n if (!isSizeDisabled(i)) {\r\n return i;\r\n }\r\n }\r\n\r\n return -1;\r\n }, [sizes, isSizeDisabled]);\r\n /**\r\n * Check every edp value.\r\n * If every AppliedShipping field is equal to \"\"(empty string)\r\n * return true\r\n * else false\r\n */\r\n const isFreeShipping = useMemo(() => {\r\n let isFreeShipping = true;\r\n\r\n for (const edp of edps) {\r\n if (edp.AppliedShipping !== '') {\r\n isFreeShipping = false;\r\n }\r\n }\r\n\r\n return isFreeShipping;\r\n }, [edps]);\r\n\r\n const isSOEligible = useMemo(() => {\r\n let isSOEligible = false;\r\n\r\n for (const edp of edps) {\r\n if (edp.IsSOEligible == true) {\r\n isSOEligible = true;\r\n break;\r\n }\r\n }\r\n return isSOEligible;\r\n }, [edps]);\r\n\r\n const getSwatchLink = useCallback((imageUrl: string, dimensionId: string): string => {\r\n const IMAGE_URL_DELIMITER = '0x0/';\r\n const [fst, snd] = imageUrl.split(IMAGE_URL_DELIMITER);\r\n const [id] = snd.split('_');\r\n const link = `${fst}/${id}_${dimensionId}_SW.jpg`;\r\n return IMAGE_URL_PREFIX + link;\r\n }, []);\r\n\r\n const onMouseLeaveOrBlur = () => {\r\n setSelectedSizeIndex(labelSize === 'select' ? firstAvailableSizeIndex : -1);\r\n setSelectedColorOrTasteIndex(showSwatches ? -1 : firstAvailableStyleIndex);\r\n setIsAddedToBag(false);\r\n\r\n if (document.activeElement instanceof HTMLElement) {\r\n // console.log('%c Is this whats happening?', 'color: purple; font-weight: bold;');\r\n document.activeElement.blur();\r\n }\r\n };\r\n\r\n const onSizeKeyDownListener = (e: React.KeyboardEvent, i: number) => {\r\n if (e.key === 'Enter') {\r\n // console.log('%c onSizeKeyDownListener parent.', 'color: purple; font-weight: bold;');\r\n e.preventDefault();\r\n setSelectedSizeIndex((prev) => (prev === i ? -1 : i));\r\n }\r\n };\r\n\r\n const onSizeClickListener = (e: React.MouseEvent, i: number) => {\r\n e.preventDefault();\r\n setSelectedSizeIndex((prev) => (prev === i ? -1 : i));\r\n };\r\n\r\n const onColorOrTasteKeyDownListener = (e: React.KeyboardEvent, i: number) => {\r\n // console.log('%c onColorOrTasteKeyDownListener parent.', 'color: purple; font-weight: bold;');\r\n if (e.key === 'Enter') {\r\n e.preventDefault();\r\n setSelectedColorOrTasteIndex((prev) => (prev === i ? -1 : i));\r\n }\r\n };\r\n\r\n const onColorOrTasteClickListener = (e: React.MouseEvent, i: number) => {\r\n e.preventDefault();\r\n setSelectedColorOrTasteIndex((prev) => (prev === i ? -1 : i));\r\n };\r\n\r\n const cartEvent = (eventName: string) => {\r\n if (typeof Event === 'function') {\r\n //modern browsers\r\n const event = new Event(eventName);\r\n return event;\r\n } else {\r\n //ie9,10,11\r\n const event = document.createEvent('Event');\r\n event.initEvent(eventName, true, true);\r\n return event;\r\n }\r\n };\r\n\r\n const addToBagAction = async (sizeIndex: number, styleIndex: number) => {\r\n // console.log('%c addToBagAction!', 'color: red; font-weight: bold;');\r\n\r\n const lang = new Cookie().Language.substring(0, 2) || 'en';\r\n const baseUrl = '/api/v2/' + lang + '/carts';\r\n\r\n const cookie = new Cookie();\r\n const cartGuid = cookie.CartGuid;\r\n\r\n const cachebleHeaders = {\r\n 'Content-Type': 'application/json',\r\n 'cache-control': 'no-cache',\r\n currentdatetime: new Cookie().CurrentDate,\r\n };\r\n\r\n const sizeDimension = sizes[sizeIndex]?.DimensionId || null;\r\n const styleDimension = styles[styleIndex]?.DimensionId || null;\r\n\r\n const selectedProduct = edps.find((edpItem) => {\r\n return edpItem.SizeDimensionId === sizeDimension && edpItem.StyleDimensionId === styleDimension;\r\n });\r\n\r\n if (!selectedProduct) {\r\n setIsAddToBagLoading(false);\r\n return false;\r\n }\r\n\r\n /*\r\n console.log('%c selectedProduct.EdpNo, selectedProduct:', 'color: red; font-weight: bold;');\r\n console.log({ selectedProductEdpNo: selectedProduct.EdpNo, selectedProduct });\r\n */\r\n\r\n // To open the \"add-to-bag modal\", set these values.\r\n // @see add-to-bag.component.tsx\r\n // @see productdetail-base.ts\r\n const edpAddedToCartEl = document.querySelector('#edpAddedToCart');\r\n const qtyAddedToCartEl = document.querySelector('#qtyAddedToCart');\r\n\r\n const cartlineModel: TmCartLineRequest = new TmCartLineRequest();\r\n\r\n cartlineModel.ItemEDP = selectedProduct.EdpNo;\r\n cartlineModel.Quantity = 1;\r\n\r\n if (cookie.UserAccessToken != null && cookie.UserAccessToken.Edp != null) {\r\n cartlineModel.CustomerEdp = cookie.UserAccessToken.Edp;\r\n }\r\n\r\n const apiSvc = new WebApi();\r\n\r\n const cartSuccess = (cartData: TmCart) => {\r\n cookie.CartGuid = cartData.CartGuid;\r\n cookie.CartProductCount = cartData.OrderSummary.TotalQuantity.toString();\r\n\r\n const storage: Storage = new Storage();\r\n storage.setSessionCart(cartData);\r\n\r\n if (edpAddedToCartEl && qtyAddedToCartEl) {\r\n edpAddedToCartEl.value = `${selectedProduct.EdpNo}`;\r\n qtyAddedToCartEl.value = '1';\r\n edpAddedToCartEl.dispatchEvent(cartEvent('change'));\r\n }\r\n\r\n // Previous TSC PRP analytics\r\n window.analyticsData.productChange = {};\r\n window.analyticsData.productChange.sku = `${selectedProduct.EdpNo}`;\r\n window.analyticsData.productChange.quantity = 1;\r\n window.analyticsData.event.eventTitle = 'change-in-cart';\r\n // New FastTrack analytics\r\n window.analyticsData.event.eventType = 'product-card-add-to-cart';\r\n window.analyticsData.product = selectedProduct;\r\n window.analyticsData.page.selectedEdp = `${selectedProduct.EdpNo}`;\r\n window.analyticsData.page.selectedEdpData = selectedProduct;\r\n\r\n setIsAddedToBag(true);\r\n setIsAddToBagLoading(false);\r\n\r\n if (cartData.Buyer && cartData.Buyer.IsFraud) {\r\n showFraudModal();\r\n }\r\n };\r\n\r\n const cartError = () => {\r\n setIsAddedToBag(false);\r\n setIsAddToBagLoading(false);\r\n };\r\n\r\n if (cookie != undefined && cookie.CartGuid != undefined) {\r\n return apiSvc.addItemToCart(\r\n cartlineModel,\r\n function (responseData) {\r\n cartSuccess(responseData);\r\n },\r\n function (errorData) {\r\n cartError();\r\n },\r\n );\r\n } else {\r\n return apiSvc.createCartAndAddItem(\r\n cartlineModel,\r\n function (responseData) {\r\n cartSuccess(responseData);\r\n },\r\n function (errorData) {\r\n cartError();\r\n },\r\n );\r\n }\r\n\r\n // if (!cartGuid) {\r\n // try {\r\n // await http.post(baseUrl, {\r\n // ItemEdp: selectedProduct.EdpNo,\r\n // Quantity: 1,\r\n // }, {\r\n // headers: cachebleHeaders,\r\n // });\r\n // setIsAddedToBag(true);\r\n\r\n // if (edpAddedToCartEl && qtyAddedToCartEl) {\r\n // edpAddedToCartEl.value = `${selectedProduct.EdpNo}`;\r\n // qtyAddedToCartEl.value = \"1\";\r\n // edpAddedToCartEl.dispatchEvent(cartEvent('change'));\r\n // }\r\n\r\n // return true;\r\n // } catch (e) {\r\n // setIsAddedToBag(false);\r\n // return false;\r\n // }\r\n // } else {\r\n // try {\r\n // await http.post(baseUrl + `/${cartGuid}/cartlines`, {\r\n // ItemEdp: selectedProduct.EdpNo,\r\n // Quantity: 1,\r\n // }, {\r\n // headers: cachebleHeaders,\r\n // });\r\n // setIsAddedToBag(true);\r\n\r\n // if (edpAddedToCartEl && qtyAddedToCartEl) {\r\n // edpAddedToCartEl.value = `${selectedProduct.EdpNo}`;\r\n // qtyAddedToCartEl.value = \"1\";\r\n // edpAddedToCartEl.dispatchEvent(cartEvent('change'));\r\n // }\r\n\r\n // return true;\r\n // } catch (e) {\r\n // setIsAddedToBag(false);\r\n // return false;\r\n // }\r\n // }\r\n };\r\n\r\n const onAddToBagClick = () => {\r\n if (!isMobileOrTablet) {\r\n setIsAddToBagLoading(true);\r\n } else {\r\n if (styles.length === 0 && sizes.length === 0) {\r\n setIsAddToBagLoading(true);\r\n } else {\r\n setIsMobileModalEnabled(true);\r\n }\r\n }\r\n };\r\n\r\n const applyDesktopHoverFocusAnalytics = () => {\r\n // New FastTrack analytics\r\n if (!isMobileOrTablet) {\r\n window.analyticsData.product = productObj;\r\n window.analyticsData.event.eventType = 'product card view';\r\n }\r\n };\r\n\r\n const onCtaClick = () => {\r\n if (!isMobileOrTablet) {\r\n ctaClick(selectedColorOrTasteIndex, selectedSizeIndex);\r\n } else {\r\n if (styles.length === 0 && sizes.length === 0) {\r\n ctaClick(selectedColorOrTasteIndex, selectedSizeIndex);\r\n } else {\r\n // New FastTrack analytics\r\n window.analyticsData.product = productObj;\r\n window.analyticsData.event.eventType = 'product card view';\r\n setIsMobileModalEnabled(true);\r\n }\r\n }\r\n };\r\n\r\n const isCtaDisabled = useMemo(() => {\r\n if (styles.length === 0 && sizes.length === 0) {\r\n return false;\r\n }\r\n\r\n if (styles.length === 0 && sizes.length !== 0) {\r\n if (selectedSizeIndex === -1) {\r\n return true;\r\n }\r\n }\r\n\r\n if (styles.length !== 0 && sizes.length === 0) {\r\n if (selectedColorOrTasteIndex === -1) {\r\n return true;\r\n }\r\n }\r\n\r\n if (styles.length !== 0 && sizes.length !== 0) {\r\n return selectedSizeIndex === -1 || selectedColorOrTasteIndex === -1;\r\n }\r\n\r\n return false;\r\n }, [styles, sizes, selectedSizeIndex, selectedColorOrTasteIndex]);\r\n\r\n useEffect(() => {\r\n if (isAddToBagLoading && !isMobileModalEnabled) {\r\n addToBagAction(selectedSizeIndex, selectedColorOrTasteIndex);\r\n }\r\n }, [isAddToBagLoading]);\r\n\r\n useEffect(() => {\r\n if (labelSize === 'select') {\r\n setDisplayedSizeLabels(sizes);\r\n setSelectedSizeIndex(firstAvailableSizeIndex);\r\n } else {\r\n const limit = maxItems[labelSize];\r\n setDisplayedSizeLabels(sizes.slice(0, limit));\r\n }\r\n }, [labelSize, maxItems, sizes, setDisplayedSizeLabels, setSelectedSizeIndex, firstAvailableSizeIndex]);\r\n\r\n useEffect(() => {\r\n const size = SizeHelpers.determineSize(sizes);\r\n setLabelSize(size);\r\n }, [sizes, setLabelSize]);\r\n\r\n const onFavouriteClick = async () => {\r\n const uat = new Cookie().UserAccessToken;\r\n\r\n if (!uat) {\r\n const targetUrlCookie = new Cookie();\r\n targetUrlCookie.setValue('TSC_TargetUrl', window.location.href, 1);\r\n window.location.href = '/pages/signin';\r\n return;\r\n }\r\n\r\n const userEdp = uat.Edp;\r\n\r\n if (!userEdp) {\r\n window.location.href = '/pages/signin';\r\n return;\r\n }\r\n\r\n if (isLikedCurrent) {\r\n try {\r\n const favouriteUtility = new FavouriteUtility();\r\n await favouriteUtility.removeByItemNumber(itemNo);\r\n setIsLikedCurrent(false);\r\n } catch (e) {\r\n console.log('Failed to unfavourite', e);\r\n }\r\n } else {\r\n try {\r\n const favourite: TmFavourite = new TmFavourite();\r\n favourite.ItemNumber = itemNo;\r\n favourite.ActivityDateTime = new Date();\r\n const favouriteUtility = new FavouriteUtility();\r\n await favouriteUtility.add(favourite); // Adjusted line\r\n setIsLikedCurrent(true);\r\n\r\n // New FastTrack analytics\r\n /*\r\n const favouritedProduct = edps.find(prod => prod.EdpNo === edp);\r\n window.analyticsData.product = favouritedProduct;\r\n */\r\n window.analyticsData.product = productObj;\r\n window.analyticsData.event.eventType = 'favourite';\r\n //trigger TT analytics event\r\n const event = new CustomEvent('favoriteEvent', {\r\n detail: { productData: productObj, selectedEdp: edp },\r\n });\r\n document.dispatchEvent(event);\r\n } catch (error) {\r\n console.log('Failed to add favourite', error);\r\n }\r\n }\r\n };\r\n\r\n const ctaClick = (styleIndex: number, sizeIndex: number) => {\r\n let url = productHref;\r\n\r\n if (styles.length === 0 && sizes.length === 0) {\r\n url = productHref;\r\n } else if (styles.length > 0 && styleIndex === -1) {\r\n url = productHref;\r\n } else if (sizes.length > 0 && sizeIndex === -1) {\r\n url = productHref;\r\n } else if (styles.length > 0 && sizes.length > 0 && (sizeIndex === -1 || styleIndex === -1)) {\r\n url = productHref;\r\n } else {\r\n const currentEdp = edps.find((edpItem) => {\r\n if (sizes.length === 0 && styleIndex !== -1) {\r\n return styles[styleIndex].DimensionId === edpItem.StyleDimensionId;\r\n } else if (styles.length === 0 && sizeIndex !== -1) {\r\n return sizes[sizeIndex].DimensionId === edpItem.SizeDimensionId;\r\n } else {\r\n return (\r\n styles[styleIndex].DimensionId === edpItem.StyleDimensionId &&\r\n sizes[sizeIndex].DimensionId === edpItem.SizeDimensionId\r\n );\r\n }\r\n });\r\n if (!currentEdp) {\r\n url = productHref;\r\n } else {\r\n url = productHref + `&edp=${currentEdp.EdpNo}`;\r\n }\r\n }\r\n // New FastTrack analytics\r\n window.analyticsData.product = productObj;\r\n window.analyticsData.event.eventType = 'product card step 1';\r\n window.location.href = url;\r\n };\r\n\r\n /*\r\n console.log('%c isMobileModalEnabled:', 'color: brown; font-weight: bold;');\r\n console.log({ isMobileModalEnabled });\r\n */\r\n\r\n const trackSearchEventClick = (itemNo: string, position: number) => {\r\n /*\r\n console.log('%c insightsClientObject:', 'color: red; font-weight: bold;');\r\n console.log({ insightsClientObject: {\r\n eventName: 'Items clicked',\r\n index: 'products',\r\n objectIDs: [itemNo],\r\n positions: [position + 1 + (currentPage - 1) * pageSize],\r\n queryID: queryId ? queryId : '',\r\n } });\r\n */\r\n insightsClient('clickedObjectIDsAfterSearch', {\r\n eventName: 'Items clicked',\r\n index: 'products',\r\n objectIDs: [itemNo],\r\n positions: [position + 1 + (currentPage - 1) * pageSize],\r\n queryID: queryId ? queryId : '',\r\n });\r\n // store data for conversion tracking on PDP\r\n try {\r\n window.sessionStorage.setItem(\r\n 'TSC_AlgoliaClick',\r\n JSON.stringify({\r\n index: 'products',\r\n objectIDs: [itemNo],\r\n positions: [position + 1 + (currentPage - 1) * pageSize],\r\n queryID: queryId ? queryId : '',\r\n }),\r\n );\r\n } catch (error) {\r\n // if it fails\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n //initially we checked if all swatches exist but for optimizatin we only now check one\r\n //if one exists, we assume all exist\r\n SwatchHelpers.doSwatchesExist(AvailableSwatches)\r\n .then((result) => {\r\n setShowSwatches(result);\r\n })\r\n .catch(() => {\r\n setShowSwatches(false);\r\n });\r\n }, [styles, AvailableSwatches]);\r\n\r\n useEffect(() => {\r\n if (!showSwatches) {\r\n setSelectedColorOrTasteIndex(firstAvailableStyleIndex);\r\n }\r\n }, [showSwatches, setSelectedColorOrTasteIndex]);\r\n\r\n const getSwatchUrl = (index: number) => {\r\n const resource = AvailableSwatches[index];\r\n if (!resource) {\r\n return '';\r\n }\r\n return IMAGE_URL_PREFIX + resource;\r\n };\r\n\r\n const getStarClassName = (\r\n roundedRating: number,\r\n ratingValue: 1 | 2 | 3 | 4 | 5,\r\n isRatingWhole: boolean,\r\n roundedFractional: number,\r\n ) => {\r\n /*\r\n console.log('%c isRatingWhole, roundedFractional:', 'color: red; font-weight: bold;');\r\n console.log({ isRatingWhole, roundedFractional });\r\n */\r\n const roundedDownWholeNumber = Math.floor(roundedRating);\r\n const className =\r\n ratingValue === roundedDownWholeNumber + 1 &&\r\n !isRatingWhole &&\r\n roundedFractional <= 87 &&\r\n roundedFractional >= 13\r\n ? `product-card__rating__star product-card__rating__star__${roundedFractional}-filled`\r\n : roundedDownWholeNumber >= ratingValue\r\n ? 'product-card__rating__star product-card__rating__star__100-filled'\r\n : 'product-card__rating__star product-card__rating__star__0-filled';\r\n return className;\r\n };\r\n\r\n const getStars = () => {\r\n /*\r\n console.log('%c rating:', 'color: red; font-weight: bold;');\r\n console.log({ rating });\r\n */\r\n const splitRating = rating.toString().split('.');\r\n const integer = parseInt(splitRating[0]);\r\n const fractional = splitRating[1]\r\n ? parseInt(splitRating[1].length === 1 ? splitRating[1] + '0' : splitRating[1])\r\n : 0;\r\n /*\r\n console.log('%c integer, fractional:', 'color: blue; font-weight: bold;');\r\n console.log({ integer, fractional });\r\n */\r\n const roundedFractional =\r\n fractional > 87\r\n ? 1\r\n : fractional <= 87 && fractional >= 63\r\n ? 0.75\r\n : fractional < 63 && fractional >= 38\r\n ? 0.5\r\n : fractional < 38 && fractional >= 13\r\n ? 0.25\r\n : 0;\r\n const roundedRating = integer + roundedFractional;\r\n /*\r\n console.log('%c roundedRating:', 'color: green; font-weight: bold;');\r\n console.log({ roundedRating });\r\n */\r\n const isRatingWhole = roundedRating % 1 === 0;\r\n return (\r\n \r\n \r\n \r\n  \r\n \r\n \r\n  \r\n \r\n \r\n  \r\n \r\n \r\n  \r\n \r\n \r\n  \r\n \r\n \r\n

    {`${t('rating')} ${rating} ${t('outOf')} 5 ${t('stars')}`}

    \r\n
    \r\n );\r\n };\r\n\r\n const renderStyleSwatch = useCallback(() => {\r\n if (!showSwatches) {\r\n return <>;\r\n }\r\n\r\n return styles.slice(0, STYLE_COUNT_LIMIT).map((style, styleIndex) => (\r\n onColorOrTasteKeyDownListener(e, styleIndex)}\r\n onClick={(e) => onColorOrTasteClickListener(e, styleIndex)}\r\n disabled={isStyleDisabled(styleIndex)}\r\n aria-pressed={styleIndex === selectedColorOrTasteIndex}\r\n >\r\n setSelectedColorOrTasteIndex(styleIndex)}\r\n />\r\n \r\n \r\n {colorOrTasteText} {style.DisplayName}\r\n \r\n \r\n \r\n ));\r\n }, [\r\n showSwatches,\r\n styles,\r\n STYLE_COUNT_LIMIT,\r\n onColorOrTasteKeyDownListener,\r\n onColorOrTasteClickListener,\r\n isStyleDisabled,\r\n selectedColorOrTasteIndex,\r\n setSelectedColorOrTasteIndex,\r\n name,\r\n SwatchHelpers,\r\n SwatchHelpers.getSwatchUrl,\r\n colorOrTasteText,\r\n ]);\r\n\r\n const selectOnChange = (value: string) => {\r\n const index = styles.findIndex((style) => style.DimensionId === value);\r\n setSelectedColorOrTasteIndex(index);\r\n };\r\n\r\n {\r\n /*\r\n const renderStyleDropdown = useCallback(() => {\r\n if (styles.length === 0) {\r\n return <>;\r\n }\r\n\r\n const stylesOptions = styles.slice(0, STYLE_COUNT_LIMIT).map((style, styleIndex) => {\r\n return {\r\n option: style.DisplayName,\r\n value: style.DimensionId,\r\n disabled: isStyleDisabled(styleIndex)\r\n };\r\n })\r\n\r\n return (\r\n setSelectedColorOrTasteIndex(firstAvailableStyleIndex)}\r\n onChange={(e) => {\r\n const index = styles.findIndex((style) => {\r\n return style.DimensionId === e.target.value;\r\n });\r\n setSelectedColorOrTasteIndex(index);\r\n }}\r\n value={styles[selectedColorOrTasteIndex]?.DimensionId}\r\n >\r\n {\r\n styles.slice(0, STYLE_COUNT_LIMIT).map((style, styleIndex) => (\r\n \r\n {style.DisplayName}\r\n \r\n ))\r\n }\r\n \r\n );\r\n }, [styles, setSelectedColorOrTasteIndex, selectedColorOrTasteIndex, isStyleDisabled]);\r\n */\r\n }\r\n\r\n const renderStyleDropdown = useCallback(() => {\r\n if (styles.length === 0) {\r\n return <>;\r\n }\r\n\r\n const stylesOptions = styles.map((style, styleIndex) => {\r\n return {\r\n option: style.DisplayName,\r\n value: style.DimensionId,\r\n disabled: isStyleDisabled(styleIndex),\r\n };\r\n });\r\n\r\n return (\r\n setSelectedColorOrTasteIndex(firstAvailableStyleIndex)}\r\n selectOnChange={selectOnChange}\r\n />\r\n );\r\n }, [styles, setSelectedColorOrTasteIndex, selectedColorOrTasteIndex, isStyleDisabled]);\r\n\r\n const renderStyles = () => {\r\n return (\r\n
    \r\n {colorOrTasteText}\r\n {/* Color and Taste */}\r\n {styles.length !== 0 && (\r\n
    \r\n

    \r\n {t('selectStyle')}:{' '}\r\n {selectedColorOrTasteIndex !== -1 && (\r\n {styles[selectedColorOrTasteIndex].DisplayName}\r\n )}\r\n

    \r\n {showSwatches && (\r\n
    {renderStyleSwatch()}
    \r\n )}\r\n {!showSwatches && renderStyleDropdown()}\r\n {styles.length >= STYLE_COUNT_LIMIT && showSwatches && (\r\n trackSearchEventClick(itemNo, position)\r\n : null\r\n }\r\n >\r\n {`${t('viewAll')} ${colorOrTasteText}`}\r\n \r\n )}\r\n
    \r\n )}\r\n
    \r\n );\r\n };\r\n\r\n const renderSizeDropdown = useCallback(() => {\r\n if (sizes.length === 0) {\r\n return <>;\r\n }\r\n\r\n return (\r\n setSelectedSizeIndex(firstAvailableSizeIndex)}\r\n onChange={(e) => {\r\n const index = sizes.findIndex((size) => {\r\n return size.DimensionId === e.target.value;\r\n });\r\n setSelectedSizeIndex(index);\r\n }}\r\n value={sizes[selectedSizeIndex]?.DimensionId}\r\n >\r\n {sizes.map((size, sizeIndex) => (\r\n \r\n ))}\r\n \r\n );\r\n }, [sizes, firstAvailableSizeIndex, selectedSizeIndex, setSelectedSizeIndex, isSizeDisabled]);\r\n\r\n return (\r\n <>\r\n \r\n
    \r\n
    \r\n \r\n {priceIsLabel !== '' ? priceIsLabel : ''}\r\n {priceIsLabel === '' &&  }\r\n \r\n \r\n {`${t('like')} ${name}`}\r\n \r\n
    \r\n
    \r\n {sellerType === 'Marketplace' ? (\r\n
    \r\n \r\n {sellerType + ' Seller'}\r\n
    \r\n ) : (\r\n  \r\n )}\r\n
    \r\n
    \r\n trackSearchEventClick(itemNo, position)\r\n : null\r\n }\r\n data-lpos=\"product card image\"\r\n >\r\n {name}\r\n \r\n\r\n
    \r\n
    {colorsAndSizesText}
    \r\n\r\n
    \r\n {t('sizes')}\r\n\r\n {/* Size */}\r\n {displayedSizeLabels.length !== 0 && (\r\n
    \r\n \r\n {t('selectSize')}:{' '}\r\n {selectedSizeIndex !== -1 && (\r\n {displayedSizeLabels[selectedSizeIndex].DisplayName}\r\n )}\r\n \r\n \r\n {labelSize === 'select' && renderSizeDropdown()}\r\n {labelSize !== 'select' &&\r\n displayedSizeLabels.map((size, sizeIndex) => (\r\n onSizeKeyDownListener(e, sizeIndex)}\r\n onClick={(e) => onSizeClickListener(e, sizeIndex)}\r\n disabled={isSizeDisabled(sizeIndex)}\r\n aria-pressed={sizeIndex === selectedSizeIndex}\r\n >\r\n setSelectedSizeIndex(sizeIndex)}\r\n disabled={isSizeDisabled(sizeIndex)}\r\n tabIndex={0}\r\n />\r\n \r\n Size\r\n {size.DisplayName}\r\n \r\n \r\n ))}\r\n
    \r\n {sizes.length > displayedSizeLabels.length && (\r\n trackSearchEventClick(itemNo, position)\r\n : null\r\n }\r\n >\r\n {t('viewAllSizes')}\r\n \r\n )}\r\n \r\n )}\r\n
    \r\n\r\n {renderStyles()}\r\n\r\n
    \r\n \r\n\r\n {/* Frequency Options */}\r\n {isSOEligible && (\r\n
    \r\n {t('optionsAvailable')}: \r\n \r\n
    \r\n \r\n {t('autoDelivery')}\r\n \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n )}\r\n
    \r\n\r\n
    \r\n trackSearchEventClick(itemNo, position)\r\n : null\r\n }\r\n >\r\n {name}\r\n \r\n

    {brandName ? `${t('by')} ${brandName}` : '\\u00a0'}

    \r\n
    \r\n trackSearchEventClick(itemNo, position)\r\n : null\r\n }\r\n >\r\n \r\n {t('currentPrice')}\r\n {isPriceRange}\r\n \r\n {isPriceRange !== wasPriceRange && (\r\n \r\n {t('previousPrice')}\r\n {wasPriceRange}\r\n \r\n )}\r\n \r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n {reviewCount !== 0 && (\r\n <>\r\n {getStars()}\r\n trackSearchEventClick(itemNo, position)\r\n : null\r\n }\r\n >\r\n {`${reviewCount} ${t('reviews')}`}\r\n \r\n \r\n )}\r\n
    \r\n\r\n
    \r\n {isFreeShipping && (\r\n
    \r\n {t('freeShipping')}\r\n
    \r\n )}\r\n \r\n {isAddedToBag && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n \"\"\r\n \r\n {/*{buttonText}*/}\r\n {ctaText}\r\n \r\n \r\n {isMobileModalEnabled && (\r\n {\r\n setIsMobileModalEnabled(false);\r\n // console.log('%c setIsMobileModalEnabled #3', 'color: red; font-weight: bold;');\r\n setIsAddedToBag(false);\r\n /*\r\n if (document.activeElement instanceof HTMLElement) {\r\n document.activeElement.blur();\r\n }\r\n */\r\n setSelectedSizeIndex(-1);\r\n setSelectedColorOrTasteIndex(-1);\r\n productCardAddButton?.current?.focus();\r\n }}\r\n //onAddToBagClickListener={addToBagAction}\r\n onAddToBagClickListener={ctaClick}\r\n edps={edps}\r\n productHref={productHref}\r\n categoryPath={categoryPath}\r\n updateSizeIndex={(v) => setSelectedSizeIndex(v)}\r\n updateColorOrTasteIndex={(v) => setSelectedColorOrTasteIndex(v)}\r\n mainIsAddedToBag={isAddedToBag}\r\n updateIsAddToBagLoading={(v) => setIsAddToBagLoading(v)}\r\n itemNo={itemNo}\r\n edp={edp}\r\n position={position}\r\n currentPage={currentPage}\r\n pageSize={pageSize}\r\n queryId={queryId}\r\n showSwatches={showSwatches}\r\n labelSize={labelSize}\r\n displayedSizeLabels={displayedSizeLabels}\r\n />\r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default ProductCard;\r\nexport function deriveFreqAutoDelivery(\r\n sizes: StyleAndSize[],\r\n styles: StyleAndSize[],\r\n getDefaultEdpItem: () => IEdp,\r\n selectedSizeIndex: number,\r\n edps: IEdp[],\r\n selectedColorOrTasteIndex: number,\r\n) {\r\n return () => {\r\n let isFrequencyAutoDelivery = false;\r\n let currentEdp = null;\r\n //figure out selected EDP for check below\r\n if (sizes.length === 0 && styles.length === 0) {\r\n //has no styles or sizes\r\n currentEdp = getDefaultEdpItem();\r\n } else if (sizes.length > 0 && styles.length === 0) {\r\n // has sizes, no styles\r\n if (selectedSizeIndex !== -1) {\r\n // size selected\r\n currentEdp = edps.find((edpItem) => {\r\n return edpItem.SizeDimensionId === sizes[selectedSizeIndex].DimensionId;\r\n });\r\n } else {\r\n // size not selected, return defaultedp\r\n const tmp = getDefaultEdpItem();\r\n currentEdp = tmp && tmp.Inventory > 0 && tmp.Inventory < 10 ? tmp : undefined;\r\n }\r\n } else if (styles.length > 0 && sizes.length === 0) {\r\n // has styles, no size\r\n if (selectedColorOrTasteIndex !== -1) {\r\n currentEdp = edps.find((edpItem) => {\r\n return edpItem.StyleDimensionId === styles[selectedColorOrTasteIndex].DimensionId;\r\n });\r\n } else {\r\n const tmp = getDefaultEdpItem();\r\n currentEdp = tmp && tmp.Inventory > 0 && tmp.Inventory < 10 ? tmp : undefined;\r\n }\r\n } else if (selectedSizeIndex === -1 && selectedColorOrTasteIndex === -1) {\r\n // has both Style/Size, not selected\r\n currentEdp = getDefaultEdpItem();\r\n } else if (selectedSizeIndex === -1 && selectedColorOrTasteIndex !== -1) {\r\n // has both, style selected\r\n currentEdp = edps.find((edpItem) => {\r\n return edpItem.StyleDimensionId === styles[selectedColorOrTasteIndex].DimensionId;\r\n });\r\n } else if (selectedSizeIndex !== -1 && selectedColorOrTasteIndex === -1) {\r\n // has both, size selected\r\n currentEdp = edps.find((edpItem) => {\r\n return edpItem.SizeDimensionId === sizes[selectedSizeIndex].DimensionId;\r\n });\r\n } else if (selectedSizeIndex !== -1 && selectedColorOrTasteIndex !== -1) {\r\n // has both Style/Size, both selected\r\n currentEdp = edps.find((edpItem) => {\r\n return (\r\n edpItem.SizeDimensionId === sizes[selectedSizeIndex].DimensionId &&\r\n edpItem.StyleDimensionId === styles[selectedColorOrTasteIndex].DimensionId\r\n );\r\n });\r\n }\r\n if (currentEdp?.IsSOEligible == true) {\r\n isFrequencyAutoDelivery = true;\r\n }\r\n return isFrequencyAutoDelivery;\r\n };\r\n}\r\n","export const en = {\r\n reviews: 'reviews',\r\n filter: 'Filter',\r\n clearAll: 'Clear all',\r\n category: 'Category',\r\n filtersAdded: 'Filters added',\r\n view: 'View',\r\n products: 'products',\r\n search: 'Search',\r\n onAirToday: 'On Air Today',\r\n onAirYesterday: 'On Air Yesterday',\r\n onAirRecently: 'On Air Recently',\r\n};\r\n\r\nexport const fr = {\r\n reviews: 'reviews',\r\n filter: 'Filter',\r\n clearAll: 'Clear all',\r\n category: 'Category',\r\n filtersAdded: 'Filters added',\r\n view: 'View',\r\n products: 'products',\r\n search: 'Search',\r\n onAirToday: 'On Air Today',\r\n onAirYesterday: 'On Air Yesterday',\r\n onAirRecently: 'On Air Recently',\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { en, fr } from './i18n';\r\nimport classnames from 'classnames';\r\n\r\nexport interface OnAirButtonsProps {\r\n className?: string;\r\n}\r\n\r\nconst OnAirButtons = ({ className = '' }: OnAirButtonsProps) => {\r\n const { i18n, t } = useTranslation('prp-filter-panel');\r\n i18n.addResourceBundle('en', 'prp-filter-panel', en, true, true);\r\n i18n.addResourceBundle('fr', 'prp-filter-panel', fr, true, true);\r\n\r\n const onAirButtons = [\r\n {\r\n id: 'on-air-today',\r\n label: t('onAirToday'),\r\n dimensionId: tscConfig.AliasDimensionOnAirToday,\r\n trackingId: '&ic=PG_BTN_OnAirProducts_Today'\r\n },\r\n {\r\n id: 'on-air-yesterday',\r\n label: t('onAirYesterday'),\r\n dimensionId: tscConfig.AliasDimensionOnAirYesterday,\r\n trackingId: '&ic=PG_BTN_OnAirProducts_Yesterday'\r\n\r\n },\r\n {\r\n id: 'on-air-recently',\r\n label: t('onAirRecently'),\r\n dimensionId: tscConfig.AliasDimensionOnAirRecently,\r\n trackingId: '&ic=PG_BTN_OnAirProducts_Recently'\r\n },\r\n ];\r\n\r\n const onAirName = 'on-air-radio-buttons';\r\n\r\n return (\r\n
      \r\n {onAirButtons.map((btn) => (\r\n
    • \r\n {\r\n window.location.href = `/pages/productresults?dimensions=${btn.dimensionId}&page=1&pageSize=36&rd=false${btn.trackingId}`;\r\n }}\r\n value={btn.dimensionId}\r\n />\r\n \r\n
    • \r\n ))}\r\n
    \r\n );\r\n}\r\n\r\nexport default OnAirButtons;\r\n","/*\r\n Licensed under the Apache License, Version 2.0 (the \"License\");\r\n you may not use this file except in compliance with the License.\r\n You may obtain a copy of the License at\r\n\r\n http://www.apache.org/licenses/LICENSE-2.0\r\n\r\n Unless required by applicable law or agreed to in writing, software\r\n distributed under the License is distributed on an \"AS IS\" BASIS,\r\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n See the License for the specific language governing permissions and\r\n limitations under the License.\r\n*/\r\nconst defaultDiacriticsRemovalMap = [\r\n {\r\n base: 'A',\r\n letters:\r\n '\\u0041\\u24B6\\uFF21\\u00C0\\u00C1\\u00C2\\u1EA6\\u1EA4\\u1EAA\\u1EA8\\u00C3\\u0100\\u0102\\u1EB0\\u1EAE\\u1EB4\\u1EB2\\u0226\\u01E0\\u00C4\\u01DE\\u1EA2\\u00C5\\u01FA\\u01CD\\u0200\\u0202\\u1EA0\\u1EAC\\u1EB6\\u1E00\\u0104\\u023A\\u2C6F',\r\n },\r\n { base: 'AA', letters: '\\uA732' },\r\n { base: 'AE', letters: '\\u00C6\\u01FC\\u01E2' },\r\n { base: 'AO', letters: '\\uA734' },\r\n { base: 'AU', letters: '\\uA736' },\r\n { base: 'AV', letters: '\\uA738\\uA73A' },\r\n { base: 'AY', letters: '\\uA73C' },\r\n { base: 'B', letters: '\\u0042\\u24B7\\uFF22\\u1E02\\u1E04\\u1E06\\u0243\\u0182\\u0181' },\r\n { base: 'C', letters: '\\u0043\\u24B8\\uFF23\\u0106\\u0108\\u010A\\u010C\\u00C7\\u1E08\\u0187\\u023B\\uA73E' },\r\n {\r\n base: 'D',\r\n letters: '\\u0044\\u24B9\\uFF24\\u1E0A\\u010E\\u1E0C\\u1E10\\u1E12\\u1E0E\\u0110\\u018B\\u018A\\u0189\\uA779\\u00D0',\r\n },\r\n { base: 'DZ', letters: '\\u01F1\\u01C4' },\r\n { base: 'Dz', letters: '\\u01F2\\u01C5' },\r\n {\r\n base: 'E',\r\n letters:\r\n '\\u0045\\u24BA\\uFF25\\u00C8\\u00C9\\u00CA\\u1EC0\\u1EBE\\u1EC4\\u1EC2\\u1EBC\\u0112\\u1E14\\u1E16\\u0114\\u0116\\u00CB\\u1EBA\\u011A\\u0204\\u0206\\u1EB8\\u1EC6\\u0228\\u1E1C\\u0118\\u1E18\\u1E1A\\u0190\\u018E',\r\n },\r\n { base: 'F', letters: '\\u0046\\u24BB\\uFF26\\u1E1E\\u0191\\uA77B' },\r\n {\r\n base: 'G',\r\n letters: '\\u0047\\u24BC\\uFF27\\u01F4\\u011C\\u1E20\\u011E\\u0120\\u01E6\\u0122\\u01E4\\u0193\\uA7A0\\uA77D\\uA77E',\r\n },\r\n { base: 'H', letters: '\\u0048\\u24BD\\uFF28\\u0124\\u1E22\\u1E26\\u021E\\u1E24\\u1E28\\u1E2A\\u0126\\u2C67\\u2C75\\uA78D' },\r\n {\r\n base: 'I',\r\n letters:\r\n '\\u0049\\u24BE\\uFF29\\u00CC\\u00CD\\u00CE\\u0128\\u012A\\u012C\\u0130\\u00CF\\u1E2E\\u1EC8\\u01CF\\u0208\\u020A\\u1ECA\\u012E\\u1E2C\\u0197',\r\n },\r\n { base: 'J', letters: '\\u004A\\u24BF\\uFF2A\\u0134\\u0248' },\r\n { base: 'K', letters: '\\u004B\\u24C0\\uFF2B\\u1E30\\u01E8\\u1E32\\u0136\\u1E34\\u0198\\u2C69\\uA740\\uA742\\uA744\\uA7A2' },\r\n {\r\n base: 'L',\r\n letters:\r\n '\\u004C\\u24C1\\uFF2C\\u013F\\u0139\\u013D\\u1E36\\u1E38\\u013B\\u1E3C\\u1E3A\\u0141\\u023D\\u2C62\\u2C60\\uA748\\uA746\\uA780',\r\n },\r\n { base: 'LJ', letters: '\\u01C7' },\r\n { base: 'Lj', letters: '\\u01C8' },\r\n { base: 'M', letters: '\\u004D\\u24C2\\uFF2D\\u1E3E\\u1E40\\u1E42\\u2C6E\\u019C' },\r\n {\r\n base: 'N',\r\n letters: '\\u004E\\u24C3\\uFF2E\\u01F8\\u0143\\u00D1\\u1E44\\u0147\\u1E46\\u0145\\u1E4A\\u1E48\\u0220\\u019D\\uA790\\uA7A4',\r\n },\r\n { base: 'NJ', letters: '\\u01CA' },\r\n { base: 'Nj', letters: '\\u01CB' },\r\n {\r\n base: 'O',\r\n letters:\r\n '\\u004F\\u24C4\\uFF2F\\u00D2\\u00D3\\u00D4\\u1ED2\\u1ED0\\u1ED6\\u1ED4\\u00D5\\u1E4C\\u022C\\u1E4E\\u014C\\u1E50\\u1E52\\u014E\\u022E\\u0230\\u00D6\\u022A\\u1ECE\\u0150\\u01D1\\u020C\\u020E\\u01A0\\u1EDC\\u1EDA\\u1EE0\\u1EDE\\u1EE2\\u1ECC\\u1ED8\\u01EA\\u01EC\\u00D8\\u01FE\\u0186\\u019F\\uA74A\\uA74C',\r\n },\r\n { base: 'OI', letters: '\\u01A2' },\r\n { base: 'OO', letters: '\\uA74E' },\r\n { base: 'OU', letters: '\\u0222' },\r\n { base: 'OE', letters: '\\u008C\\u0152' },\r\n { base: 'oe', letters: '\\u009C\\u0153' },\r\n { base: 'P', letters: '\\u0050\\u24C5\\uFF30\\u1E54\\u1E56\\u01A4\\u2C63\\uA750\\uA752\\uA754' },\r\n { base: 'Q', letters: '\\u0051\\u24C6\\uFF31\\uA756\\uA758\\u024A' },\r\n {\r\n base: 'R',\r\n letters:\r\n '\\u0052\\u24C7\\uFF32\\u0154\\u1E58\\u0158\\u0210\\u0212\\u1E5A\\u1E5C\\u0156\\u1E5E\\u024C\\u2C64\\uA75A\\uA7A6\\uA782',\r\n },\r\n {\r\n base: 'S',\r\n letters:\r\n '\\u0053\\u24C8\\uFF33\\u1E9E\\u015A\\u1E64\\u015C\\u1E60\\u0160\\u1E66\\u1E62\\u1E68\\u0218\\u015E\\u2C7E\\uA7A8\\uA784',\r\n },\r\n {\r\n base: 'T',\r\n letters: '\\u0054\\u24C9\\uFF34\\u1E6A\\u0164\\u1E6C\\u021A\\u0162\\u1E70\\u1E6E\\u0166\\u01AC\\u01AE\\u023E\\uA786',\r\n },\r\n { base: 'TZ', letters: '\\uA728' },\r\n {\r\n base: 'U',\r\n letters:\r\n '\\u0055\\u24CA\\uFF35\\u00D9\\u00DA\\u00DB\\u0168\\u1E78\\u016A\\u1E7A\\u016C\\u00DC\\u01DB\\u01D7\\u01D5\\u01D9\\u1EE6\\u016E\\u0170\\u01D3\\u0214\\u0216\\u01AF\\u1EEA\\u1EE8\\u1EEE\\u1EEC\\u1EF0\\u1EE4\\u1E72\\u0172\\u1E76\\u1E74\\u0244',\r\n },\r\n { base: 'V', letters: '\\u0056\\u24CB\\uFF36\\u1E7C\\u1E7E\\u01B2\\uA75E\\u0245' },\r\n { base: 'VY', letters: '\\uA760' },\r\n { base: 'W', letters: '\\u0057\\u24CC\\uFF37\\u1E80\\u1E82\\u0174\\u1E86\\u1E84\\u1E88\\u2C72' },\r\n { base: 'X', letters: '\\u0058\\u24CD\\uFF38\\u1E8A\\u1E8C' },\r\n {\r\n base: 'Y',\r\n letters: '\\u0059\\u24CE\\uFF39\\u1EF2\\u00DD\\u0176\\u1EF8\\u0232\\u1E8E\\u0178\\u1EF6\\u1EF4\\u01B3\\u024E\\u1EFE',\r\n },\r\n { base: 'Z', letters: '\\u005A\\u24CF\\uFF3A\\u0179\\u1E90\\u017B\\u017D\\u1E92\\u1E94\\u01B5\\u0224\\u2C7F\\u2C6B\\uA762' },\r\n {\r\n base: 'a',\r\n letters:\r\n '\\u0061\\u24D0\\uFF41\\u1E9A\\u00E0\\u00E1\\u00E2\\u1EA7\\u1EA5\\u1EAB\\u1EA9\\u00E3\\u0101\\u0103\\u1EB1\\u1EAF\\u1EB5\\u1EB3\\u0227\\u01E1\\u00E4\\u01DF\\u1EA3\\u00E5\\u01FB\\u01CE\\u0201\\u0203\\u1EA1\\u1EAD\\u1EB7\\u1E01\\u0105\\u2C65\\u0250',\r\n },\r\n { base: 'aa', letters: '\\uA733' },\r\n { base: 'ae', letters: '\\u00E6\\u01FD\\u01E3' },\r\n { base: 'ao', letters: '\\uA735' },\r\n { base: 'au', letters: '\\uA737' },\r\n { base: 'av', letters: '\\uA739\\uA73B' },\r\n { base: 'ay', letters: '\\uA73D' },\r\n { base: 'b', letters: '\\u0062\\u24D1\\uFF42\\u1E03\\u1E05\\u1E07\\u0180\\u0183\\u0253' },\r\n { base: 'c', letters: '\\u0063\\u24D2\\uFF43\\u0107\\u0109\\u010B\\u010D\\u00E7\\u1E09\\u0188\\u023C\\uA73F\\u2184' },\r\n { base: 'd', letters: '\\u0064\\u24D3\\uFF44\\u1E0B\\u010F\\u1E0D\\u1E11\\u1E13\\u1E0F\\u0111\\u018C\\u0256\\u0257\\uA77A' },\r\n { base: 'dz', letters: '\\u01F3\\u01C6' },\r\n {\r\n base: 'e',\r\n letters:\r\n '\\u0065\\u24D4\\uFF45\\u00E8\\u00E9\\u00EA\\u1EC1\\u1EBF\\u1EC5\\u1EC3\\u1EBD\\u0113\\u1E15\\u1E17\\u0115\\u0117\\u00EB\\u1EBB\\u011B\\u0205\\u0207\\u1EB9\\u1EC7\\u0229\\u1E1D\\u0119\\u1E19\\u1E1B\\u0247\\u025B\\u01DD',\r\n },\r\n { base: 'f', letters: '\\u0066\\u24D5\\uFF46\\u1E1F\\u0192\\uA77C' },\r\n {\r\n base: 'g',\r\n letters: '\\u0067\\u24D6\\uFF47\\u01F5\\u011D\\u1E21\\u011F\\u0121\\u01E7\\u0123\\u01E5\\u0260\\uA7A1\\u1D79\\uA77F',\r\n },\r\n {\r\n base: 'h',\r\n letters: '\\u0068\\u24D7\\uFF48\\u0125\\u1E23\\u1E27\\u021F\\u1E25\\u1E29\\u1E2B\\u1E96\\u0127\\u2C68\\u2C76\\u0265',\r\n },\r\n { base: 'hv', letters: '\\u0195' },\r\n {\r\n base: 'i',\r\n letters:\r\n '\\u0069\\u24D8\\uFF49\\u00EC\\u00ED\\u00EE\\u0129\\u012B\\u012D\\u00EF\\u1E2F\\u1EC9\\u01D0\\u0209\\u020B\\u1ECB\\u012F\\u1E2D\\u0268\\u0131',\r\n },\r\n { base: 'j', letters: '\\u006A\\u24D9\\uFF4A\\u0135\\u01F0\\u0249' },\r\n { base: 'k', letters: '\\u006B\\u24DA\\uFF4B\\u1E31\\u01E9\\u1E33\\u0137\\u1E35\\u0199\\u2C6A\\uA741\\uA743\\uA745\\uA7A3' },\r\n {\r\n base: 'l',\r\n letters:\r\n '\\u006C\\u24DB\\uFF4C\\u0140\\u013A\\u013E\\u1E37\\u1E39\\u013C\\u1E3D\\u1E3B\\u017F\\u0142\\u019A\\u026B\\u2C61\\uA749\\uA781\\uA747',\r\n },\r\n { base: 'lj', letters: '\\u01C9' },\r\n { base: 'm', letters: '\\u006D\\u24DC\\uFF4D\\u1E3F\\u1E41\\u1E43\\u0271\\u026F' },\r\n {\r\n base: 'n',\r\n letters:\r\n '\\u006E\\u24DD\\uFF4E\\u01F9\\u0144\\u00F1\\u1E45\\u0148\\u1E47\\u0146\\u1E4B\\u1E49\\u019E\\u0272\\u0149\\uA791\\uA7A5',\r\n },\r\n { base: 'nj', letters: '\\u01CC' },\r\n {\r\n base: 'o',\r\n letters:\r\n '\\u006F\\u24DE\\uFF4F\\u00F2\\u00F3\\u00F4\\u1ED3\\u1ED1\\u1ED7\\u1ED5\\u00F5\\u1E4D\\u022D\\u1E4F\\u014D\\u1E51\\u1E53\\u014F\\u022F\\u0231\\u00F6\\u022B\\u1ECF\\u0151\\u01D2\\u020D\\u020F\\u01A1\\u1EDD\\u1EDB\\u1EE1\\u1EDF\\u1EE3\\u1ECD\\u1ED9\\u01EB\\u01ED\\u00F8\\u01FF\\u0254\\uA74B\\uA74D\\u0275',\r\n },\r\n { base: 'oi', letters: '\\u01A3' },\r\n { base: 'ou', letters: '\\u0223' },\r\n { base: 'oo', letters: '\\uA74F' },\r\n { base: 'p', letters: '\\u0070\\u24DF\\uFF50\\u1E55\\u1E57\\u01A5\\u1D7D\\uA751\\uA753\\uA755' },\r\n { base: 'q', letters: '\\u0071\\u24E0\\uFF51\\u024B\\uA757\\uA759' },\r\n {\r\n base: 'r',\r\n letters:\r\n '\\u0072\\u24E1\\uFF52\\u0155\\u1E59\\u0159\\u0211\\u0213\\u1E5B\\u1E5D\\u0157\\u1E5F\\u024D\\u027D\\uA75B\\uA7A7\\uA783',\r\n },\r\n {\r\n base: 's',\r\n letters:\r\n '\\u0073\\u24E2\\uFF53\\u00DF\\u015B\\u1E65\\u015D\\u1E61\\u0161\\u1E67\\u1E63\\u1E69\\u0219\\u015F\\u023F\\uA7A9\\uA785\\u1E9B',\r\n },\r\n {\r\n base: 't',\r\n letters: '\\u0074\\u24E3\\uFF54\\u1E6B\\u1E97\\u0165\\u1E6D\\u021B\\u0163\\u1E71\\u1E6F\\u0167\\u01AD\\u0288\\u2C66\\uA787',\r\n },\r\n { base: 'tz', letters: '\\uA729' },\r\n {\r\n base: 'u',\r\n letters:\r\n '\\u0075\\u24E4\\uFF55\\u00F9\\u00FA\\u00FB\\u0169\\u1E79\\u016B\\u1E7B\\u016D\\u00FC\\u01DC\\u01D8\\u01D6\\u01DA\\u1EE7\\u016F\\u0171\\u01D4\\u0215\\u0217\\u01B0\\u1EEB\\u1EE9\\u1EEF\\u1EED\\u1EF1\\u1EE5\\u1E73\\u0173\\u1E77\\u1E75\\u0289',\r\n },\r\n { base: 'v', letters: '\\u0076\\u24E5\\uFF56\\u1E7D\\u1E7F\\u028B\\uA75F\\u028C' },\r\n { base: 'vy', letters: '\\uA761' },\r\n { base: 'w', letters: '\\u0077\\u24E6\\uFF57\\u1E81\\u1E83\\u0175\\u1E87\\u1E85\\u1E98\\u1E89\\u2C73' },\r\n { base: 'x', letters: '\\u0078\\u24E7\\uFF58\\u1E8B\\u1E8D' },\r\n {\r\n base: 'y',\r\n letters: '\\u0079\\u24E8\\uFF59\\u1EF3\\u00FD\\u0177\\u1EF9\\u0233\\u1E8F\\u00FF\\u1EF7\\u1E99\\u1EF5\\u01B4\\u024F\\u1EFF',\r\n },\r\n { base: 'z', letters: '\\u007A\\u24E9\\uFF5A\\u017A\\u1E91\\u017C\\u017E\\u1E93\\u1E95\\u01B6\\u0225\\u0240\\u2C6C\\uA763' },\r\n];\r\n\r\nconst diacriticsMap = {};\r\nfor (let i = 0; i < defaultDiacriticsRemovalMap.length; i++) {\r\n const letters = defaultDiacriticsRemovalMap[i].letters;\r\n for (let j = 0; j < letters.length; j++) {\r\n diacriticsMap[letters[j]] = defaultDiacriticsRemovalMap[i].base;\r\n }\r\n}\r\n\r\n// \"what?\" version ... http://jsperf.com/diacritics/12\r\nexport default function removeDiacritics(str) {\r\n return str.replace(/[^\\u0000-\\u007E]/g, function (a) {\r\n return diacriticsMap[a] || a;\r\n });\r\n}\r\n","import React, { useCallback, useEffect, useState, useMemo } from 'react';\r\nimport { IPrpDimensionState, IPrpDimensionStateRefinement, IQueryDim } from '../Prp/IPrp';\r\nimport { en, fr } from './i18n';\r\nimport { useTranslation } from 'react-i18next';\r\nimport algoliasearch from 'algoliasearch/lite';\r\nimport { TmMenu } from '../../../tscapi/model/menu';\r\nimport getNavMenu from '../../../tscapi/service/menu.service';\r\nimport OnAirButtons from './OnAirButtons';\r\nimport removeDiacritics from '../utils/removeDiacritic';\r\n\r\nexport interface PrpFilterPanelProps {\r\n dimensionStates: Array;\r\n queryDims: Array | null;\r\n onCloseListener: () => void;\r\n onFilterChangeListener: (refinement: IPrpDimensionStateRefinement) => void;\r\n onClearAllClickListener: () => void;\r\n appliedFilters: IPrpDimensionStateRefinement[];\r\n totalProductCount: number;\r\n isSearchPage: boolean;\r\n isOnAirPage: boolean;\r\n}\r\n\r\nexport interface AlgoliaResponse {\r\n hits: Array<{\r\n valueName: {\r\n en: string;\r\n fr: string;\r\n };\r\n valueId: string;\r\n objectId: string;\r\n }>;\r\n}\r\n\r\nexport const ratingSvgMapping: Record = {\r\n '0': '/App_Assets/public/Raiting_00.svg',\r\n '0.5': '/App_Assets/public/Raiting_05.svg',\r\n '1': '/App_Assets/public/Raiting_10.svg',\r\n '1.5': '/App_Assets/public/Raiting_15.svg',\r\n '2': '/App_Assets/public/Raiting_20.svg',\r\n '2.5': '/App_Assets/public/Raiting_25.svg',\r\n '3': '/App_Assets/public/Raiting_30.svg',\r\n '3.5': '/App_Assets/public/Raiting_35.svg',\r\n '4': '/App_Assets/public/Raiting_40.svg',\r\n '4.5': '/App_Assets/public/Raiting_45.svg',\r\n '5': '/App_Assets/public/Raiting_50.svg',\r\n};\r\n\r\nconst baseUrl = '/pages/productresults?dimensions=';\r\n\r\nexport type CategoryBreadcrumb = {\r\n DisplayName: string;\r\n DimensionId: string;\r\n};\r\n\r\nconst PrpFilterPanel = ({\r\n dimensionStates,\r\n queryDims,\r\n onCloseListener,\r\n onFilterChangeListener,\r\n onClearAllClickListener,\r\n appliedFilters,\r\n totalProductCount,\r\n isSearchPage,\r\n isOnAirPage,\r\n}: PrpFilterPanelProps) => {\r\n const categoryDimensionType = 'Category';\r\n\r\n const { i18n, t } = useTranslation('prp-filter-panel');\r\n i18n.addResourceBundle('en', 'prp-filter-panel', en, true, true);\r\n i18n.addResourceBundle('fr', 'prp-filter-panel', fr, true, true);\r\n\r\n const [isDimensionExpanded, setIsDimensionExpanded] = useState>([]);\r\n\r\n const [isDimensionSeeMore, setIsDimensionSeeMore] = useState>(\r\n new Array(dimensionStates.length).fill(false),\r\n );\r\n\r\n //const [l2, setL2] = useState>([])\r\n // const [l3, setL3] = useState>([]);\r\n\r\n const [isMobileSubPanelOpen, setIsMobileSubPanelOpen] = useState(false);\r\n const [isCategoryExpanded, setIsCategoryExpanded] = useState(true);\r\n const [brandSearch, setBrandSearch] = useState('');\r\n const [lastBackListItem, setLastBackListItem] = useState({\r\n DimensionId: '',\r\n DisplayName: '',\r\n });\r\n\r\n const fetchAlgolia = (dimensionId: string | null | undefined) => {\r\n let appId = 'F8X5YYAL68';\r\n let apiKey = '32e195c2957188a3db9954132e999bd2';\r\n let searchEnvironment = 'pr';\r\n const urlParams = new URLSearchParams(window.location.search);\r\n //\r\n if (\r\n window.location.hostname.startsWith('www') ||\r\n window.location.hostname.startsWith('pr') ||\r\n window.location.hostname.startsWith('st')\r\n ) {\r\n searchEnvironment = 'pr';\r\n } else {\r\n searchEnvironment = 'qa';\r\n }\r\n\r\n // parameter overides destination index for debugging\r\n if (urlParams.get('algoliadebug') == 'pr') {\r\n searchEnvironment = 'pr';\r\n }\r\n if (urlParams.get('algoliadebug') == 'qa') {\r\n searchEnvironment = 'qa';\r\n }\r\n\r\n if (searchEnvironment == 'pr') {\r\n // On production and staging, query Production indexes\r\n appId = 'F8X5YYAL68';\r\n apiKey = '4c8346d66994aa53e2fed2b017a8455b';\r\n } else {\r\n // on anything else search on QA algolia indexes\r\n appId = 'N2PGXY1LE4';\r\n apiKey = '1c209dd6850cf47fb7d0b4a7a0b1ebf8';\r\n }\r\n\r\n // create searchClient only once and reuse for each call to leverage caching\r\n const searchClient = algoliasearch(appId, apiKey);\r\n // parentId is the dimension hovered over\r\n // const filterStr = \"typeId: 'Category' AND productsCount > 0 AND parentId:100038\";\r\n const filterStr = `typeId: 'Category' AND productsCount > 0 AND parentId:${dimensionId}`;\r\n // query pr-dimensions\r\n const index = searchClient.initIndex('dimensions');\r\n index\r\n .search('', {\r\n sortFacetValuesBy: 'count',\r\n hitsPerPage: 15,\r\n filters: filterStr,\r\n attributesToRetrieve: ['valueName', 'valueId'],\r\n })\r\n .then((d) => {\r\n const response = d as unknown as AlgoliaResponse;\r\n const newL3 = response.hits.map((it) => {\r\n return {\r\n DisplayName: it.valueName.en.split(':')[0],\r\n DimensionId: it.valueId,\r\n };\r\n });\r\n //setL3(newL3);\r\n });\r\n };\r\n\r\n const getL2 = (l1DimId: string) => {\r\n const onSuccess = (tscMenu: TmMenu[]) => {\r\n const a = tscMenu.find((m) => m.Menu.NavigationDimension === l1DimId);\r\n if (!a) {\r\n //setL2([]);\r\n return;\r\n }\r\n const tmp = a.SubMenu[0].Row2Col1Left[0].Refinements.map((r) => {\r\n return {\r\n DisplayName: r.DimensionName,\r\n DimensionId: r.Url,\r\n };\r\n });\r\n //setL2(tmp);\r\n };\r\n\r\n const onFailure = () => {\r\n //setL2([]);\r\n };\r\n\r\n getNavMenu(onSuccess, onFailure);\r\n };\r\n\r\n const backList = useMemo(() => {\r\n const arr: Array = [];\r\n\r\n if (!queryDims || queryDims.length <= 0) {\r\n return [];\r\n }\r\n\r\n let dim = queryDims[0];\r\n let i = 0; // Control maximum loop\r\n const maxLoopLimit = 10;\r\n\r\n // for (let i = 0; i < queryDims.length; i++) {\r\n // arr.unshift({\r\n // DimensionId: queryDims[i].DimensionId,\r\n // DisplayName: queryDims[i].DisplayName,\r\n // });\r\n // }\r\n\r\n while (i < maxLoopLimit) {\r\n arr.unshift({\r\n DimensionId: dim.DimensionId,\r\n DisplayName: dim.DisplayName,\r\n });\r\n\r\n if (dim.ParentDimensions.length <= 0) {\r\n break;\r\n }\r\n\r\n dim = dim.ParentDimensions[0];\r\n i++;\r\n }\r\n\r\n const lastElement = arr.pop();\r\n setLastBackListItem(lastElement);\r\n\r\n // if (arr.length === 0) {\r\n // getL2(lastElement.DimensionId);\r\n // }\r\n\r\n // if (arr.length === 1) {\r\n // fetchAlgolia(lastElement.DimensionId);\r\n // }\r\n\r\n return arr;\r\n }, [queryDims, setLastBackListItem]);\r\n\r\n const dimensionsExceptCategory = useMemo(() => {\r\n return dimensionStates.filter((dimensionState) => {\r\n return dimensionState.DimensionType !== categoryDimensionType;\r\n });\r\n }, [dimensionStates]);\r\n\r\n useEffect(() => {\r\n const arr = new Array(dimensionStates.length).fill(false);\r\n const doesShopByCategoryExists =\r\n dimensionStates.find((s) => s.DimensionType === categoryDimensionType) !== undefined;\r\n if (!doesShopByCategoryExists) {\r\n arr[0] = true;\r\n }\r\n // if (backList.length === 0) {\r\n // arr[0] = true;\r\n // }\r\n setIsDimensionExpanded(arr);\r\n }, [dimensionStates, setIsDimensionExpanded, backList]);\r\n\r\n const isExpanded = useCallback(\r\n (i: number) => {\r\n return isDimensionExpanded[i];\r\n },\r\n [isDimensionExpanded],\r\n );\r\n\r\n const getRefinements = useCallback(\r\n (dimensionState: IPrpDimensionState, dimensionIndex: number) => {\r\n if (dimensionState.DimensionType === 'TSC_d_brand' || dimensionState.DimensionType === 'Brand') {\r\n if (brandSearch === '') {\r\n if (isDimensionSeeMore[dimensionIndex]) {\r\n return dimensionState.Refinements;\r\n }\r\n\r\n return dimensionState.Refinements.slice(0, dimensionState.VisibleNumber);\r\n }\r\n return dimensionState.Refinements.filter((ref) => {\r\n return removeDiacritics(ref.DimensionName.toLowerCase()).includes(\r\n removeDiacritics(brandSearch.toLowerCase()),\r\n );\r\n });\r\n }\r\n\r\n if (isDimensionSeeMore[dimensionIndex]) {\r\n return dimensionState.Refinements;\r\n }\r\n /*\r\n console.log('%c dimensionState:', 'color: green; font-weight: bold;');\r\n console.log({ dimensionState });\r\n */\r\n return dimensionState.Refinements.slice(0, dimensionState.VisibleNumber);\r\n },\r\n [isDimensionSeeMore, brandSearch],\r\n );\r\n\r\n const getTitleFormatted = useCallback((dimensionState: IPrpDimensionState) => {\r\n return dimensionState.ListTitle.charAt(0).toUpperCase() + dimensionState.ListTitle.slice(1).toLowerCase();\r\n }, []);\r\n\r\n const onRefinementKeyDown = (e: React.KeyboardEvent, refinement: IPrpDimensionStateRefinement) => {\r\n if (e.key === 'Enter' || e.key === ' ') {\r\n onFilterChangeListener(refinement);\r\n }\r\n };\r\n\r\n const renderStandardRefinement = (dimensionState: IPrpDimensionState, refinement: IPrpDimensionStateRefinement) => {\r\n return (\r\n
  • \r\n \r\n
  • \r\n );\r\n };\r\n\r\n const renderReviewRefinement = (dimensionState: IPrpDimensionState, refinement: IPrpDimensionStateRefinement) => {\r\n const totalReviewsCount = dimensionState.Refinements.map((ref) => ref.Count).reduce(\r\n (acc, curr) => acc + curr,\r\n 0,\r\n );\r\n const percentage = Math.floor((refinement.Count * 100) / totalReviewsCount);\r\n\r\n return (\r\n \r\n onFilterChangeListener(refinement)}\r\n onKeyDown={(e) => onRefinementKeyDown(e, refinement)}\r\n id={`${dimensionState.ListTitle}-${refinement.DimensionId}`}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n {refinement.DimensionName}\r\n \r\n \r\n (\r\n {refinement.Count}\r\n )\r\n {t('reviews')}\r\n \r\n
    \r\n \r\n
    \r\n \r\n \r\n );\r\n };\r\n\r\n const renderCategory = () => {\r\n const categoryDimensionType = 'Category';\r\n const category = dimensionStates.find((s) => s.DimensionType === categoryDimensionType);\r\n const doesShopByCategoryExists = category !== undefined;\r\n\r\n return (\r\n <>\r\n {doesShopByCategoryExists && (\r\n
    \r\n setIsCategoryExpanded((prev) => !prev)}\r\n >\r\n {t('category')}\r\n \r\n \r\n\r\n {isCategoryExpanded && (\r\n <>\r\n
      \r\n {backList.map((item) => (\r\n
    • \r\n \r\n \r\n \r\n {item.DisplayName}\r\n \r\n \r\n
    • \r\n ))}\r\n
    \r\n
    {lastBackListItem.DisplayName}
    \r\n {/*
    Showing {backList.length === 0 ? 'refinements' : 'l3'}
    */}\r\n \r\n \r\n )}\r\n
    \r\n )}\r\n \r\n );\r\n };\r\n\r\n return (\r\n
    \r\n {/* Header */}\r\n
    \r\n \r\n
    \r\n {/* */}\r\n {/*
    \r\n
      \r\n
    1. \r\n \r\n \r\n
    2. \r\n
    3. \r\n \r\n \r\n
    4. \r\n
    5. \r\n \r\n \r\n
    6. \r\n
    \r\n
    */}\r\n\r\n {isOnAirPage && }\r\n\r\n {/* Category */}\r\n {renderCategory()}\r\n\r\n {/* Brand */}\r\n {dimensionsExceptCategory.map((dimensionState, dimensionIndex) => (\r\n
    \r\n {/* Refinement group title*/}\r\n {\r\n setIsDimensionExpanded((prev) => prev.map((it, i) => (i === dimensionIndex ? !it : it)));\r\n }}\r\n aria-label=\"Open\"\r\n >\r\n {getTitleFormatted(dimensionState)}\r\n \r\n \r\n\r\n {/* Expanded section */}\r\n {isExpanded(dimensionIndex) && (\r\n
    \r\n {/* If dimension is brand, add search input */}\r\n {(dimensionState.DimensionType === 'TSC_d_brand' ||\r\n dimensionState.DimensionType === 'Brand') && (\r\n {\r\n setBrandSearch(e.target.value);\r\n }}\r\n />\r\n )}\r\n
    \r\n
      \r\n {getRefinements(dimensionState, dimensionIndex).map((refinement) => {\r\n const isReview =\r\n refinement.DimensionType === 'TSC_d_reviews' ||\r\n refinement.DimensionType === 'Reviews';\r\n return isReview\r\n ? renderReviewRefinement(dimensionState, refinement)\r\n : renderStandardRefinement(dimensionState, refinement);\r\n })}\r\n
    \r\n {\r\n setIsDimensionSeeMore((prev) =>\r\n prev.map((it, i) => (i === dimensionIndex ? !it : it)),\r\n );\r\n }}\r\n >\r\n \r\n {dimensionState.VisibleNumber > dimensionState.Refinements.length\r\n ? ''\r\n : isDimensionSeeMore[dimensionIndex]\r\n ? dimensionState.SeeLessLinkText\r\n : dimensionState.SeeMoreLinkText}\r\n \r\n \r\n
    \r\n
    \r\n )}\r\n
    \r\n ))}\r\n\r\n {/* Mobile SubPanel */}\r\n
    \r\n {appliedFilters.length > 0 && (\r\n setIsMobileSubPanelOpen((prev) => !prev)}\r\n >\r\n \r\n {t('filtersAdded')} ({appliedFilters.length})\r\n \r\n {/* Close Classname -> prp-filter-panel__mobile-subpanel__title-button__icon--closed */}\r\n \r\n \r\n )}\r\n {isMobileSubPanelOpen && (\r\n
    \r\n {appliedFilters.map((filter) => (\r\n onFilterChangeListener(filter)}\r\n >\r\n {(filter.DimensionType === 'TSC_d_reviews' || filter.DimensionType === 'Reviews') && (\r\n \r\n )}\r\n {filter.DimensionName}\r\n \r\n ))}\r\n \r\n
    \r\n )}\r\n \r\n {`${t('view')} ${totalProductCount} ${t('products')}`}\r\n \r\n
    \r\n
    \r\n );\r\n};\r\n\r\nexport default PrpFilterPanel;\r\n","import React from 'react';\r\n\r\n/**\r\n * @interface PrpNoSearchResultsProps\r\n */\r\nexport interface PrpNoSearchResultsProps {\r\n noResult: {\r\n heading: string;\r\n text: string;\r\n buttonText: string;\r\n };\r\n}\r\n\r\nconst PrpNoSearchResults = ({ noResult }: PrpNoSearchResultsProps) => {\r\n const onButtonClick = () => {\r\n const saytInputClassName = '.aa-Input';\r\n const saytInputElement = document.querySelector(saytInputClassName);\r\n if (saytInputElement) {\r\n saytInputElement.focus();\r\n }\r\n };\r\n\r\n return (\r\n
    \r\n
    \r\n
    \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n
    \r\n
    \r\n

    {noResult.heading}

    \r\n
    \r\n
    \r\n

    {noResult.text}

    \r\n \r\n
    \r\n
    \r\n
    \r\n {/*
    \r\n Did you mean {'\"'} boogie {'\"'}?\r\n View 50 search results\r\n
    */}\r\n
    \r\n );\r\n};\r\n\r\nexport default PrpNoSearchResults;\r\n","export const en = {\r\n showingResultsFor: 'Showing results for',\r\n noSearchResultHeading: 'We weren’t able to find any results',\r\n noSearchResultText: 'Please check the spelling or ',\r\n noSearchResultButtonText: 'try another search',\r\n filter: 'Filter',\r\n products: 'products',\r\n clearAll: 'Clear all',\r\n top: 'Top',\r\n displayingItems: 'Displaying items',\r\n outOf: 'out of',\r\n previous: 'Previous',\r\n next: 'Next',\r\n loading: 'Loading',\r\n};\r\n\r\nexport const fr = {\r\n showingResultsFor: 'Showing results for',\r\n noSearchResultHeading: 'We weren’t able to find any results',\r\n noSearchResultText: 'Please check the spelling or',\r\n noSearchResultButtonText: 'try another search',\r\n filter: 'Filter',\r\n products: 'products',\r\n clearAll: 'Clear all',\r\n top: 'Top',\r\n displayingItems: 'Displaying items',\r\n outOf: 'out of',\r\n previous: 'Previous',\r\n next: 'Next',\r\n loading: 'Loading',\r\n};\r\n","import { PrpProps } from './Prp';\r\n\r\nconst mockData: PrpProps = {\r\n data: {\r\n DimensionStates: [],\r\n Paging: {\r\n TotalRecords: 0,\r\n TotalPages: 0,\r\n CurrentPage: 0,\r\n },\r\n Sorting: {\r\n SelectedSortOption: {\r\n Key: 'FeaturedProducts',\r\n DisplayName: 'Featured Products',\r\n },\r\n SortOptions: [],\r\n },\r\n Products: [],\r\n QueryDims: [],\r\n RedirectUrl: null,\r\n SearchTerm: '',\r\n Redirected: false,\r\n AimRequestEndpoint: 'https://aim-gql-tsc.conscia.ai/graphql',\r\n AimRequestBody:\r\n '{\\r\\n \"query\": \"query ($segments: [String!]!, $context: Object!) {processedSegments(segments: $segments, context: $context) {result}}\",\\r\\n \"variables\": {\\r\\n \"segments\": [\\r\\n \"keyword-redirects\",\\r\\n \"product-search-results\",\\r\\n \"full-facet-data\",\\r\\n \"facet-rules\"\\r\\n ],\\r\\n \"context\": {\\r\\n \"queryProfileCode\": \"main\",\\r\\n \"searchTerms\": \" \",\\r\\n \"useGlobalRules\": \"TRUE\",\\r\\n \"maxResults\": 144,\\r\\n \"fieldsToReturn\": [\\r\\n \"ItemNo\",\\r\\n \"Name_En\",\\r\\n \"Name_Fr\",\\r\\n \"DefaultEdpNo\",\\r\\n \"IsSoldOut\",\\r\\n \"ProductReviewCount\",\\r\\n \"ProductReviewRating\",\\r\\n \"PriceIsLabel_En\",\\r\\n \"PriceIsLabel_Fr\",\\r\\n \"CanAddToCart\",\\r\\n \"TSFrom\",\\r\\n \"TSTo\",\\r\\n \"Styles\",\\r\\n \"Sizes\",\\r\\n \"Videos\",\\r\\n \"ShipMethod\",\\r\\n \"Installments\",\\r\\n \"Status\",\\r\\n \"IsWebOnly\",\\r\\n \"IsWebExcluded\",\\r\\n \"IsActive\",\\r\\n \"ActiveFrom\",\\r\\n \"ActiveTo\",\\r\\n \"IsSearchable\",\\r\\n \"SearchExcludeFrom\",\\r\\n \"SearchExcludeTo\",\\r\\n \"Edps.ItemNo\",\\r\\n \"Edps.EdpNo\",\\r\\n \"Edps.UpcNo\",\\r\\n \"Edps.Inventory\",\\r\\n \"Edps.PriceIs\",\\r\\n \"Edps.PriceWas\",\\r\\n \"Edps.Installments\",\\r\\n \"Edps.StyleCode\",\\r\\n \"Edps.SizeCode\",\\r\\n \"Edps.UnitsSold\",\\r\\n \"Edps.ColourFamily_en\",\\r\\n \"Edps.ColourFamily_fr\",\\r\\n \"Edps.ImageUrl\",\\r\\n \"Edps.IsPAndHOverride\",\\r\\n \"Edps.ShippingSurcharge\",\\r\\n \"Edps.PH_Routine_Alt\",\\r\\n \"Edps.Weight\",\\r\\n \"Edps.SkuAvailabilityType\",\\r\\n \"Edps.SkuAvailabilityDate\",\\r\\n \"Edps.EdpStatus\",\\r\\n \"Edps.RestrictedShipmentCode\",\\r\\n \"Edps.RestrictedProvinces\",\\r\\n \"TSC_d_product_type\",\\r\\n \"TSC_d_brand\",\\r\\n \"TSC_d_more_ways_to_shop\",\\r\\n \"TSC_d_is_price_label\",\\r\\n \"TSC_d_specialty_shop\"\\r\\n ],\\r\\n \"selectedDimensions\": [\\r\\n \"3002805\"\\r\\n ],\\r\\n \"facetState\": {\\r\\n \"selectedFacets\": {\\r\\n \"TSC_d_product_type\": {\\r\\n \"selectedKeys\": [\\r\\n \"3002805\"\\r\\n ]\\r\\n }\\r\\n }\\r\\n }\\r\\n }\\r\\n }\\r\\n}',\r\n AimRequestTime: '20211006083339446',\r\n AimResponseTimeInMS: 3797,\r\n AimRequestResponseLogDir: '',\r\n AimRequestFileName: '',\r\n AimResponseFileName: '',\r\n AimRequestResponseLogThreshold: 0,\r\n QueryId: 'b2e9eeca11eb8037b56655f4006f6f60',\r\n },\r\n};\r\n\r\nexport default mockData;\r\n","import classNames from 'classnames';\r\nimport { default as dayjs } from 'dayjs';\r\nimport DOMPurify from 'dompurify';\r\nimport React, { useCallback, useEffect, useState, useMemo } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nimport { trackFBSearchEvent } from '@/components/tracking_third_party/fbSearch';\r\nimport { TmFavouriteLocalStorage, TmFavourite, TmFavouriteList } from '@/tscapi/model/favourite';\r\nimport http from '@/tscapi/service/httpservice';\r\nimport { Cookie } from '@/tscapi/utils/cookie';\r\nimport { FavouriteStorage } from '@/tscapi/utils/favourites-storage';\r\n\r\nimport AdCard, { AdCardProps } from '../AdCard/AdCard';\r\nimport FraudModal from '../FraudModal/FraudModal';\r\nimport ProductCard, { ProductCategoryType } from '../ProductCard/ProductCard';\r\nimport OnAirButtons from '../PrpFilterPanel/OnAirButtons';\r\nimport PrpFilterPanel, { ratingSvgMapping } from '../PrpFilterPanel/PrpFilterPanel';\r\nimport PrpNoSearchResults from '../PrpNoSearchResults/PrpNoSearchResults';\r\n\r\nimport { en, fr } from './i18n';\r\nimport { IProduct } from './IProduct';\r\nimport { IPrp, IPrpDimensionStateRefinement, IPrpFavourites, IPrpDimensionState, IPrpPaging } from './IPrp';\r\nimport prpMock from './Prp.mock';\r\n\r\nexport interface PrpProps {\r\n data: IPrp;\r\n}\r\n\r\nexport type FocusArea = 'products' | 'filter' | 'sort';\r\n\r\nconst Prp = () => {\r\n const { i18n, t } = useTranslation('prp');\r\n i18n.addResourceBundle('en', 'prp', en, true, true);\r\n i18n.addResourceBundle('fr', 'prp', fr, true, true);\r\n\r\n const BREAKPOINT = 1023;\r\n const DEFAULT_PAGE_SIZE = 48;\r\n const DEFAULT_PAGE_SORT_KEY = 'FeaturedProducts';\r\n const DEFAULT_DIMENSION_ID = '0';\r\n const PRP_CARD_GRID_ITEM_CLASSNAME = '.prp-card-grid-item';\r\n\r\n const [data, setData] = useState({\r\n ...prpMock.data,\r\n Products: [],\r\n DimensionStates: [],\r\n });\r\n\r\n const [currentPage, setCurrentPage] = useState(1);\r\n const [pageSortKey, setPageSortKey] = useState('');\r\n const [pageDimensionId, setPageDimensionId] = useState('');\r\n const [searchTerm, setSearchTerm] = useState('');\r\n const [rdParameter, setRdParameter] = useState('');\r\n const [viParameter, setViParameter] = useState('');\r\n const [currentPageSize, setCurrentPageSize] = useState(DEFAULT_PAGE_SIZE);\r\n const [isFilterPanelOpen, setIsFilterPanelOpen] = useState(false);\r\n const [width, setWidth] = useState(window.innerWidth);\r\n const [currentFocusedCardIndex, setCurrentFocusedCardIndex] = useState(0);\r\n const [favourites, setFavourites] = useState(null);\r\n const [currentFocusArea, setCurrentFocusArea] = useState('products');\r\n const [isFetchComplete, setIsFetchComplete] = useState(false);\r\n const [showFraudModal, setShowFraudModal] = useState(false);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [jsonLD, setJsonLD] = useState('');\r\n\r\n const [isAdCardAvailable, setIsAdCardAvailable] = useState(false);\r\n const [adCardProps, setAdCardProps] = useState(null);\r\n\r\n /*\r\n console.log('%c data.DimensionStates:', 'color: purple; font-weight: bold;');\r\n console.log({ dataDimensionStates: data.DimensionStates });\r\n */\r\n /*\r\n console.log('%c pageDimensionId:', 'color: magenta; font-weight: bold;');\r\n console.log({ pageDimensionId });\r\n */\r\n\r\n const getProductImageURL = (prod: IProduct) => {\r\n if (prod != null && prod.ImageUrl != null && prod.ImageUrl.length > 0) {\r\n return 'https://item.tscimg.ca/TSC/' + prod.ImageUrl + '?impolicy=L';\r\n }\r\n return '';\r\n };\r\n\r\n const getEdpNo = (prod: IProduct) => {\r\n const defEdp = prod.DefaultEdp;\r\n for (const edp of prod.Edps) {\r\n if (edp.EdpNo == prod.DefaultEdp) {\r\n return edp.EdpNo;\r\n }\r\n }\r\n return '';\r\n };\r\n\r\n const getUpcNo = (prod: IProduct) => {\r\n const defEdp = prod.DefaultEdp;\r\n for (const edp of prod.Edps) {\r\n if (edp.EdpNo == prod.DefaultEdp) {\r\n return edp.UpcNo;\r\n }\r\n }\r\n return '';\r\n };\r\n\r\n const getAppliedPrice = (prod: IProduct) => {\r\n const defEdp = prod.DefaultEdp;\r\n for (const edp of prod.Edps) {\r\n if (edp.EdpNo == prod.DefaultEdp) {\r\n return edp.AppliedPrice || '0.00';\r\n }\r\n }\r\n return '';\r\n };\r\n\r\n const getSafeHTML = (value: {}) => {\r\n // If value convert to JSON and escape / to prevent script tag in JSON\r\n const json = value ? JSON.stringify(value, null) : ''; /*.replace(/\\//g, '\\\\/')*/\r\n return DOMPurify.sanitize(json);\r\n };\r\n\r\n const updateSchema = (prodResult: IPrp) => {\r\n //debugger;\r\n const todayDate: Date = new Date(Date.now());\r\n function makeDate(date: Date) {\r\n return new Date(+date);\r\n }\r\n\r\n const todaysDateFormatted = dayjs(makeDate(todayDate)).format('YYYY-MM-DD');\r\n const oneWeekLaterDateFormatted = dayjs(makeDate(todayDate)).add(7, 'day').format('YYYY-MM-DD');\r\n\r\n //let dateToString = formatWithOptions('yyyy-MM-dd');\r\n if (prodResult.Products == null || prodResult.Products.length == 0) {\r\n setJsonLD('');\r\n return;\r\n }\r\n\r\n //Construct Schema's mainEntity object\r\n const schema = {\r\n '@context': 'https://schema.org',\r\n '@type': 'SearchResultsPage',\r\n mainEntity: [],\r\n };\r\n\r\n const objEntity = {\r\n '@type': 'ItemList',\r\n name:\r\n prodResult.DimensionStates != null && prodResult.DimensionStates.length > 0\r\n ? prodResult.DimensionStates[0].ListTitle\r\n : 'ItemList',\r\n itemListOrder:\r\n 'https://schema.org/ItemListOrderAscending' /* Order is not available in TmProductResult */,\r\n itemListElement: [],\r\n };\r\n\r\n let position = 0;\r\n const cookie = new Cookie();\r\n const language = cookie.Language.toLowerCase();\r\n const getUrl = window.location;\r\n const baseUrl = getUrl.protocol + '//' + getUrl.host;\r\n\r\n for (const product of prodResult.Products) {\r\n position = position + 1;\r\n\r\n const oProd: { [k: string]: any } = {\r\n '@type': 'ListItem',\r\n position: position,\r\n item: {\r\n '@type': 'Product',\r\n name: product.Name,\r\n image: getProductImageURL(product),\r\n description: product.Name /* description is not available in TmProductForPRP, so Name is used */,\r\n brand: product.Brand != null ? product.Brand : 'Brand not provided',\r\n offers: {\r\n '@type': 'Offer',\r\n priceCurrency: 'CAD',\r\n url:\r\n baseUrl +\r\n product.LinkWithoutDomain.substring(\r\n product.LinkWithoutDomain.indexOf('/pages/productdetails'),\r\n ),\r\n itemCondition: 'https://schema.org/NewCondition',\r\n priceValidUntil: product.IsShowstopper ? todaysDateFormatted : oneWeekLaterDateFormatted,\r\n price:\r\n language == 'en_ca'\r\n ? getAppliedPrice(product).replace(/[^0-9\\.]+/g, '')\r\n : getAppliedPrice(product)\r\n .replace(/[^0-9\\,]+/g, '')\r\n .replace(',', '.'),\r\n availability: 'https://schema.org/InStock',\r\n },\r\n },\r\n };\r\n\r\n if (getUpcNo(product)) {\r\n oProd.item.gtin12 = getUpcNo(product);\r\n }\r\n if (getEdpNo(product)) {\r\n oProd.item.sku = getEdpNo(product);\r\n }\r\n\r\n if (product.ProductReviewCount > 0) {\r\n const oAggregateRating = {\r\n '@type': 'AggregateRating',\r\n ratingValue: product.ProductReviewRating,\r\n bestRating: '5',\r\n worstRating: '0',\r\n ratingCount: product.ProductReviewCount,\r\n };\r\n oProd.item['aggregateRating'] = Object.assign({}, oAggregateRating);\r\n }\r\n\r\n objEntity.itemListElement.push(oProd);\r\n }\r\n\r\n schema.mainEntity.push(objEntity);\r\n const json = schema;\r\n setJsonLD(getSafeHTML(json));\r\n };\r\n\r\n const filterPanelHandler = () => {\r\n if (isFilterPanelOpen) {\r\n setIsFilterPanelOpen(false);\r\n } else {\r\n setIsFilterPanelOpen(true);\r\n }\r\n };\r\n\r\n const getUserFavourites = (edp: number) => {\r\n const favouriteStorage = new FavouriteStorage();\r\n favouriteStorage.Favourites;\r\n setFavourites(favouriteStorage.Favourites);\r\n };\r\n\r\n const buildApiUrl = useCallback(\r\n (\r\n dimensionId: string,\r\n page: number,\r\n sortKey: string,\r\n searchTermKey: string,\r\n pageSize: number,\r\n rdValue: string,\r\n viValue: string,\r\n ) => {\r\n const lang = new Cookie().Language.substring(0, 2) || 'en';\r\n const baseUrl = '/api/v3/' + lang;\r\n let dimensionParam = '';\r\n if (dimensionId === DEFAULT_DIMENSION_ID || viValue === DEFAULT_DIMENSION_ID) {\r\n dimensionParam = '';\r\n } else if (viValue === '') {\r\n dimensionParam = `dimensions=${dimensionId}`;\r\n } else {\r\n if (viValue !== dimensionId && dimensionId === '') {\r\n dimensionParam = `visitorId=${viValue}`;\r\n } else if (viValue !== dimensionId && dimensionId !== '') {\r\n dimensionParam = `visitorId=${viValue}&dimensions=${dimensionId}`;\r\n } else {\r\n dimensionParam = `dimensions=${dimensionId}`;\r\n }\r\n }\r\n\r\n const pageParam = page === 1 ? '' : `page=${page}`;\r\n const pageSizeParam = pageSize === DEFAULT_PAGE_SIZE ? '' : `pageSize=${pageSize}`;\r\n const sortKeyParam = sortKey !== '' && sortKey !== DEFAULT_PAGE_SORT_KEY ? 'sortKey=' + sortKey : '';\r\n const searchTermParam = searchTermKey !== '' ? 'searchTerm=' + searchTermKey : '';\r\n const rdParam = rdValue !== '' ? 'rd=' + rdValue : '';\r\n const params = [dimensionParam, pageParam, pageSizeParam, sortKeyParam, searchTermParam, rdParam].filter(\r\n (it) => it !== '',\r\n );\r\n const concat = params.join('&');\r\n const endpoint = concat !== '' ? `?${concat}` : '';\r\n const prpUrl = baseUrl + `/products${endpoint}`;\r\n return prpUrl;\r\n },\r\n [],\r\n );\r\n\r\n const buildPageUrl = useCallback(\r\n (\r\n dimensionId: string,\r\n page: number,\r\n sortKey: string,\r\n searchTermKey: string,\r\n pageSize: number,\r\n rdValue: string,\r\n viValue: string,\r\n ) => {\r\n /*\r\n console.log('%c dimensionId:', 'color: brown; font-weight: bold;');\r\n console.log({ dimensionId });\r\n */\r\n const baseUrl = '/pages';\r\n let dimensionParam = '';\r\n\r\n if (dimensionId === DEFAULT_DIMENSION_ID || viValue === DEFAULT_DIMENSION_ID) {\r\n dimensionParam = '';\r\n } else if (viValue === '') {\r\n dimensionParam = `dimensions=${dimensionId}`;\r\n } else {\r\n dimensionParam = `nav=vi:${viValue}`;\r\n if (viValue !== dimensionId && dimensionId === '') {\r\n dimensionParam = `nav=vi:${viValue}`;\r\n } else if (viValue !== dimensionId && dimensionId !== '') {\r\n dimensionParam = `${dimensionParam}&dimensions=${dimensionId}`;\r\n } else {\r\n dimensionParam = `dimensions=${dimensionId}`;\r\n }\r\n }\r\n\r\n const pageParam = page === 1 ? '' : `page=${page}`;\r\n const pageSizeParam = pageSize === DEFAULT_PAGE_SIZE ? '' : `pageSize=${pageSize}`;\r\n const sortKeyParam = sortKey !== '' && sortKey !== DEFAULT_PAGE_SORT_KEY ? 'sortKey=' + sortKey : '';\r\n const searchTermParam = searchTermKey !== '' ? 'searchTerm=' + searchTermKey : '';\r\n const rdParam = rdValue !== '' ? 'rd=' + rdValue : '';\r\n const params = [dimensionParam, pageParam, pageSizeParam, sortKeyParam, searchTermParam, rdParam].filter(\r\n (it) => it !== '',\r\n );\r\n const concat = params.join('&');\r\n const endpoint = concat !== '' ? `?${concat}` : '';\r\n const pageUrl = baseUrl + `/productresults${endpoint}`;\r\n return pageUrl;\r\n },\r\n [],\r\n );\r\n\r\n const setProductRefinementAnalytics = (searchTerm: string, paging: IPrpPaging) => {\r\n const { TotalRecords, TotalPages, CurrentPage } = paging;\r\n const searchObj = { searchTerm, totalRecords: TotalRecords, totalPages: TotalPages, currentPage: CurrentPage };\r\n window.analyticsData.event = window.analyticsData.event || {};\r\n window.analyticsData.event.type = 'prp_refinement';\r\n window.analyticsData.search = searchObj;\r\n };\r\n\r\n const setMissingProductAnalytics = (searchTerm: string) => {\r\n const missingProductObj = { itemNo: searchTerm };\r\n const searchObj = { searchTerm, totalRecords: 0, totalPages: 0, currentPage: 0 };\r\n window.analyticsData.missingProduct = missingProductObj;\r\n window.analyticsData.search = searchObj;\r\n };\r\n\r\n const scrollToTopOfPRP = () => {\r\n const toScrollPosition = document.getElementById('to-scroll-position');\r\n toScrollPosition.scrollIntoView({ behavior: 'smooth', block: 'start' });\r\n };\r\n\r\n const navigateToPage = useCallback(\r\n async (\r\n dimensionId: string,\r\n page: number,\r\n sortKey: string,\r\n searchTermKey: string,\r\n pageSize: number,\r\n rdValue: string,\r\n viValue: string,\r\n ): Promise => {\r\n const cachebleHeaders = {\r\n 'Content-Type': 'application/json',\r\n currentdatetime: new Cookie().CurrentDate || new Date().toISOString(),\r\n };\r\n\r\n const prpUrl = buildApiUrl(dimensionId, page, sortKey, searchTermKey, pageSize, rdValue, viValue);\r\n\r\n try {\r\n const result = await http.get(prpUrl, {\r\n headers: cachebleHeaders,\r\n transformRequest: (data, headers) => {\r\n delete headers.Authorization;\r\n return data;\r\n },\r\n });\r\n setData(result.data);\r\n setCurrentPage(result.data.Paging.CurrentPage);\r\n setPageSortKey(result.data.Sorting.SelectedSortOption.Key);\r\n updateSchema(result.data);\r\n generateAnalyticsFilters(result.data.DimensionStates);\r\n if (result.data.Products.length > 0)\r\n setProductRefinementAnalytics(result.data.SearchTerm, result.data.Paging);\r\n if (result.data.Products === null || result.data.Products.length === 0)\r\n setMissingProductAnalytics(result.data.SearchTerm);\r\n setIsFetchComplete(true);\r\n } catch (e) {\r\n setIsFetchComplete(true);\r\n }\r\n\r\n return buildPageUrl(dimensionId, page, sortKey, searchTermKey, pageSize, rdValue, viValue);\r\n },\r\n [setData],\r\n );\r\n\r\n const fetchAndSetProducts = useCallback(\r\n async (\r\n dimensionId: string,\r\n page: number,\r\n sortKey: string,\r\n searchTermKey: string,\r\n pageSize: number,\r\n rdValue: string,\r\n viValue: string,\r\n ) => {\r\n await navigateToPage(dimensionId, page, sortKey, searchTermKey, pageSize, rdValue, viValue);\r\n },\r\n [navigateToPage],\r\n );\r\n\r\n useEffect(() => {\r\n try {\r\n const searchString = window.sessionStorage.getItem('TSC_SearchString');\r\n if (searchString) {\r\n trackFBSearchEvent(searchString);\r\n window.sessionStorage.removeItem('TSC_SearchString');\r\n }\r\n } catch (error) {\r\n console.error('Error accessing sessionStorage:', error);\r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n const domAdCard = document.querySelector('.ad-card');\r\n\r\n const adCardData: AdCardProps = {\r\n ctaText: '',\r\n href: '',\r\n image: '',\r\n text: '',\r\n title: '',\r\n imageAlt: '',\r\n textBackgroundColour: '',\r\n textBackgroundOpacity: 0.5,\r\n textColour: '',\r\n };\r\n const queryString = window.location.search.slice(1);\r\n const queries: Record = {};\r\n queryString.split('&').forEach((query) => {\r\n const [key, value] = query.split('=');\r\n queries[key] = value;\r\n });\r\n\r\n const pageSizeFromQuery = queries['pageSize'] || `$${DEFAULT_PAGE_SIZE}`;\r\n const parsedPageSize = parseInt(pageSizeFromQuery, 10) || DEFAULT_PAGE_SIZE;\r\n let pageSize = parsedPageSize;\r\n setCurrentPageSize(pageSize);\r\n\r\n if (!domAdCard) {\r\n setIsAdCardAvailable(false);\r\n } else {\r\n setIsAdCardAvailable(true);\r\n const domAdCardImage = document.querySelector('.ad-card__self');\r\n const domAdCardTitle = document.querySelector('.ad-card__content-title');\r\n const domAdCardText = document.querySelector('.ad-card__content-text');\r\n const domAdCardCta = document.querySelector('.ad-card__content-cta__title');\r\n const domAdCardImageAltText = document.querySelector('.ad-card__image-alt-text');\r\n const domAdCardTextColour = document.querySelector('.ad-card__text-colour');\r\n const domAdCardTextBackgroundColour = document.querySelector(\r\n '.ad-card__text-background-colour',\r\n );\r\n const domAdCardTextBackgroundOpacity = document.querySelector(\r\n '.ad-card__text-background-opacity',\r\n );\r\n\r\n adCardData.href = domAdCard.getAttribute('href') || '';\r\n adCardData.image = domAdCardImage?.getAttribute('src') || '';\r\n adCardData.title = domAdCardTitle.textContent || '';\r\n adCardData.text = domAdCardText.textContent || '';\r\n adCardData.ctaText = domAdCardCta.textContent || '';\r\n adCardData.imageAlt = domAdCardImageAltText.textContent || '';\r\n adCardData.textColour = domAdCardTextColour.textContent || '';\r\n adCardData.textBackgroundColour = domAdCardTextBackgroundColour.textContent || '';\r\n adCardData.textBackgroundOpacity = parseFloat(domAdCardTextBackgroundOpacity.textContent) || 0.5;\r\n\r\n setAdCardProps(adCardData);\r\n domAdCard.remove();\r\n\r\n pageSize -= 1;\r\n setCurrentPageSize(pageSize);\r\n }\r\n\r\n let navQuery = queries['nav'];\r\n let dimensionId = '';\r\n let viValue = '';\r\n\r\n if (navQuery) {\r\n navQuery = decodeURIComponent(navQuery);\r\n const [head, tail] = navQuery.split(':');\r\n if (head === 'N' || head === 'n') {\r\n dimensionId = tail;\r\n } else if (head === 'vi') {\r\n //dimensionId = tail;\r\n setViParameter(tail);\r\n viValue = tail;\r\n if (queries['dimensions'] && queries['dimensions'] !== tail) {\r\n dimensionId = queries['dimensions'];\r\n }\r\n } else {\r\n dimensionId = DEFAULT_DIMENSION_ID;\r\n }\r\n } else if (queries['dimensions']) {\r\n const dimensionsQuery = queries['dimensions'];\r\n dimensionId = dimensionsQuery;\r\n } else {\r\n dimensionId = DEFAULT_DIMENSION_ID;\r\n }\r\n\r\n setPageDimensionId(dimensionId);\r\n const pageQuery = queries['page'];\r\n let page = 1;\r\n\r\n if (pageQuery) {\r\n page = parseInt(pageQuery, 10) || 1;\r\n setCurrentPage(page);\r\n }\r\n\r\n const sortKey = queries['sortKey'] || '';\r\n setPageSortKey(sortKey);\r\n\r\n const searchTermKey = queries['searchterm'] || queries['searchTerm'] || '';\r\n setSearchTerm(searchTermKey);\r\n\r\n const rdTemp = queries['rd'] || '';\r\n const rd = rdTemp === 'false' ? '0' : rdTemp;\r\n setRdParameter(rd);\r\n\r\n fetchAndSetProducts(dimensionId, page, sortKey, searchTermKey, pageSize, rd, viValue).then(() => {\r\n const uat = new Cookie().UserAccessToken;\r\n if (!uat) {\r\n return;\r\n }\r\n\r\n const customerEdp = uat.Edp;\r\n if (!customerEdp) {\r\n return;\r\n }\r\n\r\n getUserFavourites(customerEdp);\r\n });\r\n }, [setPageDimensionId, fetchAndSetProducts]);\r\n\r\n const isSignedIn = useMemo(() => {\r\n const cookie = new Cookie();\r\n return !!cookie.UserAccessToken;\r\n }, [Cookie]);\r\n\r\n const isFavourite = (itemNo: string) => {\r\n if (!isSignedIn) {\r\n return false;\r\n }\r\n\r\n return favourites?.some((item) => item.ItemNumber === itemNo);\r\n };\r\n\r\n const products = useMemo(() => {\r\n return data.Products.map((el, i) => {\r\n const isLiked = isFavourite(el.ItemNo) || false;\r\n return (\r\n \r\n {\r\n document.querySelector('.prp-wrapper')?.scrollIntoView();\r\n setShowFraudModal(true);\r\n $('#fraudModal').modal('show');\r\n }}\r\n />\r\n \r\n );\r\n });\r\n }, [data, favourites]);\r\n\r\n const cards = useMemo(() => {\r\n const MOBILE_BREAKPOINT = 768;\r\n const isMobile = window.innerWidth < MOBILE_BREAKPOINT;\r\n const tmp: JSX.Element[] = [];\r\n\r\n if (isAdCardAvailable && adCardProps !== null) {\r\n const adCardComponent = (\r\n \r\n );\r\n\r\n if (isMobile) {\r\n tmp.push(adCardComponent);\r\n tmp.push(products[0]);\r\n tmp.push(products[1]);\r\n } else {\r\n tmp.push(products[0]);\r\n tmp.push(products[1]);\r\n tmp.push(adCardComponent);\r\n }\r\n\r\n products.slice(2).forEach((p) => {\r\n tmp.push(p);\r\n });\r\n } else {\r\n products.forEach((p) => {\r\n tmp.push(p);\r\n });\r\n }\r\n\r\n return tmp.slice(0, currentPageSize);\r\n }, [products, currentPageSize, adCardProps, window.innerWidth]);\r\n\r\n // const scrollToTop = useCallback(() => {\r\n // // window.scrollTo({\r\n // // top: 0,\r\n // // left: 0,\r\n // // behavior: 'smooth',\r\n // // });\r\n\r\n // document.querySelector('.prp')?.scrollIntoView();\r\n // }, []);\r\n\r\n const productGridKeyListener = (e: React.KeyboardEvent) => {\r\n const UP_ARROW = 'ArrowUp';\r\n const RIGHT_ARROW = 'ArrowRight';\r\n const DOWN_ARROW = 'ArrowDown';\r\n const LEFT_ARROW = 'ArrowLeft';\r\n\r\n let newIndex = -1;\r\n if (e.key === UP_ARROW) {\r\n newIndex = currentFocusedCardIndex - 3;\r\n } else if (e.key === RIGHT_ARROW) {\r\n newIndex = currentFocusedCardIndex + 1;\r\n } else if (e.key === DOWN_ARROW) {\r\n newIndex = currentFocusedCardIndex + 3;\r\n } else if (e.key === LEFT_ARROW) {\r\n newIndex = currentFocusedCardIndex - 1;\r\n }\r\n\r\n if (newIndex < 0) {\r\n newIndex = 0;\r\n } else if (newIndex >= cards.length) {\r\n newIndex = cards.length - 1;\r\n }\r\n\r\n setCurrentFocusedCardIndex(newIndex);\r\n };\r\n\r\n const prpKeyDownListener = (e: React.KeyboardEvent) => {\r\n if (!e.ctrlKey) {\r\n return;\r\n }\r\n\r\n if (currentFocusArea === 'products') {\r\n setCurrentFocusArea('filter');\r\n if (document.activeElement instanceof HTMLElement) {\r\n document.activeElement.blur();\r\n }\r\n const el = document.querySelector('.prp-filter-panel__blocks');\r\n el?.focus();\r\n return;\r\n }\r\n\r\n if (currentFocusArea === 'filter') {\r\n setCurrentFocusArea('sort');\r\n document.querySelector('.prp__count-and-shorting__shorting')?.focus();\r\n return;\r\n }\r\n\r\n if (currentFocusArea === 'sort') {\r\n setCurrentFocusArea('products');\r\n document.querySelector(PRP_CARD_GRID_ITEM_CLASSNAME)?.focus();\r\n return;\r\n }\r\n };\r\n\r\n const updateFilterAnalyticsData = (selectedFilters: any[]) => {\r\n const analyticsData = window.analyticsData || {};\r\n analyticsData.filters = selectedFilters;\r\n window.analytics_track = window.analytics_track || [];\r\n window.analytics_track.push({\r\n event: {\r\n type: 'prp_refinement',\r\n },\r\n });\r\n };\r\n\r\n const generateAnalyticsFilters = (dimensionStates: IPrpDimensionState[]) => {\r\n if (dimensionStates != null && dimensionStates.length > 0) {\r\n // let totalSelectedRefinements = 0;\r\n\r\n const analyticsFilters = [];\r\n\r\n for (const dimState of dimensionStates) {\r\n const groupName: string = dimState.ListTitle;\r\n\r\n dimState.ListTitle = dimState.ListTitle.substr(\r\n 0,\r\n dimState.ListTitle.indexOf('(') > 0 ? dimState.ListTitle.indexOf('(') : dimState.ListTitle.length,\r\n ).trim();\r\n const selectedRefinements: number = dimState.Refinements.filter((dim) => dim.Selected).length;\r\n if (selectedRefinements > 0) {\r\n dimState.ListTitle += ' (' + selectedRefinements + ')';\r\n // totalSelectedRefinements += selectedRefinements;\r\n\r\n const options = [];\r\n const selectedFilters = dimState.Refinements.filter((dim) => dim.Selected);\r\n for (const selectedFilter of selectedFilters) {\r\n options.push({ name: selectedFilter.DimensionName });\r\n }\r\n analyticsFilters.push({ group: groupName, options: options });\r\n }\r\n }\r\n /*\r\n console.log('%c analyticsFilters:', 'color: purple; font-weight: bold;');\r\n console.log({ analyticsFilters });\r\n */\r\n updateFilterAnalyticsData(analyticsFilters);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n // window.addEventListener('resize', () => setWidth(window.innerWidth));\r\n if (width <= BREAKPOINT) {\r\n setIsFilterPanelOpen(false);\r\n } else {\r\n setIsFilterPanelOpen(true);\r\n }\r\n }, [width, BREAKPOINT, setIsFilterPanelOpen, setWidth]);\r\n\r\n useEffect(() => {\r\n const interval = setInterval(() => {\r\n setWidth(window.innerWidth);\r\n }, 300);\r\n\r\n return () => {\r\n clearInterval(interval);\r\n };\r\n }, [setWidth]);\r\n\r\n useEffect(() => {\r\n const allGridItems = document.querySelectorAll(PRP_CARD_GRID_ITEM_CLASSNAME);\r\n const currentItem = allGridItems[currentFocusedCardIndex];\r\n const isProductCard = currentItem?.classList.contains('prp-card-grid-item--product-card');\r\n\r\n if (isProductCard) {\r\n const index = currentFocusedCardIndex >= 2 ? currentFocusedCardIndex - 1 : currentFocusedCardIndex;\r\n document.querySelectorAll('.product-card')[index]?.focus();\r\n } else {\r\n document.querySelectorAll('.ad-card')[0]?.focus();\r\n }\r\n }, [currentFocusedCardIndex]);\r\n\r\n const onBackButtonEvent = (event: PopStateEvent) => {\r\n event.preventDefault();\r\n window.location.href = window.location.href;\r\n };\r\n\r\n useEffect(() => {\r\n window.addEventListener('popstate', onBackButtonEvent);\r\n return () => window.removeEventListener('popstate', onBackButtonEvent);\r\n }, []);\r\n\r\n const paginationIndices = useMemo(() => {\r\n const indices = [];\r\n const halfSize = 5;\r\n for (let i = 0; i < halfSize; i++) {\r\n indices.push(currentPage - i);\r\n }\r\n\r\n for (let i = 1; i < 2 * halfSize; i++) {\r\n indices.push(currentPage + i);\r\n }\r\n\r\n const maxPage = data.Paging.TotalPages <= 10 ? data.Paging.TotalPages : 10;\r\n const filtered = indices.filter((i) => i > 0 && i <= data.Paging.TotalPages).sort((a, b) => a - b);\r\n const arr: number[] = [];\r\n\r\n for (let i = 0; i < Math.min(maxPage, filtered.length); i++) {\r\n arr.push(filtered[i]);\r\n }\r\n\r\n return arr;\r\n }, [currentPage, data.Paging.TotalPages]);\r\n\r\n const appliedFilters = useMemo(() => {\r\n const filters: Array = [];\r\n if (!data.DimensionStates) {\r\n return [];\r\n }\r\n data.DimensionStates.forEach((state) => {\r\n state.Refinements.forEach((refinement) => {\r\n /*\r\n console.log('%c refinement:', 'color: lime; font-weight: bold;');\r\n console.log({ refinement });\r\n */\r\n if (refinement.Selected) {\r\n filters.push(refinement);\r\n }\r\n });\r\n });\r\n return filters;\r\n }, [data, data.DimensionStates]);\r\n\r\n const onFilterChange = (refinement: IPrpDimensionStateRefinement) => {\r\n /*\r\n console.log('%c refinement:', 'color: red; font-weight: bold;');\r\n console.log({ refinement });\r\n */\r\n let newDimensionId = '';\r\n // const delimiter = window.location.href.includes('-') ? '-' : '%7C';\r\n const delimiter = '%7C';\r\n /*\r\n console.log('%c newDimensionId:', 'color: lime; font-weight: bold;');\r\n console.log({ delimiter });\r\n */\r\n\r\n // If not selected, then add a new selection\r\n // Else, remove the selection\r\n if (!refinement.Selected) {\r\n if (pageDimensionId === '') {\r\n newDimensionId = `${refinement.DimensionId}`;\r\n } else {\r\n newDimensionId = `${pageDimensionId}${delimiter}${refinement.DimensionId}`;\r\n }\r\n } else {\r\n if (viParameter === '') {\r\n newDimensionId = pageDimensionId.replace(`${delimiter}${refinement.DimensionId}`, '');\r\n } else {\r\n const splitted = pageDimensionId.split(delimiter);\r\n if (splitted.length === 1) {\r\n newDimensionId = pageDimensionId.replace(`${refinement.DimensionId}`, '');\r\n } else {\r\n if (splitted[0] === refinement.DimensionId) {\r\n newDimensionId = pageDimensionId.replace(`${refinement.DimensionId}${delimiter}`, '');\r\n } else {\r\n newDimensionId = pageDimensionId.replace(`${delimiter}${refinement.DimensionId}`, '');\r\n }\r\n }\r\n }\r\n }\r\n\r\n /*\r\n console.log('%c newDimensionId:', 'color: red; font-weight: bold;');\r\n console.log({ newDimensionId });\r\n */\r\n setPageDimensionId(newDimensionId);\r\n const newPageUrl = buildPageUrl(\r\n newDimensionId,\r\n 1,\r\n data.Sorting.SelectedSortOption.Key,\r\n searchTerm,\r\n currentPageSize,\r\n rdParameter,\r\n viParameter,\r\n );\r\n /*\r\n console.log('%c newPageUrl:', 'color: gold; font-weight: bold;');\r\n console.log({ newPageUrl });\r\n */\r\n setIsLoading(true);\r\n fetchAndSetProducts(\r\n newDimensionId,\r\n 1,\r\n data.Sorting.SelectedSortOption.Key,\r\n searchTerm,\r\n currentPageSize,\r\n rdParameter,\r\n viParameter,\r\n ).then(() => {\r\n // history.push(newPageUrl);\r\n // window.location.replace(newPageUrl);\r\n window.history.pushState({}, null, newPageUrl);\r\n setIsLoading(false);\r\n });\r\n };\r\n\r\n const removeAppliedFilter = (dimensionId: string) => {\r\n // const delimiter = window.location.href.includes('-') ? '-' : '%7C';\r\n const delimiter = '%7C';\r\n let newDimensionId = '';\r\n\r\n if (viParameter === '') {\r\n newDimensionId = pageDimensionId.replace(`${delimiter}${dimensionId}`, '');\r\n } else {\r\n const splitted = pageDimensionId.split(delimiter);\r\n if (splitted.length === 1) {\r\n newDimensionId = pageDimensionId.replace(`${dimensionId}`, '');\r\n } else {\r\n if (splitted[0] === dimensionId) {\r\n newDimensionId = pageDimensionId.replace(`${dimensionId}${delimiter}`, '');\r\n } else {\r\n newDimensionId = pageDimensionId.replace(`${delimiter}${dimensionId}`, '');\r\n }\r\n }\r\n }\r\n\r\n setPageDimensionId(newDimensionId);\r\n const newPageUrl = buildPageUrl(\r\n newDimensionId,\r\n 1,\r\n data.Sorting.SelectedSortOption.Key,\r\n searchTerm,\r\n currentPageSize,\r\n rdParameter,\r\n viParameter,\r\n );\r\n setIsLoading(true);\r\n fetchAndSetProducts(\r\n newDimensionId,\r\n 1,\r\n data.Sorting.SelectedSortOption.Key,\r\n searchTerm,\r\n currentPageSize,\r\n rdParameter,\r\n viParameter,\r\n ).then(() => {\r\n // history.push(newPageUrl);\r\n // window.location.replace(newPageUrl);\r\n window.history.pushState({}, null, newPageUrl);\r\n setIsLoading(false);\r\n });\r\n };\r\n\r\n const removeAllAppliedFilters = () => {\r\n const delimiter = pageDimensionId.includes('-') ? '-' : '%7C';\r\n let newDimensionId = '';\r\n\r\n if (viParameter === '') {\r\n newDimensionId = pageDimensionId.split(delimiter)[0];\r\n } else {\r\n newDimensionId = '';\r\n }\r\n\r\n setPageDimensionId(newDimensionId);\r\n const newPageUrl = buildPageUrl(\r\n newDimensionId,\r\n 1,\r\n data.Sorting.SelectedSortOption.Key,\r\n searchTerm,\r\n currentPageSize,\r\n rdParameter,\r\n viParameter,\r\n );\r\n setIsLoading(true);\r\n fetchAndSetProducts(\r\n newDimensionId,\r\n 1,\r\n data.Sorting.SelectedSortOption.Key,\r\n searchTerm,\r\n currentPageSize,\r\n rdParameter,\r\n viParameter,\r\n ).then(() => {\r\n // history.push(newPageUrl);\r\n // window.location.replace(newPageUrl);\r\n window.history.pushState({}, null, newPageUrl);\r\n setIsLoading(false);\r\n });\r\n };\r\n\r\n const isSearchPage = useMemo(() => {\r\n return searchTerm !== '';\r\n }, [searchTerm]);\r\n\r\n const isOnAirPage = useMemo(() => {\r\n return (\r\n tscConfig.AliasDimensionOnAirRecently === pageDimensionId ||\r\n tscConfig.AliasDimensionOnAirToday === pageDimensionId ||\r\n tscConfig.AliasDimensionOnAirYesterday === pageDimensionId\r\n );\r\n }, [pageDimensionId]);\r\n\r\n /*\r\n console.log('%c jsonLD, isJsonLDTrue:', 'color: red; font-weight: bold;');\r\n console.log({ jsonLD, isJsonLDTrue: jsonLD.length > 0 });\r\n */\r\n\r\n const sortChange = (e: React.ChangeEvent) => {\r\n const newPageUrl = buildPageUrl(\r\n pageDimensionId,\r\n 1,\r\n e.target.value,\r\n searchTerm,\r\n currentPageSize,\r\n rdParameter,\r\n viParameter,\r\n );\r\n setIsLoading(true);\r\n fetchAndSetProducts(\r\n pageDimensionId,\r\n 1,\r\n e.target.value,\r\n searchTerm,\r\n currentPageSize,\r\n rdParameter,\r\n viParameter,\r\n ).then(() => {\r\n window.history.pushState({}, null, newPageUrl);\r\n setIsLoading(false);\r\n setPageSortKey(data.Sorting.SelectedSortOption.Key);\r\n });\r\n };\r\n\r\n if (!isFetchComplete) {\r\n return (\r\n
    \r\n

    {t('loading')}

    \r\n
    \r\n );\r\n }\r\n\r\n if (isFetchComplete && data.Paging.TotalRecords === 0) {\r\n return (\r\n
    \r\n \r\n
    \r\n );\r\n }\r\n\r\n return (\r\n <>\r\n {showFraudModal && setShowFraudModal(false)} />}\r\n
    \r\n {isSearchPage && (\r\n

    \r\n {t('showingResultsFor')} "{decodeURIComponent(searchTerm)}"\r\n

    \r\n )}\r\n {isOnAirPage && }\r\n
    \r\n {isLoading &&
    Loading
    }\r\n {jsonLD.length > 0 && (\r\n