import { attachTooltips } from './tooltip.js';
// The links every site is expected to carry: where the source lives, who made
// it, and what it does with your data. Kept to one line at the foot of the
// menu rather than a page of its own, because there is very little to say and
// a whole screen would overstate it.
//
// Edit these to point at the real destinations.
export const LINKS = {
github: 'https://github.com/srdusr/typerpunk',
privacy: '#privacy',
};
// Share is a Web Share invocation where the browser has one (every mobile
// browser, Safari, and Edge), and a clipboard copy everywhere else. Neither
// needs a network call or a third-party button, so there is no tracking
// script here and nothing to consent to.
async function share(result) {
const url = window.location.origin;
const text = result
? `I just typed ${Math.round(result.wpm)} wpm at ${Math.round(result.accuracy)}% accuracy on TyperPunk.`
: 'TyperPunk - competitive typing in the terminal and the browser.';
if (navigator.share) {
try {
await navigator.share({ title: 'TyperPunk', text, url });
return 'shared';
} catch {
// A cancelled share sheet is not a failure; fall through to copy.
}
}
try {
await navigator.clipboard.writeText(`${text} ${url}`);
return 'copied';
} catch {
return 'failed';
}
}
/// `result` is optional: with one, Share offers the score just achieved;
/// without, it offers the site.
export function renderSiteFooter(root, { result, onShowPrivacy, onShowContribute } = {}) {
const wrap = document.createElement('div');
wrap.className = 'site-footer';
wrap.innerHTML = `
`;
root.appendChild(wrap);
attachTooltips(wrap);
const shareBtn = wrap.querySelector('[data-action="share"]');
shareBtn.addEventListener('click', async () => {
const outcome = await share(result);
shareBtn.textContent = outcome === 'copied' ? 'Copied' : outcome === 'failed' ? 'Copy failed' : 'Shared';
setTimeout(() => { shareBtn.textContent = 'Share'; }, 1800);
});
wrap.querySelector('[data-action="privacy"]').addEventListener('click', () => onShowPrivacy?.());
wrap.querySelector('[data-action="contribute"]').addEventListener('click', () => onShowContribute?.());
return () => wrap.remove();
}