FeDirect/static/add_an_instance.mts

65 lines
2.2 KiB
TypeScript
Raw Normal View History

// This file handles the "Add an instance" dialog
export function parseHost(host: string): { host: string, secure: boolean } | null {
let parsedInstance = URL.parse(host);
parsedInstance ??= URL.parse("https://" + host);
if (!parsedInstance?.host) return null;
2025-01-14 13:10:29 +01:00
if (!/https?:/.test(parsedInstance.protocol)) return null;
return {
host: parsedInstance.host,
secure: parsedInstance.protocol === "https:"
};
}
2025-01-14 10:49:44 +01:00
export function initializeAddInstanceDialog(
dialog: HTMLDialogElement,
callback: (
host: string,
secure: boolean,
autoQueryMetadata: boolean,
) => void
): {
showAddInstanceDialog: () => void,
hideAddInstanceDialog: () => void,
} {
const showAddInstanceDialog = () => dialog.showModal();
const hideAddInstanceDialog = () => dialog.close();
const form = dialog.querySelector(".addInstanceForm");
if (!(form instanceof HTMLFormElement))
throw new Error(".addInstanceForm isn't a form");
const instanceHost = form.querySelector("#instanceHost");
if (!(instanceHost instanceof HTMLInputElement))
throw new Error("#instanceHost isn't an input");
instanceHost.addEventListener("input", e => {
if (parseHost(instanceHost.value) === null)
instanceHost.setCustomValidity("Invalid instance hostname or URL");
else
instanceHost.setCustomValidity("");
});
2025-01-14 10:49:44 +01:00
const autoQueryMetadata = form.querySelector("#autoQueryMetadata");
if (!(autoQueryMetadata instanceof HTMLInputElement))
throw new Error("#autoQueryMetadata isn't an input");
form.addEventListener("submit", e => {
// A sane browser doesn't allow for submitting the form if the above validation fails
const { host, secure } = parseHost(instanceHost.value)!;
2025-01-14 10:49:44 +01:00
callback(host, secure, autoQueryMetadata.checked);
form.reset();
});
const closeButton = form.querySelector(".close");
if (!(closeButton instanceof HTMLButtonElement))
throw new Error(".close isn't a button");
closeButton.addEventListener("click", e => hideAddInstanceDialog());
return {
showAddInstanceDialog,
hideAddInstanceDialog
};
}