console.log("Gateway mode");
function sendRequestToExtension(
requestType,
payload,
timeout = 750
) {
return new Promise((resolve, reject) => {
const requestId = Math.random().toString(36).substring(2, 15); // Generate a unique ID for the request
const detail = {
type: requestType,
payload,
requestId,
timeout: timeout / 1000,
};
// Store the timeout ID so it can be cleared later
const timeoutId = setTimeout(() => {
document.removeEventListener("qortalExtensionResponses", handleResponse);
reject(new Error("Request timed out"));
}, timeout); // Adjust timeout as necessary
function handleResponse(event) {
const { requestId: responseId, data } = event.detail;
if (requestId === responseId) {
// Match the response with the request
document.removeEventListener("qortalExtensionResponses", handleResponse);
clearTimeout(timeoutId); // Clear the timeout upon successful response
resolve(data);
}
}
document.addEventListener("qortalExtensionResponses", handleResponse);
document.dispatchEvent(
new CustomEvent("qortalExtensionRequests", { detail })
);
});
}
const isExtensionInstalledFunc = async () => {
try {
const response = await sendRequestToExtension(
"REQUEST_IS_INSTALLED",
{},
750
);
return response;
} catch (error) {
// not installed
}
};
function qdnGatewayShowModal(message) {
const modalElementId = "qdnGatewayModal";
if (document.getElementById(modalElementId) != null) {
document.body.removeChild(document.getElementById(modalElementId));
}
var modalElement = document.createElement('div');
modalElement.style.cssText = 'position:fixed; z-index:99999; background:#fff; padding:20px; border-radius:5px; font-family:sans-serif; bottom:20px; right:20px; color:#000; max-width:400px; box-shadow:0 3px 10px rgb(0 0 0 / 0.2); font-family:arial; font-weight:normal; font-size:16px;';
modalElement.innerHTML = message + "
";
modalElement.id = modalElementId;
var closeButton = document.createElement('button');
closeButton.style.cssText = 'background-color:#008CBA; border:none; color:white; cursor:pointer; float: right; margin: 10px; padding:15px; border-radius:5px; display:inline-block; text-align:center; text-decoration:none; font-family:arial; font-weight:normal; font-size:16px;';
closeButton.innerText = "Close";
closeButton.addEventListener ("click", function() {
document.body.removeChild(document.getElementById(modalElementId));
});
modalElement.appendChild(closeButton);
var qortalButton = document.createElement('button');
qortalButton.style.cssText = 'background-color:#4CAF50; border:none; color:white; cursor:pointer; float: right; margin: 10px; padding:15px; border-radius:5px; text-align:center; text-decoration:none; display:inline-block; font-family:arial; font-weight:normal; font-size:16px;';
qortalButton.innerText = "Learn more";
qortalButton.addEventListener ("click", function() {
document.body.removeChild(document.getElementById(modalElementId));
window.open("https://qortal.org");
});
modalElement.appendChild(qortalButton);
document.body.appendChild(modalElement);
}
window.addEventListener("message", async (event) => {
if (event == null || event.data == null || event.data.length == 0) {
return;
}
if (event.data.action == null || event.data.requestedHandler == null) {
return;
}
if (event.data.requestedHandler != "UI") {
// Gateway mode only cares about requests that were intended for the UI
return;
}
let response;
let data = event.data;
switch (data.action) {
case "GET_USER_ACCOUNT":
case "PUBLISH_QDN_RESOURCE":
case "PUBLISH_MULTIPLE_QDN_RESOURCES":
case "SEND_CHAT_MESSAGE":
case "JOIN_GROUP":
case "DEPLOY_AT":
case "GET_WALLET_BALANCE":
case "SEND_COIN":
case "GET_LIST_ITEMS":
case "ADD_LIST_ITEMS":
case "DELETE_LIST_ITEM":
const isExtInstalledRes = await isExtensionInstalledFunc()
if(isExtInstalledRes?.version) return;
const errorString = "Interactive features were requested, but these are not yet supported when viewing via a gateway. To use interactive features, please access using the Qortal UI desktop app. More info at: https://qortal.org";
response = "{\"error\": \"" + errorString + "\"}"
const modalText = "This app is powered by the Qortal blockchain. You are viewing in read-only mode. To use interactive features, please access using the Qortal UI desktop app.";
qdnGatewayShowModal(modalText);
break;
default:
console.log('Unhandled gateway message: ' + JSON.stringify(data));
return;
}
handleResponse(event, response);
}, false);