import { LocalEvent } from "../commons/types/local-event"; import { Runner } from "../commons/types/runner"; import { CookieUtils } from "../commons/utils/cookie-utils"; import { EventEmitter } from "../commons/utils/event-emitter"; import { BatchEventBuilder } from "../event/core/batch-event-builder"; import { Event, EventType } from "../event/core/event"; /** * GA Runner to send GA events when some biggy events occur. * * @export * @class GARunner * @extends {Runner} */ export class GARunner extends Runner { /** * Run all event processing code. * * @protected * @memberof GARunner */ protected run(): Promise { EventEmitter.on(LocalEvent.EventPush, (event) => this.processEventPush(event)); EventEmitter.on(LocalEvent.EventBatch, (batch) => this.processEventBatch(batch)); return; } /** * Process a batch of events. * * @private * @param {BatchEventBuilder} batch Batch of events. * @memberof GARunner */ private processEventBatch(batch: BatchEventBuilder) { batch.events.forEach((event) => this.processEventPush(event)); } /** * Process a single event. * * @private * @param {Event} event Event to be processed. * @memberof GARunner */ private processEventPush(event: Event) { let conversion: ConversionCookie = { front: false, search: false }; const cookie = CookieUtils.get(window._RecSys.Bundle.Properties.cookies.ga.key); if (cookie !== undefined && cookie.length > 0) { conversion = JSON.parse(atob(cookie)); } if (event.type === EventType.FrontClick) { conversion.front = true; } else if (event.type === EventType.SearchClick) { conversion.search = true; } else if (event.type === EventType.PageConfirmation) { if (conversion.search) { window.dataLayer.push({ event: "biggy.search.conversion", } as ConversionEvent); } if (conversion.front) { window.dataLayer.push({ event: "biggy.front.conversion", } as ConversionEvent); } } CookieUtils.set(window._RecSys.Bundle.Properties.cookies.ga.key, btoa(JSON.stringify(conversion)), { ttl: window._RecSys.Bundle.Properties.cookies.ga.ttl, }); } } /** * DataLayer event for client-side conversion. * * @interface ConversionEvent */ interface ConversionEvent { event: "biggy.front.conversion" | "biggy.search.conversion"; } /** * Tracking cookie for client-side conversion. * * @interface ConversionCookie */ interface ConversionCookie { front: boolean; search: boolean; }