import * as _ from "lodash"; export class AnalyticsService { private dataLayer: AnalyticsEvent[]; constructor($window: DataLayerWindow) { // Depends if the GTM script has run yet if (!$window.dataLayer) $window.dataLayer = []; this.dataLayer = $window.dataLayer; } push(...events: AnalyticsEvent[]) { this.dataLayer.push(...events) } /** Sends undefined values for all the fields that currently exist in the data layer */ clear() { let keys = _.uniq(_.flatMap(this.dataLayer, e => Object.keys(e))).filter(e => e !== 'event' && !e.startsWith('gtm.')); if (keys.length > 0) { let cleanVariables = Object.assign({}, ...keys.map(k => ({ [k]: undefined }))); this.dataLayer.push(cleanVariables); } } } export interface DataLayerWindow extends angular.IWindowService { dataLayer: AnalyticsEvent[]; } export interface AnalyticsEvent { event?: EventName; // Remember that if these properties are not provided, GTM will use the previous value [p: string]: any; } type EventName = 'GetQuickQuote' | 'ViewQuoteForm' | 'ViewSwitchForm' | 'ViewPlan' | 'SubmitAcquisition' | 'ViewConfirmation' | 'ViewPropertyQuestions';