mirror of
https://github.com/Qortal/Qortal-Hub.git
synced 2025-07-24 10:41:24 +00:00
temp replace storage
This commit is contained in:
141
src/App.tsx
141
src/App.tsx
@@ -260,7 +260,7 @@ export const getBaseApiReactSocket = (customApi?: string) => {
|
||||
return groupApiSocket;
|
||||
}
|
||||
};
|
||||
export const isMainWindow = window?.location?.href?.includes("?main=true");
|
||||
export const isMainWindow = true
|
||||
function App() {
|
||||
const [extState, setExtstate] = useState<extStates>("not-authenticated");
|
||||
const [desktopViewMode, setDesktopViewMode] = useState('home')
|
||||
@@ -287,7 +287,7 @@ function App() {
|
||||
const [walletToBeDownloadedPassword, setWalletToBeDownloadedPassword] =
|
||||
useState<string>("");
|
||||
const [isMain, setIsMain] = useState<boolean>(
|
||||
window?.location?.href?.includes("?main=true")
|
||||
true
|
||||
);
|
||||
const isMainRef = useRef(false);
|
||||
const [authenticatePassword, setAuthenticatePassword] = useState<string>("");
|
||||
@@ -495,7 +495,6 @@ function App() {
|
||||
for (const field of requiredFields) {
|
||||
if (!(field in pf)) throw new Error(field + " not found in JSON");
|
||||
}
|
||||
// storeWalletInfo(pf);
|
||||
setRawWallet(pf);
|
||||
// setExtstate("authenticated");
|
||||
setExtstate("wallet-dropped");
|
||||
@@ -529,26 +528,7 @@ function App() {
|
||||
};
|
||||
};
|
||||
|
||||
const storeWalletInfo = (wallet: any) => {
|
||||
chrome?.runtime?.sendMessage(
|
||||
{ action: "storeWalletInfo", wallet },
|
||||
(response) => {
|
||||
if (response) {
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
chrome.tabs.query(
|
||||
{ active: true, currentWindow: true },
|
||||
function (tabs: any[]) {
|
||||
chrome.tabs.sendMessage(
|
||||
tabs[0].id,
|
||||
{ from: "popup", subject: "anySubject" },
|
||||
function (response) {}
|
||||
);
|
||||
}
|
||||
);
|
||||
};
|
||||
|
||||
|
||||
const getBalanceFunc = () => {
|
||||
setQortBalanceLoading(true);
|
||||
@@ -755,126 +735,29 @@ function App() {
|
||||
|
||||
//param = isDecline
|
||||
const confirmPayment = (isDecline: boolean) => {
|
||||
if (isDecline) {
|
||||
chrome?.runtime?.sendMessage(
|
||||
{
|
||||
action: "sendQortConfirmation",
|
||||
payload: {
|
||||
amount: sendqortState?.amount,
|
||||
receiver: sendqortState?.address,
|
||||
password: paymentPassword,
|
||||
interactionId: sendqortState?.interactionId,
|
||||
isDecline: true,
|
||||
},
|
||||
},
|
||||
(response) => {
|
||||
if (response) {
|
||||
setSendPaymentSuccess("Payment successfully sent");
|
||||
} else {
|
||||
window.close();
|
||||
}
|
||||
}
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
setIsLoading(true);
|
||||
chrome?.runtime?.sendMessage(
|
||||
{
|
||||
action: "sendQortConfirmation",
|
||||
payload: {
|
||||
amount: sendqortState.amount,
|
||||
receiver: sendqortState.address,
|
||||
password: paymentPassword,
|
||||
interactionId: sendqortState.interactionId,
|
||||
isDecline: false,
|
||||
},
|
||||
},
|
||||
(response) => {
|
||||
if (response === true) {
|
||||
setExtstate("transfer-success-request");
|
||||
setCountdown(null);
|
||||
} else {
|
||||
setSendPaymentError(
|
||||
response?.error || "Unable to perform payment. Please try again."
|
||||
);
|
||||
}
|
||||
setIsLoading(false);
|
||||
}
|
||||
);
|
||||
// REMOVED FOR MOBILE APP
|
||||
};
|
||||
|
||||
const confirmBuyOrder = (isDecline: boolean) => {
|
||||
if (isDecline) {
|
||||
chrome?.runtime?.sendMessage(
|
||||
{
|
||||
action: "buyOrderConfirmation",
|
||||
payload: {
|
||||
crosschainAtInfo: requestBuyOrder?.crosschainAtInfo,
|
||||
interactionId: requestBuyOrder?.interactionId,
|
||||
isDecline: true,
|
||||
useLocal: requestBuyOrder?.useLocal,
|
||||
},
|
||||
},
|
||||
(response) => {
|
||||
window.close();
|
||||
}
|
||||
);
|
||||
return;
|
||||
}
|
||||
// REMOVED FOR MOBILE APP
|
||||
|
||||
setIsLoading(true);
|
||||
chrome?.runtime?.sendMessage(
|
||||
{
|
||||
action: "buyOrderConfirmation",
|
||||
payload: {
|
||||
crosschainAtInfo: requestBuyOrder?.crosschainAtInfo,
|
||||
interactionId: requestBuyOrder?.interactionId,
|
||||
isDecline: false,
|
||||
useLocal: requestBuyOrder?.useLocal,
|
||||
},
|
||||
},
|
||||
(response) => {
|
||||
if (response === true) {
|
||||
setExtstate("buy-order-submitted");
|
||||
setCountdown(null);
|
||||
} else {
|
||||
setSendPaymentError(
|
||||
response?.error || "Unable to perform payment. Please try again."
|
||||
);
|
||||
}
|
||||
setIsLoading(false);
|
||||
}
|
||||
);
|
||||
};
|
||||
const responseToConnectionRequest = (
|
||||
isOkay: boolean,
|
||||
hostname: string,
|
||||
interactionId: string
|
||||
) => {
|
||||
chrome?.runtime?.sendMessage(
|
||||
{
|
||||
action: "responseToConnectionRequest",
|
||||
payload: { isOkay, hostname, interactionId },
|
||||
},
|
||||
(response) => {
|
||||
if (response === false || response === true) {
|
||||
window.close();
|
||||
}
|
||||
}
|
||||
);
|
||||
// REMOVED FOR MOBILE APP
|
||||
};
|
||||
|
||||
// const rawWalletRef = useRef(null)
|
||||
|
||||
// useEffect(()=> {
|
||||
// rawWalletRef.current = rawWallet
|
||||
// }, [rawWallet])
|
||||
|
||||
useEffect(() => {
|
||||
try {
|
||||
setIsLoading(true);
|
||||
chrome?.runtime?.sendMessage({ action: "getWalletInfo" }, (response) => {
|
||||
|
||||
window.sendMessage("getWalletInfo")
|
||||
.then((response) => {
|
||||
console.log('getwalll', response)
|
||||
if (response && response?.walletInfo) {
|
||||
setRawWallet(response?.walletInfo);
|
||||
if (
|
||||
@@ -886,6 +769,9 @@ function App() {
|
||||
|
||||
setExtstate("authenticated");
|
||||
}
|
||||
})
|
||||
.catch((error) => {
|
||||
console.error("Failed to get wallet info:", error);
|
||||
});
|
||||
} catch (error) {
|
||||
} finally {
|
||||
@@ -1120,6 +1006,7 @@ function App() {
|
||||
wallet: rawWallet,
|
||||
})
|
||||
.then((response) => {
|
||||
console.log('response2', response)
|
||||
if (response && !response.error) {
|
||||
setAuthenticatePassword("");
|
||||
setExtstate("authenticated");
|
||||
|
@@ -22,7 +22,9 @@ import { CustomizedSnackbars } from "../components/Snackbar/Snackbar";
|
||||
import { set } from "lodash";
|
||||
import { cleanUrl, isUsingLocal } from "../background";
|
||||
|
||||
const manifestData = chrome?.runtime?.getManifest();
|
||||
const manifestData = {
|
||||
version: '2.2.0'
|
||||
}
|
||||
|
||||
export const NotAuthenticated = ({
|
||||
getRootProps,
|
||||
@@ -69,6 +71,7 @@ export const NotAuthenticated = ({
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
const checkIfUserHasLocalNode = useCallback(async () => {
|
||||
try {
|
||||
const url = `http://127.0.0.1:12391/admin/status`;
|
||||
|
@@ -53,6 +53,7 @@ import {
|
||||
import { decryptGroupEncryption, encryptAndPublishSymmetricKeyGroupChat, publishGroupEncryptedResource, publishOnQDN } from "./backgroundFunctions/encryption";
|
||||
import { PUBLIC_NOTIFICATION_CODE_FIRST_SECRET_KEY } from "./constants/codes";
|
||||
import { encryptSingle } from "./qdn/encryption/group-encryption";
|
||||
import { getData, storeData } from "./utils/chromeStorage";
|
||||
|
||||
export function versionCase(request, event) {
|
||||
event.source.postMessage(
|
||||
@@ -70,15 +71,42 @@ export async function getWalletInfoCase(request, event) {
|
||||
try {
|
||||
const response = await getKeyPair();
|
||||
|
||||
event.source.postMessage(
|
||||
{
|
||||
requestId: request.requestId,
|
||||
action: "getWalletInfo",
|
||||
payload: { walletInfo: response },
|
||||
type: "backgroundMessageResponse",
|
||||
},
|
||||
event.origin
|
||||
);
|
||||
try {
|
||||
const walletInfo = await getData('walletInfo').catch((error)=> null)
|
||||
if(walletInfo){
|
||||
event.source.postMessage(
|
||||
{
|
||||
requestId: request.requestId,
|
||||
action: "getWalletInfo",
|
||||
payload: { walletInfo },
|
||||
type: "backgroundMessageResponse",
|
||||
},
|
||||
event.origin
|
||||
);
|
||||
} else {
|
||||
event.source.postMessage(
|
||||
{
|
||||
requestId: request.requestId,
|
||||
action: "getWalletInfo",
|
||||
error: "No wallet info found",
|
||||
type: "backgroundMessageResponse",
|
||||
},
|
||||
event.origin
|
||||
);
|
||||
}
|
||||
|
||||
} catch (error) {
|
||||
event.source.postMessage(
|
||||
{
|
||||
requestId: request.requestId,
|
||||
action: "getWalletInfo",
|
||||
error: "No wallet info found",
|
||||
type: "backgroundMessageResponse",
|
||||
},
|
||||
event.origin
|
||||
);
|
||||
}
|
||||
|
||||
} catch (error) {
|
||||
event.source.postMessage(
|
||||
{
|
||||
@@ -171,10 +199,12 @@ export async function userInfoCase(request, event) {
|
||||
}
|
||||
|
||||
export async function decryptWalletCase(request, event) {
|
||||
try {
|
||||
try {
|
||||
console.log('request', request)
|
||||
const { password, wallet } = request.payload;
|
||||
const response = await decryptWallet(password, wallet, walletVersion);
|
||||
|
||||
console.log({password, wallet})
|
||||
const response = await decryptWallet({password, wallet, walletVersion});
|
||||
console.log('response', response)
|
||||
event.source.postMessage(
|
||||
{
|
||||
requestId: request.requestId,
|
||||
@@ -841,10 +871,7 @@ export async function addTimestampEnterChatCase(request, event) {
|
||||
export async function setApiKeyCase(request, event) {
|
||||
try {
|
||||
const payload = request.payload;
|
||||
chrome.storage.local.set({ apiKey: payload }, () => {
|
||||
// sendResponse(true);
|
||||
});
|
||||
|
||||
storeData('apiKey', payload)
|
||||
event.source.postMessage(
|
||||
{
|
||||
requestId: request.requestId,
|
||||
@@ -869,9 +896,7 @@ export async function setApiKeyCase(request, event) {
|
||||
export async function setCustomNodesCase(request, event) {
|
||||
try {
|
||||
const nodes = request.payload;
|
||||
chrome.storage.local.set({ customNodes: nodes }, () => {
|
||||
// sendResponse(true);
|
||||
});
|
||||
storeData('customNodes', nodes)
|
||||
|
||||
event.source.postMessage(
|
||||
{
|
||||
@@ -1346,8 +1371,9 @@ export async function publishGroupEncryptedResourceCase(request, event) {
|
||||
export async function decryptGroupEncryptionCase(request, event) {
|
||||
try {
|
||||
const { data} = request.payload;
|
||||
console.log('data', data)
|
||||
const response = await decryptGroupEncryption({ data });
|
||||
|
||||
console.log('dataresponse', response)
|
||||
event.source.postMessage(
|
||||
{
|
||||
requestId: request.requestId,
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,7 @@
|
||||
import { getBaseApi } from "../background";
|
||||
import { createSymmetricKeyAndNonce, decryptGroupData, encryptDataGroup, objectToBase64 } from "../qdn/encryption/group-encryption";
|
||||
import { publishData } from "../qdn/publish/pubish";
|
||||
import { getData } from "../utils/chromeStorage";
|
||||
|
||||
const apiEndpoints = [
|
||||
"https://api.qortal.org",
|
||||
@@ -36,9 +37,10 @@ async function findUsableApi() {
|
||||
|
||||
|
||||
async function getSaveWallet() {
|
||||
const res = await chrome.storage.local.get(["walletInfo"]);
|
||||
if (res?.walletInfo) {
|
||||
return res.walletInfo;
|
||||
const res = await getData<any>("walletInfo").catch(() => null);
|
||||
|
||||
if (res) {
|
||||
return res
|
||||
} else {
|
||||
throw new Error("No wallet saved");
|
||||
}
|
||||
@@ -56,9 +58,9 @@ export async function getNameInfo() {
|
||||
}
|
||||
}
|
||||
async function getKeyPair() {
|
||||
const res = await chrome.storage.local.get(["keyPair"]);
|
||||
if (res?.keyPair) {
|
||||
return res.keyPair;
|
||||
const res = await getData<any>("keyPair").catch(() => null);
|
||||
if (res) {
|
||||
return res
|
||||
} else {
|
||||
throw new Error("Wallet not authenticated");
|
||||
}
|
||||
@@ -98,7 +100,7 @@ export const encryptAndPublishSymmetricKeyGroupChat = async ({groupId, previousD
|
||||
}
|
||||
|
||||
const resKeyPair = await getKeyPair()
|
||||
const parsedData = JSON.parse(resKeyPair)
|
||||
const parsedData = resKeyPair
|
||||
const privateKey = parsedData.privateKey
|
||||
const userPublicKey = parsedData.publicKey
|
||||
const groupmemberPublicKeys = await getPublicKeys(groupId)
|
||||
@@ -219,7 +221,7 @@ export const decryptGroupEncryption = async ({data}: {
|
||||
}) => {
|
||||
try {
|
||||
const resKeyPair = await getKeyPair()
|
||||
const parsedData = JSON.parse(resKeyPair)
|
||||
const parsedData = resKeyPair
|
||||
const privateKey = parsedData.privateKey
|
||||
const encryptedData = decryptGroupData(
|
||||
data,
|
||||
|
@@ -118,32 +118,32 @@ export const AppRating = ({ app, myName, ratingCountPosition = "right" }) => {
|
||||
const pollName = `app-library-${app.service}-rating-${app.name}`;
|
||||
const pollOptions = [`1, 2, 3, 4, 5, initialValue-${newValue}`];
|
||||
await new Promise((res, rej) => {
|
||||
chrome?.runtime?.sendMessage(
|
||||
{
|
||||
action: "CREATE_POLL",
|
||||
type: "qortalRequest",
|
||||
payload: {
|
||||
pollName: pollName,
|
||||
pollDescription: `Rating for ${app.service} ${app.name}`,
|
||||
pollOptions: pollOptions,
|
||||
pollOwnerAddress: myName,
|
||||
},
|
||||
window.sendMessage("CREATE_POLL", {
|
||||
payload: {
|
||||
pollName: pollName,
|
||||
pollDescription: `Rating for ${app.service} ${app.name}`,
|
||||
pollOptions: pollOptions,
|
||||
pollOwnerAddress: myName,
|
||||
},
|
||||
(response) => {
|
||||
if (response.error) {
|
||||
rej(response?.message);
|
||||
return;
|
||||
} else {
|
||||
res(response);
|
||||
setInfoSnack({
|
||||
type: "success",
|
||||
message:
|
||||
"Successfully rated. Please wait a couple minutes for the network to propogate the changes.",
|
||||
});
|
||||
setOpenSnack(true);
|
||||
}
|
||||
}, 60000)
|
||||
.then((response) => {
|
||||
if (response.error) {
|
||||
rej(response?.message);
|
||||
return;
|
||||
} else {
|
||||
res(response);
|
||||
setInfoSnack({
|
||||
type: "success",
|
||||
message:
|
||||
"Successfully rated. Please wait a couple minutes for the network to propogate the changes.",
|
||||
});
|
||||
setOpenSnack(true);
|
||||
}
|
||||
);
|
||||
})
|
||||
.catch((error) => {
|
||||
console.error("Failed qortalRequest", error);
|
||||
});
|
||||
|
||||
});
|
||||
} else {
|
||||
const pollName = `app-library-${app.service}-rating-${app.name}`;
|
||||
@@ -153,30 +153,30 @@ export const AppRating = ({ app, myName, ratingCountPosition = "right" }) => {
|
||||
if (isNaN(optionIndex) || optionIndex === -1)
|
||||
throw new Error("Cannot find rating option");
|
||||
await new Promise((res, rej) => {
|
||||
chrome?.runtime?.sendMessage(
|
||||
{
|
||||
action: "VOTE_ON_POLL",
|
||||
type: "qortalRequest",
|
||||
payload: {
|
||||
pollName: pollName,
|
||||
optionIndex,
|
||||
},
|
||||
window.sendMessage("VOTE_ON_POLL", {
|
||||
payload: {
|
||||
pollName: pollName,
|
||||
optionIndex,
|
||||
},
|
||||
(response) => {
|
||||
if (response.error) {
|
||||
rej(response?.message);
|
||||
return;
|
||||
} else {
|
||||
res(response);
|
||||
setInfoSnack({
|
||||
type: "success",
|
||||
message:
|
||||
"Successfully rated. Please wait a couple minutes for the network to propogate the changes.",
|
||||
});
|
||||
setOpenSnack(true);
|
||||
}
|
||||
}, 60000)
|
||||
.then((response) => {
|
||||
if (response.error) {
|
||||
rej(response?.message);
|
||||
return;
|
||||
} else {
|
||||
res(response);
|
||||
setInfoSnack({
|
||||
type: "success",
|
||||
message:
|
||||
"Successfully rated. Please wait a couple minutes for the network to propogate the changes.",
|
||||
});
|
||||
setOpenSnack(true);
|
||||
}
|
||||
);
|
||||
})
|
||||
.catch((error) => {
|
||||
console.error("Failed qortalRequest", error);
|
||||
});
|
||||
|
||||
});
|
||||
}
|
||||
} catch (error) {
|
||||
|
@@ -368,7 +368,8 @@ isDOMContentLoaded: false
|
||||
if (event?.data?.requestedHandler !== 'UI') return;
|
||||
|
||||
const sendMessageToRuntime = (message, eventPort) => {
|
||||
chrome?.runtime?.sendMessage(message, (response) => {
|
||||
window.sendMessage(message.action, message, 60000, message.isFromExtension)
|
||||
.then((response) => {
|
||||
if (response.error) {
|
||||
eventPort.postMessage({
|
||||
result: null,
|
||||
@@ -380,7 +381,11 @@ isDOMContentLoaded: false
|
||||
error: null,
|
||||
});
|
||||
}
|
||||
})
|
||||
.catch((error) => {
|
||||
console.error("Failed qortalRequest", error);
|
||||
});
|
||||
|
||||
};
|
||||
|
||||
// Check if action is included in the predefined list of UI requests
|
||||
|
@@ -126,7 +126,7 @@ const timeDifferenceForNotificationChats = 900000;
|
||||
export const requestQueueMemberNames = new RequestQueueWithPromise(5);
|
||||
export const requestQueueAdminMemberNames = new RequestQueueWithPromise(5);
|
||||
|
||||
const audio = new Audio(chrome.runtime?.getURL("msg-not1.wav"));
|
||||
// const audio = new Audio(chrome.runtime?.getURL("msg-not1.wav"));
|
||||
|
||||
export const getGroupAdminsAddress = async (groupNumber: number) => {
|
||||
// const validApi = await findUsableApi();
|
||||
@@ -203,6 +203,7 @@ export const decryptResource = async (data: string) => {
|
||||
data,
|
||||
})
|
||||
.then((response) => {
|
||||
console.log('decryptseroucs', response)
|
||||
if (!response?.error) {
|
||||
res(response);
|
||||
return;
|
||||
@@ -892,78 +893,89 @@ export const Group = ({
|
||||
|
||||
|
||||
useEffect(() => {
|
||||
// Listen for messages from the background script
|
||||
chrome?.runtime?.onMessage.addListener((message, sender, sendResponse) => {
|
||||
if (message.action === "SET_GROUPS") {
|
||||
// Handler function for incoming messages
|
||||
const messageHandler = (event) => {
|
||||
const message = event.data;
|
||||
|
||||
if (message?.action === "SET_GROUPS") {
|
||||
// Update the component state with the received 'sendqort' state
|
||||
setGroups(message.payload);
|
||||
getLatestRegularChat(message.payload)
|
||||
getLatestRegularChat(message.payload);
|
||||
setMemberGroups(message.payload);
|
||||
|
||||
|
||||
if (selectedGroupRef.current && groupSectionRef.current === "chat") {
|
||||
window.sendMessage("addTimestampEnterChat", {
|
||||
timestamp: Date.now(),
|
||||
groupId: selectedGroupRef.current.groupId,
|
||||
}).catch((error) => {
|
||||
console.error("Failed to add timestamp:", error.message || "An error occurred");
|
||||
});
|
||||
|
||||
console.error("Failed to add timestamp:", error.message || "An error occurred");
|
||||
});
|
||||
}
|
||||
|
||||
if (selectedDirectRef.current) {
|
||||
window.sendMessage("addTimestampEnterChat", {
|
||||
timestamp: Date.now(),
|
||||
groupId: selectedDirectRef.current.address,
|
||||
}).catch((error) => {
|
||||
console.error("Failed to add timestamp:", error.message || "An error occurred");
|
||||
});
|
||||
|
||||
console.error("Failed to add timestamp:", error.message || "An error occurred");
|
||||
});
|
||||
}
|
||||
|
||||
setTimeout(() => {
|
||||
getTimestampEnterChat();
|
||||
}, 200);
|
||||
}
|
||||
if (message.action === "SET_GROUP_ANNOUNCEMENTS") {
|
||||
|
||||
if (message?.action === "SET_GROUP_ANNOUNCEMENTS") {
|
||||
// Update the component state with the received 'sendqort' state
|
||||
setGroupAnnouncements(message.payload);
|
||||
|
||||
if (
|
||||
selectedGroupRef.current &&
|
||||
groupSectionRef.current === "announcement"
|
||||
) {
|
||||
|
||||
if (selectedGroupRef.current && groupSectionRef.current === "announcement") {
|
||||
window.sendMessage("addGroupNotificationTimestamp", {
|
||||
timestamp: Date.now(),
|
||||
groupId: selectedGroupRef.current.groupId,
|
||||
}).catch((error) => {
|
||||
console.error("Failed to add group notification timestamp:", error.message || "An error occurred");
|
||||
});
|
||||
|
||||
console.error("Failed to add group notification timestamp:", error.message || "An error occurred");
|
||||
});
|
||||
|
||||
setTimeout(() => {
|
||||
getGroupAnnouncements();
|
||||
}, 200);
|
||||
}
|
||||
}
|
||||
if (message.action === "SET_DIRECTS") {
|
||||
|
||||
if (message?.action === "SET_DIRECTS") {
|
||||
// Update the component state with the received 'sendqort' state
|
||||
setDirects(message.payload);
|
||||
|
||||
|
||||
} else if (message.action === "PLAY_NOTIFICATION_SOUND") {
|
||||
audio.play();
|
||||
} else if (message?.action === "PLAY_NOTIFICATION_SOUND") {
|
||||
// audio.play();
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
// Attach the event listener
|
||||
window.addEventListener("message", messageHandler);
|
||||
|
||||
// Clean up the event listener on component unmount
|
||||
return () => {
|
||||
window.removeEventListener("message", messageHandler);
|
||||
};
|
||||
}, []);
|
||||
|
||||
|
||||
useEffect(() => {
|
||||
if (
|
||||
!myAddress ||
|
||||
hasInitializedWebsocket.current ||
|
||||
!window?.location?.href?.includes("?main=true") ||
|
||||
!groups ||
|
||||
groups?.length === 0
|
||||
)
|
||||
return;
|
||||
|
||||
chrome?.runtime?.sendMessage({ action: "setupGroupWebsocket" });
|
||||
window.sendMessage("setupGroupWebsocket", {})
|
||||
.catch((error) => {
|
||||
console.error("Failed to setup group websocket:", error.message || "An error occurred");
|
||||
});
|
||||
|
||||
|
||||
hasInitializedWebsocket.current = true;
|
||||
}, [myAddress, groups]);
|
||||
|
@@ -18,7 +18,7 @@ export const WebSocketActive = ({ myAddress, setIsLoadingGroups }) => {
|
||||
|
||||
useEffect(() => {
|
||||
if (!myAddress) return; // Only proceed if myAddress is set
|
||||
if (!window?.location?.href?.includes("?main=true")) return;
|
||||
|
||||
|
||||
const pingHeads = () => {
|
||||
try {
|
||||
|
@@ -1,97 +1,121 @@
|
||||
import React, { useContext, useEffect, useMemo, useState } from 'react'
|
||||
import { useRecoilState, useSetRecoilState } from 'recoil';
|
||||
import isEqual from 'lodash/isEqual'; // Import deep comparison utility
|
||||
import { canSaveSettingToQdnAtom, hasSettingsChangedAtom, oldPinnedAppsAtom, settingsLocalLastUpdatedAtom, settingsQDNLastUpdatedAtom, sortablePinnedAppsAtom } from '../../atoms/global';
|
||||
import { ButtonBase } from '@mui/material';
|
||||
import { objectToBase64 } from '../../qdn/encryption/group-encryption';
|
||||
import { MyContext } from '../../App';
|
||||
import { getFee } from '../../background';
|
||||
import { CustomizedSnackbars } from '../Snackbar/Snackbar';
|
||||
import { SaveIcon } from '../../assets/svgs/SaveIcon';
|
||||
import { IconWrapper } from '../Desktop/DesktopFooter';
|
||||
export const Save = ({isDesktop}) => {
|
||||
const [pinnedApps, setPinnedApps] = useRecoilState(sortablePinnedAppsAtom);
|
||||
const [settingsQdnLastUpdated, setSettingsQdnLastUpdated] = useRecoilState(settingsQDNLastUpdatedAtom);
|
||||
const [settingsLocalLastUpdated] = useRecoilState(settingsLocalLastUpdatedAtom);
|
||||
const setHasSettingsChangedAtom = useSetRecoilState(hasSettingsChangedAtom);
|
||||
import React, { useContext, useEffect, useMemo, useState } from "react";
|
||||
import { useRecoilState, useSetRecoilState } from "recoil";
|
||||
import isEqual from "lodash/isEqual"; // Import deep comparison utility
|
||||
import {
|
||||
canSaveSettingToQdnAtom,
|
||||
hasSettingsChangedAtom,
|
||||
oldPinnedAppsAtom,
|
||||
settingsLocalLastUpdatedAtom,
|
||||
settingsQDNLastUpdatedAtom,
|
||||
sortablePinnedAppsAtom,
|
||||
} from "../../atoms/global";
|
||||
import { ButtonBase } from "@mui/material";
|
||||
import { objectToBase64 } from "../../qdn/encryption/group-encryption";
|
||||
import { MyContext } from "../../App";
|
||||
import { getFee } from "../../background";
|
||||
import { CustomizedSnackbars } from "../Snackbar/Snackbar";
|
||||
import { SaveIcon } from "../../assets/svgs/SaveIcon";
|
||||
import { IconWrapper } from "../Desktop/DesktopFooter";
|
||||
export const Save = ({ isDesktop }) => {
|
||||
const [pinnedApps, setPinnedApps] = useRecoilState(sortablePinnedAppsAtom);
|
||||
const [settingsQdnLastUpdated, setSettingsQdnLastUpdated] = useRecoilState(
|
||||
settingsQDNLastUpdatedAtom
|
||||
);
|
||||
const [settingsLocalLastUpdated] = useRecoilState(
|
||||
settingsLocalLastUpdatedAtom
|
||||
);
|
||||
const setHasSettingsChangedAtom = useSetRecoilState(hasSettingsChangedAtom);
|
||||
|
||||
const [canSave] = useRecoilState(canSaveSettingToQdnAtom);
|
||||
const [openSnack, setOpenSnack] = useState(false);
|
||||
const [isLoading, setIsLoading] = useState(false)
|
||||
const [canSave] = useRecoilState(canSaveSettingToQdnAtom);
|
||||
const [openSnack, setOpenSnack] = useState(false);
|
||||
const [isLoading, setIsLoading] = useState(false);
|
||||
const [infoSnack, setInfoSnack] = useState(null);
|
||||
const [oldPinnedApps, setOldPinnedApps] = useRecoilState(oldPinnedAppsAtom)
|
||||
const [oldPinnedApps, setOldPinnedApps] = useRecoilState(oldPinnedAppsAtom);
|
||||
|
||||
const { show } = useContext(MyContext);
|
||||
const { show } = useContext(MyContext);
|
||||
|
||||
const hasChanged = useMemo(()=> {
|
||||
const newChanges = {
|
||||
sortablePinnedApps: pinnedApps.map((item)=> {
|
||||
const hasChanged = useMemo(() => {
|
||||
const newChanges = {
|
||||
sortablePinnedApps: pinnedApps.map((item) => {
|
||||
return {
|
||||
name: item?.name,
|
||||
service: item?.service,
|
||||
};
|
||||
}),
|
||||
};
|
||||
const oldChanges = {
|
||||
sortablePinnedApps: oldPinnedApps.map((item) => {
|
||||
return {
|
||||
name: item?.name,
|
||||
service: item?.service,
|
||||
};
|
||||
}),
|
||||
};
|
||||
if (settingsQdnLastUpdated === -100) return false;
|
||||
return (
|
||||
!isEqual(oldChanges, newChanges) &&
|
||||
settingsQdnLastUpdated < settingsLocalLastUpdated
|
||||
);
|
||||
}, [
|
||||
oldPinnedApps,
|
||||
pinnedApps,
|
||||
settingsQdnLastUpdated,
|
||||
settingsLocalLastUpdated,
|
||||
]);
|
||||
|
||||
useEffect(() => {
|
||||
setHasSettingsChangedAtom(hasChanged);
|
||||
}, [hasChanged]);
|
||||
|
||||
const saveToQdn = async () => {
|
||||
try {
|
||||
setIsLoading(true);
|
||||
const data64 = await objectToBase64({
|
||||
sortablePinnedApps: pinnedApps.map((item) => {
|
||||
return {
|
||||
name: item?.name,
|
||||
service: item?.service
|
||||
}
|
||||
})
|
||||
}
|
||||
const oldChanges = {
|
||||
sortablePinnedApps: oldPinnedApps.map((item)=> {
|
||||
return {
|
||||
name: item?.name,
|
||||
service: item?.service
|
||||
}
|
||||
})
|
||||
}
|
||||
if(settingsQdnLastUpdated === -100) return false
|
||||
return !isEqual(oldChanges, newChanges) && settingsQdnLastUpdated < settingsLocalLastUpdated
|
||||
}, [oldPinnedApps, pinnedApps, settingsQdnLastUpdated, settingsLocalLastUpdated])
|
||||
|
||||
useEffect(()=> {
|
||||
setHasSettingsChangedAtom(hasChanged)
|
||||
}, [hasChanged])
|
||||
|
||||
const saveToQdn = async ()=> {
|
||||
try {
|
||||
setIsLoading(true)
|
||||
const data64 = await objectToBase64({
|
||||
sortablePinnedApps: pinnedApps.map((item)=> {
|
||||
return {
|
||||
name: item?.name,
|
||||
service: item?.service
|
||||
}
|
||||
})
|
||||
})
|
||||
const encryptData = await new Promise((res, rej) => {
|
||||
chrome?.runtime?.sendMessage(
|
||||
service: item?.service,
|
||||
};
|
||||
}),
|
||||
});
|
||||
const encryptData = await new Promise((res, rej) => {
|
||||
window
|
||||
.sendMessage(
|
||||
"ENCRYPT_DATA",
|
||||
{
|
||||
action: "ENCRYPT_DATA",
|
||||
type: "qortalRequest",
|
||||
payload: {
|
||||
data64
|
||||
data64,
|
||||
},
|
||||
},
|
||||
(response) => {
|
||||
if (response.error) {
|
||||
rej(response?.message);
|
||||
return;
|
||||
} else {
|
||||
res(response);
|
||||
|
||||
}
|
||||
60000
|
||||
)
|
||||
.then((response) => {
|
||||
if (response.error) {
|
||||
rej(response?.message);
|
||||
return;
|
||||
} else {
|
||||
res(response);
|
||||
}
|
||||
);
|
||||
});
|
||||
if(encryptData && !encryptData?.error){
|
||||
const fee = await getFee('ARBITRARY')
|
||||
})
|
||||
.catch((error) => {
|
||||
console.error("Failed qortalRequest", error);
|
||||
});
|
||||
});
|
||||
if (encryptData && !encryptData?.error) {
|
||||
const fee = await getFee("ARBITRARY");
|
||||
|
||||
await show({
|
||||
message: "Would you like to publish your settings to QDN (encrypted) ?" ,
|
||||
publishFee: fee.fee + ' QORT'
|
||||
})
|
||||
const response = await new Promise((res, rej) => {
|
||||
window.sendMessage("publishOnQDN", {
|
||||
data: encryptData,
|
||||
identifier: "ext_saved_settings",
|
||||
service: "DOCUMENT_PRIVATE",
|
||||
})
|
||||
await show({
|
||||
message:
|
||||
"Would you like to publish your settings to QDN (encrypted) ?",
|
||||
publishFee: fee.fee + " QORT",
|
||||
});
|
||||
const response = await new Promise((res, rej) => {
|
||||
window
|
||||
.sendMessage("publishOnQDN", {
|
||||
data: encryptData,
|
||||
identifier: "ext_saved_settings",
|
||||
service: "DOCUMENT_PRIVATE",
|
||||
})
|
||||
.then((response) => {
|
||||
if (!response?.error) {
|
||||
res(response);
|
||||
@@ -102,51 +126,67 @@ export const Save = ({isDesktop}) => {
|
||||
.catch((error) => {
|
||||
rej(error.message || "An error occurred");
|
||||
});
|
||||
|
||||
});
|
||||
if(response?.identifier){
|
||||
setOldPinnedApps(pinnedApps)
|
||||
setSettingsQdnLastUpdated(Date.now())
|
||||
setInfoSnack({
|
||||
type: "success",
|
||||
message:
|
||||
"Sucessfully published to QDN",
|
||||
});
|
||||
setOpenSnack(true);
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
setInfoSnack({
|
||||
type: "error",
|
||||
message:
|
||||
error?.message || "Unable to save to QDN",
|
||||
});
|
||||
setOpenSnack(true);
|
||||
} finally {
|
||||
setIsLoading(false)
|
||||
if (response?.identifier) {
|
||||
setOldPinnedApps(pinnedApps);
|
||||
setSettingsQdnLastUpdated(Date.now());
|
||||
setInfoSnack({
|
||||
type: "success",
|
||||
message: "Sucessfully published to QDN",
|
||||
});
|
||||
setOpenSnack(true);
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
setInfoSnack({
|
||||
type: "error",
|
||||
message: error?.message || "Unable to save to QDN",
|
||||
});
|
||||
setOpenSnack(true);
|
||||
} finally {
|
||||
setIsLoading(false);
|
||||
}
|
||||
};
|
||||
return (
|
||||
<>
|
||||
<ButtonBase onClick={saveToQdn} disabled={!hasChanged || !canSave || isLoading || settingsQdnLastUpdated === -100}>
|
||||
{isDesktop ? (
|
||||
<ButtonBase
|
||||
onClick={saveToQdn}
|
||||
disabled={
|
||||
!hasChanged ||
|
||||
!canSave ||
|
||||
isLoading ||
|
||||
settingsQdnLastUpdated === -100
|
||||
}
|
||||
>
|
||||
{isDesktop ? (
|
||||
<IconWrapper
|
||||
color="rgba(250, 250, 250, 0.5)"
|
||||
label="Save"
|
||||
selected={false}
|
||||
>
|
||||
<SaveIcon
|
||||
color={settingsQdnLastUpdated === -100 ? '#8F8F91' : (hasChanged && !isLoading) ? '#5EB049' : '#8F8F91'}
|
||||
/>
|
||||
color="rgba(250, 250, 250, 0.5)"
|
||||
label="Save"
|
||||
selected={false}
|
||||
>
|
||||
<SaveIcon
|
||||
color={
|
||||
settingsQdnLastUpdated === -100
|
||||
? "#8F8F91"
|
||||
: hasChanged && !isLoading
|
||||
? "#5EB049"
|
||||
: "#8F8F91"
|
||||
}
|
||||
/>
|
||||
</IconWrapper>
|
||||
) : (
|
||||
<SaveIcon
|
||||
color={settingsQdnLastUpdated === -100 ? '#8F8F91' : (hasChanged && !isLoading) ? '#5EB049' : '#8F8F91'}
|
||||
/>
|
||||
)}
|
||||
|
||||
) : (
|
||||
<SaveIcon
|
||||
color={
|
||||
settingsQdnLastUpdated === -100
|
||||
? "#8F8F91"
|
||||
: hasChanged && !isLoading
|
||||
? "#5EB049"
|
||||
: "#8F8F91"
|
||||
}
|
||||
/>
|
||||
)}
|
||||
</ButtonBase>
|
||||
<CustomizedSnackbars
|
||||
<CustomizedSnackbars
|
||||
duration={3500}
|
||||
open={openSnack}
|
||||
setOpen={setOpenSnack}
|
||||
@@ -154,6 +194,5 @@ export const Save = ({isDesktop}) => {
|
||||
setInfo={setInfoSnack}
|
||||
/>
|
||||
</>
|
||||
|
||||
)
|
||||
}
|
||||
);
|
||||
};
|
||||
|
@@ -46,7 +46,7 @@ export default theme;
|
||||
|
||||
|
||||
ReactDOM.createRoot(document.getElementById('root')!).render(
|
||||
<React.StrictMode>
|
||||
<>
|
||||
<ThemeProvider theme={theme}>
|
||||
<CssBaseline />
|
||||
<MessageQueueProvider>
|
||||
@@ -55,5 +55,5 @@ ReactDOM.createRoot(document.getElementById('root')!).render(
|
||||
</RecoilRoot>
|
||||
</MessageQueueProvider>
|
||||
</ThemeProvider>
|
||||
</React.StrictMode>,
|
||||
</>,
|
||||
)
|
||||
|
@@ -20,21 +20,17 @@ window.addEventListener("message", (event) => {
|
||||
const { resolve, reject } = callbackMap.get(requestId);
|
||||
callbackMap.delete(requestId); // Remove callback after use
|
||||
|
||||
if (error) {
|
||||
reject({ error, message });
|
||||
} else {
|
||||
resolve({ payload });
|
||||
}
|
||||
resolve(event.data)
|
||||
}
|
||||
});
|
||||
|
||||
export const sendMessageBackground = (action, data = {}, timeout = 60000) => {
|
||||
export const sendMessageBackground = (action, data = {}, timeout = 60000, isFromExtension) => {
|
||||
return new Promise((resolve, reject) => {
|
||||
const requestId = generateRequestId(); // Unique ID for each request
|
||||
callbackMap.set(requestId, { resolve, reject }); // Store both resolve and reject callbacks
|
||||
|
||||
// Send the message with `backgroundMessage` type
|
||||
window.postMessage({ type: "backgroundMessage", action, requestId, payload: data }, "*");
|
||||
window.postMessage({ type: "backgroundMessage", action, requestId, payload: data, isFromExtension }, "*");
|
||||
|
||||
// Set up a timeout to automatically reject if no response is received
|
||||
const timeoutId = setTimeout(() => {
|
||||
|
@@ -330,6 +330,7 @@ export const decodeBase64ForUIChatMessages = (messages)=> {
|
||||
|
||||
|
||||
export function decryptGroupData(data64EncryptedData: string, privateKey: string) {
|
||||
console.log({data64EncryptedData, privateKey})
|
||||
const allCombined = base64ToUint8Array(data64EncryptedData)
|
||||
const str = "qortalGroupEncryptedData"
|
||||
const strEncoder = new TextEncoder()
|
||||
|
@@ -5,6 +5,7 @@ import Base58 from "../../deps/Base58"
|
||||
import nacl from "../../deps/nacl-fast"
|
||||
import utils from "../../utils/utils"
|
||||
import { createEndpoint, getBaseApi } from "../../background";
|
||||
import { getData } from "../../utils/chromeStorage";
|
||||
|
||||
export async function reusableGet(endpoint){
|
||||
const validApi = await getBaseApi();
|
||||
@@ -34,9 +35,9 @@ export async function reusableGet(endpoint){
|
||||
}
|
||||
|
||||
async function getKeyPair() {
|
||||
const res = await chrome.storage.local.get(["keyPair"]);
|
||||
if (res?.keyPair) {
|
||||
return res.keyPair;
|
||||
const res = await getData<any>("keyPair").catch(() => null);
|
||||
if (res) {
|
||||
return res
|
||||
} else {
|
||||
throw new Error("Wallet not authenticated");
|
||||
}
|
||||
@@ -118,7 +119,7 @@ export const publishData = async ({
|
||||
|
||||
|
||||
const resKeyPair = await getKeyPair()
|
||||
const parsedData = JSON.parse(resKeyPair)
|
||||
const parsedData = resKeyPair
|
||||
const uint8PrivateKey = Base58.decode(parsedData.privateKey);
|
||||
const uint8PublicKey = Base58.decode(parsedData.publicKey);
|
||||
const keyPair = {
|
||||
|
428
src/qortalRequests copy.ts
Normal file
428
src/qortalRequests copy.ts
Normal file
@@ -0,0 +1,428 @@
|
||||
import { addForeignServer, addListItems, createPoll, decryptData, deleteListItems, deployAt, encryptData, getCrossChainServerInfo, getDaySummary, getForeignFee, getListItems, getServerConnectionHistory, getTxActivitySummary, getUserAccount, getUserWallet, getUserWalletInfo, getWalletBalance, joinGroup, publishMultipleQDNResources, publishQDNResource, removeForeignServer, saveFile, sendChatMessage, sendCoin, setCurrentForeignServer, updateForeignFee, voteOnPoll } from "./qortalRequests/get";
|
||||
|
||||
|
||||
|
||||
// Promisify chrome.storage.local.get
|
||||
function getLocalStorage(key) {
|
||||
return new Promise((resolve, reject) => {
|
||||
chrome.storage.local.get([key], function (result) {
|
||||
if (chrome.runtime.lastError) {
|
||||
return reject(chrome.runtime.lastError);
|
||||
}
|
||||
resolve(result[key]);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// Promisify chrome.storage.local.set
|
||||
function setLocalStorage(data) {
|
||||
return new Promise((resolve, reject) => {
|
||||
chrome.storage.local.set(data, function () {
|
||||
if (chrome.runtime.lastError) {
|
||||
return reject(chrome.runtime.lastError);
|
||||
}
|
||||
resolve();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
export async function setPermission(key, value) {
|
||||
try {
|
||||
// Get the existing qortalRequestPermissions object
|
||||
const qortalRequestPermissions = (await getLocalStorage('qortalRequestPermissions')) || {};
|
||||
|
||||
// Update the permission
|
||||
qortalRequestPermissions[key] = value;
|
||||
|
||||
// Save the updated object back to storage
|
||||
await setLocalStorage({ qortalRequestPermissions });
|
||||
|
||||
console.log('Permission set for', key);
|
||||
} catch (error) {
|
||||
console.error('Error setting permission:', error);
|
||||
}
|
||||
}
|
||||
|
||||
export async function getPermission(key) {
|
||||
try {
|
||||
// Get the qortalRequestPermissions object from storage
|
||||
const qortalRequestPermissions = (await getLocalStorage('qortalRequestPermissions')) || {};
|
||||
|
||||
// Return the value for the given key, or null if it doesn't exist
|
||||
return qortalRequestPermissions[key] || null;
|
||||
} catch (error) {
|
||||
console.error('Error getting permission:', error);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// TODO: GET_FRIENDS_LIST
|
||||
// NOT SURE IF TO IMPLEMENT: LINK_TO_QDN_RESOURCE, QDN_RESOURCE_DISPLAYED, SET_TAB_NOTIFICATIONS
|
||||
|
||||
chrome?.runtime?.onMessage.addListener((request, sender, sendResponse) => {
|
||||
if (request) {
|
||||
const isFromExtension = request?.isExtension
|
||||
switch (request.action) {
|
||||
case "GET_USER_ACCOUNT": {
|
||||
getUserAccount()
|
||||
.then((res) => {
|
||||
sendResponse(res);
|
||||
})
|
||||
.catch((error) => {
|
||||
sendResponse({ error: "Unable to get user account" });
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
case "ENCRYPT_DATA": {
|
||||
const data = request.payload;
|
||||
|
||||
encryptData(data, sender)
|
||||
.then((res) => {
|
||||
sendResponse(res);
|
||||
})
|
||||
.catch((error) => {
|
||||
sendResponse({ error: error.message });
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
case "DECRYPT_DATA": {
|
||||
const data = request.payload;
|
||||
|
||||
decryptData(data)
|
||||
.then((res) => {
|
||||
sendResponse(res);
|
||||
})
|
||||
.catch((error) => {
|
||||
sendResponse({ error: error.message });
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
case "GET_LIST_ITEMS": {
|
||||
const data = request.payload;
|
||||
|
||||
getListItems(data, isFromExtension)
|
||||
.then((res) => {
|
||||
sendResponse(res);
|
||||
})
|
||||
.catch((error) => {
|
||||
sendResponse({ error: error.message });
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
case "ADD_LIST_ITEMS": {
|
||||
const data = request.payload;
|
||||
|
||||
addListItems(data, isFromExtension)
|
||||
.then((res) => {
|
||||
sendResponse(res);
|
||||
})
|
||||
.catch((error) => {
|
||||
sendResponse({ error: error.message });
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
case "DELETE_LIST_ITEM": {
|
||||
const data = request.payload;
|
||||
|
||||
deleteListItems(data, isFromExtension)
|
||||
.then((res) => {
|
||||
sendResponse(res);
|
||||
})
|
||||
.catch((error) => {
|
||||
sendResponse({ error: error.message });
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
case "PUBLISH_QDN_RESOURCE": {
|
||||
const data = request.payload;
|
||||
|
||||
publishQDNResource(data, sender, isFromExtension)
|
||||
.then((res) => {
|
||||
sendResponse(res);
|
||||
})
|
||||
.catch((error) => {
|
||||
sendResponse({ error: error.message });
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
case "PUBLISH_MULTIPLE_QDN_RESOURCES": {
|
||||
const data = request.payload;
|
||||
|
||||
publishMultipleQDNResources(data, sender, isFromExtension)
|
||||
.then((res) => {
|
||||
sendResponse(res);
|
||||
})
|
||||
.catch((error) => {
|
||||
sendResponse({ error: error.message });
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
case "VOTE_ON_POLL": {
|
||||
const data = request.payload;
|
||||
|
||||
voteOnPoll(data, isFromExtension)
|
||||
.then((res) => {
|
||||
sendResponse(res);
|
||||
})
|
||||
.catch((error) => {
|
||||
sendResponse({ error: error.message });
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
case "CREATE_POLL": {
|
||||
const data = request.payload;
|
||||
|
||||
createPoll(data, isFromExtension)
|
||||
.then((res) => {
|
||||
sendResponse(res);
|
||||
})
|
||||
.catch((error) => {
|
||||
sendResponse({ error: error.message });
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
case "SEND_CHAT_MESSAGE": {
|
||||
const data = request.payload;
|
||||
sendChatMessage(data, isFromExtension)
|
||||
.then((res) => {
|
||||
sendResponse(res);
|
||||
})
|
||||
.catch((error) => {
|
||||
sendResponse({ error: error.message });
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
case "JOIN_GROUP": {
|
||||
const data = request.payload;
|
||||
|
||||
joinGroup(data, isFromExtension)
|
||||
.then((res) => {
|
||||
sendResponse(res);
|
||||
})
|
||||
.catch((error) => {
|
||||
sendResponse({ error: error.message });
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
case "SAVE_FILE": {
|
||||
const data = request.payload;
|
||||
|
||||
saveFile(data, sender, isFromExtension)
|
||||
.then((res) => {
|
||||
sendResponse(res);
|
||||
})
|
||||
.catch((error) => {
|
||||
sendResponse({ error: error.message });
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
case "DEPLOY_AT": {
|
||||
const data = request.payload;
|
||||
|
||||
deployAt(data, isFromExtension)
|
||||
.then((res) => {
|
||||
sendResponse(res);
|
||||
})
|
||||
.catch((error) => {
|
||||
sendResponse({ error: error.message });
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
case "GET_USER_WALLET": {
|
||||
const data = request.payload;
|
||||
|
||||
getUserWallet(data, isFromExtension)
|
||||
.then((res) => {
|
||||
sendResponse(res);
|
||||
})
|
||||
.catch((error) => {
|
||||
sendResponse({ error: error.message });
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
case "GET_WALLET_BALANCE": {
|
||||
const data = request.payload;
|
||||
|
||||
getWalletBalance(data, false, isFromExtension)
|
||||
.then((res) => {
|
||||
sendResponse(res);
|
||||
})
|
||||
.catch((error) => {
|
||||
sendResponse({ error: error.message });
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case "GET_USER_WALLET_INFO": {
|
||||
const data = request.payload;
|
||||
|
||||
getUserWalletInfo(data, isFromExtension)
|
||||
.then((res) => {
|
||||
sendResponse(res);
|
||||
})
|
||||
.catch((error) => {
|
||||
sendResponse({ error: error.message });
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
case "GET_CROSSCHAIN_SERVER_INFO": {
|
||||
const data = request.payload;
|
||||
|
||||
getCrossChainServerInfo(data)
|
||||
.then((res) => {
|
||||
sendResponse(res);
|
||||
})
|
||||
.catch((error) => {
|
||||
sendResponse({ error: error.message });
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
case "GET_TX_ACTIVITY_SUMMARY": {
|
||||
const data = request.payload;
|
||||
|
||||
getTxActivitySummary(data)
|
||||
.then((res) => {
|
||||
sendResponse(res);
|
||||
})
|
||||
.catch((error) => {
|
||||
sendResponse({ error: error.message });
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case "GET_FOREIGN_FEE": {
|
||||
const data = request.payload;
|
||||
|
||||
getForeignFee(data)
|
||||
.then((res) => {
|
||||
sendResponse(res);
|
||||
})
|
||||
.catch((error) => {
|
||||
sendResponse({ error: error.message });
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case "UPDATE_FOREIGN_FEE": {
|
||||
const data = request.payload;
|
||||
|
||||
updateForeignFee(data)
|
||||
.then((res) => {
|
||||
sendResponse(res);
|
||||
})
|
||||
.catch((error) => {
|
||||
sendResponse({ error: error.message });
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case "GET_SERVER_CONNECTION_HISTORY": {
|
||||
const data = request.payload;
|
||||
|
||||
getServerConnectionHistory(data)
|
||||
.then((res) => {
|
||||
sendResponse(res);
|
||||
})
|
||||
.catch((error) => {
|
||||
sendResponse({ error: error.message });
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case "SET_CURRENT_FOREIGN_SERVER": {
|
||||
const data = request.payload;
|
||||
|
||||
setCurrentForeignServer(data)
|
||||
.then((res) => {
|
||||
sendResponse(res);
|
||||
})
|
||||
.catch((error) => {
|
||||
sendResponse({ error: error.message });
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case "ADD_FOREIGN_SERVER": {
|
||||
const data = request.payload;
|
||||
|
||||
addForeignServer(data)
|
||||
.then((res) => {
|
||||
sendResponse(res);
|
||||
})
|
||||
.catch((error) => {
|
||||
sendResponse({ error: error.message });
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case "REMOVE_FOREIGN_SERVER": {
|
||||
const data = request.payload;
|
||||
|
||||
removeForeignServer(data)
|
||||
.then((res) => {
|
||||
sendResponse(res);
|
||||
})
|
||||
.catch((error) => {
|
||||
sendResponse({ error: error.message });
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case "GET_DAY_SUMMARY": {
|
||||
const data = request.payload;
|
||||
|
||||
getDaySummary(data)
|
||||
.then((res) => {
|
||||
sendResponse(res);
|
||||
})
|
||||
.catch((error) => {
|
||||
sendResponse({ error: error.message });
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case "SEND_COIN": {
|
||||
const data = request.payload;
|
||||
|
||||
sendCoin(data, isFromExtension)
|
||||
.then((res) => {
|
||||
sendResponse(res);
|
||||
})
|
||||
.catch((error) => {
|
||||
sendResponse({ error: error.message });
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
});
|
@@ -1,30 +1,22 @@
|
||||
import { addForeignServer, addListItems, createPoll, decryptData, deleteListItems, deployAt, encryptData, getCrossChainServerInfo, getDaySummary, getForeignFee, getListItems, getServerConnectionHistory, getTxActivitySummary, getUserAccount, getUserWallet, getUserWalletInfo, getWalletBalance, joinGroup, publishMultipleQDNResources, publishQDNResource, removeForeignServer, saveFile, sendChatMessage, sendCoin, setCurrentForeignServer, updateForeignFee, voteOnPoll } from "./qortalRequests/get";
|
||||
import { storeData } from "./utils/chromeStorage";
|
||||
|
||||
|
||||
|
||||
// Promisify chrome.storage.local.get
|
||||
function getLocalStorage(key) {
|
||||
return new Promise((resolve, reject) => {
|
||||
chrome.storage.local.get([key], function (result) {
|
||||
if (chrome.runtime.lastError) {
|
||||
return reject(chrome.runtime.lastError);
|
||||
}
|
||||
resolve(result[key]);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// Promisify chrome.storage.local.set
|
||||
function setLocalStorage(data) {
|
||||
return new Promise((resolve, reject) => {
|
||||
chrome.storage.local.set(data, function () {
|
||||
if (chrome.runtime.lastError) {
|
||||
return reject(chrome.runtime.lastError);
|
||||
}
|
||||
resolve();
|
||||
});
|
||||
});
|
||||
}
|
||||
return getData(key).catch((error) => {
|
||||
console.error("Error retrieving data:", error);
|
||||
throw error;
|
||||
});
|
||||
}
|
||||
|
||||
// Promisify setting data in localStorage
|
||||
function setLocalStorage(key, data) {
|
||||
return storeData(key, data).catch((error) => {
|
||||
console.error("Error saving data:", error);
|
||||
throw error;
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
export async function setPermission(key, value) {
|
||||
@@ -60,369 +52,565 @@ function getLocalStorage(key) {
|
||||
|
||||
// TODO: GET_FRIENDS_LIST
|
||||
// NOT SURE IF TO IMPLEMENT: LINK_TO_QDN_RESOURCE, QDN_RESOURCE_DISPLAYED, SET_TAB_NOTIFICATIONS
|
||||
|
||||
function setupMessageListener() {
|
||||
window.addEventListener("message", async (event) => {
|
||||
const request = event.data;
|
||||
|
||||
// Ensure the message is from a trusted source
|
||||
const isFromExtension = request?.isExtension;
|
||||
if (request?.type !== "backgroundMessage") return; // Only process messages of type 'backgroundMessage'
|
||||
|
||||
chrome?.runtime?.onMessage.addListener((request, sender, sendResponse) => {
|
||||
if (request) {
|
||||
const isFromExtension = request?.isExtension
|
||||
switch (request.action) {
|
||||
case "GET_USER_ACCOUNT": {
|
||||
getUserAccount()
|
||||
.then((res) => {
|
||||
sendResponse(res);
|
||||
})
|
||||
.catch((error) => {
|
||||
sendResponse({ error: "Unable to get user account" });
|
||||
});
|
||||
|
||||
break;
|
||||
console.log("REQUEST MESSAGE QORTALREQUEST", request);
|
||||
|
||||
// Handle actions based on the `request.action` value
|
||||
switch (request.action) {
|
||||
case "GET_USER_ACCOUNT": {
|
||||
try {
|
||||
const res = await getUserAccount();
|
||||
event.source.postMessage({
|
||||
requestId: request.requestId,
|
||||
action: request.action,
|
||||
payload: res,
|
||||
type: "backgroundMessageResponse",
|
||||
}, event.origin);
|
||||
} catch (error) {
|
||||
event.source.postMessage({
|
||||
requestId: request.requestId,
|
||||
action: request.action,
|
||||
error: "Unable to get user account",
|
||||
type: "backgroundMessageResponse",
|
||||
}, event.origin);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case "ENCRYPT_DATA": {
|
||||
try {
|
||||
const res = await encryptData(request.payload, event.source);
|
||||
event.source.postMessage({
|
||||
requestId: request.requestId,
|
||||
action: request.action,
|
||||
payload: res,
|
||||
type: "backgroundMessageResponse",
|
||||
}, event.origin);
|
||||
} catch (error) {
|
||||
event.source.postMessage({
|
||||
requestId: request.requestId,
|
||||
action: request.action,
|
||||
error: error.message,
|
||||
type: "backgroundMessageResponse",
|
||||
}, event.origin);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case "DECRYPT_DATA": {
|
||||
try {
|
||||
const res = await decryptData(request.payload);
|
||||
event.source.postMessage({
|
||||
requestId: request.requestId,
|
||||
action: request.action,
|
||||
payload: res,
|
||||
type: "backgroundMessageResponse",
|
||||
}, event.origin);
|
||||
} catch (error) {
|
||||
event.source.postMessage({
|
||||
requestId: request.requestId,
|
||||
action: request.action,
|
||||
error: error.message,
|
||||
type: "backgroundMessageResponse",
|
||||
}, event.origin);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case "GET_LIST_ITEMS": {
|
||||
try {
|
||||
const res = await getListItems(request.payload, isFromExtension);
|
||||
event.source.postMessage({
|
||||
requestId: request.requestId,
|
||||
action: request.action,
|
||||
payload: res,
|
||||
type: "backgroundMessageResponse",
|
||||
}, event.origin);
|
||||
} catch (error) {
|
||||
event.source.postMessage({
|
||||
requestId: request.requestId,
|
||||
action: request.action,
|
||||
error: error.message,
|
||||
type: "backgroundMessageResponse",
|
||||
}, event.origin);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case "ADD_LIST_ITEMS": {
|
||||
try {
|
||||
const res = await addListItems(request.payload, isFromExtension);
|
||||
event.source.postMessage({
|
||||
requestId: request.requestId,
|
||||
action: request.action,
|
||||
payload: res,
|
||||
type: "backgroundMessageResponse",
|
||||
}, event.origin);
|
||||
} catch (error) {
|
||||
event.source.postMessage({
|
||||
requestId: request.requestId,
|
||||
action: request.action,
|
||||
error: error.message,
|
||||
type: "backgroundMessageResponse",
|
||||
}, event.origin);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case "DELETE_LIST_ITEM": {
|
||||
try {
|
||||
const res = await deleteListItems(request.payload, isFromExtension);
|
||||
event.source.postMessage({
|
||||
requestId: request.requestId,
|
||||
action: request.action,
|
||||
payload: res,
|
||||
type: "backgroundMessageResponse",
|
||||
}, event.origin);
|
||||
} catch (error) {
|
||||
event.source.postMessage({
|
||||
requestId: request.requestId,
|
||||
action: request.action,
|
||||
error: error.message,
|
||||
type: "backgroundMessageResponse",
|
||||
}, event.origin);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case "PUBLISH_QDN_RESOURCE": {
|
||||
try {
|
||||
const res = await publishQDNResource(request.payload, event.source, isFromExtension);
|
||||
event.source.postMessage({
|
||||
requestId: request.requestId,
|
||||
action: request.action,
|
||||
payload: res,
|
||||
type: "backgroundMessageResponse",
|
||||
}, event.origin);
|
||||
} catch (error) {
|
||||
event.source.postMessage({
|
||||
requestId: request.requestId,
|
||||
action: request.action,
|
||||
error: error.message,
|
||||
type: "backgroundMessageResponse",
|
||||
}, event.origin);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case "PUBLISH_MULTIPLE_QDN_RESOURCES": {
|
||||
try {
|
||||
const res = await publishMultipleQDNResources(request.payload, event.source, isFromExtension);
|
||||
event.source.postMessage({
|
||||
requestId: request.requestId,
|
||||
action: request.action,
|
||||
payload: res,
|
||||
type: "backgroundMessageResponse",
|
||||
}, event.origin);
|
||||
} catch (error) {
|
||||
event.source.postMessage({
|
||||
requestId: request.requestId,
|
||||
action: request.action,
|
||||
error: error.message,
|
||||
type: "backgroundMessageResponse",
|
||||
}, event.origin);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case "VOTE_ON_POLL": {
|
||||
try {
|
||||
const res = await voteOnPoll(request.payload, isFromExtension);
|
||||
event.source.postMessage({
|
||||
requestId: request.requestId,
|
||||
action: request.action,
|
||||
payload: res,
|
||||
type: "backgroundMessageResponse",
|
||||
}, event.origin);
|
||||
} catch (error) {
|
||||
event.source.postMessage({
|
||||
requestId: request.requestId,
|
||||
action: request.action,
|
||||
error: error.message,
|
||||
type: "backgroundMessageResponse",
|
||||
}, event.origin);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case "CREATE_POLL": {
|
||||
try {
|
||||
const res = await createPoll(request.payload, isFromExtension);
|
||||
event.source.postMessage({
|
||||
requestId: request.requestId,
|
||||
action: request.action,
|
||||
payload: res,
|
||||
type: "backgroundMessageResponse",
|
||||
}, event.origin);
|
||||
} catch (error) {
|
||||
event.source.postMessage({
|
||||
requestId: request.requestId,
|
||||
action: request.action,
|
||||
error: error.message,
|
||||
type: "backgroundMessageResponse",
|
||||
}, event.origin);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case "SEND_CHAT_MESSAGE": {
|
||||
try {
|
||||
const res = await sendChatMessage(request.payload, isFromExtension);
|
||||
event.source.postMessage({
|
||||
requestId: request.requestId,
|
||||
action: request.action,
|
||||
payload: res,
|
||||
type: "backgroundMessageResponse",
|
||||
}, event.origin);
|
||||
} catch (error) {
|
||||
event.source.postMessage({
|
||||
requestId: request.requestId,
|
||||
action: request.action,
|
||||
error: error.message,
|
||||
type: "backgroundMessageResponse",
|
||||
}, event.origin);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case "JOIN_GROUP": {
|
||||
try {
|
||||
const res = await joinGroup(request.payload, isFromExtension);
|
||||
event.source.postMessage({
|
||||
requestId: request.requestId,
|
||||
action: request.action,
|
||||
payload: res,
|
||||
type: "backgroundMessageResponse",
|
||||
}, event.origin);
|
||||
} catch (error) {
|
||||
event.source.postMessage({
|
||||
requestId: request.requestId,
|
||||
action: request.action,
|
||||
error: error.message,
|
||||
type: "backgroundMessageResponse",
|
||||
}, event.origin);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case "SAVE_FILE": {
|
||||
try {
|
||||
const res = await saveFile(request.payload, event.source, isFromExtension);
|
||||
event.source.postMessage({
|
||||
requestId: request.requestId,
|
||||
action: request.action,
|
||||
payload: res,
|
||||
type: "backgroundMessageResponse",
|
||||
}, event.origin);
|
||||
} catch (error) {
|
||||
event.source.postMessage({
|
||||
requestId: request.requestId,
|
||||
action: request.action,
|
||||
error: error.message,
|
||||
type: "backgroundMessageResponse",
|
||||
}, event.origin);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case "DEPLOY_AT": {
|
||||
try {
|
||||
const res = await deployAt(request.payload, isFromExtension);
|
||||
event.source.postMessage({
|
||||
requestId: request.requestId,
|
||||
action: request.action,
|
||||
payload: res,
|
||||
type: "backgroundMessageResponse",
|
||||
}, event.origin);
|
||||
} catch (error) {
|
||||
event.source.postMessage({
|
||||
requestId: request.requestId,
|
||||
action: request.action,
|
||||
error: error.message,
|
||||
type: "backgroundMessageResponse",
|
||||
}, event.origin);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case "GET_USER_WALLET": {
|
||||
try {
|
||||
const res = await getUserWallet(request.payload, isFromExtension);
|
||||
event.source.postMessage({
|
||||
requestId: request.requestId,
|
||||
action: request.action,
|
||||
payload: res,
|
||||
type: "backgroundMessageResponse",
|
||||
}, event.origin);
|
||||
} catch (error) {
|
||||
event.source.postMessage({
|
||||
requestId: request.requestId,
|
||||
action: request.action,
|
||||
error: error.message,
|
||||
type: "backgroundMessageResponse",
|
||||
}, event.origin);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case "GET_WALLET_BALANCE": {
|
||||
try {
|
||||
const res = await getWalletBalance(request.payload, false, isFromExtension);
|
||||
event.source.postMessage({
|
||||
requestId: request.requestId,
|
||||
action: request.action,
|
||||
payload: res,
|
||||
type: "backgroundMessageResponse",
|
||||
}, event.origin);
|
||||
} catch (error) {
|
||||
event.source.postMessage({
|
||||
requestId: request.requestId,
|
||||
action: request.action,
|
||||
error: error.message,
|
||||
type: "backgroundMessageResponse",
|
||||
}, event.origin);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case "GET_USER_WALLET_INFO": {
|
||||
try {
|
||||
const res = await getUserWalletInfo(request.payload, isFromExtension);
|
||||
event.source.postMessage({
|
||||
requestId: request.requestId,
|
||||
action: request.action,
|
||||
payload: res,
|
||||
type: "backgroundMessageResponse",
|
||||
}, event.origin);
|
||||
} catch (error) {
|
||||
event.source.postMessage({
|
||||
requestId: request.requestId,
|
||||
action: request.action,
|
||||
error: error.message,
|
||||
type: "backgroundMessageResponse",
|
||||
}, event.origin);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case "GET_CROSSCHAIN_SERVER_INFO": {
|
||||
try {
|
||||
const res = await getCrossChainServerInfo(request.payload);
|
||||
event.source.postMessage({
|
||||
requestId: request.requestId,
|
||||
action: request.action,
|
||||
payload: res,
|
||||
type: "backgroundMessageResponse",
|
||||
}, event.origin);
|
||||
} catch (error) {
|
||||
event.source.postMessage({
|
||||
requestId: request.requestId,
|
||||
action: request.action,
|
||||
error: error.message,
|
||||
type: "backgroundMessageResponse",
|
||||
}, event.origin);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case "GET_TX_ACTIVITY_SUMMARY": {
|
||||
try {
|
||||
const res = await getTxActivitySummary(request.payload);
|
||||
event.source.postMessage({
|
||||
requestId: request.requestId,
|
||||
action: request.action,
|
||||
payload: res,
|
||||
type: "backgroundMessageResponse",
|
||||
}, event.origin);
|
||||
} catch (error) {
|
||||
event.source.postMessage({
|
||||
requestId: request.requestId,
|
||||
action: request.action,
|
||||
error: error.message,
|
||||
type: "backgroundMessageResponse",
|
||||
}, event.origin);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case "GET_FOREIGN_FEE": {
|
||||
try {
|
||||
const res = await getForeignFee(request.payload);
|
||||
event.source.postMessage({
|
||||
requestId: request.requestId,
|
||||
action: request.action,
|
||||
payload: res,
|
||||
type: "backgroundMessageResponse",
|
||||
}, event.origin);
|
||||
} catch (error) {
|
||||
event.source.postMessage({
|
||||
requestId: request.requestId,
|
||||
action: request.action,
|
||||
error: error.message,
|
||||
type: "backgroundMessageResponse",
|
||||
}, event.origin);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case "UPDATE_FOREIGN_FEE": {
|
||||
try {
|
||||
const res = await updateForeignFee(request.payload);
|
||||
event.source.postMessage({
|
||||
requestId: request.requestId,
|
||||
action: request.action,
|
||||
payload: res,
|
||||
type: "backgroundMessageResponse",
|
||||
}, event.origin);
|
||||
} catch (error) {
|
||||
event.source.postMessage({
|
||||
requestId: request.requestId,
|
||||
action: request.action,
|
||||
error: error.message,
|
||||
type: "backgroundMessageResponse",
|
||||
}, event.origin);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case "GET_SERVER_CONNECTION_HISTORY": {
|
||||
try {
|
||||
const res = await getServerConnectionHistory(request.payload);
|
||||
event.source.postMessage({
|
||||
requestId: request.requestId,
|
||||
action: request.action,
|
||||
payload: res,
|
||||
type: "backgroundMessageResponse",
|
||||
}, event.origin);
|
||||
} catch (error) {
|
||||
event.source.postMessage({
|
||||
requestId: request.requestId,
|
||||
action: request.action,
|
||||
error: error.message,
|
||||
type: "backgroundMessageResponse",
|
||||
}, event.origin);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case "SET_CURRENT_FOREIGN_SERVER": {
|
||||
try {
|
||||
const res = await setCurrentForeignServer(request.payload);
|
||||
event.source.postMessage({
|
||||
requestId: request.requestId,
|
||||
action: request.action,
|
||||
payload: res,
|
||||
type: "backgroundMessageResponse",
|
||||
}, event.origin);
|
||||
} catch (error) {
|
||||
event.source.postMessage({
|
||||
requestId: request.requestId,
|
||||
action: request.action,
|
||||
error: error.message,
|
||||
type: "backgroundMessageResponse",
|
||||
}, event.origin);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case "ADD_FOREIGN_SERVER": {
|
||||
try {
|
||||
const res = await addForeignServer(request.payload);
|
||||
event.source.postMessage({
|
||||
requestId: request.requestId,
|
||||
action: request.action,
|
||||
payload: res,
|
||||
type: "backgroundMessageResponse",
|
||||
}, event.origin);
|
||||
} catch (error) {
|
||||
event.source.postMessage({
|
||||
requestId: request.requestId,
|
||||
action: request.action,
|
||||
error: error.message,
|
||||
type: "backgroundMessageResponse",
|
||||
}, event.origin);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case "REMOVE_FOREIGN_SERVER": {
|
||||
try {
|
||||
const res = await removeForeignServer(request.payload);
|
||||
event.source.postMessage({
|
||||
requestId: request.requestId,
|
||||
action: request.action,
|
||||
payload: res,
|
||||
type: "backgroundMessageResponse",
|
||||
}, event.origin);
|
||||
} catch (error) {
|
||||
event.source.postMessage({
|
||||
requestId: request.requestId,
|
||||
action: request.action,
|
||||
error: error.message,
|
||||
type: "backgroundMessageResponse",
|
||||
}, event.origin);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case "GET_DAY_SUMMARY": {
|
||||
try {
|
||||
const res = await getDaySummary(request.payload);
|
||||
event.source.postMessage({
|
||||
requestId: request.requestId,
|
||||
action: request.action,
|
||||
payload: res,
|
||||
type: "backgroundMessageResponse",
|
||||
}, event.origin);
|
||||
} catch (error) {
|
||||
event.source.postMessage({
|
||||
requestId: request.requestId,
|
||||
action: request.action,
|
||||
error: error.message,
|
||||
type: "backgroundMessageResponse",
|
||||
}, event.origin);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case "SEND_COIN": {
|
||||
try {
|
||||
const res = await sendCoin(request.payload, isFromExtension);
|
||||
event.source.postMessage({
|
||||
requestId: request.requestId,
|
||||
action: request.action,
|
||||
payload: res,
|
||||
type: "backgroundMessageResponse",
|
||||
}, event.origin);
|
||||
} catch (error) {
|
||||
event.source.postMessage({
|
||||
requestId: request.requestId,
|
||||
action: request.action,
|
||||
error: error.message,
|
||||
type: "backgroundMessageResponse",
|
||||
}, event.origin);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
case "ENCRYPT_DATA": {
|
||||
const data = request.payload;
|
||||
|
||||
encryptData(data, sender)
|
||||
.then((res) => {
|
||||
sendResponse(res);
|
||||
})
|
||||
.catch((error) => {
|
||||
sendResponse({ error: error.message });
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
case "DECRYPT_DATA": {
|
||||
const data = request.payload;
|
||||
|
||||
decryptData(data)
|
||||
.then((res) => {
|
||||
sendResponse(res);
|
||||
})
|
||||
.catch((error) => {
|
||||
sendResponse({ error: error.message });
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
case "GET_LIST_ITEMS": {
|
||||
const data = request.payload;
|
||||
|
||||
getListItems(data, isFromExtension)
|
||||
.then((res) => {
|
||||
sendResponse(res);
|
||||
})
|
||||
.catch((error) => {
|
||||
sendResponse({ error: error.message });
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
case "ADD_LIST_ITEMS": {
|
||||
const data = request.payload;
|
||||
|
||||
addListItems(data, isFromExtension)
|
||||
.then((res) => {
|
||||
sendResponse(res);
|
||||
})
|
||||
.catch((error) => {
|
||||
sendResponse({ error: error.message });
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
case "DELETE_LIST_ITEM": {
|
||||
const data = request.payload;
|
||||
|
||||
deleteListItems(data, isFromExtension)
|
||||
.then((res) => {
|
||||
sendResponse(res);
|
||||
})
|
||||
.catch((error) => {
|
||||
sendResponse({ error: error.message });
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
case "PUBLISH_QDN_RESOURCE": {
|
||||
const data = request.payload;
|
||||
|
||||
publishQDNResource(data, sender, isFromExtension)
|
||||
.then((res) => {
|
||||
sendResponse(res);
|
||||
})
|
||||
.catch((error) => {
|
||||
sendResponse({ error: error.message });
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
case "PUBLISH_MULTIPLE_QDN_RESOURCES": {
|
||||
const data = request.payload;
|
||||
|
||||
publishMultipleQDNResources(data, sender, isFromExtension)
|
||||
.then((res) => {
|
||||
sendResponse(res);
|
||||
})
|
||||
.catch((error) => {
|
||||
sendResponse({ error: error.message });
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
case "VOTE_ON_POLL": {
|
||||
const data = request.payload;
|
||||
|
||||
voteOnPoll(data, isFromExtension)
|
||||
.then((res) => {
|
||||
sendResponse(res);
|
||||
})
|
||||
.catch((error) => {
|
||||
sendResponse({ error: error.message });
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
case "CREATE_POLL": {
|
||||
const data = request.payload;
|
||||
|
||||
createPoll(data, isFromExtension)
|
||||
.then((res) => {
|
||||
sendResponse(res);
|
||||
})
|
||||
.catch((error) => {
|
||||
sendResponse({ error: error.message });
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
case "SEND_CHAT_MESSAGE": {
|
||||
const data = request.payload;
|
||||
sendChatMessage(data, isFromExtension)
|
||||
.then((res) => {
|
||||
sendResponse(res);
|
||||
})
|
||||
.catch((error) => {
|
||||
sendResponse({ error: error.message });
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
case "JOIN_GROUP": {
|
||||
const data = request.payload;
|
||||
|
||||
joinGroup(data, isFromExtension)
|
||||
.then((res) => {
|
||||
sendResponse(res);
|
||||
})
|
||||
.catch((error) => {
|
||||
sendResponse({ error: error.message });
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
case "SAVE_FILE": {
|
||||
const data = request.payload;
|
||||
|
||||
saveFile(data, sender, isFromExtension)
|
||||
.then((res) => {
|
||||
sendResponse(res);
|
||||
})
|
||||
.catch((error) => {
|
||||
sendResponse({ error: error.message });
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
case "DEPLOY_AT": {
|
||||
const data = request.payload;
|
||||
|
||||
deployAt(data, isFromExtension)
|
||||
.then((res) => {
|
||||
sendResponse(res);
|
||||
})
|
||||
.catch((error) => {
|
||||
sendResponse({ error: error.message });
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
case "GET_USER_WALLET": {
|
||||
const data = request.payload;
|
||||
|
||||
getUserWallet(data, isFromExtension)
|
||||
.then((res) => {
|
||||
sendResponse(res);
|
||||
})
|
||||
.catch((error) => {
|
||||
sendResponse({ error: error.message });
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
case "GET_WALLET_BALANCE": {
|
||||
const data = request.payload;
|
||||
|
||||
getWalletBalance(data, false, isFromExtension)
|
||||
.then((res) => {
|
||||
sendResponse(res);
|
||||
})
|
||||
.catch((error) => {
|
||||
sendResponse({ error: error.message });
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case "GET_USER_WALLET_INFO": {
|
||||
const data = request.payload;
|
||||
|
||||
getUserWalletInfo(data, isFromExtension)
|
||||
.then((res) => {
|
||||
sendResponse(res);
|
||||
})
|
||||
.catch((error) => {
|
||||
sendResponse({ error: error.message });
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
case "GET_CROSSCHAIN_SERVER_INFO": {
|
||||
const data = request.payload;
|
||||
|
||||
getCrossChainServerInfo(data)
|
||||
.then((res) => {
|
||||
sendResponse(res);
|
||||
})
|
||||
.catch((error) => {
|
||||
sendResponse({ error: error.message });
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
case "GET_TX_ACTIVITY_SUMMARY": {
|
||||
const data = request.payload;
|
||||
|
||||
getTxActivitySummary(data)
|
||||
.then((res) => {
|
||||
sendResponse(res);
|
||||
})
|
||||
.catch((error) => {
|
||||
sendResponse({ error: error.message });
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case "GET_FOREIGN_FEE": {
|
||||
const data = request.payload;
|
||||
|
||||
getForeignFee(data)
|
||||
.then((res) => {
|
||||
sendResponse(res);
|
||||
})
|
||||
.catch((error) => {
|
||||
sendResponse({ error: error.message });
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case "UPDATE_FOREIGN_FEE": {
|
||||
const data = request.payload;
|
||||
|
||||
updateForeignFee(data)
|
||||
.then((res) => {
|
||||
sendResponse(res);
|
||||
})
|
||||
.catch((error) => {
|
||||
sendResponse({ error: error.message });
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case "GET_SERVER_CONNECTION_HISTORY": {
|
||||
const data = request.payload;
|
||||
|
||||
getServerConnectionHistory(data)
|
||||
.then((res) => {
|
||||
sendResponse(res);
|
||||
})
|
||||
.catch((error) => {
|
||||
sendResponse({ error: error.message });
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case "SET_CURRENT_FOREIGN_SERVER": {
|
||||
const data = request.payload;
|
||||
|
||||
setCurrentForeignServer(data)
|
||||
.then((res) => {
|
||||
sendResponse(res);
|
||||
})
|
||||
.catch((error) => {
|
||||
sendResponse({ error: error.message });
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case "ADD_FOREIGN_SERVER": {
|
||||
const data = request.payload;
|
||||
|
||||
addForeignServer(data)
|
||||
.then((res) => {
|
||||
sendResponse(res);
|
||||
})
|
||||
.catch((error) => {
|
||||
sendResponse({ error: error.message });
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case "REMOVE_FOREIGN_SERVER": {
|
||||
const data = request.payload;
|
||||
|
||||
removeForeignServer(data)
|
||||
.then((res) => {
|
||||
sendResponse(res);
|
||||
})
|
||||
.catch((error) => {
|
||||
sendResponse({ error: error.message });
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case "GET_DAY_SUMMARY": {
|
||||
const data = request.payload;
|
||||
|
||||
getDaySummary(data)
|
||||
.then((res) => {
|
||||
sendResponse(res);
|
||||
})
|
||||
.catch((error) => {
|
||||
sendResponse({ error: error.message });
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case "SEND_COIN": {
|
||||
const data = request.payload;
|
||||
|
||||
sendCoin(data, isFromExtension)
|
||||
.then((res) => {
|
||||
sendResponse(res);
|
||||
})
|
||||
.catch((error) => {
|
||||
sendResponse({ error: error.message });
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
return true;
|
||||
});
|
||||
|
||||
// Initialize the message listener
|
||||
setupMessageListener();
|
||||
|
||||
|
@@ -54,7 +54,7 @@ const _createPoll = async ({pollName, pollDescription, options}, isFromExtension
|
||||
const wallet = await getSaveWallet();
|
||||
const address = wallet.address0;
|
||||
const resKeyPair = await getKeyPair();
|
||||
const parsedData = JSON.parse(resKeyPair);
|
||||
const parsedData = resKeyPair;
|
||||
const uint8PrivateKey = Base58.decode(parsedData.privateKey);
|
||||
const uint8PublicKey = Base58.decode(parsedData.publicKey);
|
||||
const keyPair = {
|
||||
@@ -106,7 +106,7 @@ const _deployAt = async (
|
||||
const address = wallet.address0;
|
||||
const lastReference = await getLastRef();
|
||||
const resKeyPair = await getKeyPair();
|
||||
const parsedData = JSON.parse(resKeyPair);
|
||||
const parsedData = resKeyPair;
|
||||
const uint8PrivateKey = Base58.decode(parsedData.privateKey);
|
||||
const uint8PublicKey = Base58.decode(parsedData.publicKey);
|
||||
const keyPair = {
|
||||
@@ -154,7 +154,7 @@ const _voteOnPoll = async ({pollName, optionIndex, optionName}, isFromExtension)
|
||||
const wallet = await getSaveWallet();
|
||||
const address = wallet.address0;
|
||||
const resKeyPair = await getKeyPair();
|
||||
const parsedData = JSON.parse(resKeyPair);
|
||||
const parsedData = resKeyPair;
|
||||
const uint8PrivateKey = Base58.decode(parsedData.privateKey);
|
||||
const uint8PublicKey = Base58.decode(parsedData.publicKey);
|
||||
const keyPair = {
|
||||
@@ -373,7 +373,7 @@ export const encryptData = async (data, sender) => {
|
||||
}
|
||||
|
||||
const resKeyPair = await getKeyPair();
|
||||
const parsedData = JSON.parse(resKeyPair);
|
||||
const parsedData = resKeyPair;
|
||||
const privateKey = parsedData.privateKey;
|
||||
const userPublicKey = parsedData.publicKey;
|
||||
|
||||
@@ -396,7 +396,7 @@ export const decryptData = async (data) => {
|
||||
throw new Error(`Missing fields: encryptedData`);
|
||||
}
|
||||
const resKeyPair = await getKeyPair();
|
||||
const parsedData = JSON.parse(resKeyPair);
|
||||
const parsedData = resKeyPair;
|
||||
const uint8PrivateKey = Base58.decode(parsedData.privateKey);
|
||||
const uint8Array = base64ToUint8Array(encryptedData);
|
||||
const startsWithQortalEncryptedData = uint8ArrayStartsWith(
|
||||
@@ -638,7 +638,7 @@ export const publishQDNResource = async (data: any, sender, isFromExtension) =>
|
||||
if (data.encrypt) {
|
||||
try {
|
||||
const resKeyPair = await getKeyPair()
|
||||
const parsedData = JSON.parse(resKeyPair)
|
||||
const parsedData = resKeyPair
|
||||
const privateKey = parsedData.privateKey
|
||||
const userPublicKey = parsedData.publicKey
|
||||
const encryptDataResponse = encryptDataGroup({
|
||||
@@ -858,7 +858,7 @@ export const publishMultipleQDNResources = async (data: any, sender, isFromExten
|
||||
if (data.encrypt) {
|
||||
try {
|
||||
const resKeyPair = await getKeyPair()
|
||||
const parsedData = JSON.parse(resKeyPair)
|
||||
const parsedData = resKeyPair
|
||||
const privateKey = parsedData.privateKey
|
||||
const userPublicKey = parsedData.publicKey
|
||||
const encryptDataResponse = encryptDataGroup({
|
||||
@@ -1088,7 +1088,7 @@ export const sendChatMessage = async (data, isFromExtension) => {
|
||||
|
||||
let reference = Base58.encode(_reference);
|
||||
const resKeyPair = await getKeyPair();
|
||||
const parsedData = JSON.parse(resKeyPair);
|
||||
const parsedData = resKeyPair;
|
||||
const uint8PrivateKey = Base58.decode(parsedData.privateKey);
|
||||
const uint8PublicKey = Base58.decode(parsedData.publicKey);
|
||||
const keyPair = {
|
||||
@@ -1127,7 +1127,7 @@ export const sendChatMessage = async (data, isFromExtension) => {
|
||||
|
||||
let reference = Base58.encode(_reference);
|
||||
const resKeyPair = await getKeyPair();
|
||||
const parsedData = JSON.parse(resKeyPair);
|
||||
const parsedData = resKeyPair;
|
||||
const uint8PrivateKey = Base58.decode(parsedData.privateKey);
|
||||
const uint8PublicKey = Base58.decode(parsedData.publicKey);
|
||||
const keyPair = {
|
||||
@@ -1355,7 +1355,7 @@ export const getUserWallet = async (data, isFromExtension) => {
|
||||
const wallet = await getSaveWallet();
|
||||
const address = wallet.address0;
|
||||
const resKeyPair = await getKeyPair();
|
||||
const parsedData = JSON.parse(resKeyPair);
|
||||
const parsedData = resKeyPair;
|
||||
const arrrSeed58 = parsedData.arrrSeed58;
|
||||
if (coin === "ARRR") {
|
||||
const bodyToString = arrrSeed58;
|
||||
@@ -1448,7 +1448,7 @@ export const getWalletBalance = async (data, bypassPermission?: boolean, isFromE
|
||||
const wallet = await getSaveWallet();
|
||||
const address = wallet.address0;
|
||||
const resKeyPair = await getKeyPair();
|
||||
const parsedData = JSON.parse(resKeyPair);
|
||||
const parsedData = resKeyPair;
|
||||
if (coin === "QORT") {
|
||||
let qortAddress = address;
|
||||
try {
|
||||
@@ -1535,7 +1535,7 @@ const getUserWalletFunc = async (coin) => {
|
||||
const wallet = await getSaveWallet();
|
||||
const address = wallet.address0;
|
||||
const resKeyPair = await getKeyPair();
|
||||
const parsedData = JSON.parse(resKeyPair);
|
||||
const parsedData = resKeyPair;
|
||||
switch (coin) {
|
||||
case "QORT":
|
||||
userWallet["address"] = address;
|
||||
@@ -2068,7 +2068,7 @@ export const sendCoin = async (data, isFromExtension) => {
|
||||
const wallet = await getSaveWallet();
|
||||
const address = wallet.address0;
|
||||
const resKeyPair = await getKeyPair();
|
||||
const parsedData = JSON.parse(resKeyPair);
|
||||
const parsedData = resKeyPair;
|
||||
const localNodeAvailable = await isUsingLocal()
|
||||
if(checkCoin !== 'QORT' && !localNodeAvailable) throw new Error('Cannot send a non-QORT coin through the gateway. Please use your local node.')
|
||||
if (checkCoin === "QORT") {
|
||||
|
@@ -1,28 +1,54 @@
|
||||
|
||||
export const storeWalletInfo = (payload: any)=> {
|
||||
return new Promise((resolve, reject) => {
|
||||
chrome.storage.local.set({walletInfo: payload}, () => {
|
||||
if (chrome.runtime.lastError) {
|
||||
reject(new Error('Error saving data'));
|
||||
} else {
|
||||
resolve('Data saved successfully');
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
export const getWalletInfo = (): Promise<any> => {
|
||||
export const storeData = (key: string, payload: any): Promise<string> => {
|
||||
return new Promise((resolve, reject) => {
|
||||
chrome.storage.local.get(['walletInfo'], (result) => {
|
||||
if (chrome.runtime.lastError) {
|
||||
reject(new Error('Error retrieving data'));
|
||||
} else if (result.walletInfo) {
|
||||
resolve(result.walletInfo as any);
|
||||
} else {
|
||||
reject(new Error('No wallet info found'));
|
||||
}
|
||||
});
|
||||
try {
|
||||
localStorage.setItem(key, JSON.stringify(payload));
|
||||
resolve("Data saved successfully");
|
||||
} catch (error) {
|
||||
reject(new Error("Error saving data"));
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
export const getData = <T = any>(key: string): Promise<T> => {
|
||||
return new Promise((resolve, reject) => {
|
||||
try {
|
||||
const data = localStorage.getItem(key);
|
||||
if (data) {
|
||||
resolve(JSON.parse(data) as T);
|
||||
} else {
|
||||
reject(new Error(`No data found for key: ${key}`));
|
||||
}
|
||||
} catch (error) {
|
||||
reject(new Error("Error retrieving data"));
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
export async function removeKeysAndLogout(
|
||||
keys: string[],
|
||||
event: MessageEvent,
|
||||
request: any
|
||||
) {
|
||||
try {
|
||||
// Remove each key from localStorage
|
||||
keys.forEach((key) => localStorage.removeItem(key));
|
||||
|
||||
|
||||
// Send a response back to indicate successful logout
|
||||
event.source.postMessage(
|
||||
{
|
||||
requestId: request.requestId,
|
||||
action: "logout",
|
||||
payload: true,
|
||||
type: "backgroundMessageResponse",
|
||||
},
|
||||
event.origin
|
||||
);
|
||||
} catch (error) {
|
||||
console.error("Error removing keys:", error);
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user