Skip to content

Commit b5697a9

Browse files
committed
fix track events so they use consent context correctly. Only load segment if the user consents to analytics
1 parent 55e9c9f commit b5697a9

File tree

5 files changed

+72
-55
lines changed

5 files changed

+72
-55
lines changed

src/js/04-segment-analytics.js

Lines changed: 37 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,55 @@
11
;(function () {
22
'use strict'
33

4-
if (window.analytics) {
5-
const trackedLinkElements = document.querySelectorAll('a[data-track]')
6-
const trackedElements = document.querySelectorAll('[data-track]:not(a)')
7-
8-
const context = {
4+
const ketchConsentContext = {
5+
context: {
96
consent: {
107
categoryPreferences: {
11-
advertising: 'behavioral_advertising',
12-
ketch_purpose_code: 'ketch_purpose_code',
13-
analytics: 'analytics',
14-
data_broking: 'data_broking',
15-
personalization: 'personalization',
16-
essential_services: 'essential_services',
8+
...(window.ketchConsent?.purposes || {
9+
analytics: false,
10+
essential_services: false,
11+
targeted_advertising: false,
12+
}),
1713
},
1814
},
15+
},
16+
}
17+
18+
const trackEvent = (name, payload) => {
19+
if (window.analytics) {
20+
window.analytics.track(name, {
21+
...(payload || {}),
22+
...ketchConsentContext,
23+
})
1924
}
25+
}
26+
27+
const trackLinkEvent = (element, name, payload) => {
28+
if (window.analytics) {
29+
window.analytics.trackLink(element, name, {
30+
...(payload || {}),
31+
...ketchConsentContext,
32+
})
33+
}
34+
}
35+
36+
if (window.analytics) {
37+
const trackedLinkElements = document.querySelectorAll('a[data-track]')
38+
const trackedElements = document.querySelectorAll('[data-track]:not(a)')
2039

2140
trackedLinkElements.forEach((element) => {
22-
window.analytics.trackLink(element, element.dataset.track, context)
41+
trackLinkEvent(element, element.dataset.track)
2342
})
2443

2544
trackedElements.forEach((element) => {
2645
element.addEventListener('click', (e) => {
27-
window.analytics.track(element.dataset.track, context)
46+
trackEvent(element.dataset.track)
2847
})
2948
})
3049
}
50+
51+
// Expose trackEvent and trackLinkEvent to the global scope.
52+
// All tracking events should be done through these functions because they handle the Ketch consent context.
53+
window.trackEvent = trackEvent
54+
window.trackLinkEvent = trackLinkEvent
3155
})()

src/js/05-feedback-dialog.js

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -40,19 +40,9 @@
4040
form.onsubmit = (e) => {
4141
e.preventDefault()
4242
const message = form.elements.message.value
43-
if (message && window.analytics) {
44-
window.analytics.track('Feedback Form', {
43+
if (message && window.trackEvent) {
44+
window.trackEvent('Feedback Form', {
4545
message,
46-
consent: {
47-
categoryPreferences: {
48-
advertising: 'behavioral_advertising',
49-
ketch_purpose_code: 'ketch_purpose_code',
50-
analytics: 'analytics',
51-
data_broking: 'data_broking',
52-
personalization: 'personalization',
53-
essential_services: 'essential_services',
54-
},
55-
},
5646
})
5747
}
5848
form.elements.message.value = ''

src/js/07-copy-to-clipboard.js

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -92,22 +92,12 @@
9292
}
9393

9494
function trackCopy (language, title, text) {
95-
if (window.analytics) {
95+
if (window.trackEvent) {
9696
var sample = text.slice(0, 50).replace(/\s+/g, ' ').trim()
97-
window.analytics.track('Code Snippet Copied', {
97+
window.trackEvent('Code Snippet Copied', {
9898
snippetLanguage: language,
9999
snippetTitle: title,
100100
snippetSample: sample,
101-
consent: {
102-
categoryPreferences: {
103-
advertising: 'behavioral_advertising',
104-
ketch_purpose_code: 'ketch_purpose_code',
105-
analytics: 'analytics',
106-
data_broking: 'data_broking',
107-
personalization: 'personalization',
108-
essential_services: 'essential_services',
109-
},
110-
},
111101
})
112102
}
113103
}

src/partials/head-prelude.hbs

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,2 @@
11
<meta charset="utf-8">
22
<meta name="viewport" content="width=device-width,initial-scale=1">
3-
{{#with site.keys.ketchSmartTagUrl}}
4-
<script>!function(){window.semaphore=window.semaphore||[],window.ketch=function(){window.semaphore.push(arguments)};var e=document.createElement("script");e.type="text/javascript",e.src="{{this}}",e.defer=e.async=!0,document.getElementsByTagName("head")[0].appendChild(e)}();</script>
5-
<script>
6-
ketch('on', 'regionInfo', regionInfo => {
7-
var customTextRegions = ['US-CA'];
8-
if (customTextRegions.includes(regionInfo)) {
9-
var preferenceCenterLinkElement = document.getElementById("preferenceCenterLink");
10-
preferenceCenterLinkElement.textContent = "Do Not Sell My Personal Information";
11-
}
12-
})
13-
</script>
14-
{{/with}}

src/partials/head-scripts.hbs

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,35 @@
11
{{#with site.keys.segment}}
2-
<script>
3-
!function(){var i="analytics",analytics=window[i]=window[i]||[];if(!analytics.initialize)if(analytics.invoked)window.console&&console.error&&console.error("Segment snippet included twice.");else{analytics.invoked=!0;analytics.methods=["trackSubmit","trackClick","trackLink","trackForm","pageview","identify","reset","group","track","ready","alias","debug","page","screen","once","off","on","addSourceMiddleware","addIntegrationMiddleware","setAnonymousId","addDestinationMiddleware","register"];analytics.factory=function(e){return function(){if(window[i].initialized)return window[i][e].apply(window[i],arguments);var n=Array.prototype.slice.call(arguments);if(["track","screen","alias","group","page","identify"].indexOf(e)>-1){var c=document.querySelector("link[rel='canonical']");n.push({__t:"bpc",c:c&&c.getAttribute("href")||void 0,p:location.pathname,u:location.href,s:location.search,t:document.title,r:document.referrer})}n.unshift(e);analytics.push(n);return analytics}};for(var n=0;n<analytics.methods.length;n++){var key=analytics.methods[n];analytics[key]=analytics.factory(key)}analytics.load=function(key,n){var t=document.createElement("script");t.type="text/javascript";t.async=!0;t.setAttribute("data-global-segment-analytics-key",i);t.src="https://cdn.segment.com/analytics.js/v1/" + key + "/analytics.min.js";var r=document.getElementsByTagName("script")[0];r.parentNode.insertBefore(t,r);analytics._loadOptions=n};analytics._writeKey="{{this}}";;analytics.SNIPPET_VERSION="5.2.1";
4-
analytics.load("{{this}}");
5-
analytics.page();
6-
}}();
7-
</script>
2+
<script>
3+
!function(){var i="analytics",analytics=window[i]=window[i]||[];if(!analytics.initialize)if(analytics.invoked)window.console&&console.error&&console.error("Segment snippet included twice.");else{analytics.invoked=!0;analytics.methods=["trackSubmit","trackClick","trackLink","trackForm","pageview","identify","reset","group","track","ready","alias","debug","page","screen","once","off","on","addSourceMiddleware","addIntegrationMiddleware","setAnonymousId","addDestinationMiddleware","register"];analytics.factory=function(e){return function(){if(window[i].initialized)return window[i][e].apply(window[i],arguments);var n=Array.prototype.slice.call(arguments);if(["track","screen","alias","group","page","identify"].indexOf(e)>-1){var c=document.querySelector("link[rel='canonical']");n.push({__t:"bpc",c:c&&c.getAttribute("href")||void 0,p:location.pathname,u:location.href,s:location.search,t:document.title,r:document.referrer})}n.unshift(e);analytics.push(n);return analytics}};for(var n=0;n<analytics.methods.length;n++){var key=analytics.methods[n];analytics[key]=analytics.factory(key)}analytics.load=function(key,n){var t=document.createElement("script");t.type="text/javascript";t.async=!0;t.setAttribute("data-global-segment-analytics-key",i);t.src="https://cdn.segment.com/analytics.js/v1/" + key + "/analytics.min.js";var r=document.getElementsByTagName("script")[0];r.parentNode.insertBefore(t,r);analytics._loadOptions=n};analytics._writeKey="{{this}}";;analytics.SNIPPET_VERSION="5.2.1";
4+
analytics.page();
5+
}}();
6+
</script>
7+
{{/with}}
8+
9+
{{#with site.keys.ketchSmartTagUrl}}
10+
<script>!function(){window.semaphore=window.semaphore||[],window.ketch=function(){window.semaphore.push(arguments)};var e=document.createElement("script");e.type="text/javascript",e.src="{{this}}",e.defer=e.async=!0,document.getElementsByTagName("head")[0].appendChild(e)}();</script>
11+
<script>
12+
if (window.ketch) {
13+
function saveConsent(consent) {
14+
window.ketchConsent = consent;
15+
};
16+
window.ketch("on", "consent", (consent) => {
17+
saveConsent(consent);
18+
// Only load Segment analytics if the user has consented to analytics
19+
if (consent?.purposes?.analytics && window.analytics) {
20+
window.analytics.load("{{../site.keys.segment}}");
21+
}
22+
});
23+
window.ketch("on", "userConsentUpdated", saveConsent);
24+
window.ketch("on", "regionInfo", regionInfo => {
25+
var customTextRegions = ["US-CA"];
26+
if (customTextRegions.includes(regionInfo)) {
27+
var preferenceCenterLinkElement = document.getElementById("preferenceCenterLink");
28+
preferenceCenterLinkElement.textContent = "Do Not Sell My Personal Information";
29+
}
30+
})
31+
}
32+
</script>
833
{{/with}}
934
1035
<script>var uiRootPath = '{{{uiRootPath}}}'</script>

0 commit comments

Comments
 (0)