49 lines
1.6 KiB
JavaScript
49 lines
1.6 KiB
JavaScript
(() => {
|
|
"use strict";
|
|
|
|
const modalElement = document.getElementById("matrixFrameModal");
|
|
if (!modalElement || !window.bootstrap) {
|
|
return;
|
|
}
|
|
|
|
const frame = modalElement.querySelector("iframe");
|
|
const title = modalElement.querySelector(".modal-title");
|
|
const modal = new bootstrap.Modal(modalElement, { backdrop: "static", keyboard: true });
|
|
let resolveResult;
|
|
let completionMessage = "matrix:user-saved";
|
|
|
|
window.MatrixModal = {
|
|
openFrame(options) {
|
|
title.textContent = options.title;
|
|
frame.src = options.url;
|
|
completionMessage = options.completionMessage || "matrix:user-saved";
|
|
modal.show();
|
|
return new Promise((resolve) => {
|
|
resolveResult = resolve;
|
|
});
|
|
},
|
|
close(result = { status: "cancelled" }) {
|
|
resolveResult?.(result);
|
|
resolveResult = undefined;
|
|
modal.hide();
|
|
}
|
|
};
|
|
|
|
window.addEventListener("message", (event) => {
|
|
if (event.origin !== window.location.origin || event.source !== frame.contentWindow) {
|
|
return;
|
|
}
|
|
if (event.data?.type === completionMessage) {
|
|
window.MatrixModal.close({ status: "saved", value: event.data.value });
|
|
} else if (event.data?.type === "matrix:modal-close") {
|
|
window.MatrixModal.close();
|
|
}
|
|
});
|
|
|
|
modalElement.addEventListener("hidden.bs.modal", () => {
|
|
frame.removeAttribute("src");
|
|
resolveResult?.({ status: "cancelled" });
|
|
resolveResult = undefined;
|
|
});
|
|
})();
|