UNPKG

@ngx-ext/google-analytics

Version:

Google Analytics for your Angular application

67 lines 9.65 kB
import { EventEmitter, Inject, Injectable, Optional } from '@angular/core'; import { interval, ReplaySubject, throwError, timer } from 'rxjs'; import { filter, first, switchMap, takeUntil, tap } from 'rxjs/operators'; import { GA_OPTIONS, GA_TOKEN } from './ga.token'; export class GoogleAnalyticsService { constructor(trackingId, options) { this.event = new EventEmitter(); this.pageView = new EventEmitter(); this.queue = new ReplaySubject(); if (trackingId) { this.configure(trackingId, options); } } configure(trackingId, options = 'auto') { this.ga('create', trackingId, options); this.ga('send', 'pageview'); this.event.subscribe((x) => { this.onEvent(x); }); this.pageView.subscribe((x) => { this.onPageView(x); }); const timer$ = timer(20000) .pipe(switchMap(() => throwError(new Error('Could not load GA')))); interval(50) .pipe(takeUntil(timer$), filter(() => Boolean(window.ga)), first(), switchMap(() => this.queue), tap(args => { window.ga(...args); // tslint:disable-line:no-unsafe-any })) .subscribe(); } set(key, value) { if (typeof key !== 'string' && typeof key !== 'object') { throw new TypeError(`Expected \`fieldName\` to be of type \`string\` or \`object\`, got \`${typeof key}\``); } if (typeof key === 'string' && value === undefined) { throw new TypeError('Expected `fieldValue` to not be `undefined`'); } if (typeof key === 'object') { this.ga('set', key); } else { this.ga('set', key, value); } } onEvent(event) { this.ga('send', 'event', event.category, event.action, event.label, event.value); } onPageView(pageview) { const fieldsObject = {}; if (pageview.title) { fieldsObject.title = pageview.title; } this.ga('send', 'pageview', pageview.page, fieldsObject); } ga(...args) { this.queue.next(args); } } GoogleAnalyticsService.decorators = [ { type: Injectable } ]; /** @nocollapse */ GoogleAnalyticsService.ctorParameters = () => [ { type: String, decorators: [{ type: Optional }, { type: Inject, args: [GA_TOKEN,] }] }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [GA_OPTIONS,] }] } ]; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2Euc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2dvb2dsZS1hbmFseXRpY3Mvc3JjL2xpYi9nYS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0UsT0FBTyxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBTWxELE1BQU0sT0FBTyxzQkFBc0I7SUFLakMsWUFDZ0MsVUFBa0IsRUFDaEIsT0FBaUM7UUFONUQsVUFBSyxHQUF3QixJQUFJLFlBQVksRUFBUyxDQUFDO1FBQ3ZELGFBQVEsR0FBMkIsSUFBSSxZQUFZLEVBQVksQ0FBQztRQUN0RCxVQUFLLEdBQTZCLElBQUksYUFBYSxFQUFFLENBQUM7UUFNckUsSUFBSSxVQUFVLEVBQUU7WUFDZCxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztTQUNyQztJQUNILENBQUM7SUFFTSxTQUFTLENBQUMsVUFBa0IsRUFBRSxVQUFvQyxNQUFNO1FBQzdFLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN2QyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUU1QixJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQVEsRUFBRSxFQUFFO1lBQ2hDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEIsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQVcsRUFBRSxFQUFFO1lBQ3RDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckIsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsS0FBTSxDQUFDO2FBQ3pCLElBQUksQ0FDSCxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksS0FBSyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUM1RCxDQUFDO1FBRUosUUFBUSxDQUFDLEVBQUUsQ0FBQzthQUNULElBQUksQ0FDSCxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQ2pCLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUUsTUFBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ3pDLEtBQUssRUFBRSxFQUNQLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQzNCLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNSLE1BQWMsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLG9DQUFvQztRQUNuRSxDQUFDLENBQUMsQ0FDSDthQUNBLFNBQVMsRUFBRSxDQUFDO0lBQ2pCLENBQUM7SUFJTSxHQUFHLENBQUMsR0FBUSxFQUFFLEtBQVc7UUFDOUIsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxFQUFFO1lBQ3RELE1BQU0sSUFBSSxTQUFTLENBQUMsd0VBQXdFLE9BQU8sR0FBRyxJQUFJLENBQUMsQ0FBQztTQUM3RztRQUVELElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7WUFDbEQsTUFBTSxJQUFJLFNBQVMsQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO1NBQ3BFO1FBRUQsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUU7WUFDM0IsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7U0FDckI7YUFBTTtZQUNMLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztTQUM1QjtJQUNILENBQUM7SUFFTyxPQUFPLENBQUMsS0FBWTtRQUMxQixJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25GLENBQUM7SUFFTyxVQUFVLENBQUMsUUFBa0I7UUFDbkMsTUFBTSxZQUFZLEdBQXVCLEVBQUUsQ0FBQztRQUU1QyxJQUFJLFFBQVEsQ0FBQyxLQUFLLEVBQUU7WUFDbEIsWUFBWSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDO1NBQ3JDO1FBRUQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVPLEVBQUUsQ0FBQyxHQUFHLElBQWU7UUFDM0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEIsQ0FBQzs7O1lBL0VGLFVBQVU7Ozs7eUNBT04sUUFBUSxZQUFJLE1BQU0sU0FBQyxRQUFROzRDQUMzQixRQUFRLFlBQUksTUFBTSxTQUFDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFdmVudEVtaXR0ZXIsIEluamVjdCwgSW5qZWN0YWJsZSwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGludGVydmFsLCBSZXBsYXlTdWJqZWN0LCB0aHJvd0Vycm9yLCB0aW1lciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyLCBmaXJzdCwgc3dpdGNoTWFwLCB0YWtlVW50aWwsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEdBX09QVElPTlMsIEdBX1RPS0VOIH0gZnJvbSAnLi9nYS50b2tlbic7XG5pbXBvcnQgeyBFdmVudCB9IGZyb20gJy4vaW50ZXJmYWNlcy9ldmVudCc7XG5pbXBvcnQgeyBQYWdlVmlldyB9IGZyb20gJy4vaW50ZXJmYWNlcy9wYWdlLXZpZXcnO1xuaW1wb3J0IHsgVHJhY2tpbmdPcHRpb25zIH0gZnJvbSAnLi9pbnRlcmZhY2VzL3RyYWNraW5nLW9wdGlvbnMnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgR29vZ2xlQW5hbHl0aWNzU2VydmljZSB7XG4gIHB1YmxpYyBldmVudDogRXZlbnRFbWl0dGVyPEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8RXZlbnQ+KCk7XG4gIHB1YmxpYyBwYWdlVmlldzogRXZlbnRFbWl0dGVyPFBhZ2VWaWV3PiA9IG5ldyBFdmVudEVtaXR0ZXI8UGFnZVZpZXc+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcXVldWU6IFJlcGxheVN1YmplY3Q8dW5rbm93bltdPiA9IG5ldyBSZXBsYXlTdWJqZWN0KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChHQV9UT0tFTikgdHJhY2tpbmdJZDogc3RyaW5nLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoR0FfT1BUSU9OUykgb3B0aW9uczogVHJhY2tpbmdPcHRpb25zIHwgc3RyaW5nLFxuICApIHtcbiAgICBpZiAodHJhY2tpbmdJZCkge1xuICAgICAgdGhpcy5jb25maWd1cmUodHJhY2tpbmdJZCwgb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNvbmZpZ3VyZSh0cmFja2luZ0lkOiBzdHJpbmcsIG9wdGlvbnM6IFRyYWNraW5nT3B0aW9ucyB8IHN0cmluZyA9ICdhdXRvJyk6IHZvaWQge1xuICAgIHRoaXMuZ2EoJ2NyZWF0ZScsIHRyYWNraW5nSWQsIG9wdGlvbnMpO1xuICAgIHRoaXMuZ2EoJ3NlbmQnLCAncGFnZXZpZXcnKTtcblxuICAgIHRoaXMuZXZlbnQuc3Vic2NyaWJlKCh4OiBFdmVudCkgPT4ge1xuICAgICAgdGhpcy5vbkV2ZW50KHgpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5wYWdlVmlldy5zdWJzY3JpYmUoKHg6IFBhZ2VWaWV3KSA9PiB7XG4gICAgICB0aGlzLm9uUGFnZVZpZXcoeCk7XG4gICAgfSk7XG5cbiAgICBjb25zdCB0aW1lciQgPSB0aW1lcigyMF8wMDApXG4gICAgICAucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRocm93RXJyb3IobmV3IEVycm9yKCdDb3VsZCBub3QgbG9hZCBHQScpKSksXG4gICAgICApO1xuXG4gICAgaW50ZXJ2YWwoNTApXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRpbWVyJCksXG4gICAgICAgIGZpbHRlcigoKSA9PiBCb29sZWFuKCh3aW5kb3cgYXMgYW55KS5nYSkpLFxuICAgICAgICBmaXJzdCgpLFxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5xdWV1ZSksXG4gICAgICAgIHRhcChhcmdzID0+IHtcbiAgICAgICAgICAod2luZG93IGFzIGFueSkuZ2EoLi4uYXJncyk7IC8vIHRzbGludDpkaXNhYmxlLWxpbmU6bm8tdW5zYWZlLWFueVxuICAgICAgICB9KSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQoZmllbGRzT2JqZWN0OiBhbnkpOiB2b2lkO1xuICBwdWJsaWMgc2V0KGZpZWxkTmFtZTogc3RyaW5nLCBmaWVsZFZhbHVlOiBhbnkpOiB2b2lkO1xuICBwdWJsaWMgc2V0KGtleTogYW55LCB2YWx1ZT86IGFueSk6IHZvaWQge1xuICAgIGlmICh0eXBlb2Yga2V5ICE9PSAnc3RyaW5nJyAmJiB0eXBlb2Yga2V5ICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgXFxgZmllbGROYW1lXFxgIHRvIGJlIG9mIHR5cGUgXFxgc3RyaW5nXFxgIG9yIFxcYG9iamVjdFxcYCwgZ290IFxcYCR7dHlwZW9mIGtleX1cXGBgKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGtleSA9PT0gJ3N0cmluZycgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYGZpZWxkVmFsdWVgIHRvIG5vdCBiZSBgdW5kZWZpbmVkYCcpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Yga2V5ID09PSAnb2JqZWN0Jykge1xuICAgICAgdGhpcy5nYSgnc2V0Jywga2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5nYSgnc2V0Jywga2V5LCB2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvbkV2ZW50KGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuZ2EoJ3NlbmQnLCAnZXZlbnQnLCBldmVudC5jYXRlZ29yeSwgZXZlbnQuYWN0aW9uLCBldmVudC5sYWJlbCwgZXZlbnQudmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBvblBhZ2VWaWV3KHBhZ2V2aWV3OiBQYWdlVmlldyk6IHZvaWQge1xuICAgIGNvbnN0IGZpZWxkc09iamVjdDogeyB0aXRsZT86IHN0cmluZyB9ID0ge307XG5cbiAgICBpZiAocGFnZXZpZXcudGl0bGUpIHtcbiAgICAgIGZpZWxkc09iamVjdC50aXRsZSA9IHBhZ2V2aWV3LnRpdGxlO1xuICAgIH1cblxuICAgIHRoaXMuZ2EoJ3NlbmQnLCAncGFnZXZpZXcnLCBwYWdldmlldy5wYWdlLCBmaWVsZHNPYmplY3QpO1xuICB9XG5cbiAgcHJpdmF0ZSBnYSguLi5hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgICB0aGlzLnF1ZXVlLm5leHQoYXJncyk7XG4gIH1cbn1cbiJdfQ==