Qortal-Hub/public/content-script.js
2024-10-14 18:59:42 +03:00

585 lines
16 KiB
JavaScript

async function connection(hostname) {
const isConnected = await chrome.storage.local.get([hostname]);
let connected = false;
if (
isConnected &&
Object.keys(isConnected).length > 0 &&
isConnected[hostname]
) {
connected = true;
}
return connected;
}
// In your content script
document.addEventListener("qortalExtensionRequests", async (event) => {
const { type, payload, requestId, timeout } = event.detail; // Capture the requestId
if (type === "REQUEST_USER_INFO") {
const hostname = window.location.hostname;
const res = await connection(hostname);
if (!res) {
document.dispatchEvent(
new CustomEvent("qortalExtensionResponses", {
detail: {
type: "USER_INFO",
data: {
error: "Not authorized",
},
requestId,
},
})
);
return;
}
chrome?.runtime?.sendMessage({ action: "userInfo" }, (response) => {
if (response.error) {
document.dispatchEvent(
new CustomEvent("qortalExtensionResponses", {
detail: {
type: "USER_INFO",
data: {
error: response.error,
},
requestId,
},
})
);
} else {
// Include the requestId in the detail when dispatching the response
document.dispatchEvent(
new CustomEvent("qortalExtensionResponses", {
detail: { type: "USER_INFO", data: response, requestId },
})
);
}
});
} else if (type === "REQUEST_IS_INSTALLED") {
chrome?.runtime?.sendMessage({ action: "version" }, (response) => {
if (response.error) {
console.error("Error:", response.error);
} else {
// Include the requestId in the detail when dispatching the response
document.dispatchEvent(
new CustomEvent("qortalExtensionResponses", {
detail: { type: "IS_INSTALLED", data: response, requestId },
})
);
}
});
} else if (type === "REQUEST_CONNECTION") {
const hostname = window.location.hostname;
chrome?.runtime?.sendMessage(
{
action: "connection",
payload: {
hostname,
},
timeout,
},
(response) => {
if (response.error) {
console.error("Error:", response.error);
} else {
// Include the requestId in the detail when dispatching the response
document.dispatchEvent(
new CustomEvent("qortalExtensionResponses", {
detail: { type: "CONNECTION", data: response, requestId },
})
);
}
}
);
} else if (type === "REQUEST_OAUTH") {
const hostname = window.location.hostname;
const res = await connection(hostname);
if (!res) {
document.dispatchEvent(
new CustomEvent("qortalExtensionResponses", {
detail: {
type: "OAUTH",
data: {
error: "Not authorized",
},
requestId,
},
})
);
return;
}
chrome?.runtime?.sendMessage(
{
action: "oauth",
payload: {
nodeBaseUrl: payload.nodeBaseUrl,
senderAddress: payload.senderAddress,
senderPublicKey: payload.senderPublicKey,
timestamp: payload.timestamp,
},
},
(response) => {
if (response.error) {
document.dispatchEvent(
new CustomEvent("qortalExtensionResponses", {
detail: {
type: "OAUTH",
data: {
error: response.error,
},
requestId,
},
})
);
} else {
// Include the requestId in the detail when dispatching the response
document.dispatchEvent(
new CustomEvent("qortalExtensionResponses", {
detail: { type: "OAUTH", data: response, requestId },
})
);
}
}
);
} else if (type === "REQUEST_BUY_ORDER") {
const hostname = window.location.hostname;
const res = await connection(hostname);
if (!res) {
document.dispatchEvent(
new CustomEvent("qortalExtensionResponses", {
detail: {
type: "BUY_ORDER",
data: {
error: "Not authorized",
},
requestId,
},
})
);
return;
}
chrome?.runtime?.sendMessage(
{
action: "buyOrder",
payload: {
qortalAtAddresses: payload.qortalAtAddresses,
hostname,
useLocal: payload?.useLocal,
},
timeout,
},
(response) => {
if (response.error) {
document.dispatchEvent(
new CustomEvent("qortalExtensionResponses", {
detail: {
type: "BUY_ORDER",
data: {
error: response.error,
},
requestId,
},
})
);
} else {
// Include the requestId in the detail when dispatching the response
document.dispatchEvent(
new CustomEvent("qortalExtensionResponses", {
detail: { type: "BUY_ORDER", data: response, requestId },
})
);
}
}
);
} else if (type === "REQUEST_LTC_BALANCE") {
const hostname = window.location.hostname;
const res = await connection(hostname);
if (!res) {
document.dispatchEvent(
new CustomEvent("qortalExtensionResponses", {
detail: {
type: "USER_INFO",
data: {
error: "Not authorized",
},
requestId,
},
})
);
return;
}
chrome?.runtime?.sendMessage(
{
action: "ltcBalance",
payload: {
hostname,
},
timeout,
},
(response) => {
if (response.error) {
document.dispatchEvent(
new CustomEvent("qortalExtensionResponses", {
detail: {
type: "LTC_BALANCE",
data: {
error: response.error,
},
requestId,
},
})
);
} else {
// Include the requestId in the detail when dispatching the response
document.dispatchEvent(
new CustomEvent("qortalExtensionResponses", {
detail: { type: "LTC_BALANCE", data: response, requestId },
})
);
}
}
);
} else if (type === "CHECK_IF_LOCAL") {
const hostname = window.location.hostname;
const res = await connection(hostname);
if (!res) {
document.dispatchEvent(
new CustomEvent("qortalExtensionResponses", {
detail: {
type: "USER_INFO",
data: {
error: "Not authorized",
},
requestId,
},
})
);
return;
}
chrome?.runtime?.sendMessage(
{
action: "checkLocal",
payload: {
hostname,
},
timeout,
},
(response) => {
if (response.error) {
document.dispatchEvent(
new CustomEvent("qortalExtensionResponses", {
detail: {
type: "CHECK_IF_LOCAL",
data: {
error: response.error,
},
requestId,
},
})
);
} else {
// Include the requestId in the detail when dispatching the response
document.dispatchEvent(
new CustomEvent("qortalExtensionResponses", {
detail: { type: "CHECK_IF_LOCAL", data: response, requestId },
})
);
}
}
);
} else if (type === "REQUEST_AUTHENTICATION") {
const hostname = window.location.hostname;
const res = await connection(hostname);
if (!res) {
document.dispatchEvent(
new CustomEvent("qortalExtensionResponses", {
detail: {
type: "USER_INFO",
data: {
error: "Not authorized",
},
requestId,
},
})
);
return;
}
chrome?.runtime?.sendMessage(
{
action: "authentication",
payload: {
hostname,
},
timeout,
},
(response) => {
if (response.error) {
document.dispatchEvent(
new CustomEvent("qortalExtensionResponses", {
detail: {
type: "AUTHENTICATION",
data: {
error: response.error,
},
requestId,
},
})
);
} else {
// Include the requestId in the detail when dispatching the response
document.dispatchEvent(
new CustomEvent("qortalExtensionResponses", {
detail: { type: "AUTHENTICATION", data: response, requestId },
})
);
}
}
);
} else if (type === "REQUEST_SEND_QORT") {
const hostname = window.location.hostname;
const res = await connection(hostname);
if (!res) {
document.dispatchEvent(
new CustomEvent("qortalExtensionResponses", {
detail: {
type: "USER_INFO",
data: {
error: "Not authorized",
},
requestId,
},
})
);
return;
}
chrome?.runtime?.sendMessage(
{
action: "sendQort",
payload: {
hostname,
amount: payload.amount,
description: payload.description,
address: payload.address,
},
timeout,
},
(response) => {
if (response.error) {
document.dispatchEvent(
new CustomEvent("qortalExtensionResponses", {
detail: {
type: "SEND_QORT",
data: {
error: response.error,
},
requestId,
},
})
);
} else {
// Include the requestId in the detail when dispatching the response
document.dispatchEvent(
new CustomEvent("qortalExtensionResponses", {
detail: { type: "SEND_QORT", data: response, requestId },
})
);
}
}
);
} else if (type === "REQUEST_CLOSE_POPUP") {
const hostname = window.location.hostname;
const res = await connection(hostname);
if (!res) {
document.dispatchEvent(
new CustomEvent("qortalExtensionResponses", {
detail: {
type: "USER_INFO",
data: {
error: "Not authorized",
},
requestId,
},
})
);
return;
}
chrome?.runtime?.sendMessage({ action: "closePopup" }, (response) => {
if (response.error) {
document.dispatchEvent(
new CustomEvent("qortalExtensionResponses", {
detail: {
type: "CLOSE_POPUP",
data: {
error: response.error,
},
requestId,
},
})
);
} else {
// Include the requestId in the detail when dispatching the response
document.dispatchEvent(
new CustomEvent("qortalExtensionResponses", {
detail: { type: "CLOSE_POPUP", data: true, requestId },
})
);
}
});
}
// Handle other request types as needed...
});
chrome.runtime?.onMessage.addListener(function (message, sender, sendResponse) {
if (message.type === "LOGOUT") {
// Notify the web page
window.postMessage(
{
type: "LOGOUT",
from: "qortal",
},
"*"
);
} else if (message.type === "RESPONSE_FOR_TRADES") {
// Notify the web page
window.postMessage(
{
type: "RESPONSE_FOR_TRADES",
from: "qortal",
payload: message.message,
},
"*"
);
}
});
const lastActionTimestamps = {};
// Function to debounce actions based on message.action
function debounceAction(action, wait = 500) {
const currentTime = Date.now();
// Check if this action has been recently triggered
if (lastActionTimestamps[action] && currentTime - lastActionTimestamps[action] < wait) {
// Ignore this action if it occurred within the debounce time window
return false;
}
// Update the last timestamp for this action
lastActionTimestamps[action] = currentTime;
return true;
}
if (!window.hasAddedQortalListener) {
console.log("Listener added");
window.hasAddedQortalListener = true;
//qortalRequests
const listener = (event) => {
event.preventDefault(); // Prevent default behavior
event.stopImmediatePropagation(); // Stop other listeners from firing
// Verify that the message is from the web page and contains expected data
if (event.source !== window || !event.data || !event.data.action) return;
// // Check if this action should be processed (debounced)
// if (!debounceAction(event.data.action)) {
// console.log(`Debounced action: ${event.data.action}`);
// return;
// }
if(event?.data?.requestedHandler !== 'UI') return
if (event.data.action === "GET_USER_ACCOUNT") {
chrome?.runtime?.sendMessage(
{ action: "GET_USER_ACCOUNT", type: "qortalRequest" },
(response) => {
if (response.error) {
event.ports[0].postMessage({
result: null,
error: response.error,
});
} else {
event.ports[0].postMessage({
result: response,
error: null,
});
}
}
);
} else if (event.data.action === "SEND_COIN") {
chrome?.runtime?.sendMessage(
{ action: "SEND_COIN", type: "qortalRequest", payload: event.data },
(response) => {
if (response.error) {
event.ports[0].postMessage({
result: null,
error: response.error,
});
} else {
event.ports[0].postMessage({
result: response,
error: null,
});
}
}
);
} else if (event.data.action === "ENCRYPT_DATA") {
chrome?.runtime?.sendMessage(
{ action: "ENCRYPT_DATA", type: "qortalRequest", payload: event.data },
(response) => {
if (response.error) {
event.ports[0].postMessage({
result: null,
error: response.error,
});
} else {
event.ports[0].postMessage({
result: response,
error: null,
});
}
}
);
} else if (event.data.action === "DECRYPT_DATA") {
chrome?.runtime?.sendMessage(
{ action: "DECRYPT_DATA", type: "qortalRequest", payload: event.data },
(response) => {
if (response.error) {
event.ports[0].postMessage({
result: null,
error: response.error,
});
} else {
event.ports[0].postMessage({
result: response,
error: null,
});
}
}
);
} else if (event.data.action === "GET_LIST_ITEMS") {
console.log("message", event);
chrome?.runtime?.sendMessage(
{
action: "GET_LIST_ITEMS",
type: "qortalRequest",
payload: event.data,
},
(response) => {
console.log("response", response);
if (response.error) {
event.ports[0].postMessage({
result: null,
error: response.error,
});
} else {
event.ports[0].postMessage({
result: response,
error: null,
});
}
}
);
}
};
window.addEventListener("message", listener);
}