UNPKG

5.75 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3var tslib_1 = require("tslib");
4var page_type_1 = require("../../commons/types/page-type");
5var event_runner_1 = require("../../event/core/event-runner");
6var confirmation_1 = require("../../event/types/page/confirmation");
7var cart_1 = require("../types/page/cart");
8var cart_add_1 = require("../types/session/cart-add");
9var cart_remove_1 = require("../types/session/cart-remove");
10/**
11 * Specific runner used by VTEX stores.
12 *
13 * @class VTEXRunner
14 * @implements {Runner}
15 */
16var VTEXRunner = /** @class */ (function (_super) {
17 tslib_1.__extends(VTEXRunner, _super);
18 function VTEXRunner() {
19 return _super !== null && _super.apply(this, arguments) || this;
20 }
21 /**
22 * Process DataLayer item.
23 *
24 * @protected
25 * @param {*} item Current item.
26 * @memberof VTEXRunner
27 */
28 VTEXRunner.prototype.processItem = function (item) {
29 var info = this.getPageInfo(item);
30 if (info) {
31 if (info.pageType === page_type_1.PageType.Confirmation) {
32 this.sendOrderEvent(info.item);
33 }
34 else if (info.pageType === page_type_1.PageType.Cart) {
35 this.sendCartEvent(info.item);
36 }
37 }
38 };
39 /**
40 * Get current page info based on DataLayer.
41 *
42 * @protected
43 * @param {PageItem} item Current item.
44 * @return {PageInfo} Current page info.
45 * @memberof VTEXRunner
46 */
47 VTEXRunner.prototype.getPageInfo = function (item) {
48 if (item && item.event) {
49 if (item.event.toUpperCase() === "ORDERPLACED") {
50 return {
51 item: item,
52 pageType: page_type_1.PageType.Confirmation,
53 };
54 }
55 else if (item.event.toUpperCase() === "ADDTOCART" ||
56 item.event.toUpperCase() === "REMOVEFROMCART" ||
57 item.event.toUpperCase() === "CART") {
58 return {
59 item: item,
60 pageType: page_type_1.PageType.Cart,
61 };
62 }
63 }
64 return undefined;
65 };
66 /**
67 * Send order event, based on a order item.
68 *
69 * @protected
70 * @param {*} orderItem Order item from the DataLayer.
71 * @memberof VTEXRunner
72 */
73 VTEXRunner.prototype.sendOrderEvent = function (orderItem) {
74 var orderId = orderItem.transactionId;
75 var products = [];
76 if (orderItem.transactionProducts) {
77 for (var _i = 0, _a = orderItem.transactionProducts; _i < _a.length; _i++) {
78 var transactionProduct = _a[_i];
79 products.push({
80 product: transactionProduct.id,
81 quantity: transactionProduct.quantity,
82 price: transactionProduct.price,
83 });
84 }
85 }
86 var event = new confirmation_1.PageConfirmationEvent(orderId).withProducts(products);
87 event.push();
88 };
89 /**
90 * Send cart event, based on a cart item.
91 *
92 * @protected
93 * @param {*} cartItem Cart item from the DataLayer.
94 * @memberof VTEXRunner
95 */
96 VTEXRunner.prototype.sendCartEvent = function (cartItem) {
97 // Create a generic cart event.
98 var event = this.createCartEvent(cartItem.event);
99 // Get layer products from specific event key.
100 var layerProducts = cartItem.ecommerce[this.getCartProductsKeyFromEvent(cartItem.event)].products;
101 if (layerProducts && layerProducts instanceof Array && layerProducts.length > 0) {
102 for (var _i = 0, layerProducts_1 = layerProducts; _i < layerProducts_1.length; _i++) {
103 var product = layerProducts_1[_i];
104 event.withProduct(product.id, product.quantity);
105 }
106 }
107 event.push();
108 };
109 /**
110 * Get layer products from specific event key.
111 *
112 * VTEX has 3 specific keys when working with cart items on
113 * the dataLayer.
114 *
115 * When products are added, they send the `ADDTOCART` event,
116 * when they are removed `REMOVEFROMCART` and when they are
117 * sending the full basket, they use the `CART` event.
118 *
119 * Whenever this events are sent, they come with an `ecommerce`
120 * object, inside it, there is a key with the products array,
121 * the key name follows the following rule:
122 *
123 * - When event is `ADDTOCART`, the key is `add`.
124 * - When event is `REMOVEFROMCART`, the key is `remove`.
125 * - When event is `CART`, the key is `checkout`.
126 *
127 * @protected
128 * @param {string} event Current event name.
129 * @return {string} Event related key.
130 * @memberof VTEXRunner
131 */
132 VTEXRunner.prototype.getCartProductsKeyFromEvent = function (event) {
133 var keyFromEvent = {
134 ADDTOCART: "add",
135 REMOVEFROMCART: "remove",
136 CART: "checkout",
137 };
138 return keyFromEvent[event.toUpperCase()];
139 };
140 /**
141 * Create a generic cart event.
142 *
143 * @protected
144 * @param {string} event Current event name.
145 * @return {CartEvent} Relevant cart event.
146 * @memberof VTEXRunner
147 */
148 VTEXRunner.prototype.createCartEvent = function (event) {
149 switch (event.toUpperCase()) {
150 case "ADDTOCART":
151 return new cart_add_1.SessionCartAddEvent();
152 case "REMOVEFROMCART":
153 return new cart_remove_1.SessionCartRemoveEvent();
154 default:
155 return new cart_1.PageCartEvent();
156 }
157 };
158 return VTEXRunner;
159}(event_runner_1.EventRunner));
160exports.VTEXRunner = VTEXRunner;
161//# sourceMappingURL=vtex-runner.js.map
\No newline at end of file