mirror of
https://github.com/Qortal/qortal-mobile.git
synced 2025-04-18 17:35:53 +00:00
started on background cases
This commit is contained in:
parent
ef058b9c8b
commit
8afc3789c9
166
src/App.tsx
166
src/App.tsx
@ -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
233
src/background-cases.ts
Normal 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
4554
src/background-old.ts
Normal file
File diff suppressed because it is too large
Load Diff
1417
src/background.ts
1417
src/background.ts
File diff suppressed because it is too large
Load Diff
66
src/messaging/messagesToBackground.tsx
Normal file
66
src/messaging/messagesToBackground.tsx
Normal 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 there’s 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;
|
Loading…
x
Reference in New Issue
Block a user