diff --git a/static/add_an_instance.mts b/static/add_an_instance.mts new file mode 100644 index 0000000..e305637 --- /dev/null +++ b/static/add_an_instance.mts @@ -0,0 +1,54 @@ +// 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; + return { + host: parsedInstance.host, + secure: parsedInstance.protocol === "https:" + }; +} + +export function initializeAddInstanceDialog(dialog: HTMLDialogElement): { + 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(""); + }); + + form.addEventListener("submit", async e => { + // A sane browser doesn't allow for submitting the form if the above validation fails + const { host, secure } = parseHost(instanceHost.value)!; + console.log( + await fetch(`/api/instance_info/${secure}/${encodeURI(host)}`).then(r => r.json()) + ); + 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 + }; +} diff --git a/static/crossroad.html b/static/crossroad.html index 9940a49..8fbe927 100644 --- a/static/crossroad.html +++ b/static/crossroad.html @@ -9,9 +9,12 @@ - +
- +

FeDirect

By Nekomata

@@ -20,14 +23,20 @@ Instances and stuff go here!
-
- +
+

Add an instance

-
- + + + +
+ +
diff --git a/static/crossroad.mts b/static/crossroad.mts index f624e3f..00332d4 100644 --- a/static/crossroad.mts +++ b/static/crossroad.mts @@ -1,5 +1,15 @@ +import { initializeAddInstanceDialog } from "./add_an_instance.mjs"; import knownSoftware from "./known_software.mjs"; import storageManager from "./storage_manager.mjs"; console.log(knownSoftware); console.log(storageManager.storage.instances); + +export function getMainDialog(): HTMLDialogElement { + return document.getElementById('mainDialog') as HTMLDialogElement; +} + +const dialog = document.querySelector("#addInstance"); +if (!(dialog instanceof HTMLDialogElement)) + throw new Error("Couldn't find addInstance dialog"); +export const { showAddInstanceDialog, hideAddInstanceDialog } = initializeAddInstanceDialog(dialog);