blob: 5d32275f533025de2d9a02a176d923e5bded1564 [file] [log] [blame]
/**
* @license
* Copyright 2020 The Go Authors. All rights reserved.
* Use of this source code is governed by a BSD-style
* license that can be found in the LICENSE file.
*/
import { registerHeaderListeners, registerSearchFormListeners } from 'static/shared/header/header';
import { CarouselController } from 'static/shared/carousel/carousel';
import { ClipboardController } from 'static/shared/clipboard/clipboard';
import { ToolTipController } from 'static/shared/tooltip/tooltip';
import { SelectNavController } from 'static/shared/outline/select';
import { ModalController } from 'static/shared/modal/modal';
import { initModals } from 'static/shared/jump/jump';
import { keyboard } from 'static/shared/keyboard/keyboard';
import * as analytics from 'static/shared/analytics/analytics';
import { initJumpLinks } from './about/index';
window.addEventListener('load', () => {
for (const el of document.querySelectorAll<HTMLButtonElement>('.js-clipboard')) {
new ClipboardController(el);
}
for (const el of document.querySelectorAll<HTMLDialogElement>('.js-modal')) {
new ModalController(el);
}
for (const t of document.querySelectorAll<HTMLDetailsElement>('.js-tooltip')) {
new ToolTipController(t);
}
for (const el of document.querySelectorAll<HTMLSelectElement>('.js-selectNav')) {
new SelectNavController(el);
}
for (const el of document.querySelectorAll<HTMLSelectElement>('.js-carousel')) {
new CarouselController(el);
}
for (const el of document.querySelectorAll('.js-toggleTheme')) {
el.addEventListener('click', () => {
toggleTheme();
});
}
if (document.querySelector<HTMLElement>('.js-gtmID')?.dataset.gtmid && window.dataLayer) {
analytics.func(function () {
removeUTMSource();
});
} else {
removeUTMSource();
}
registerHeaderListeners();
registerSearchFormListeners();
initModals();
initJumpLinks();
registerCookieNotice();
});
// Pressing '/' focuses the search box
keyboard.on('/', 'focus search', e => {
const searchInput = Array.from(
document.querySelectorAll<HTMLInputElement>('.js-searchFocus')
).pop();
// Favoring the Firefox quick find feature over search input
// focus. See: https://github.com/golang/go/issues/41093.
if (searchInput && !window.navigator.userAgent.includes('Firefox')) {
e.preventDefault();
searchInput.focus();
}
});
// Pressing 'y' changes the browser URL to the canonical URL
// without triggering a reload.
keyboard.on('y', 'set canonical url', () => {
let canonicalURLPath = document.querySelector<HTMLDivElement>('.js-canonicalURLPath')?.dataset[
'canonicalUrlPath'
];
if (canonicalURLPath && canonicalURLPath !== '') {
const fragment = window.location.hash;
if (fragment) {
canonicalURLPath += fragment;
}
window.history.replaceState(null, '', canonicalURLPath);
}
});
/**
* setupGoogleTagManager initializes Google Tag Manager.
*/
(function setupGoogleTagManager() {
analytics.track({
'gtm.start': new Date().getTime(),
event: 'gtm.js',
});
})();
/**
* removeUTMSource removes the utm_source GET parameter if present.
* This is done using JavaScript, so that the utm_source is still
* captured by Google Analytics.
*/
function removeUTMSource() {
const urlParams = new URLSearchParams(window.location.search);
const utmSource = urlParams.get('utm_source');
if (utmSource !== 'gopls' && utmSource !== 'godoc' && utmSource !== 'pkggodev') {
return;
}
/** Strip the utm_source query parameter and replace the URL. **/
const newURL = new URL(window.location.href);
urlParams.delete('utm_source');
newURL.search = urlParams.toString();
window.history.replaceState(null, '', newURL.toString());
}
/**
* toggleTheme switches the preferred color scheme between auto, light, and dark.
*/
function toggleTheme() {
let nextTheme = 'dark';
const theme = document.documentElement.getAttribute('data-theme');
if (theme === 'dark') {
nextTheme = 'light';
} else if (theme === 'light') {
nextTheme = 'auto';
}
let domain = '';
if (location.hostname.endsWith('go.dev')) {
domain = 'domain=.go.dev;';
}
document.documentElement.setAttribute('data-theme', nextTheme);
document.cookie = `prefers-color-scheme=${nextTheme};${domain}path=/;max-age=31536000;`;
}
/**
* registerCookieNotice makes the cookie notice visible and adds listeners to dismiss it
* if it has not yet been acknowledge by the user.
*/
function registerCookieNotice() {
const themeCookie = document.cookie.match(/cookie-consent=true/);
if (!themeCookie) {
const notice = document.querySelector('.js-cookieNotice');
const button = notice?.querySelector('button');
notice?.classList.add('Cookie-notice--visible');
button?.addEventListener('click', () => {
let domain = '';
if (location.hostname.endsWith('go.dev')) {
// Apply the cookie to *.go.dev.
domain = 'domain=.go.dev;';
}
document.cookie = `cookie-consent=true;${domain}path=/;max-age=31536000`;
notice?.remove();
});
}
}