import {Base64} from 'js-base64'; const fragmentPrefix = '#json='; const exampleRedirect: Redirect = { matcherType: 'hostname', matcherValue: 'example.com', redirectType: 'hostname', redirectValue: 'example.org', }; function decodeBase64(base64: string): T { return JSON.parse(Base64.decode(base64)) as T; } function encodeBase64(source: any): string { return Base64.encode(JSON.stringify(source), true); } window.addEventListener('DOMContentLoaded', () => { window['Re-Nav'] = { decodeBase64, encodeBase64, share, }; console.log( "Want to manually create a share link? Use the window['Re-Nav'].share", 'function, where redirect is an object with matcherType, matcherValue,', 'redirectType and redirectValue properties. Like this:', ); console.log(JSON.stringify(exampleRedirect, undefined, 2)); console.log(window['Re-Nav'].share); if (!location.hash.startsWith(fragmentPrefix)) { return; } const decoded = decodeBase64( location.hash.slice(fragmentPrefix.length), ); for (const [key, value] of Object.entries(decoded)) { insertText(key as keyof Redirect, value); } for (const element of document.querySelectorAll('.hidden-by-default')) { element.classList.remove('hidden-by-default'); } document.querySelector('.subtitle')!.textContent = 'Someone shared a redirect with you!'; }); function insertText(key: keyof Redirect, value: string): void { const insert = (selector: string, text: string) => { document.querySelector(selector)!.textContent = text; }; // eslint-disable-next-line unicorn/prefer-switch if (key === 'matcherType') { insert('.matcher-type', value); } else if (key === 'matcherValue') { insert('.matcher-value', value); } else if (key === 'redirectType') { insert('.redirect-type', value); } else if (key === 'redirectValue') { insert('.redirect-value', value); } else { console.warn(`Unknown key: ${key as string}`); } } function share(redirect: Redirect): string { const encoded = encodeBase64(redirect); const url = new URL(window.location.href); url.hash = `${fragmentPrefix}${encoded}`; return url.href; }