{"version":3,"file":"bloomreach-recommendations.js","sources":["../../../resources/javascript/features/content-block/bloomreach-recommendation-engine/index.js","../../../resources/javascript/entrypoint/bloomreach-recommendations.js"],"sourcesContent":["import { initRecommendationBlock } from '../../recommendations/block';\n\n/**\n * Initialise Bloomreach Recommendation Engine content blocks.\n *\n * This function must be called on pages that include Bloomreach Recommendation\n * Engine content blocks, but no more than once per page load.\n */\nexport const initBloomreachRecommendationBlocks = async () => {\n  for (const block of document.querySelectorAll('.block--bloomreach-recommendation-engine')) {\n    initRecommendationBlock(block, {\n      carouselClass: 'br-rec-engine',\n      loadRecommendations: async ({ engineId, container }) => {\n        const relatedProducts = container.dataset.recEngineProducts ? JSON.parse(container.dataset.recEngineProducts) : []\n\n        const statusLoaded = 'loaded';\n        const statusTimedOut = 'timed-out';\n\n        return new Promise((resolve, reject) => {\n          if (typeof globalThis.exponea === 'undefined') {\n            reject('unavailable');\n            return;\n          }\n\n          let status = 'loading';\n\n          let callExponea = () => {\n            if (status === statusTimedOut) {\n              return;\n            }\n\n            globalThis.exponea.getRecommendation({\n              recommendationId: engineId,\n              callback: (data) => {\n                if (status === statusTimedOut) {\n                  return;\n                }\n\n                status = statusLoaded;\n\n                if (!data || !data.length) {\n                  reject('zero-recommendations');\n                  return;\n                }\n\n                resolve(data.map(({ item_id: productCode }) => productCode));\n              },\n              fillWithRandom: true, // Fill random items until size is reached, if there aren't enough recommendations.\n              size: 18, // Maximum number of recommendations to return.\n              items: relatedProducts,\n              catalogAttributesWhitelist: [], // Returns only specified attributes from catalog items. If empty or not set, returns everything.\n            });\n          };\n\n          let timer = setInterval(() => {\n            if (globalThis.exponea.isInitialized) {\n              clearInterval(timer);\n              callExponea();\n            } else if (status === statusTimedOut) {\n              clearInterval(timer);\n            }\n          }, 500);\n\n          // Start timeout to discard rendering when recommendations are loaded\n          // from Bloomreach too late.\n          setTimeout(() => {\n            if (status !== statusLoaded) {\n              status = statusTimedOut;\n              reject(status);\n            }\n          }, 10000);\n        });\n      },\n      trackClick: (e, { engineId, card }) => {\n        globalThis.exponea.track('recommendation', {\n          action: 'click',\n          item_id: card.dataset.gaid,\n          recommendation_id: engineId,\n        });\n      },\n    });\n  }\n};\n","// @ts-check\n\nimport { initBloomreachRecommendationBlocks } from '../features/content-block/bloomreach-recommendation-engine';\nimport { onDOMContentLoaded } from '../util/loaded';\n\nonDOMContentLoaded(() => {\n  initBloomreachRecommendationBlocks();\n});\n"],"names":["initBloomreachRecommendationBlocks","async","block","document","querySelectorAll","initRecommendationBlock","carouselClass","loadRecommendations","engineId","container","relatedProducts","dataset","recEngineProducts","JSON","parse","statusLoaded","statusTimedOut","Promise","resolve","reject","globalThis","exponea","status","timer","setInterval","isInitialized","clearInterval","getRecommendation","recommendationId","callback","data","length","map","item_id","productCode","fillWithRandom","size","items","catalogAttributesWhitelist","setTimeout","trackClick","e","card","track","action","gaid","recommendation_id","onDOMContentLoaded"],"mappings":"+MAQO,MAAMA,EAAqCC,UAChD,IAAK,MAAMC,KAASC,SAASC,iBAAiB,4CAC5CC,EAAwBH,EAAO,CAC7BI,cAAe,gBACfC,oBAAqBN,OAASO,WAAUC,gBACtC,MAAMC,EAAkBD,EAAUE,QAAQC,kBAAoBC,KAAKC,MAAML,EAAUE,QAAQC,mBAAqB,GAE1GG,EAAe,SACfC,EAAiB,YAEvB,OAAO,IAAIC,SAAQ,CAACC,EAASC,KAC3B,QAAkC,IAAvBC,WAAWC,QAEpB,YADAF,EAAO,eAIT,IAAIG,EAAS,UA8BTC,EAAQC,aAAY,KAClBJ,WAAWC,QAAQI,eACrBC,cAAcH,GA7BZD,IAAWN,GAIfI,WAAWC,QAAQM,kBAAkB,CACnCC,iBAAkBpB,EAClBqB,SAAWC,IACLR,IAAWN,IAIfM,EAASP,EAEJe,GAASA,EAAKC,OAKnBb,EAAQY,EAAKE,KAAI,EAAGC,QAASC,KAAkBA,KAJ7Cf,EAAO,wBAImD,EAE9DgB,gBAAgB,EAChBC,KAAM,GACNC,MAAO3B,EACP4B,2BAA4B,MAQnBhB,IAAWN,GACpBU,cAAcH,EACf,GACA,KAIHgB,YAAW,KACLjB,IAAWP,IACbO,EAASN,EACTG,EAAOG,GACR,GACA,IAAM,GACT,EAEJkB,WAAYA,CAACC,GAAKjC,WAAUkC,WAC1BtB,WAAWC,QAAQsB,MAAM,iBAAkB,CACzCC,OAAQ,QACRX,QAASS,EAAK/B,QAAQkC,KACtBC,kBAAmBtC,GACnB,GAGP,EC5EHuC,GAAmB,KACjB/C,GAAoC"}