import { AddInstanceDialog } from "./add_an_instance.mjs"; import { InstanceDetailsDialog, InstanceDetailsDialogData } from "./confirm_instance_details.mjs"; import { Dialog } from "./dialog.mjs"; import storageManager, { Instance } from "./storage_manager.mjs"; export class AddInstanceFlow { addDialog: AddInstanceDialog; spinnerDialog: Dialog; detailsDialog: InstanceDetailsDialog; constructor( addDialog: AddInstanceDialog | HTMLDialogElement, spinnerDialog: HTMLDialogElement, detailsDialog: InstanceDetailsDialog | HTMLDialogElement, ) { if (addDialog instanceof AddInstanceDialog) this.addDialog = addDialog; else this.addDialog = new AddInstanceDialog(addDialog, true); this.spinnerDialog = new Dialog(spinnerDialog); if (detailsDialog instanceof InstanceDetailsDialog) this.detailsDialog = detailsDialog; else this.detailsDialog = new InstanceDetailsDialog(detailsDialog, true); } async start() { const { autoQueryMetadata, host, secure, } = await this.addDialog.present(); let detailsDialogData: InstanceDetailsDialogData = { name: host, host, hostSecure: secure, software: "", iconURL: null, }; try { 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) // I guess TS is too stupid to understand this? ) throw new Error("Invalid API response"); detailsDialogData.name = name; detailsDialogData.software = software; detailsDialogData.iconURL = iconURL as string | null; } catch { } this.spinnerDialog.close(); detailsDialogData = await this.detailsDialog.present(detailsDialogData); const instance: Instance = { name: detailsDialogData.name, origin: `http${detailsDialogData.hostSecure ? "s" : ""}://${detailsDialogData.host}`, software: detailsDialogData.software, iconURL: detailsDialogData.iconURL ?? undefined }; storageManager.storage.instances.push(instance); storageManager.save(); console.log("Successfully added new instance:", instance); } }