This repository has been archived on 2023-03-18. You can view files and clone it, but cannot push or open issues or pull requests.
osr-discourse-src/app/assets/javascripts/discourse/lib/page-tracker.js
2020-03-12 13:29:55 -04:00

77 lines
1.8 KiB
JavaScript

import { next } from "@ember/runloop";
let _started = false;
let cache = {};
let transitionCount = 0;
export function setTransient(key, data, count) {
cache[key] = { data, target: transitionCount + count };
}
export function getTransient(key) {
return cache[key];
}
export function resetPageTracking() {
_started = false;
transitionCount = 0;
cache = {};
}
export function startPageTracking(router, appEvents) {
if (_started) {
return;
}
router.on("routeDidChange", transition => {
// we ocassionally prevent tracking of replaced pages when only query params changed
// eg: google analytics
const replacedOnlyQueryParams =
transition.urlMethod === "replace" && transition.queryParamsOnly;
router.send("refreshTitle");
const url = Discourse.getURL(router.get("url"));
// Refreshing the title is debounced, so we need to trigger this in the
// next runloop to have the correct title.
next(() => {
let title = Discourse.get("_docTitle");
appEvents.trigger("page:changed", {
url,
title,
currentRouteName: router.currentRouteName,
replacedOnlyQueryParams
});
});
transitionCount++;
Object.keys(cache).forEach(k => {
const v = cache[k];
if (v && v.target && v.target < transitionCount) {
delete cache[k];
}
});
});
_started = true;
}
const _gtmPageChangedCallbacks = [];
export function addGTMPageChangedCallback(callback) {
_gtmPageChangedCallbacks.push(callback);
}
export function googleTagManagerPageChanged(data) {
let gtmData = {
event: "virtualPageView",
page: {
title: data.title,
url: data.url
}
};
_gtmPageChangedCallbacks.forEach(callback => callback(gtmData));
window.dataLayer.push(gtmData);
}