2020-04-11 19:54:34 +02:00
|
|
|
import {html, render} from "htm/preact";
|
|
|
|
import {InterlangTable, MessageHandler, ValidatableInput} from "./DOM";
|
2020-04-13 23:09:02 +02:00
|
|
|
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 messages = $("#messages");
|
|
|
|
|
|
|
|
const progressHandler = new MessageHandler(messages)
|
|
|
|
.setCallback(() => errorHandler.clear())
|
|
|
|
.toggleLoadingIcon(true);
|
|
|
|
const errorHandler = new MessageHandler(messages, "errorMessage")
|
|
|
|
.setCallback((...messages) => {
|
|
|
|
progressHandler.clear();
|
|
|
|
console.error(...messages);
|
|
|
|
})
|
|
|
|
.toggleLoadingIcon(false);
|
|
|
|
|
|
|
|
|
|
|
|
let previousUrl = undefined;
|
|
|
|
let mwm = undefined;
|
|
|
|
|
|
|
|
const submit = async () => {
|
|
|
|
// Clean up
|
|
|
|
urlInput.showBlank();
|
|
|
|
pageInput.showBlank();
|
|
|
|
progressHandler.clear();
|
|
|
|
errorHandler.clear();
|
|
|
|
|
|
|
|
const oldTable = $("#networkTable");
|
|
|
|
if (oldTable !== null)
|
|
|
|
oldTable.parentNode.removeChild(oldTable);
|
|
|
|
|
|
|
|
// Validate
|
|
|
|
const urlValidity = urlInput.validate();
|
|
|
|
if (urlValidity !== "") return errorHandler.handle(urlValidity);
|
|
|
|
|
|
|
|
const pageValidity = pageInput.validate();
|
|
|
|
if (pageValidity !== "") return errorHandler.handle(pageValidity);
|
|
|
|
|
|
|
|
// Initialize
|
|
|
|
if (urlInput.getValue() !== previousUrl) {
|
|
|
|
progressHandler.handle("Initializing", urlInput.getValue());
|
|
|
|
|
|
|
|
try {
|
|
|
|
const mw = new MediaWiki(urlInput.getValue());
|
|
|
|
mwm = await new MediaWikiManager().init(mw);
|
|
|
|
} catch (error) {
|
|
|
|
errorHandler.handle(error);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
previousUrl = urlInput.getValue();
|
|
|
|
}
|
|
|
|
|
|
|
|
// Discover
|
2020-04-11 19:54:34 +02:00
|
|
|
discoverNetwork(mwm, pageInput.getValue(), progressHandler.handle.bind(progressHandler))
|
2020-04-13 23:09:02 +02:00
|
|
|
.then(({pages, redirects}) => new InterlangNetwork(pages, redirects))
|
|
|
|
.then(network => {
|
2020-04-11 12:25:15 +02:00
|
|
|
progressHandler.handle("Creating table");
|
|
|
|
|
|
|
|
const form = $("#networkTableForm");
|
|
|
|
form.textContent = "";
|
2020-04-13 23:09:02 +02:00
|
|
|
render(html`<${InterlangTable} id="networkTable" network=${network} />`, form);
|
2020-04-11 12:25:15 +02:00
|
|
|
|
|
|
|
progressHandler.handle();
|
|
|
|
})
|
|
|
|
.catch(error => errorHandler.handle(error));
|
|
|
|
};
|
|
|
|
|
|
|
|
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());
|
|
|
|
});
|