interlanguage-checker/src/main/js/Main.js

98 lines
3.4 KiB
JavaScript
Raw Normal View History

2020-04-11 19:54:34 +02:00
import {html, render} from "htm/preact";
import {InterlangTable, MessageHandler, ValidatableInput} from "./DOM";
import {discoverNetwork, InterlangNetwork, MediaWiki, MediaWikiManager} from "./MediaWiki";
2020-04-11 12:25:15 +02:00
import {$, doAfterLoad} from "./Shared";
doAfterLoad(async () => {
const urlInput = new ValidatableInput($("#url"), (value) => {
if (value.trim() === "")
return "URL must not be empty.";
try {
new URL(value); // Throws exception if invalid
return "";
} catch (error) {
return error.message;
}
});
const pageInput = new ValidatableInput($("#page"), (value) => {
return value.trim() === "" ? "Page must not be empty" : "";
});
const checkButton = $("#check");
const messageHandler = new MessageHandler($("#messages"))
.setCallback((level, message) => {
if (level === "error") console.error(message);
});
2020-04-11 12:25:15 +02:00
let previousUrl = undefined;
let mwm = undefined;
const submit = async () => {
// Clean up
urlInput.showBlank();
pageInput.showBlank();
messageHandler.clear();
2020-04-11 12:25:15 +02:00
const oldTable = $("#networkTable");
if (oldTable !== null)
oldTable.parentNode.removeChild(oldTable);
// Validate
const urlValidity = urlInput.validate();
if (urlValidity !== "") return messageHandler.handle("error", urlValidity);
2020-04-11 12:25:15 +02:00
const pageValidity = pageInput.validate();
if (pageValidity !== "") return messageHandler.handle("error", pageValidity);
2020-04-11 12:25:15 +02:00
// Initialize
if (urlInput.getValue() !== previousUrl) {
messageHandler.handle("progress", `Initializing <code>${urlInput.getValue()}</code>`);
2020-04-11 12:25:15 +02:00
try {
const mw = new MediaWiki(urlInput.getValue());
mwm = await new MediaWikiManager().init(mw);
} catch (error) {
messageHandler.handle("error", error);
2020-04-11 12:25:15 +02:00
return;
}
previousUrl = urlInput.getValue();
}
// Discover
discoverNetwork(mwm, pageInput.getValue(), it => messageHandler.handle("progress", it))
.then(({pages, redirects}) => new InterlangNetwork(pages, redirects))
.then(network => {
messageHandler.handle("progress", "Creating table");
2020-04-11 12:25:15 +02:00
const form = $("#networkTableForm");
form.textContent = "";
render(html`<${InterlangTable} id="networkTable" network=${network} />`, form);
2020-04-11 12:25:15 +02:00
switch (network.checkState()) {
case "complete":
messageHandler.handle("complete", "A perfect network! 🙂");
break;
case "incomplete":
messageHandler.handle("warning", "The network is incomplete 😞");
break;
case "imperfect":
messageHandler.handle("warning", "The network is complete but flawed 😕 ");
break;
}
2020-04-11 12:25:15 +02:00
})
.catch(error => messageHandler.handle("error", error));
2020-04-11 12:25:15 +02:00
};
urlInput.input.addEventListener("keypress", (event) => {
if (event.key.toLowerCase() === "enter") submit();
});
pageInput.input.addEventListener("keypress", (event) => {
if (event.key.toLowerCase() === "enter") submit();
});
checkButton.addEventListener("click", () => submit());
});