Fixes Connect bug where activity comparison shows a blank page for activities containing step speed loss chart
// ==UserScript==
// @name Garmin Connect: fix activity comparisons
// @namespace http://tampermonkey.net/
// @description Fixes Connect bug where activity comparison shows a blank page for activities containing step speed loss chart
// @author You
// @match https://connect.garmin.com/modern/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=garmin.com
// @grant window.onurlchange
// @license MIT
// @version 0.1
// ==/UserScript==
(function () {
'use strict';
const urlPrefix = 'https://connect.garmin.com/modern/activities/compare'
let currentPageMatchesUrl = false;
waitForUrl()
function waitForUrl() {
// if (window.onurlchange == null) {
// feature is supported
window.addEventListener('urlchange', onUrlChange);
// }
onUrlChange();
}
function onUrlChange() {
const urlMatches = window.location.href.startsWith(urlPrefix);
if (!currentPageMatchesUrl) {
if (urlMatches) {
currentPageMatchesUrl = true;
init();
}
} else {
if (!urlMatches) {
currentPageMatchesUrl = false;
deinit();
}
}
}
(function () {
const accessor = Object.getOwnPropertyDescriptor(XMLHttpRequest.prototype, 'responseText');
Object.defineProperty(XMLHttpRequest.prototype, 'responseText', {
get: function () {
const responseText = accessor.get.call(this);
if (!currentPageMatchesUrl) {
return responseText;
}
if (this.responseURL.toString().match('https://connect.garmin.com/activity-service/activity/[0-9]*/details')) {
console.warn('intercepted activity details request: ' + this.responseURL)
const data = JSON.parse(responseText);
const newDescriptors = [];
for (const d of data['metricDescriptors']) {
if (
!d['key'].startsWith('directStepSpeedLoss')
// &&
// !d['key'].startsWith('directImpactLoadFactor')
) {
newDescriptors.push(d)
}
}
data['metricDescriptors'] = newDescriptors;
console.warn('modified activity chart descriptors to exclude step speed loss')
return JSON.stringify(data);
}
return responseText;
},
configurable: true
});
})();
function init() {
}
function deinit() {
}
})();