add pop up for incorrectly configured instances

Will automatically repair instances bad URLs and notify the user of this situation.
This commit is contained in:
MathMan05 2025-03-15 22:05:50 -05:00
parent c48ac2e065
commit b944be96a4
2 changed files with 152 additions and 7 deletions

View file

@ -8,7 +8,7 @@ interface OptionsElement<x> {
value: x;
}
//future me stuff
class Buttons implements OptionsElement<unknown> {
export class Buttons implements OptionsElement<unknown> {
readonly name: string;
readonly buttons: [string, Options | string][];
buttonList!: HTMLDivElement;
@ -136,6 +136,36 @@ class TextInput implements OptionsElement<string> {
this.onSubmit(this.value);
}
}
const mdProm = import("./markdown.js");
class SettingsMDText implements OptionsElement<void> {
readonly onSubmit!: (str: string) => void;
value!: void;
text: string;
elm!: WeakRef<HTMLSpanElement>;
constructor(text: string) {
this.text = text;
}
generateHTML(): HTMLSpanElement {
const span = document.createElement("span");
this.elm = new WeakRef(span);
this.setText(this.text);
return span;
}
setText(text: string) {
this.text = text;
if (this.elm) {
const span = this.elm.deref();
if (span) {
span.innerHTML = "";
mdProm.then((e) => {
span.append(new e.MarkDown(text, undefined).makeHTML());
});
}
}
}
watchForChange() {}
submit() {}
}
class SettingsText implements OptionsElement<void> {
readonly onSubmit!: (str: string) => void;
@ -773,6 +803,12 @@ class Options implements OptionsElement<void> {
this.generate(text);
return text;
}
addMDText(str: string) {
const text = new SettingsMDText(str);
this.options.push(text);
this.generate(text);
return text;
}
addHR() {
const rule = new HorrizonalRule();
this.options.push(rule);
@ -1406,4 +1442,4 @@ class Settings extends Buttons {
}
}
export {Settings, OptionsElement, Buttons, Options, Form, Float};
export {Settings, OptionsElement, Options, Form, Float};

View file

@ -1,4 +1,5 @@
import {I18n} from "../i18n.js";
import {Dialog} from "../settings.js";
setTheme();
export function setTheme() {
let name = localStorage.getItem("theme");
@ -304,7 +305,11 @@ const instancefetch = fetch("/instances.json")
if (datalist) {
console.warn(json);
const instancein = document.getElementById("instancein") as HTMLInputElement;
if (instancein && instancein.value === "") {
if (
instancein &&
instancein.value === "" &&
!new URLSearchParams(window.location.search).get("instance")
) {
instancein.value = json[0].name;
}
for (const instance of json) {
@ -423,12 +428,24 @@ export async function getapiurls(str: string): Promise<
return false;
}
const url = new URL(api);
function isloopback(str: string) {
return str.includes("localhost") || str.includes("127.0.0.1");
}
let urls:
| undefined
| {
api: string;
cdn: string;
gateway: string;
wellknown: string;
login: string;
};
try {
const info = await fetch(
`${api}${url.pathname.includes("api") ? "" : "api"}/policies/instance/domains`,
).then((x) => x.json());
const apiurl = new URL(info.apiEndpoint);
return {
urls = {
api: info.apiEndpoint + appendApi(apiurl.pathname),
gateway: info.gateway,
cdn: info.cdn,
@ -441,7 +458,7 @@ export async function getapiurls(str: string): Promise<
const responce = await fetch(val.api + (val.api.endsWith("/") ? "" : "/") + "ping");
if (responce.ok) {
if (val.login) {
return val as {
urls = val as {
wellknown: string;
api: string;
cdn: string;
@ -450,7 +467,7 @@ export async function getapiurls(str: string): Promise<
};
} else {
val.login = val.api;
return val as {
urls = val as {
wellknown: string;
api: string;
cdn: string;
@ -460,8 +477,100 @@ export async function getapiurls(str: string): Promise<
}
}
}
return false;
}
if (urls) {
if (isloopback(urls.api) !== isloopback(str)) {
return new Promise<
| {
api: string;
cdn: string;
gateway: string;
wellknown: string;
login: string;
}
| false
>((res) => {
const menu = new Dialog("");
const options = menu.float.options;
options.addMDText(I18n.incorrectURLS());
const opt = options.addOptions("", {ltr: true});
let clicked = false;
opt.addButtonInput("", I18n.yes(), async () => {
if (clicked) return;
clicked = true;
const temp = new URL(str);
temp.port = "";
const newOrgin = temp.host;
const tempurls = {
api: new URL(urls.api),
cdn: new URL(urls.cdn),
gateway: new URL(urls.gateway),
wellknown: new URL(urls.wellknown),
login: new URL(urls.login),
};
tempurls.api.host = newOrgin;
tempurls.cdn.host = newOrgin;
tempurls.gateway.host = newOrgin;
tempurls.wellknown.host = newOrgin;
tempurls.login.host = newOrgin;
try {
if (!(await fetch(tempurls.api + "/ping")).ok) {
res(false);
menu.hide();
return;
}
} catch {
res(false);
menu.hide();
return;
}
res({
api: tempurls.api.toString(),
cdn: tempurls.cdn.toString(),
gateway: tempurls.gateway.toString(),
wellknown: tempurls.wellknown.toString(),
login: tempurls.login.toString(),
});
menu.hide();
});
const no = opt.addButtonInput("", I18n.no(), async () => {
if (clicked) return;
clicked = true;
try {
if (!(await fetch(urls.api + "/ping")).ok) {
res(false);
menu.hide();
return;
}
} catch {
res(false);
return;
}
res(urls);
menu.hide();
});
const span = document.createElement("span");
options.addHTMLArea(span);
const t = setInterval(() => {
if (!document.contains(span)) {
clearInterval(t);
no.onClick();
}
}, 100);
menu.show();
});
}
//*/
try {
if (!(await fetch(urls.api + "/ping")).ok) {
return false;
}
} catch {
return false;
}
return urls;
}
return false;
}
/**
*