{"version":3,"file":"static/js/0cb33b52305580e1a0af.bundle.js","mappings":"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","sources":["webpack://bju-press/./src/modules/analytics-ga4/analytics-ga4.tsx?e0e5","webpack://bju-press/./src/utilities/analytics/analytics-dispatcher.ts?75be","webpack://bju-press/./lib/analytics-ga4/module-registration.js?3107","webpack://bju-press/external var \"React\"?0d3b","webpack://bju-press/external var \"ReactDOM\"?853b"],"sourcesContent":["//==============================================================================\r\n//==============================================================================\r\nimport * as React from 'react';\r\n\r\nimport { subscribe } from '../../utilities/analytics/analytics-dispatcher';\r\nimport {\r\n AddToCartEvent,\r\n AddToWishlistEvent,\r\n CartViewEvent,\r\n CheckoutPaymentEvent,\r\n CheckoutShippingEvent,\r\n CheckoutStartEvent,\r\n ImpressionEvent,\r\n PageViewEvent,\r\n PDPVisitEvent,\r\n RemoveFromCartEvent,\r\n SelectItemEvent,\r\n SingleProductEvent,\r\n TransactionEvent\r\n} from '../../utilities/analytics/analytics-events';\r\n\r\nimport * as GA4 from './ga4-typings';\r\n\r\nimport { IAnalyticsGa4Data } from './analytics-ga4.data';\r\nimport { IAnalyticsGa4Props } from './analytics-ga4.props.autogenerated';\r\n\r\n//==============================================================================\r\n// INTERFACES\r\n//==============================================================================\r\ndeclare const dataLayer: any[] | undefined;\r\n\r\n//==============================================================================\r\n// CLASS DEFINITION\r\n//==============================================================================\r\n/**\r\n * AnalyticsGa4 component\r\n * @extends {React.PureComponent>}\r\n */\r\nclass AnalyticsGa4 extends React.PureComponent> {\r\n\r\n private SUBSCRIBER_NAME = 'GOOGLE_ANALYTICS_4';\r\n\r\n //----------------------------------------------------------\r\n // Subscribe to events\r\n // NOTE: Currently, events can only be emitted from the\r\n // client. If we run this in the constructor, it occurs\r\n // during SSR and is cached across page views. Singletons\r\n // that maintain state are kept in memory on the server,\r\n // making them dangerous.\r\n // In the future the analytics system will queue\r\n // up events emitted during SSR. When that happens, the\r\n // system will need to switch to data actions to prevent\r\n // subscriptions from persisting globally on the server.\r\n //----------------------------------------------------------\r\n public componentDidMount() {\r\n this.addToCart = this.addToCart.bind(this);\r\n this.removeFromCart = this.removeFromCart.bind(this);\r\n this.cartView = this.cartView.bind(this);\r\n this.purchase = this.purchase.bind(this);\r\n this.addToWishlist = this.addToWishlist.bind(this);\r\n this.productDetailView = this.productDetailView.bind(this);\r\n this.impression = this.impression.bind(this);\r\n this.checkoutStart = this.checkoutStart.bind(this);\r\n this.checkoutShipping = this.checkoutShipping.bind(this);\r\n this.checkoutPayment = this.checkoutPayment.bind(this);\r\n this.pageView = this.pageView.bind(this);\r\n this.selectItem = this.selectItem.bind(this);\r\n\r\n subscribe(this.SUBSCRIBER_NAME, 'addToCart', this.addToCart);\r\n subscribe(this.SUBSCRIBER_NAME, 'removeFromCart', this.removeFromCart);\r\n subscribe(this.SUBSCRIBER_NAME, 'cartView', this.cartView);\r\n subscribe(this.SUBSCRIBER_NAME, 'purchase', this.purchase);\r\n subscribe(this.SUBSCRIBER_NAME, 'addToWishlist', this.addToWishlist);\r\n subscribe(this.SUBSCRIBER_NAME, 'productDetailView', this.productDetailView);\r\n subscribe(this.SUBSCRIBER_NAME, 'impression', this.impression);\r\n subscribe(this.SUBSCRIBER_NAME, 'checkoutStart', this.checkoutStart);\r\n subscribe(this.SUBSCRIBER_NAME, 'checkoutShipping', this.checkoutShipping);\r\n subscribe(this.SUBSCRIBER_NAME, 'checkoutPayment', this.checkoutPayment);\r\n subscribe(this.SUBSCRIBER_NAME, 'pageView', this.pageView);\r\n subscribe(this.SUBSCRIBER_NAME, 'selectItemEvent', this.selectItem);\r\n\r\n // emit page view event automatically\r\n const customer = this.props.data.customerInformation.result;\r\n const email = customer?.Email;\r\n const pageViewData: PageViewEvent = {\r\n page_type: this.props.config.pageType || '',\r\n user_login: email ? 'Logged' : 'Unlogged',\r\n user_id: customer?.AccountNumber || ''\r\n };\r\n this.pageView(pageViewData);\r\n }\r\n\r\n //----------------------------------------------------------\r\n // No visuals are involved\r\n //----------------------------------------------------------\r\n public render(): null {\r\n return null;\r\n }\r\n\r\n //==============================================================================\r\n // Helpers\r\n //==============================================================================\r\n\r\n //----------------------------------------------------------\r\n // Convert generic event data to a GA4_Item record\r\n //----------------------------------------------------------\r\n private formatProduct(product: SingleProductEvent): GA4.GA4_Item {\r\n\r\n return {\r\n item_id: product.itemID,\r\n item_name: product.name,\r\n affiliation: product.affiliation,\r\n discount: product.discount,\r\n item_variant: product.variant,\r\n price: product.price,\r\n currency: product.currency,\r\n quantity: product.quantity\r\n };\r\n }\r\n\r\n //----------------------------------------------------------\r\n //----------------------------------------------------------\r\n private emit(event: unknown) {\r\n if (typeof dataLayer !== 'undefined') {\r\n dataLayer.push(event);\r\n }\r\n }\r\n\r\n //==============================================================================\r\n // EVENT HANDLERS\r\n //==============================================================================\r\n\r\n //----------------------------------------------------------\r\n // Add to Cart\r\n //----------------------------------------------------------\r\n private addToCart(data: AddToCartEvent): void {\r\n\r\n // Create an event rather than directly pushing to the data layer to enforce typing\r\n const event: GA4.AddToCartEvent = {\r\n event: 'add_to_cart',\r\n ecommerce: {\r\n currency: data.currency,\r\n value: (data.price - (data.discount || 0)) * data.quantity,\r\n items: [this.formatProduct(data)],\r\n }\r\n };\r\n\r\n this.emit(event);\r\n }\r\n\r\n //----------------------------------------------------------\r\n // Remove from Cart\r\n //----------------------------------------------------------\r\n private removeFromCart(data: RemoveFromCartEvent): void {\r\n\r\n // Create an event rather than directly pushing to the data layer to enforce typing\r\n const event: GA4.RemoveFromCartEvent = {\r\n event: 'remove_from_cart',\r\n ecommerce: {\r\n currency: data.currency,\r\n value: (data.price - (data.discount || 0)) * data.quantity,\r\n items: [this.formatProduct(data)],\r\n }\r\n };\r\n\r\n this.emit(event);\r\n }\r\n\r\n //----------------------------------------------------------\r\n // Cart View\r\n //----------------------------------------------------------\r\n private cartView(data: CartViewEvent): void {\r\n\r\n const event: GA4.ViewCartEvent = {\r\n event: 'view_cart',\r\n ecommerce: {\r\n currency: data.currency,\r\n value: data.subtotal,\r\n items: data.lines.map(entry => this.formatProduct(entry)),\r\n }\r\n };\r\n\r\n this.emit(event);\r\n }\r\n\r\n //----------------------------------------------------------\r\n // Purchase Complete\r\n //----------------------------------------------------------\r\n private purchase(data: TransactionEvent): void {\r\n\r\n // Create an event rather than directly pushing to the data layer to enforce typing\r\n const event: GA4.PurchaseEvent = {\r\n event: 'purchaseGA4',\r\n ecommerce: {\r\n transaction_id: data.id,\r\n currency: data.currency,\r\n value: data.total,\r\n shipping: data.shipping,\r\n tax: data.tax,\r\n coupon: data.coupons?.join('|'),\r\n items: data.lines.map(entry => this.formatProduct(entry)),\r\n }\r\n };\r\n\r\n this.emit(event);\r\n }\r\n\r\n //----------------------------------------------------------\r\n // Add to wishlist\r\n //----------------------------------------------------------\r\n private addToWishlist(data: AddToWishlistEvent): void {\r\n\r\n const event: GA4.AddToWishlistEvent = {\r\n event: 'add_to_wishlist',\r\n ecommerce: {\r\n currency: data.currency,\r\n value: (data.price - (data.discount || 0)) * data.quantity,\r\n items: [this.formatProduct(data)],\r\n }\r\n };\r\n\r\n this.emit(event);\r\n }\r\n\r\n //----------------------------------------------------------\r\n // Product Detail View (PDP visited)\r\n //----------------------------------------------------------\r\n private productDetailView(data: PDPVisitEvent): void {\r\n\r\n const event: GA4.ProductViewEvent = {\r\n event: 'view_item',\r\n ecommerce: {\r\n currency: data.currency,\r\n value: (data.price - (data.discount || 0)) * data.quantity,\r\n items: [this.formatProduct(data)],\r\n }\r\n };\r\n\r\n this.emit(event);\r\n }\r\n\r\n //----------------------------------------------------------\r\n // Item Clicked\r\n //----------------------------------------------------------\r\n private selectItem(data: SelectItemEvent): void {\r\n\r\n const event: GA4.SelectItemEvent = {\r\n event: 'select_item',\r\n ecommerce: {\r\n item_list_name: data.context,\r\n items: [this.formatProduct(data.product)],\r\n }\r\n };\r\n\r\n this.emit(event);\r\n }\r\n\r\n //----------------------------------------------------------\r\n // Product Impressions\r\n // Currently used for PLPs and product collections,\r\n // so we'll use the view_item_list event\r\n //----------------------------------------------------------\r\n private impression(data: ImpressionEvent): void {\r\n\r\n const event: GA4.ProductListViewEvent = {\r\n event: 'view_item_list',\r\n ecommerce: {\r\n item_list_id: data.list,\r\n item_list_name: data.context,\r\n items: data.products.map(entry => this.formatProduct(entry)),\r\n }\r\n };\r\n\r\n this.emit(event);\r\n }\r\n\r\n //----------------------------------------------------------\r\n // Checkout Start\r\n //----------------------------------------------------------\r\n private checkoutStart(data: CheckoutStartEvent): void {\r\n\r\n const event: GA4.CheckoutStartEvent = {\r\n event: 'begin_checkout',\r\n ecommerce: {\r\n coupon: data.coupon,\r\n currency: data.currency,\r\n value: data.subtotal,\r\n items: data.lines.map(entry => this.formatProduct(entry)),\r\n }\r\n };\r\n\r\n this.emit(event);\r\n }\r\n\r\n //----------------------------------------------------------\r\n // Checkout Start\r\n //----------------------------------------------------------\r\n private checkoutShipping(data: CheckoutShippingEvent): void {\r\n\r\n const event: GA4.CheckoutShippingEvent = {\r\n event: 'add_shipping_info',\r\n ecommerce: {\r\n shipping_tier: data.shippingMethod,\r\n currency: data.currency,\r\n value: data.shippingCost,\r\n coupon: data.coupon,\r\n items: data.lines?.map(entry => this.formatProduct(entry)),\r\n }\r\n };\r\n\r\n this.emit(event);\r\n }\r\n\r\n //----------------------------------------------------------\r\n // Checkout Start\r\n //----------------------------------------------------------\r\n private checkoutPayment(data: CheckoutPaymentEvent): void {\r\n\r\n const event: GA4.CheckoutPaymentEvent = {\r\n event: 'add_payment_info',\r\n ecommerce: {\r\n coupon: data.coupon,\r\n payment_type: data.paymentMethod,\r\n currency: data.currency,\r\n value: data.amount,\r\n items: data.lines?.map(entry => this.formatProduct(entry)),\r\n }\r\n };\r\n\r\n this.emit(event);\r\n }\r\n\r\n //----------------------------------------------------------\r\n // Page View\r\n //----------------------------------------------------------\r\n private pageView(data: PageViewEvent): void {\r\n\r\n const event: GA4.PageViewEvent = {\r\n event: 'pageLoad',\r\n user_login: data.user_login,\r\n user_id: data.user_id,\r\n page_type: data.page_type\r\n };\r\n\r\n this.emit(event);\r\n }\r\n\r\n}\r\n\r\nexport default AnalyticsGa4;\r\n","//==============================================================================\r\n// Analytics Event Dispatcher (Simple Pub-Sub system)\r\n//\r\n// This module receives events and forwards them to the appropriate handlers\r\n// Subscriptions are managed using a subscriber ID to aid in unsubscribing\r\n//\r\n// NOTE: Singletons aren't compatible with SSR. This module acts as a singleton,\r\n// maintaining its data as a global. Modules MUST call subscribe on the client\r\n// ONLY (via componentDidMount).\r\n//\r\n// @TODO: Currently, only client-side events will be processed. Events generated\r\n// during server-side renders will be lost. If we move data to a data action\r\n// it can be persisted from server to client. That will allow us to queue up\r\n// events generated on the server or before subscriptions occur, and emit\r\n// them immediately upon subscription.\r\n//==============================================================================\r\nimport { EventHandler } from \"./analytics-events\";\r\n\r\n//==============================================================================\r\n// INTERFACES\r\n//==============================================================================\r\n\r\n// List of subscribers to a single event\r\ninterface EventSubscribers {\r\n [subscriber: string]: EventHandler;\r\n}\r\n\r\n//==============================================================================\r\n// GLOBALS\r\n//==============================================================================\r\n\r\n// List of subscriptions, organized by event name and then subscriber name\r\nconst subscriptions: { [eventName: string]: EventSubscribers } = {};\r\n\r\n//==============================================================================\r\n// FUNCTIONS\r\n//==============================================================================\r\n\r\n//==========================================================\r\n// Called by event emitters when an event occurs\r\n//\r\n// NOTE: This should only be called on the client! Events on\r\n// the server will be lost. They should instead be queued\r\n// via a data action cache.\r\n//==========================================================\r\nexport function publish(eventName: string, eventData: unknown): void {\r\n\r\n // Get the list of subscribers for this event\r\n const subscribers = Object.keys(subscriptions[eventName] || {});\r\n\r\n // Notify each subscriber\r\n subscribers.forEach(subscriber => subscriptions[eventName][subscriber](eventData));\r\n}\r\n\r\n//==========================================================\r\n// Called by event handlers when they self-register for events\r\n//==========================================================\r\nexport function subscribe(subscriber: string, eventName: string, handler: EventHandler): void {\r\n\r\n // If it's a new event, create an entry\r\n subscriptions[eventName] = subscriptions[eventName] || {};\r\n\r\n // Ensure this subscriber isn't already subscribed to this event\r\n if (subscriptions[eventName][subscriber]) {\r\n throw new Error(`Duplicate subscription request for ${subscriber}: ${eventName}`);\r\n }\r\n\r\n // Add the subscription\r\n subscriptions[eventName][subscriber] = handler;\r\n}\r\n\r\n//==========================================================\r\n// Unsubscribe from a single event\r\n//==========================================================\r\nexport function unsubscribe(subscriber: string, eventName: string): void {\r\n if (subscriptions[eventName] && subscriptions[eventName][subscriber]) {\r\n delete subscriptions[eventName][subscriber];\r\n }\r\n}\r\n","const binding = { modules: {}, dataActions: {} };\n\n const registerActionId = (actionPath) => {\n if (binding.dataActions[actionPath] &&\n binding.dataActions[actionPath].default &&\n binding.dataActions[actionPath].default.prototype &&\n binding.dataActions[actionPath].default.prototype.id) {\n binding.dataActions[binding.dataActions[actionPath].default.prototype.id] = binding.dataActions[actionPath];\n } else {\n Object.keys(binding.dataActions[actionPath] || {}).forEach(exportName => {\n if (binding.dataActions[actionPath][exportName] &&\n binding.dataActions[actionPath][exportName].prototype &&\n binding.dataActions[actionPath][exportName].prototype.Action) {\n binding.dataActions[binding.dataActions[actionPath][exportName].prototype.id] = binding.dataActions[actionPath][exportName];\n }\n })\n }\n };\n\n const registerSanitizedActionPath = (sanitizedActionPath, dataAction) => {\n if (process.env.NODE_ENV === 'development') {\n if (!dataAction.default) {\n throw new Error('Data action path does not have a default export');\n }\n if (!(dataAction.default.prototype.id && binding.dataActions[dataAction.default.prototype.id]) || !binding.dataActions[sanitizedActionPath]) {\n binding.dataActions[sanitizedActionPath] = dataAction;\n }\n } else {\n binding.dataActions[sanitizedActionPath] = dataAction;\n if (!binding.dataActions[sanitizedActionPath].default) {\n throw new Error('Data action path ' + sanitizedActionPath + ' does not have a default export');\n }\n binding.dataActions[sanitizedActionPath].default.prototype.RegistrationId = sanitizedActionPath;\n if (binding.dataActions[sanitizedActionPath].default.prototype.id) {\n binding.dataActions[binding.dataActions[sanitizedActionPath].default.prototype.id] = sanitizedActionPath;\n }\n }\n };\n \n\n (binding.modules['analytics-ga4'] = {\n c: () => require('partner/modules/analytics-ga4/analytics-ga4.tsx'),\n $type: 'contentModule',\n da: [{name:'customerInformation', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-customer', runOn: 0}],\n \n iNM: false,\n ns: '__local__',\n n: 'analytics-ga4',\n p: '__local__',\n \n pdp: '',\n \n \n md: 'src/modules/analytics-ga4'\n });\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-customer';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-customer');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n \n window.__bindings__ = window.__bindings__ || {};\n window.__bindings__.modules = {\n ...window.__bindings__.modules || {},\n ...binding.modules\n };\n \n window.__bindings__.dataActions = {\n ...window.__bindings__.dataActions || {},\n ...binding.dataActions\n };","module.exports = React;","module.exports = ReactDOM;"],"names":["AnalyticsGa4","React","constructor","SUBSCRIBER_NAME","componentDidMount","this","addToCart","bind","removeFromCart","cartView","purchase","addToWishlist","productDetailView","impression","checkoutStart","checkoutShipping","checkoutPayment","pageView","selectItem","subscribe","customer","props","data","customerInformation","result","email","Email","pageViewData","page_type","config","pageType","user_login","user_id","AccountNumber","render","formatProduct","product","item_id","itemID","item_name","name","affiliation","discount","item_variant","variant","price","currency","quantity","emit","event","dataLayer","push","ecommerce","value","items","subtotal","lines","map","entry","_data$coupons","transaction_id","id","total","shipping","tax","coupon","coupons","join","item_list_name","context","item_list_id","list","products","_data$lines","shipping_tier","shippingMethod","shippingCost","_data$lines2","payment_type","paymentMethod","amount","subscriptions","publish","eventName","eventData","Object","keys","forEach","subscriber","handler","Error","binding","modules","dataActions","c","require","$type","da","path","runOn","iNM","ns","n","p","pdp","md","registerSanitizedActionPath","sanitizedActionPath","dataAction","default","prototype","RegistrationId","window","__bindings__","_objectSpread","module","exports","ReactDOM"],"sourceRoot":""}