{"version":3,"file":"chunks-b180264cd1f963ce/apps_recommender_tracking_src_index_js.24acd55da725ccec.js","mappings":"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","sources":["webpack://assemble/./apps/common/constants/index.js","webpack://assemble/./apps/common/cookie-utils/Utils.js","webpack://assemble/./apps/common/cookie-utils/Shopware.js","webpack://assemble/./apps/common/cookie-utils/index.js","webpack://assemble/./apps/common/utils/index.js","webpack://assemble/./apps/recommender/tracking/src/index.js","webpack://assemble/./apps/recommender/tracking/src/Api.js","webpack://assemble/./node_modules/js-cookie/src/js.cookie.js"],"sourcesContent":["\nexport const API_VERSION = \"v2\";\nexport const ICON_SET_BOX= \"box\";\nexport const ICON_SET_BLUEPRINT = \"bp\";\nexport const ICON_SET_FONTAWESOME = \"fa\";\n\nexport const DESERIALIZE_TYPE_OBJECT = \"OBJECT\";\nexport const DESERIALIZE_TYPE_ARRAY_OBJECTS = \"ARRAY_OBJECTS\";\nexport const DESERIALIZE_TYPE_CUSTOM = \"CUSTOM\";\n\nexport const COOKIE_EXPIRES_DAYS = 365;\n\nexport const COOKIE_ID = \"ov_cookie_id\";\nexport const COOKIE_CONTACT_ID = \"ov_contact_id\";\n\nexport const COOKIE_REVIEWS_UPVOTED = \"ov_reviews_upvoted\";\nexport const COOKIE_BACKINSTOCK_VISITOR_ID = \"ov_backinstock_visitor_id\";\n\nexport const COOKIE_PROMPT_SESSION_NUM_VIEWED_PAGES = \"ov_prompt_session_num_viewed_pages\";\nexport const COOKIE_PROMPT_SESSION_VISITOR_TYPE = \"ov_prompt_session_visitor_type\";\nexport const COOKIE_PROMPT_SESSION_FIRST_SEEN = \"ov_prompt_session_first_seen\";\nexport const COOKIE_PROMPT_VISITOR_ID = \"ov_prompt_visitor_id\";\nexport const COOKIE_PROMPT_LAST_SEEN = \"ov_prompt_last_seen\";\n\n\n\n","import Cookies from 'js-cookie';\nimport * as comUtils from \"common/utils\";\nexport * from \"common/utils\";\nimport * as constants from 'common/constants';\n\n\nexport function getCookie(name, attributes={}) {\n return Cookies.get(name, attributes);\n}\n","import * as utils from './Utils';\n\nexport function requireCookieConsent() {\n if (!window.OnVoardData.use_cookie_consent) return false;\n if (!document.querySelector(\".cookie-permission-container\")) return false;\n return true;\n}\n\nexport function allowCookieId() {\n if (!requireCookieConsent()) return true;\n\n let allow = utils.getCookie('ov_allow_cookie_id');\n if (allow) return true;\n return false;\n}\n\nexport function allowContactIdCookie() {\n if (!requireCookieConsent()) return true;\n\n let allow = utils.getCookie('ov_allow_contact_id');\n if (allow) return true;\n return false;\n}\n\nexport function allowBackInStockVisitorIdCookie() {\n return true;\n}\n\nexport function allowReviewsUpvotedCookie() {\n return true;\n}\n\nexport function allowPromptSessionCookies() {\n return true;\n}\n\nexport function allowPromptVisitorIdCookie() {\n return true;\n}\n\nexport function allowPromptLastSeenCookie() {\n if (!requireCookieConsent()) return true;\n\n let allow = utils.getCookie('ov_allow_prompt_last_seen');\n if (allow) return true;\n return false;\n}\n","import Cookies from 'js-cookie';\nimport * as utils from './Utils';\nimport * as shopwareUtils from './Shopware';\nimport * as constants from 'common/constants';\n\n\nexport function allowCookieId() {\n let platform = utils.getEcommercePlatform();\n if (platform === 'shopware') return shopwareUtils.allowCookieId();\n return true;\n}\n\nexport function allowContactIdCookie() {\n let platform = utils.getEcommercePlatform();\n if (platform === 'shopware') return shopwareUtils.allowContactIdCookie();\n return true;\n}\n\nexport function allowBackInStockVisitorIdCookie() {\n let platform = utils.getEcommercePlatform();\n if (platform === 'shopware') return shopwareUtils.allowBackInStockVisitorIdCookie();\n return true;\n}\n\nexport function allowReviewsUpvotedCookie() {\n let platform = utils.getEcommercePlatform();\n if (platform === 'shopware') return shopwareUtils.allowReviewsUpvotedCookie();\n return true;\n}\n\nexport function allowPromptSessionCookies() {\n let platform = utils.getEcommercePlatform();\n if (platform === 'shopware') return shopwareUtils.allowPromptSessionCookies();\n return true;\n}\n\nexport function allowPromptVisitorIdCookie() {\n let platform = utils.getEcommercePlatform();\n if (platform === 'shopware') return shopwareUtils.allowPromptVisitorIdCookie();\n return true;\n}\n\nexport function allowPromptLastSeenCookie() {\n let platform = utils.getEcommercePlatform();\n if (platform === 'shopware') return shopwareUtils.allowPromptLastSeenCookie();\n return true;\n}\n\n//======================================\n// Core Functions\n//======================================\nexport function canSetCookie(name) {\n if (name === constants.COOKIE_ID) return allowCookieId();\n if (name === constants.COOKIE_CONTACT_ID) return allowContactIdCookie();\n if (name === constants.COOKIE_REVIEWS_UPVOTED) return allowReviewsUpvotedCookie();\n if (name === constants.COOKIE_BACKINSTOCK_VISITOR_ID) return allowBackInStockVisitorIdCookie();\n\n if (name.startsWith(\"ov_prompt_session\")) return allowPromptSessionCookies();\n if (name === constants.COOKIE_PROMPT_VISITOR_ID) return allowPromptVisitorIdCookie();\n if (name === constants.COOKIE_PROMPT_LAST_SEEN) return allowPromptLastSeenCookie();\n return true;\n}\n\nexport function getCookie(...args) {\n return utils.getCookie(...args);\n}\n\nexport function setCookie(name, value, attributes={}) {\n if (!canSetCookie(name)) return;\n\n if (!('expires' in attributes)) {\n attributes['expires'] = constants.COOKIE_EXPIRES_DAYS;\n }\n\n Cookies.set(name, value, attributes);\n return Cookies.get(name, attributes);\n}\n\nexport function setSessionCookie(name, value, attributes={}) {\n if (!canSetCookie(name)) return;\n Cookies.set(name, value, attributes);\n return Cookies.get(name, attributes);\n}\n\nexport function getOrSetCookie(name, value, attributes={}) {\n const cookie = getCookie(name, attributes) || null;\n if (cookie) return cookie;\n if (!canSetCookie(name)) return;\n\n if (!('expires' in attributes)) {\n attributes['expires'] = constants.COOKIE_EXPIRES_DAYS;\n }\n\n setCookie(name, value, attributes);\n return getCookie(name, attributes);\n}\n\nexport function removeCookie(name, attributes={}) {\n Cookies.remove(name, attributes);\n}\n\nexport function getCookieInt(cookieName) {\n let value = 0;\n\n try {\n value = parseInt(getCookie(cookieName)) || 0;\n } catch(e) {\n value = 0;\n }\n\n return value;\n}\n\nexport function parseCookieJson(rawValue, defaultValue) {\n let value = defaultValue;\n if (rawValue) {\n try {\n value = JSON.parse(rawValue);\n } catch(e) {\n value = defaultValue;\n }\n }\n\n if (!rawValue) value = defaultValue;\n return value;\n}\n\n//======================================\n// Get Cookies\n//======================================\nexport function getCookieId() {\n const cookieName = constants.COOKIE_ID;\n let cookieValue = getCookie(cookieName);\n return cookieValue;\n}\n\nexport function getOrCreateCookieId() {\n let cookieValue = getCookieId();\n if (cookieValue) return cookieValue;\n\n const cookieName = constants.COOKIE_ID;\n if (!canSetCookie(cookieName)) return;\n\n cookieValue = utils.uniqueId();\n setCookie(cookieName, cookieValue);\n return cookieValue;\n}\n\nexport function getContactId() {\n const cookieName = constants.COOKIE_CONTACT_ID;\n let cookieValue = getCookie(cookieName);\n return cookieValue;\n}\n","import axios from 'axios';\nimport get from 'lodash/get';\nimport ldIsEmpty from 'lodash/isEmpty';\nimport queryString from 'query-string';\nimport { customAlphabet } from 'nanoid';\nimport dictionary from 'nanoid-dictionary';\nimport * as constants from 'common/constants';\n\n\nexport function isProduction() {\n if (process.env.NODE_ENV === 'production') {\n return true;\n } else {\n return false;\n }\n}\n\nexport function isPreview() {\n if (typeof IS_PREVIEW !== 'undefined' && IS_PREVIEW) return true;\n return false;\n}\n\nexport function isClientProduction() {\n if (isProduction() && !isPreview()) return true;\n return false;\n}\n\nexport function getEcommercePlatform() {\n let ovData = window.OnVoardData;\n if (!ovData) return;\n return ovData.ecommerce_platform;\n}\n\nexport function getPlatformIdentifierForEngagement() {\n let platform = getEcommercePlatform();\n if (platform === 'bigcommerce') return window.OnVoardData.store_hash;\n if (platform === 'easystore') return window.OnVoardData.shop.domain;\n if (platform === 'shopify' && window.OnVoardData) return window.OnVoardData.shop.myshopify_domain;\n if (platform === 'shopline') return window.Shopline.storeId;\n if (platform === 'shopware') return window.OnVoardData.app_shop_id;\n if (platform === 'wix') return window.OnVoardData.account_id;\n if (platform === 'woocommerce') return window.location.hostname;\n return;\n}\n\nexport function isBrowser() {\n return typeof window !== 'undefined';\n}\n\n// https://stackoverflow.com/a/26824304/1446284\nexport function isInt(val) {\n var expression = /^[0-9]+$/;\n return expression.test(val);\n}\n\n// https://stackoverflow.com/a/9716488/1446284\nexport function isNumeric(val) {\n return !isNaN(parseFloat(val)) && isFinite(val);\n}\n\nexport function isBoolean(value) {\n return typeof value === 'boolean';\n}\n\nexport function isString(val) {\n return typeof val === 'string';\n}\n\nexport function isFunction(val) {\n return typeof val === 'function';\n}\n\nexport function isArray(val) {\n return Array.isArray(val);\n}\n\nexport function isObject(val) {\n return (!!val) && (val.constructor === Object);\n}\n\nexport function isEmpty(val) {\n return ldIsEmpty(val);\n}\n\nexport function stringContains(string, subString) {\n return string.indexOf(subString) !== -1;\n}\n\n// Use jquery's `inArray` to check if value is in array.\n// Will return boolean instead of value index\nexport function inArray(item, arrayList) {\n if ($.inArray(item, arrayList) !== -1) return true;\n return false;\n}\n\nexport function loopObject(object, callback) {\n for (var k in object) {\n let v = object[k];\n callback(k, v);\n }\n}\n\nexport function getRandomInt(max) {\n return Math.floor(Math.random() * Math.floor(max));\n}\n\nexport function generateHash(length=16) {\n return [...Array(length)].map(() => Math.random().toString(36)[2]).join('');\n}\n\nexport function formatAmount(amount) {\n amount = amount.toString();\n amount = amount.replace(/[^0-9.-]/g, '');\n amount = parseFloat(amount);\n return amount;\n}\n\nexport function isMobileScreen() {\n if (!isBrowser()) return;\n var screenWidth = window.screen.width;\n var screenHeight = window.screen.height;\n return screenWidth >= 768 ? false : true;\n}\n\n// In seconds precision\nexport function getCurrentTimestamp() {\n return Math.floor(Date.now() / 1000);\n}\n\nexport function currentURL() {\n if (!isBrowser()) return;\n return window.location.href;\n}\n\nexport function currentURLWithoutParams() {\n if (!isBrowser()) return;\n return window.location.protocol + '//' + window.location.host + window.location.pathname;\n}\n\nexport function currentDomain() {\n if (!isBrowser()) return;\n return window.location.hostname;\n}\n\nexport function currentURLPath() {\n if (!isBrowser()) return;\n return window.location.pathname;\n}\n\nexport function getScrollPercent() {\n if (!isBrowser()) return;\n const h = document.documentElement;\n const b = document.body;\n const st = 'scrollTop';\n const sh = 'scrollHeight';\n return (h[st]||b[st]) / ((h[sh]||b[sh]) - h.clientHeight) * 100;\n}\n\n\nexport function appendQueryString(url, qs) {\n const parsed = queryString.parseUrl(url);\n qs = {...parsed.query, ...qs};\n\n Object.keys(qs).forEach((key) => (qs[key] === null || qs[key] === \"\") && delete qs[key]);\n let stringified = queryString.stringify(qs);\n if (!stringified) {\n return url;\n } else {\n return url + \"?\" + stringified;\n }\n}\n\n// {url: 'https://foo.bar', query: {foo: 'bar'}}\nexport function parseUrl(url) {\n return queryString.parseUrl(url);\n}\n\n// {foo: 'bar'}\nexport function parseQueryString(val) {\n return queryString.parse(val);\n}\n\nexport function removeQueryString(url) {\n return url.split(\"?\")[0];\n}\n\n// Scroll to top of element. Useful when you are using scrollable elements\nexport function scrollElementTop(el) {\n el.scrollTop = el.scrollHeight;\n\n setTimeout(() => {\n el.scrollTop = 0;\n }, 100);\n}\n\nexport function getCssValueForSelector(selector, propKey) {\n if (!isBrowser()) return;\n const el = document.querySelector(selector);\n if (!el) return;\n\n style = window.getComputedStyle(el);\n return style.getPropertyValue(propKey);\n}\n\nexport function attachUrlChangeEvent() {\n if (window.OV_ATTACHED_URL_CHANGE_EVENT) return null;\n\n let platform = getEcommercePlatform();\n\n // shopline need this to detect\n // https://phpcoder.tech/detect-url-change-in-javascript-without-refresh/\n if (platform === 'shopline') {\n let lastUrl = location.href;\n new MutationObserver(() => {\n const url = location.href;\n if (url !== lastUrl) {\n lastUrl = url;\n window.dispatchEvent(new Event('ovurlchange'));\n }\n }).observe(document, {subtree: true, childList: true});\n\n window.OV_ATTACHED_URL_CHANGE_EVENT = 1;\n return;\n }\n\n // See https://stackoverflow.com/a/52809105/1446284\n history.pushState = (f => function pushState(){\n var ret = f.apply(this, arguments);\n window.dispatchEvent(new Event('pushstate'));\n window.dispatchEvent(new Event('ovurlchange'));\n return ret;\n })(history.pushState);\n\n history.replaceState = (f => function replaceState(){\n var ret = f.apply(this, arguments);\n window.dispatchEvent(new Event('replacestate'));\n window.dispatchEvent(new Event('ovurlchange'));\n return ret;\n })(history.replaceState);\n\n window.addEventListener('popstate', () => {\n window.dispatchEvent(new Event('ovurlchange'))\n });\n\n window.OV_ATTACHED_URL_CHANGE_EVENT = 1;\n}\n\nexport function attachHashChangeEvent() {\n if (window.OV_ATTACHED_HASH_CHANGE_EVENT) return null;\n\n window.addEventListener('hashchange', () => {\n window.dispatchEvent(new Event('ovhashchange'))\n });\n\n window.OV_ATTACHED_HASH_CHANGE_EVENT = 1;\n}\n\n// See https://stackoverflow.com/a/43467144/1446284\nexport function isValidUrl(value) {\n if (!value) return false;\n if (value.startsWith(\"//\")) value = value.replace(\"//\", \"https://\");\n if (!value.startsWith(\"http://\") && !value.startsWith(\"https://\")) {\n value = `http://${value}`\n }\n\n let url;\n try {\n url = new URL(value);\n } catch (_) {\n return false;\n }\n\n return url.protocol === \"http:\" || url.protocol === \"https:\";\n}\n\n// https://gist.github.com/ManUtopiK/469aec75b655d6a4d912aeb3b75af3c9\nexport function cleanGraphQLResponse(input) {\n if (!input) return null\n const output = {}\n const isObject = obj => {\n return obj !== null && typeof obj === 'object' && !Array.isArray(obj)\n }\n\n Object.keys(input).forEach(key => {\n if (input[key] && input[key].edges) {\n output[key] = input[key].edges.map(edge =>\n cleanGraphQLResponse(edge.node)\n )\n } else if (isObject(input[key])) {\n output[key] = cleanGraphQLResponse(input[key])\n } else if (key !== '__typename') {\n output[key] = input[key]\n }\n })\n\n return output\n}\n\n\nconst requestAnimFrame = (function() {\n if (window.requestAnimationFrame) return window.requestAnimationFrame;\n return (callback, element) => window.setTimeout(callback, 1000 / 60);\n})();\n\n// See https://gist.github.com/joelambert/1002116\nexport function requestInterval(fn, delay) {\n if(!window.requestAnimationFrame) return window.setInterval(fn, delay);\n\n let start = new Date().getTime();\n let handle = new Object();\n\n function loop() {\n var current = new Date().getTime(),\n delta = current - start;\n\n if(delta >= delay) {\n fn.call();\n start = new Date().getTime();\n }\n\n handle.value = requestAnimFrame(loop);\n };\n\n handle.value = requestAnimFrame(loop);\n return handle;\n}\n\n\n// See https://gist.github.com/joelambert/1002116\nexport function clearRequestInterval(handle) {\n if (window.cancelAnimationFrame) window.cancelAnimationFrame(handle.value);\n clearInterval(handle);\n}\n\nexport function stringifyError(error) {\n try {\n error = JSON.stringify(error);\n } catch {}\n return error;\n}\n\nexport function printErrors(errors) {\n if (isArray(errors)) {\n errors.forEach((error) => {\n console.log(error);\n });\n\n return;\n }\n\n if (isObject(errors)) {\n for (let [key, value] of Object.entries(errors)) {\n console.log(`${key}: ${value}`);\n }\n\n return;\n }\n\n console.log(errors);\n}\n\n\n//===================================================\n// interceptRequests\n//===================================================\n// https://gist.github.com/sergeimuller/a609a9df7d30e2625a177123797471e2\nfunction replaceXHROpen(interceptPaths, callback) {\n let oldXHROpen = window.XMLHttpRequest.prototype.open;\n window.XMLHttpRequest.prototype.open = function(method, url, async, user, password) {\n this.addEventListener('load', function() {\n if (!interceptPaths.some((path) => url.includes(path))) return;\n\n // Can't guarantee response is always json\n callback(this.response, url);\n });\n\n oldXHROpen.apply(this, arguments);\n }\n\n // required because some apps or themes mess jQuery up and causing unexpected issues\n try {\n if (window.jQuery) {\n jQuery(document).ajaxSuccess(function(event, xhr, settings) {\n if (!interceptPaths.some((path) => settings.url.includes(path))) return;\n\n // Can't guarantee response is always json\n callback(xhr.responseText, settings.url);\n });\n }\n } catch(e) {}\n}\n\n// https://stackoverflow.com/a/64961272/1446284\nfunction replaceFetch(interceptPaths, callback) {\n let oldFetch = window.fetch;\n window.fetch = async (...args) => {\n const reqUrl = args[0];\n const response = await oldFetch(...args);\n if (!reqUrl || !interceptPaths.some((path) => reqUrl.includes(path))) return response;\n\n // Can't guarantee response is always json\n response\n .clone()\n .text()\n .then((textResponse) => {\n callback(textResponse, reqUrl);\n })\n .catch((err) => {\n console.error(err);\n })\n\n return response;\n }\n}\n\n\nexport function interceptRequests(interceptPaths, callback) {\n if (getEcommercePlatform() === 'shopline' && window.__AJAX_INTERCEPTOR__) {\n window.__AJAX_INTERCEPTOR__((data) => {\n if (data.method !== 'GET') return;\n if (!interceptPaths.some((path) => data.url.includes(path))) return;\n\n // Can't guarantee response is always json\n callback(data.xhr.responseText, data.url);\n });\n }\n\n replaceXHROpen(interceptPaths, callback);\n replaceFetch(interceptPaths, callback);\n}\n\n\n//===================================================\n// API Utils\n//===================================================\nexport function handleErrorCallback(error, errorCallback) {\n if (error.response) {\n if (error.response.status === 500) {\n errorCallback(\"Server error 500. This error indicates that there are some issues on our end.\");\n return;\n }\n\n if (error.response.data) {\n if (error.response.data.errors && Array.isArray(error.response.data.errors)) {\n errorCallback(error.response.data.errors.join(\"\\n\"));\n return;\n }\n\n errorCallback(error.response.data);\n return;\n }\n }\n\n errorCallback(error.message);\n}\n\nexport function handleRqSuccess(response, successCallback) {\n successCallback(response.data);\n};\n\n\nexport function handleRqError(error, errorCallback) {\n handleErrorCallback(error, errorCallback);\n};\n\n\nexport function getRq(kwargs) {\n const config = {};\n config['method'] = 'get';\n config['url'] = kwargs.url;\n if (kwargs.headers) config['headers'] = kwargs.headers;\n\n axios(config)\n .then((response) => handleRqSuccess(response, kwargs.successCallback))\n .catch((error) => handleRqError(error, kwargs.errorCallback));\n};\n\nexport function postRq(kwargs) {\n const config = {};\n config['method'] = 'post';\n config['url'] = kwargs.url;\n config['data'] = kwargs.data || \"{}\";\n if (kwargs.headers) config['headers'] = kwargs.headers;\n\n axios(config)\n .then((response) => handleRqSuccess(response, kwargs.successCallback))\n .catch((error) => handleRqError(error, kwargs.errorCallback));\n};\n\nexport function buildUrl(path, qs={}) {\n return appendQueryString(`${BASE_API_URL}/${constants.API_VERSION}/${path}`, qs);\n}\n\nexport function uniqueId(prefix='', length=16) {\n const generator = customAlphabet(dictionary.alphanumeric, length);\n let id = generator();\n if (prefix) id = `${prefix}${id}`;\n return id;\n}\n\n// https://github.com/scopsy/await-to-js\nexport function to(promise) {\n return promise.then(data => {\n return [null, data];\n })\n .catch(err => [err]);\n}\n","import * as api from './Api';\nimport * as utils from './Utils';\n\n\nfunction extractProductExternalId() {\n let ovData = window.OnVoardData;\n if (!ovData) return;\n\n if (ovData.ecommerce_platform === \"shopify\") {\n const template = ovData.template;\n const product = ovData.product;\n if (template !== \"product\" || !product) return;\n return product.id;\n }\n\n if (ovData.ecommerce_platform === \"bigcommerce\") {\n const pageType = ovData.page_type;\n const product = ovData.product;\n if (pageType !== \"product\" || !product) return;\n return product.id;\n }\n\n if (ovData.ecommerce_platform === \"easystore\") {\n const template = ovData.template;\n const product = ovData.product;\n if (template !== \"product\" || !product) return;\n return product.id;\n }\n\n if (ovData.ecommerce_platform === \"shopline\") {\n const product = ovData.product;\n if (!product || !product.id) return;\n return product.id;\n }\n\n if (ovData.ecommerce_platform === \"shopware\") {\n const product = ovData.product;\n if (!product || !product.id) return;\n return product.id;\n }\n\n if (ovData.ecommerce_platform === \"wix\") {\n const pageType = ovData.page_type;\n const product = ovData.product;\n if (pageType !== \"product\" || !product) return;\n return product.id;\n }\n\n if (ovData.ecommerce_platform === \"woocommerce\") {\n const pageType = ovData.page_type;\n const product = ovData.product;\n if (pageType !== \"product\" || !product) return;\n return product.id;\n }\n\n return;\n}\n\nfunction trackClick(qs, cookieId, productExternalId) {\n if (!qs['ov_recommender']) return;\n\n let clickedRecommenderId = decodeURIComponent(qs['ov_recommender']);\n if (!clickedRecommenderId) return;\n\n let payload = {};\n payload['recommender'] = clickedRecommenderId;\n payload['cookie_id'] = cookieId;\n payload['ecommerce_platform'] = utils.getEcommercePlatform();\n payload['platform_identifier'] = utils.getPlatformIdentifierForEngagement();\n if (productExternalId) payload['product_external_id'] = productExternalId;\n\n const successCallback = (response) => {};\n const errorCallback = (error) => {\n console.error(error);\n };\n\n api.postRecommenderTrackClick(successCallback, errorCallback, JSON.stringify(payload));\n}\n\n\nfunction trackRecentlyViewed(accountId, cookieId, productExternalId) {\n if (!cookieId || !productExternalId) return;\n\n let payload = {};\n payload['account_id'] = accountId;\n payload['cookie_id'] = cookieId;\n payload['product_external_id'] = productExternalId;\n\n const successCallback = (response) => {};\n const errorCallback = (error) => {\n console.error(error);\n };\n\n api.postRecommenderTrackRecentlyViewed(successCallback, errorCallback, JSON.stringify(payload));\n}\n\n\nexport function processTracking() {\n if (!utils.isBrowser()) return;\n\n let ovData = window.OnVoardData;\n const platform = utils.getEcommercePlatform();\n const el = document.querySelector(\".ov-app-recommender-tracking\");\n if (!el) return;\n\n let accountId = el.getAttribute('data-account-id');\n if (!accountId && platform === 'shopline') {\n if (ovData && ovData.config) {\n accountId = ovData.config['account_id'];\n }\n }\n\n if (accountId && !el.getAttribute('data-account-id')) {\n el.setAttribute(\"data-account-id\", accountId);\n }\n\n const qs = utils.parseQueryString(window.location.search);\n const cookieId = utils.getOrCreateCookieId();\n const productExternalId = extractProductExternalId();\n\n // track click\n trackClick(qs, cookieId, productExternalId);\n\n // track recently viewed\n trackRecentlyViewed(accountId, cookieId, productExternalId);\n};\n\n","import * as utils from 'Utils';\n\n\nexport function postRecommenderTrackClick(successCallback, errorCallback, data) {\n utils.postRq({\n \"url\": utils.buildUrl(`recommenders/track-click`),\n \"successCallback\": successCallback,\n \"errorCallback\": errorCallback,\n \"data\": data\n });\n}\n\nexport function postRecommenderTrackRecentlyViewed(successCallback, errorCallback, data) {\n utils.postRq({\n \"url\": utils.buildUrl(`recommenders/track-recently-viewed`),\n \"successCallback\": successCallback,\n \"errorCallback\": errorCallback,\n \"data\": data\n });\n}\n\n","/*!\n * JavaScript Cookie v2.2.1\n * https://github.com/js-cookie/js-cookie\n *\n * Copyright 2006, 2015 Klaus Hartl & Fagner Brack\n * Released under the MIT license\n */\n;(function (factory) {\n\tvar registeredInModuleLoader;\n\tif (typeof define === 'function' && define.amd) {\n\t\tdefine(factory);\n\t\tregisteredInModuleLoader = true;\n\t}\n\tif (typeof exports === 'object') {\n\t\tmodule.exports = factory();\n\t\tregisteredInModuleLoader = true;\n\t}\n\tif (!registeredInModuleLoader) {\n\t\tvar OldCookies = window.Cookies;\n\t\tvar api = window.Cookies = factory();\n\t\tapi.noConflict = function () {\n\t\t\twindow.Cookies = OldCookies;\n\t\t\treturn api;\n\t\t};\n\t}\n}(function () {\n\tfunction extend () {\n\t\tvar i = 0;\n\t\tvar result = {};\n\t\tfor (; i < arguments.length; i++) {\n\t\t\tvar attributes = arguments[ i ];\n\t\t\tfor (var key in attributes) {\n\t\t\t\tresult[key] = attributes[key];\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\tfunction decode (s) {\n\t\treturn s.replace(/(%[0-9A-Z]{2})+/g, decodeURIComponent);\n\t}\n\n\tfunction init (converter) {\n\t\tfunction api() {}\n\n\t\tfunction set (key, value, attributes) {\n\t\t\tif (typeof document === 'undefined') {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tattributes = extend({\n\t\t\t\tpath: '/'\n\t\t\t}, api.defaults, attributes);\n\n\t\t\tif (typeof attributes.expires === 'number') {\n\t\t\t\tattributes.expires = new Date(new Date() * 1 + attributes.expires * 864e+5);\n\t\t\t}\n\n\t\t\t// We're using \"expires\" because \"max-age\" is not supported by IE\n\t\t\tattributes.expires = attributes.expires ? attributes.expires.toUTCString() : '';\n\n\t\t\ttry {\n\t\t\t\tvar result = JSON.stringify(value);\n\t\t\t\tif (/^[\\{\\[]/.test(result)) {\n\t\t\t\t\tvalue = result;\n\t\t\t\t}\n\t\t\t} catch (e) {}\n\n\t\t\tvalue = converter.write ?\n\t\t\t\tconverter.write(value, key) :\n\t\t\t\tencodeURIComponent(String(value))\n\t\t\t\t\t.replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent);\n\n\t\t\tkey = encodeURIComponent(String(key))\n\t\t\t\t.replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent)\n\t\t\t\t.replace(/[\\(\\)]/g, escape);\n\n\t\t\tvar stringifiedAttributes = '';\n\t\t\tfor (var attributeName in attributes) {\n\t\t\t\tif (!attributes[attributeName]) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tstringifiedAttributes += '; ' + attributeName;\n\t\t\t\tif (attributes[attributeName] === true) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Considers RFC 6265 section 5.2:\n\t\t\t\t// ...\n\t\t\t\t// 3. If the remaining unparsed-attributes contains a %x3B (\";\")\n\t\t\t\t// character:\n\t\t\t\t// Consume the characters of the unparsed-attributes up to,\n\t\t\t\t// not including, the first %x3B (\";\") character.\n\t\t\t\t// ...\n\t\t\t\tstringifiedAttributes += '=' + attributes[attributeName].split(';')[0];\n\t\t\t}\n\n\t\t\treturn (document.cookie = key + '=' + value + stringifiedAttributes);\n\t\t}\n\n\t\tfunction get (key, json) {\n\t\t\tif (typeof document === 'undefined') {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar jar = {};\n\t\t\t// To prevent the for loop in the first place assign an empty array\n\t\t\t// in case there are no cookies at all.\n\t\t\tvar cookies = document.cookie ? document.cookie.split('; ') : [];\n\t\t\tvar i = 0;\n\n\t\t\tfor (; i < cookies.length; i++) {\n\t\t\t\tvar parts = cookies[i].split('=');\n\t\t\t\tvar cookie = parts.slice(1).join('=');\n\n\t\t\t\tif (!json && cookie.charAt(0) === '\"') {\n\t\t\t\t\tcookie = cookie.slice(1, -1);\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tvar name = decode(parts[0]);\n\t\t\t\t\tcookie = (converter.read || converter)(cookie, name) ||\n\t\t\t\t\t\tdecode(cookie);\n\n\t\t\t\t\tif (json) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tcookie = JSON.parse(cookie);\n\t\t\t\t\t\t} catch (e) {}\n\t\t\t\t\t}\n\n\t\t\t\t\tjar[name] = cookie;\n\n\t\t\t\t\tif (key === name) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {}\n\t\t\t}\n\n\t\t\treturn key ? jar[key] : jar;\n\t\t}\n\n\t\tapi.set = set;\n\t\tapi.get = function (key) {\n\t\t\treturn get(key, false /* read as raw */);\n\t\t};\n\t\tapi.getJSON = function (key) {\n\t\t\treturn get(key, true /* read as json */);\n\t\t};\n\t\tapi.remove = function (key, attributes) {\n\t\t\tset(key, '', extend(attributes, {\n\t\t\t\texpires: -1\n\t\t\t}));\n\t\t};\n\n\t\tapi.defaults = {};\n\n\t\tapi.withConverter = init;\n\n\t\treturn api;\n\t}\n\n\treturn init(function () {});\n}));\n"],"names":["API_VERSION","ICON_SET_BOX","ICON_SET_BLUEPRINT","ICON_SET_FONTAWESOME","DESERIALIZE_TYPE_OBJECT","DESERIALIZE_TYPE_ARRAY_OBJECTS","DESERIALIZE_TYPE_CUSTOM","COOKIE_EXPIRES_DAYS","COOKIE_ID","COOKIE_CONTACT_ID","COOKIE_REVIEWS_UPVOTED","COOKIE_BACKINSTOCK_VISITOR_ID","COOKIE_PROMPT_SESSION_NUM_VIEWED_PAGES","COOKIE_PROMPT_SESSION_VISITOR_TYPE","COOKIE_PROMPT_SESSION_FIRST_SEEN","COOKIE_PROMPT_VISITOR_ID","COOKIE_PROMPT_LAST_SEEN","getCookie","name","attributes","Cookies","requireCookieConsent","window","OnVoardData","use_cookie_consent","document","querySelector","allowCookieId","utils","allowContactIdCookie","allowPromptLastSeenCookie","canSetCookie","constants","startsWith","setCookie","value","setSessionCookie","removeCookie","parseCookieJson","rawValue","defaultValue","JSON","parse","e","getCookieId","getOrCreateCookieId","cookieValue","cookieName","getContactId","isProduction","isPreview","IS_PREVIEW","isClientProduction","getEcommercePlatform","ovData","ecommerce_platform","getPlatformIdentifierForEngagement","platform","store_hash","shop","domain","myshopify_domain","Shopline","storeId","app_shop_id","account_id","location","hostname","isBrowser","isInt","val","test","isNumeric","isNaN","parseFloat","isFinite","isBoolean","isString","isFunction","isArray","Array","isObject","constructor","Object","isEmpty","ldIsEmpty","stringContains","string","subString","indexOf","inArray","item","arrayList","$","loopObject","object","callback","k","getRandomInt","max","Math","floor","random","generateHash","length","map","toString","join","formatAmount","amount","replace","isMobileScreen","screenWidth","screen","width","height","getCurrentTimestamp","Date","now","currentURL","href","currentURLWithoutParams","protocol","host","pathname","currentDomain","currentURLPath","getScrollPercent","h","documentElement","b","body","st","sh","clientHeight","appendQueryString","url","qs","parsed","queryString","query","keys","forEach","key","stringified","parseUrl","parseQueryString","removeQueryString","split","scrollElementTop","el","scrollTop","scrollHeight","setTimeout","getCssValueForSelector","selector","propKey","style","getComputedStyle","getPropertyValue","attachUrlChangeEvent","OV_ATTACHED_URL_CHANGE_EVENT","f","lastUrl","MutationObserver","dispatchEvent","Event","observe","subtree","childList","history","pushState","ret","apply","this","arguments","replaceState","addEventListener","attachHashChangeEvent","OV_ATTACHED_HASH_CHANGE_EVENT","isValidUrl","URL","_","cleanGraphQLResponse","input","output","obj","edges","edge","node","requestAnimFrame","requestAnimationFrame","element","requestInterval","fn","delay","setInterval","start","getTime","handle","loop","call","clearRequestInterval","cancelAnimationFrame","clearInterval","stringifyError","error","stringify","printErrors","errors","console","log","entries","interceptRequests","interceptPaths","__AJAX_INTERCEPTOR__","data","method","some","path","includes","xhr","responseText","oldXHROpen","XMLHttpRequest","prototype","open","async","user","password","response","jQuery","ajaxSuccess","event","settings","replaceXHROpen","oldFetch","fetch","reqUrl","clone","text","then","textResponse","err","replaceFetch","handleErrorCallback","errorCallback","status","message","handleRqSuccess","successCallback","handleRqError","getRq","kwargs","config","headers","axios","postRq","buildUrl","BASE_API_URL","uniqueId","prefix","generator","customAlphabet","dictionary","id","to","promise","trackClick","cookieId","productExternalId","clickedRecommenderId","decodeURIComponent","payload","api","trackRecentlyViewed","accountId","processTracking","getAttribute","setAttribute","search","template","product","pageType","page_type","extractProductExternalId","factory","module","exports","OldCookies","noConflict","extend","i","result","decode","s","init","converter","set","defaults","expires","toUTCString","write","encodeURIComponent","String","escape","stringifiedAttributes","attributeName","cookie","get","json","jar","cookies","parts","slice","charAt","read","getJSON","remove","withConverter"],"sourceRoot":""}