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