import React from 'dom-chef'; import select from 'select-dom'; import {wrap, isEditable} from '../libs/dom-utils'; import features from '../libs/features'; function addLocation(baseElement: HTMLElement): void { for (const {nextElementSibling, nextSibling} of select.all('.octicon-location', baseElement)) { const location = nextElementSibling ?? nextSibling!; // `nextSibling` alone might point to an empty TextNode before an element, if there’s an element if (isEditable(location)) { continue; } const locationName = location.textContent!.trim(); const googleMapsLink = `https://www.google.com/maps/search/?api=1&query=${encodeURIComponent(locationName)}`; location.before(' '); // Keeps the link’s underline from extending out to the icon wrap(location, ); } } const hovercardObserver = new MutationObserver(([mutation]) => { addLocation(mutation.target as HTMLElement); }); function init(): void { addLocation(document.body); const hovercardContainer = select('.js-hovercard-content > .Popover-message'); if (hovercardContainer) { hovercardObserver.observe(hovercardContainer, {childList: true}); } } features.add({ id: __featureName__, description: 'Linkifies the user location in their hovercard and profile page.', screenshot: 'https://user-images.githubusercontent.com/1402241/69076885-00d3a100-0a67-11ea-952a-690acec0826f.png', load: features.onAjaxedPages, init });