-
-
Notifications
You must be signed in to change notification settings - Fork 160
/
Copy pathgoogle-tag-manager.js
92 lines (73 loc) · 2.51 KB
/
google-tag-manager.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
import { assert, deprecate } from '@ember/debug';
import { capitalize } from '@ember/string';
import { compact } from 'ember-metrics/-private/utils/object-transforms';
import removeFromDOM from 'ember-metrics/-private/utils/remove-from-dom';
import BaseAdapter from './base';
export default class GoogleTagManager extends BaseAdapter {
dataLayer = 'dataLayer';
toStringExtension() {
return 'GoogleTagManager';
}
install() {
const { id, dataLayer, envParams } = this.config;
const envParamsString = envParams ? `&${envParams}` : '';
assert(
`[ember-metrics] You must pass a valid \`id\` to the ${this.toString()} adapter`,
id
);
this.dataLayer = dataLayer || 'dataLayer';
this._injectScript(id, envParamsString);
}
// prettier-ignore
_injectScript(id, envParamsString) {
(function(w, d, s, l, i) {
w[l] = w[l] || [];
w[l].push({
'gtm.start': new Date().getTime(),
event: 'gtm.js'
});
var f = d.getElementsByTagName(s)[0],
j = d.createElement(s),
dl = l !== 'dataLayer' ? '&l=' + l : '';
j.async = true;
j.src = 'https://www.googletagmanager.com/gtm.js?id=' + i + dl + envParamsString;
f.parentNode.insertBefore(j, f);
})(window, document, 'script', this.dataLayer, id);
}
trackEvent(options = {}) {
const compactedOptions = compact(options);
const dataLayer = this.dataLayer;
const gtmEvent = { event: compactedOptions['event'] };
deprecate(
'Future versions of the GoogleTagManagerAdapter will no longer prefix top-level dataLayer keys with `event`. If you wish to retain this behaviour you will need to override the adapter and prefix the keys yourself.',
false,
{
id: 'ember-metrics.issue-438',
for: 'ember-metrics',
since: '1.5.0',
until: '2.0.0',
}
);
delete compactedOptions['event'];
for (let key in compactedOptions) {
const capitalizedKey = capitalize(key);
gtmEvent[`event${capitalizedKey}`] = compactedOptions[key];
}
window[dataLayer].push(gtmEvent);
return gtmEvent;
}
trackPage(options = {}) {
const compactedOptions = compact(options);
const dataLayer = this.dataLayer;
const sendEvent = {
event: compactedOptions['event'] || 'pageview',
};
const pageEvent = { ...sendEvent, ...compactedOptions };
window[dataLayer].push(pageEvent);
return pageEvent;
}
uninstall() {
removeFromDOM('script[src*="gtm.js"]');
delete window.dataLayer;
}
}