79 lines
2.1 KiB
TypeScript
79 lines
2.1 KiB
TypeScript
|
import {Base64} from 'js-base64';
|
||
|
|
||
|
const fragmentPrefix = '#json=';
|
||
|
|
||
|
const exampleRedirect: Redirect = {
|
||
|
matcherType: 'hostname',
|
||
|
matcherValue: 'example.com',
|
||
|
redirectType: 'hostname',
|
||
|
redirectValue: 'example.org',
|
||
|
};
|
||
|
|
||
|
function decodeBase64<T>(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<Redirect>(
|
||
|
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;
|
||
|
}
|