diff --git a/static/add_instance_flow.mts b/static/add_instance_flow.mts index ffd78ae..1877a87 100644 --- a/static/add_instance_flow.mts +++ b/static/add_instance_flow.mts @@ -1,69 +1,78 @@ import { AddInstanceDialog } from "./add_an_instance.mjs"; import { initializeInstanceDetailsDialog } from "./confirm_instance_details.mjs"; +import { Dialog } from "./dialog.mjs"; import storageManager, { Instance } from "./storage_manager.mjs"; -export function initializeAddInstanceFlow( - detailsDialog: HTMLDialogElement, - addDialog: HTMLDialogElement -): { - showAddInstanceDialog: () => void, - hideAddInstanceDialog: () => void -} { - const instanceDetailsDialogCallback = ( - name: string, - host: string, - hostSecure: boolean, - software: string, - icon: string | null - ) => { - const instance: Instance = { - name, - origin: `http${hostSecure ? "s" : ""}://${host}`, - software, - iconURL: icon ?? undefined +export class AddInstanceFlow { + addDialog: AddInstanceDialog; + spinnerDialog: Dialog; + detailsDialog: HTMLDialogElement; + + constructor( + addDialog: AddInstanceDialog | HTMLDialogElement, + spinnerDialog: HTMLDialogElement, + detailsDialog: HTMLDialogElement, + ) { + if (addDialog instanceof AddInstanceDialog) + this.addDialog = addDialog; + else + this.addDialog = new AddInstanceDialog(addDialog, true); + this.spinnerDialog = new Dialog(spinnerDialog); + this.detailsDialog = detailsDialog; + } + + async start() { + const instanceDetailsDialogCallback = ( + name: string, + host: string, + hostSecure: boolean, + software: string, + icon: string | null + ) => { + const instance: Instance = { + name, + origin: `http${hostSecure ? "s" : ""}://${host}`, + software, + iconURL: icon ?? undefined + }; + storageManager.storage.instances.push(instance); + storageManager.save(); + console.log("Successfully added new instance:", instance); }; - storageManager.storage.instances.push(instance); - storageManager.save(); - console.log("Successfully added new instance:", instance); - }; - const { - showInstanceDetailsDialog, - hideInstanceDetailsDialog, - populateInstanceDetailsDialog - } = initializeInstanceDetailsDialog(detailsDialog, instanceDetailsDialogCallback); + const { + showInstanceDetailsDialog, + hideInstanceDetailsDialog, + populateInstanceDetailsDialog + } = initializeInstanceDetailsDialog(this.detailsDialog, instanceDetailsDialogCallback); + + const { + autoQueryMetadata, + host, + secure, + } = await this.addDialog.prompt(); - const addInstanceDialogCallback = async ( - host: string, - secure: boolean, - autoQueryMetadata: boolean, - ) => { try { - if (!autoQueryMetadata) throw new Error("Don't"); + if (!autoQueryMetadata) throw null; // Skip to catch block + + this.spinnerDialog.open(); + const { name, software, iconURL } = await fetch(`/api/instance_info/${secure}/${encodeURIComponent(host)}`) .then(r => r.json()); if ( typeof name !== "string" || typeof software !== "string" - || !(typeof iconURL === "string" || iconURL === null) + || !(typeof iconURL === "string" || iconURL === null) // I guess TS is too stupid to understand this? ) throw new Error("Invalid API response"); + populateInstanceDetailsDialog(name, host, secure, software, iconURL as string | null); } catch { populateInstanceDetailsDialog(host, host, secure, "", null); } finally { + this.spinnerDialog.close(); showInstanceDetailsDialog(); } } - - const { - showAddInstanceDialog, - hideAddInstanceDialog - } = initializeAddInstanceDialog(addDialog, addInstanceDialogCallback); - - return { - showAddInstanceDialog, - hideAddInstanceDialog - }; } diff --git a/static/crossroad.html b/static/crossroad.html index 2274d20..e431a81 100644 --- a/static/crossroad.html +++ b/static/crossroad.html @@ -29,7 +29,7 @@
You currently don't have any instances. You should add one!