started on background cases

This commit is contained in:
PhilReact 2024-10-28 09:00:38 +02:00
parent ef058b9c8b
commit 8afc3789c9
5 changed files with 4998 additions and 1438 deletions

View File

@ -101,10 +101,11 @@ import { Settings } from "./components/Group/Settings";
import { MainAvatar } from "./components/MainAvatar";
import { useRetrieveDataLocalStorage } from "./useRetrieveDataLocalStorage";
import { useQortalGetSaveSettings } from "./useQortalGetSaveSettings";
import { useRecoilState, useResetRecoilState } from "recoil";
import { useRecoilState, useResetRecoilState, useSetRecoilState } from "recoil";
import { canSaveSettingToQdnAtom, fullScreenAtom, hasSettingsChangedAtom, oldPinnedAppsAtom, settingsLocalLastUpdatedAtom, settingsQDNLastUpdatedAtom, sortablePinnedAppsAtom } from "./atoms/global";
import { useAppFullScreen } from "./useAppFullscreen";
import { NotAuthenticated } from "./ExtStates/NotAuthenticated";
import { sendMessageBackground, sendMessageState } from "./messaging/messagesToBackground";
type extStates =
| "not-authenticated"
@ -343,6 +344,9 @@ function App() {
const { toggleFullScreen } = useAppFullScreen(setFullScreen);
useEffect(() => {
// Attach a global event listener for double-click
const handleDoubleClick = () => {
@ -543,21 +547,33 @@ function App() {
const getBalanceFunc = () => {
setQortBalanceLoading(true);
chrome?.runtime?.sendMessage({ action: "balance" }, (response) => {
window.sendMessage("balance")
.then((response) => {
if (!response?.error && !isNaN(+response)) {
setBalance(response);
}
setQortBalanceLoading(false);
})
.catch((error) => {
console.error("Failed to get balance:", error);
setQortBalanceLoading(false);
});
};
const getLtcBalanceFunc = () => {
setLtcBalanceLoading(true);
chrome?.runtime?.sendMessage({ action: "ltcBalance" }, (response) => {
if (!response?.error && !isNaN(+response)) {
setLtcBalance(response);
}
setLtcBalanceLoading(false);
});
window.sendMessage("ltcBalance")
.then((response) => {
if (!response?.error && !isNaN(+response)) {
setLtcBalance(response);
}
setLtcBalanceLoading(false);
})
.catch((error) => {
console.error("Failed to get LTC balance:", error);
setLtcBalanceLoading(false);
});
};
const sendCoinFunc = () => {
setSendPaymentError("");
@ -575,27 +591,25 @@ function App() {
return;
}
setIsLoading(true);
chrome?.runtime?.sendMessage(
{
action: "sendCoin",
payload: {
amount: Number(paymentAmount),
receiver: paymentTo.trim(),
password: paymentPassword,
},
},
(response) => {
window.sendMessage("sendCoin", {
amount: Number(paymentAmount),
receiver: paymentTo.trim(),
password: paymentPassword,
})
.then((response) => {
if (response?.error) {
setSendPaymentError(response.error);
} else {
setIsOpenSendQort(false);
setIsOpenSendQortSuccess(true);
// setExtstate("transfer-success-regular");
// setSendPaymentSuccess("Payment successfully sent");
}
setIsLoading(false);
}
);
})
.catch((error) => {
console.error("Failed to send coin:", error);
setIsLoading(false);
});
};
const clearAllStates = () => {
@ -883,11 +897,16 @@ function App() {
}, 10000);
});
}
chrome?.runtime?.sendMessage({ action: "userInfo" }, (response) => {
window.sendMessage("userInfo")
.then((response) => {
if (response && !response.error) {
setUserInfo(response);
}
})
.catch((error) => {
console.error("Failed to get user info:", error);
});
getBalanceFunc();
} catch (error) {}
}, []);
@ -974,37 +993,41 @@ function App() {
crypto.kdfThreads,
() => {}
);
chrome?.runtime?.sendMessage(
{
action: "decryptWallet",
payload: {
password: walletToBeDownloadedPassword,
wallet,
},
},
(response) => {
if (response && !response?.error) {
window.sendMessage("decryptWallet", {
password: walletToBeDownloadedPassword,
wallet,
})
.then((response) => {
if (response && !response.error) {
setRawWallet(wallet);
setWalletToBeDownloaded({
wallet,
qortAddress: wallet.address0,
});
chrome?.runtime?.sendMessage(
{ action: "userInfo" },
(response2) => {
window.sendMessage("userInfo")
.then((response2) => {
setIsLoading(false);
if (response2 && !response2.error) {
setUserInfo(response);
setUserInfo(response2);
}
}
);
})
.catch((error) => {
setIsLoading(false);
console.error("Failed to get user info:", error);
});
getBalanceFunc();
} else if (response?.error) {
setIsLoading(false);
setWalletToBeDecryptedError(response.error);
}
}
);
})
.catch((error) => {
setIsLoading(false);
console.error("Failed to decrypt wallet:", error);
});
} catch (error: any) {
setWalletToBeDownloadedError(error?.message);
setIsLoading(false);
@ -1082,40 +1105,49 @@ function App() {
res();
}, 250);
});
chrome?.runtime?.sendMessage(
{
action: "decryptWallet",
payload: {
password: authenticatePassword,
wallet: rawWallet,
},
},
(response) => {
if (response && !response?.error) {
window.sendMessage("decryptWallet", {
password: authenticatePassword,
wallet: rawWallet,
})
.then((response) => {
if (response && !response.error) {
setAuthenticatePassword("");
setExtstate("authenticated");
setWalletToBeDecryptedError("");
chrome?.runtime?.sendMessage({ action: "userInfo" }, (response) => {
setIsLoading(false);
if (response && !response.error) {
setUserInfo(response);
}
});
getBalanceFunc();
chrome?.runtime?.sendMessage(
{ action: "getWalletInfo" },
(response) => {
if (response && response?.walletInfo) {
setRawWallet(response?.walletInfo);
window.sendMessage("userInfo")
.then((response) => {
setIsLoading(false);
if (response && !response.error) {
setUserInfo(response);
}
}
);
})
.catch((error) => {
setIsLoading(false);
console.error("Failed to get user info:", error);
});
getBalanceFunc();
window.sendMessage("getWalletInfo")
.then((response) => {
if (response && response.walletInfo) {
setRawWallet(response.walletInfo);
}
})
.catch((error) => {
console.error("Failed to get wallet info:", error);
});
} else if (response?.error) {
setIsLoading(false);
setWalletToBeDecryptedError(response.error);
}
}
);
})
.catch((error) => {
setIsLoading(false);
console.error("Failed to decrypt wallet:", error);
});
} catch (error) {
setWalletToBeDecryptedError("Unable to authenticate. Wrong password");
}

233
src/background-cases.ts Normal file
View File

@ -0,0 +1,233 @@
import {
decryptWallet,
findUsableApi,
getBalanceInfo,
getKeyPair,
getLTCBalance,
getNameInfo,
getUserInfo,
sendCoin,
walletVersion,
} from "./background";
export function versionCase(request, event) {
event.source.postMessage(
{
requestId: request.requestId,
action: "version",
payload: { version: "1.0" },
type: "backgroundMessageResponse",
},
event.origin
);
}
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
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: "getWalletInfo",
error: error?.message,
type: "backgroundMessageResponse",
},
event.origin
);
}
}
export async function validApiCase(request, event) {
try {
const usableApi = await findUsableApi();
event.source.postMessage(
{
requestId: request.requestId,
action: "validApi",
payload: usableApi,
type: "backgroundMessageResponse",
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: "validApi",
error: error?.message,
type: "backgroundMessageResponse",
},
event.origin
);
}
}
export async function nameCase(request, event) {
try {
const response = await getNameInfo();
event.source.postMessage(
{
requestId: request.requestId,
action: "name",
payload: response,
type: "backgroundMessageResponse",
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: "name",
error: error?.message,
type: "backgroundMessageResponse",
},
event.origin
);
}
}
export async function userInfoCase(request, event) {
try {
const response = await getUserInfo();
event.source.postMessage(
{
requestId: request.requestId,
action: "userInfo",
payload: response,
type: "backgroundMessageResponse",
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: "userInfo",
error: "User not authenticated",
type: "backgroundMessageResponse",
},
event.origin
);
}
}
export async function decryptWalletCase(request, event) {
try {
const { password, wallet } = request.payload;
const response = await decryptWallet(password, wallet, walletVersion);
event.source.postMessage(
{
requestId: request.requestId,
action: "decryptWallet",
payload: response,
type: "backgroundMessageResponse",
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: "decryptWallet",
error: error?.message,
type: "backgroundMessageResponse",
},
event.origin
);
}
}
export async function balanceCase(request, event) {
try {
const response = await getBalanceInfo();
event.source.postMessage(
{ requestId: request.requestId, action: "balance", payload: response, type: "backgroundMessageResponse" },
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: "balance",
error: error?.message,
type: "backgroundMessageResponse"
},
event.origin
);
}
}
export async function ltcBalanceCase(request, event) {
try {
const response = await getLTCBalance();
event.source.postMessage(
{ requestId: request.requestId, action: "ltcBalance", payload: response, type: "backgroundMessageResponse" },
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: "ltcBalance",
error: error?.message,
type: "backgroundMessageResponse"
},
event.origin
);
}
}
export async function sendCoinCase(request, event) {
try {
const { receiver, password, amount } = request.payload;
const { res } = await sendCoin({receiver, password, amount});
if (!res?.success) {
event.source.postMessage(
{
requestId: request.requestId,
action: "sendCoin",
error: res?.data?.message,
type: "backgroundMessageResponse",
},
event.origin
);
return;
}
event.source.postMessage(
{
requestId: request.requestId,
action: "sendCoin",
payload: true,
type: "backgroundMessageResponse",
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: "sendCoin",
error: error?.message,
type: "backgroundMessageResponse",
},
event.origin
);
}
}

4554
src/background-old.ts Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,66 @@
// Utility to generate unique request IDs
function generateRequestId() {
return `msg-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;
}
// Map to store callbacks by requestId
const callbackMap = new Map();
// Global listener for handling message responses
window.addEventListener("message", (event) => {
const { type, requestId, payload, error, message } = event.data;
// Only process messages of type `backgroundMessageResponse`
if (type !== "backgroundMessageResponse") return;
// Check if theres a callback stored for this requestId
if (callbackMap.has(requestId)) {
const { resolve, reject } = callbackMap.get(requestId);
callbackMap.delete(requestId); // Remove callback after use
if (error) {
reject({ error, message });
} else {
resolve({ payload });
}
}
});
// Define the sendMessage function
export const sendMessageBackground = (action, data = {}, timeout = 60000) => {
return new Promise((resolve) => {
const requestId = generateRequestId(); // Unique ID for each request
callbackMap.set(requestId, { resolve }); // Store resolve callback only
// Send the message with `backgroundMessage` type
window.postMessage({ type: "backgroundMessage", action, requestId, payload: data }, "*");
// Set up a timeout to automatically resolve with an error if no response is received
const timeoutId = setTimeout(() => {
// Remove the callback to prevent memory leaks
callbackMap.delete(requestId);
resolve({ error: "timeout", message: `Request timed out after ${timeout} ms` });
}, timeout);
// Adjust resolve to clear the timeout when a response arrives
callbackMap.set(requestId, {
resolve: (response) => {
clearTimeout(timeoutId); // Clear the timeout if the response is received in time
resolve(response);
}
});
}).then((response) => {
// Return payload or error based on response content
if (response?.payload) {
return response.payload;
} else if (response?.error) {
return { error: response.error, message: response?.message || "An error occurred" };
}
});
};
window.sendMessage = sendMessageBackground;