{"version":3,"file":"cart-analytics-6e6bf3b5.js","sources":["../../../client/src/javascripts/customer_pages/_cart/cart-omni-analytics.js","../../../client/src/javascripts/customer_pages/_cart/cart-google-tag-manager.js"],"sourcesContent":["import { builderDispatch } from '../_utils/ui';\nimport CartItemsChangeEvents from './cart-items-change-events';\n\nclass Analytics {\n  // Analytics style options\n\n  constructor(items) {\n    this.items = items;\n    this.items.prints = $.extend({\n      quantity: 0,\n      sizes: [],\n      delivery_options: [],\n    }, this.items.prints);\n  }\n\n  invoke() {\n    if (typeof s_omni !== 'object') return;\n\n    s_omni.channel = window.location.hostname;\n    s_omni.prop1 = 'Cart';\n    s_omni.events = this._events();\n    s_omni.products = this._products();\n\n    if (this._isEmpty()) {\n      s_omni.pageName = 'Shopping Cart Empty';\n      s_omni.prop2 = 'Shopping Cart Empty';\n      s_omni.prop21 = '';\n    } else {\n      // Get the delivery options and quantity\n      s_omni.pageName = 'Shopping Cart Cart';\n      s_omni.prop2 = 'Shopping Cart Cart';\n      s_omni.prop8 = 'Walmart Photo: LiveLink';\n      s_omni.prop21 = `InCart:${this._fulfilmentMethods()}`; // Fulfilment Methods List\n      s_omni.eVar33 = `${this._quantity()}`;\n    }\n\n    s_omni.t();\n  };\n\n  _quantity() {\n    if (this.__quantity) {\n      return this.__quantity;\n    }\n\n    this.__quantity = this._allItems().reduce((total, item) => total + item.quantity, 0);\n\n    return this.__quantity;\n  };\n\n  _isEmpty() {\n    return this._quantity() === 0;\n  };\n\n  _fulfilmentMethods() {\n    const fulfilmentMethods = {};\n    // Collect the delivery options\n    this._allItems().forEach((item) => {\n      const fulfilmentMethod = this.#translateDeliveryOption(item.delivery_options[0]);\n      if (fulfilmentMethod) {\n        fulfilmentMethods[fulfilmentMethod] = true;\n      }\n    });\n\n    return Object.keys(fulfilmentMethods).join(',');\n  };\n\n  _allItems() {\n    return [].concat(this._printsItems(), this._prismItems());\n  };\n\n  _products() {\n    return [].concat(this._printProducts(), this._prismProducts()).map((item) => item.join(';')).join(',');\n  };\n\n  _printProducts() {\n    return this._printsProductItems().map((item) => [\n      'walmartphotocenter:',\n      (item.partner_id || item.sku),\n      item.quantity,\n      (item.total_price / 100),\n      '',\n      'evar30=Walmart.com',\n    ]);\n  };\n\n  _prismProducts() {\n    return this._prismProductItems().map((item) => [\n      'walmartphotocenter:',\n      (item.partner_id || item.sku),\n      item.quantity,\n      (item.cost / 100),\n      '',\n      'evar30=Walmart.com',\n    ]);\n  };\n\n  #translateDeliveryOption(option) {\n    option = option || {};\n    switch (option.type) {\n      case 'PICKUP':\n        if (parseInt(option.time_hours) === 1) {\n          return '1-HOUR';\n        }\n        if (option.time_hours <= 24) {\n          return 'PUT';\n        }\n        if (option.time_hours <= 24 * 5) {\n          return 'S2S';\n        }\n        break;\n      case 'POST':\n        if (option.time_hours <= 24 * 5) {\n          return 'S2H';\n        }\n        break;\n    }\n  }\n}\n\nclass AnalyticsLoaded extends Analytics {\n  _events() {\n    return 'scView';\n  };\n\n  _printsItems() {\n    return this.items.prints;\n  };\n\n  _prismItems() {\n    return this.items.prism;\n  };\n\n  _printsProductItems() {\n    return this.items.prints.sizes;\n  };\n\n  _prismProductItems() {\n    return this.items.prism;\n  };\n}\n\nclass AnalyticsRemovedPrints extends Analytics {\n  constructor(items, size) {\n    super(items);\n\n    this.size = size;\n  }\n\n  _events() {\n    return 'scRemove';\n  };\n\n  // prints items \"are no longer in the cart\"\n  _printsItems() {\n    return $.extend({\n      quantity: 0,\n      sizes: [],\n      delivery_options: [],\n    }, this.items.prints);\n  };\n\n  // but prism items are\n  _prismItems() {\n    return this.items.prism;\n  };\n\n  // need to pass the not-yet-deleted prints summary to omniture\n  _printsProductItems() {\n    if (this.size) {\n      return [this.size];\n    }\n    return this.items.prints.sizes;\n  };\n\n  // omniture doesn't want to know\n  _prismProductItems() {\n    return [];\n  };\n}\n\nclass AnalyticsUnremovedPrints extends AnalyticsRemovedPrints {\n  _events() {\n    return 'scAdd';\n  };\n}\n\nclass AnalyticsRemovedPrism extends Analytics {\n  // `prism_id` is passed in but not used, and seems empty the `products` event variable\n  // this differs to the behaviour of the prints equivalent\n  constructor(items, _prism_id) {\n    super(items);\n  }\n\n  _events() {\n    return 'scRemove';\n  };\n\n  // prints are still here\n  _printsItems() {\n    return this.items.prints;\n  };\n\n  // we're removing just this particular item\n  _prismItems() {\n    // this array with the item in question removed\n    return this.items.prism.filter(function (item) {\n      return item.id != this.prism_id;\n    }, this);\n  };\n\n  // omniture doesn't want to know\n  _printsProductItems() {\n    return [];\n  };\n\n  // omniture is only interested in the removed item\n  _prismProductItems() {\n    return this.items.prism.filter(function (item) {\n      return item.id == this.prism_id;\n    }, this);\n  };\n}\n\nclass AnalyticsUnremovedPrism extends AnalyticsRemovedPrism {\n  _events() {\n    return 'scAdd';\n  };\n}\n\nclass AnalyticsChangedQuantity extends Analytics {\n  constructor(items, prism_id, quantity) {\n    super(items);\n\n    this.quantity = parseInt(quantity, 10);\n\n    this.item = items.prism.find((item) => item.id == prism_id);\n  }\n\n  _events() {\n    return this.quantity < this.item.quantity ? 'scRemove' : 'scAdd';\n  };\n\n  _printsItems() {\n    return this.items.prints;\n  };\n\n  _prismItems() {\n    return this.items.prism;\n  };\n\n  // omniture doesn't want to know\n  _printsProductItems() {\n    return [];\n  };\n\n  // omniture is only interested in the adjusted item\n  _prismProductItems() {\n    const delta = Math.abs(this.quantity - this.item.quantity);\n\n    const item = $.extend({}, this.item, {\n      quantity: delta,\n      cost: (this.item.cost / this.item.quantity) * delta,\n    });\n\n    return [item];\n  };\n}\n\nbuilderDispatch.register((payload) => {\n  let analytics;\n\n  switch (payload.type) {\n    case CartItemsChangeEvents.LOADED:\n      analytics = new AnalyticsLoaded(payload.items);\n      break;\n    case CartItemsChangeEvents.REMOVED_PRINTS:\n      analytics = new AnalyticsRemovedPrints(payload.items, payload.print_size);\n      break;\n    case CartItemsChangeEvents.UNREMOVED_PRINTS:\n      analytics = new AnalyticsUnremovedPrints(payload.items, payload.print_size);\n      break;\n    case CartItemsChangeEvents.REMOVED_PRISM:\n      analytics = new AnalyticsRemovedPrism(payload.items, payload.prism_id);\n      break;\n    case CartItemsChangeEvents.UNREMOVED_PRISM:\n      analytics = new AnalyticsUnremovedPrism(payload.items, payload.prism_id);\n      break;\n    case CartItemsChangeEvents.QUANTITY_CHANGED:\n      analytics = new AnalyticsChangedQuantity(payload.items, payload.prism_id, payload.quantity);\n      break;\n  }\n\n  try {\n    analytics && analytics.invoke();\n  } catch (e) {\n    window.console && window.console.warn && window.console.warn(e);\n  }\n});\n","import Currency from '../_utils/tools/currency';\nimport { builderDispatch } from '../_utils/ui';\nimport CartItemsChangeEvents, {\n  CartItemsAnalyticsEvents,\n} from './cart-items-change-events';\nimport OrderCalculator from '../_utils/_order-data/order-calculator';\n\nif (typeof dataLayer === 'object') {\n  dataLayer.push({\n    cartId: App.order.order_id.replace(/^[A-Z]+/, ''),\n  });\n}\n\nbuilderDispatch.register(payload => {\n  if (typeof dataLayer !== 'object') {\n    return;\n  }\n\n  switch (payload.type) {\n    case CartItemsChangeEvents.UPDATED:\n      handleContentsChange(payload.items);\n      break;\n    case CartItemsChangeEvents.ZIP_CODE_CHANGED:\n      handleZipCodeChanged(payload.value);\n      break;\n  }\n});\n\n// Product Item keys being pushed to the window dataLayer need to align with keys in\n// https://github.com/livelink/web-kiosk/blob/main/app/google_tag_manager_data_layer/basket_page_google_tag_manager_data_layer.rb\n// These are used within GTM for analytics etc\n\nfunction handleContentsChange({ prints = {}, prism = [] }) {\n  const items = [];\n  let cartValue = 0;\n  let printsDeliveryOption;\n  (prints.delivery_options || []).forEach(option => {\n    if (option.key == prints.delivery) {\n      printsDeliveryOption = option.partner_id;\n    }\n  });\n\n  OrderCalculator.alivePrintSizes(prints).forEach(size => {\n    cartValue += size.total_price;\n\n    items.push({\n      catalog_item_id: size.partner_id,\n      id: size.sku,\n      category: 'Print',\n      product_title: size.title,\n      quantity: size.quantity,\n      price: Currency.format(size.price),\n      total_price: Currency.format(size.total_price),\n      delivery_option: printsDeliveryOption,\n    });\n  });\n\n  OrderCalculator.alivePrismItems(prism).forEach(item => {\n    cartValue += item.cost;\n    let deliveryOption;\n    item.delivery_options.forEach(option => {\n      if (option.key == item.delivery) {\n        deliveryOption = option.partner_id;\n      }\n    });\n\n    items.push({\n      catalog_item_id: item.partner_id,\n      id: item.sku,\n      category: item?.product_category?.title,\n      product_title: item.product_title,\n      quantity: item.quantity,\n      price: Currency.format(item.price),\n      total_price: Currency.format(item.cost),\n      delivery_option: deliveryOption,\n    });\n  });\n\n  dataLayer.push({\n    event: CartItemsAnalyticsEvents.UPDATED,\n    cart_value: Currency.format(cartValue),\n    items,\n  });\n}\n\nfunction handleZipCodeChanged(value) {\n  dataLayer.push({\n    event: CartItemsAnalyticsEvents.UPDATED,\n    zip_code: value,\n  });\n}\n"],"names":["Analytics","items","__privateAdd","_translateDeliveryOption","total","item","fulfilmentMethods","fulfilmentMethod","__privateMethod","translateDeliveryOption_fn","option","AnalyticsLoaded","AnalyticsRemovedPrints","size","AnalyticsUnremovedPrints","AnalyticsRemovedPrism","_prism_id","AnalyticsUnremovedPrism","AnalyticsChangedQuantity","prism_id","quantity","delta","builderDispatch","payload","analytics","CartItemsChangeEvents","e","handleContentsChange","handleZipCodeChanged","prints","prism","cartValue","printsDeliveryOption","OrderCalculator","Currency","deliveryOption","_a","CartItemsAnalyticsEvents","value"],"mappings":"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"}