app/dialog.mjs (76 lines of code) (raw):
import { _ } from "util";
export function alert(message) {
if (window.dialogResolve) {
return new Promise((resolve) => resolve(false));
}
reset();
return new Promise((resolve) => {
window.dialogResolve = resolve;
_("#dialog").classList.add("dialog-alert");
_("#dialog-message").textContent = message;
_("#dialog-wrapper").classList.remove("hidden");
});
}
export function prompt(message, value, placeholder) {
if (window.dialogResolve) {
return new Promise((resolve) => resolve(false));
}
reset();
return new Promise((resolve) => {
window.dialogResolve = resolve;
_("#dialog").classList.add("dialog-prompt");
_("#dialog-message").textContent = message;
if (placeholder) {
_("#dialog-input").placeholder = placeholder;
}
if (value === undefined) {
_("#dialog-input").value = "";
} else {
_("#dialog-input").value = value;
_("#dialog-input").select();
}
_("#dialog-wrapper").classList.remove("hidden");
_("#dialog-input").focus();
});
}
export function showSpinner(message) {
if (!_("#dialog-wrapper").classList.contains("hidden")) return;
_("#dialog").classList.add("dialog-spinner");
_("#dialog-message").textContent = message;
_("#dialog-wrapper").classList.remove("hidden");
}
export function hideSpinner() {
reset();
}
function reset() {
_("#dialog-wrapper").classList.add("hidden");
_("#dialog").classList.remove("dialog-alert", "dialog-prompt", "dialog-spinner");
}
export function initUI() {
window.dialogResolve = undefined;
document.addEventListener("keyup", (event) => {
if (_("#dialog-wrapper").classList.contains("hidden")) return;
if (event.key === "Escape") {
_("#dialog-cancel").click();
return;
}
if (event.key === "Enter") {
_("#dialog-ok").click();
return;
}
});
_("#dialog-cancel").addEventListener("click", () => {
_("#dialog-wrapper").classList.add("hidden");
window.dialogResolve(false);
window.dialogResolve = undefined;
});
_("#dialog-ok").addEventListener("click", () => {
_("#dialog-wrapper").classList.add("hidden");
if (_("#dialog").classList.contains("dialog-prompt")) {
window.dialogResolve(_("#dialog-input").value);
} else {
window.dialogResolve(true);
}
window.dialogResolve = undefined;
});
}