FeDirect/static/add_instance_flow.mts

73 lines
2.5 KiB
TypeScript
Raw Permalink Normal View History

import { AddInstanceDialog } from "./add_an_instance.mjs";
2025-02-03 19:00:15 +01:00
import { dialogDetailsToInstance, InstanceDetailsDialog, InstanceDetailsDialogData } from "./confirm_instance_details.mjs";
import { Dialog } from "./dialog.mjs";
2025-01-14 15:58:30 +01:00
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);
}
2025-02-03 19:00:15 +01:00
async start(autoSave: boolean) {
const {
autoQueryMetadata,
host,
secure,
} = await this.addDialog.present();
2025-02-03 19:00:15 +01:00
const detailsDialogData: InstanceDetailsDialogData = {
name: host,
host,
hostSecure: secure,
software: "",
iconURL: null,
};
2025-01-14 15:58:30 +01:00
try {
if (!autoQueryMetadata) throw null; // Skip to catch block
this.spinnerDialog.open();
2025-01-14 15:58:30 +01:00
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?
2025-01-14 15:58:30 +01:00
)
throw new Error("Invalid API response");
detailsDialogData.name = name;
detailsDialogData.software = software;
detailsDialogData.iconURL = iconURL as string | null;
} catch { }
this.spinnerDialog.close();
2025-02-03 19:00:15 +01:00
const finalData = await this.detailsDialog.present(detailsDialogData);
const instance = dialogDetailsToInstance(finalData, {});
storageManager.storage.instances.push(instance);
2025-02-03 19:00:15 +01:00
if (autoSave) storageManager.save();
console.log("Successfully added new instance:", instance);
2025-01-14 15:58:30 +01:00
}
}