import { PageType } from "../../commons/types/page-type"; import { EventRunner, PageItem, PageInfo } from "../../event/core/event-runner"; import { OrderProduct, PageConfirmationEvent } from "../../event/types/page/confirmation"; import { CartEvent } from "../types/base/cart-event"; import { PageCartEvent } from "../types/page/cart"; import { SessionCartAddEvent } from "../types/session/cart-add"; import { SessionCartRemoveEvent } from "../types/session/cart-remove"; /** * Specific runner used by eFacil. * * @class EFacilRunner * @implements {Runner} */ export class EFacilRunner extends EventRunner { /** * Process DataLayer item. * * @protected * @param {*} item Current item. * @memberof EFacilRunner */ protected processItem(item: PageItem): void { const info = this.getPageInfo(item); if (info) { if (info.pageType === PageType.Confirmation) { this.sendOrderEvent(info.item); } else if (info.pageType === PageType.Cart) { this.sendCartEvent(info.item); } } } /** * Get current page info based on DataLayer. * * @private * @param {PageItem} item Current item. * @return {PageInfo} Current page info. * @memberof EFacilRunner */ private getPageInfo(item: PageItem): PageInfo { if (item) { if (item.pageType && item.pageType.toUpperCase() === "CONCLUSAO_PEDIDO") { return { item, pageType: PageType.Confirmation, }; } } return undefined; } /** * Send order event, based on a order item. * * @private * @param {*} orderItem Order item from the DataLayer. * @memberof EFacilRunner */ private sendOrderEvent(orderItem: PageItem): void { const orderId = orderItem.transactionId; const products: OrderProduct[] = []; if (orderItem.transactionProducts) { for (const transactionProduct of orderItem.transactionProducts) { // Remove thousands comma separator. const price = Number(String(transactionProduct.price).replace(",", "")); products.push({ product: transactionProduct.id, quantity: transactionProduct.quantity, price, }); } } const event = new PageConfirmationEvent(orderId).withProducts(products); event.push(); } /** * Send cart event, based on a cart item. * * @private * @param {*} cartItem Cart item from the DataLayer. * @memberof EFacilRunner */ private sendCartEvent(cartItem: PageItem): void { // Create a generic cart event. const event = this.createCartEvent(cartItem.event); // Get layer products from specific event key. const layerProducts = cartItem.ecommerce[this.getCartProductsKeyFromEvent(cartItem.event)].products; if (layerProducts && layerProducts instanceof Array && layerProducts.length > 0) { for (const product of layerProducts) { event.withProduct(product.id, product.quantity); } } event.push(); } /** * Get layer products from specific event key. * * eFacil didnt implement cart events yet. * * @private * @param {string} event Current event name. * @return {string} Event related key. * @memberof EFacilRunner */ private getCartProductsKeyFromEvent(event: string): string { const keyFromEvent: { [event: string]: string } = { ADDTOCART: "add", REMOVEFROMCART: "remove", }; return keyFromEvent[event.toUpperCase()]; } /** * Create a generic cart event. * * @private * @param {string} event Current event name. * @return {CartEvent} Relevant cart event. * @memberof EFacilRunner */ private createCartEvent(event: string): CartEvent { switch (event.toUpperCase()) { case "ADDTOCART": return new SessionCartAddEvent(); case "REMOVEFROMCART": return new SessionCartRemoveEvent(); default: return new PageCartEvent(); } } }