NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name Strava route planner: Realistic topo maps
// @version 0.1
// @grant none
// @include https://www.strava.com/routes/new*
// @include https://www.strava.com/routes/*/edit*
// @require https://openuserjs.org/src/libs/xsanda/Run_code_as_client.js
// @license MIT
// ==/UserScript==
runAsClient(() => {
const addButton = (src, handler) => {
img = document.createElement("img");
img.src = src;
Object.assign(img.style,{
height: "48px",
padding: "10px",
cursor: "pointer",
});
document.querySelector('header [class^="Header--actions"]').prepend(img);
img.addEventListener('click', handler);
return img;
};
const addHillShadeLayer = (map) => {
if (!map.getSource('dem')) {
map.addSource('dem', {
'type': 'raster-dem',
'url': 'mapbox://mapbox.terrain-rgb'
});
}
if (!map.getLayer('improved-hillshading')) {
map.addLayer({
'id': 'improved-hillshading',
'type': 'hillshade',
'source': 'dem',
}, map.getLayer('global-heatmap') ? 'global-heatmap' : undefined);
} else map.setLayoutProperty('improved-hillshading', 'visibility', 'visible');
map.setLayoutProperty('hillshade-greys', 'visibility', 'none');
};
const hideHillShadeLayer = (map) => {
map.setLayoutProperty('hillshade-greys', 'visibility', 'visible');
map.setLayoutProperty('improved-hillshading', 'visibility', 'none');
};
const waitFor = (f, freq = 1000) =>
new Promise((resolve) => {
const interval = setInterval(() => {
const result = f();
if (result !== undefined) {
clearInterval(interval);
resolve(result);
}
}, freq);
});
(async () => {
const mapInstance = await waitFor(() => {
const mapElem = document.querySelector(".mapboxgl-map");
if (!mapElem) return;
const [key, reactElement] = Object.entries(mapElem).find(([key]) => /^__reactInternalInstance/.test(key)) ?? [];
return reactElement.memoizedProps?.children?.props?.value?.map;
});
window.map = mapInstance;
let showHillShade = false;
addButton("https://static.thenounproject.com/png/1634624-200.png", () => {
showHillShade = !showHillShade;
if (showHillShade) addHillShadeLayer(mapInstance);
else hideHillShadeLayer(mapInstance);
});
})().catch(console.error);
});