Refactor add network hook
This commit is contained in:
parent
36bb645e65
commit
08b44293ef
@ -1,135 +1,110 @@
|
||||
import { useEffect, useCallback } from "react";
|
||||
|
||||
import { addNewNetwork, createWallet, isChainIdPresent, isWalletCreated, retrieveAccounts } from "../utils/accounts";
|
||||
import { sendMessage } from "../utils/misc";
|
||||
import useAccountsData from "./useAccountsData";
|
||||
import { addNewNetwork, createWallet, isChainIdPresent, isWalletCreated } from "../utils/accounts";
|
||||
import { useNetworks } from "../context/NetworksContext";
|
||||
import { useAccounts } from "../context/AccountsContext";
|
||||
import { ADD_NETWORK, WALLET_ACCOUNTS_DATA } from "../utils/constants";
|
||||
import { ADD_NETWORK } from "../utils/constants";
|
||||
import { NetworksFormData } from "../types";
|
||||
import { sendMessage } from "../utils/misc";
|
||||
|
||||
const REACT_APP_ALLOWED_URLS = import.meta.env.REACT_APP_ALLOWED_URLS;
|
||||
|
||||
const useGetOrCreateNetwork = () => {
|
||||
const { networksData, setNetworksData } = useNetworks();
|
||||
const { setAccounts } = useAccounts();
|
||||
const { getAccountsData } = useAccountsData();
|
||||
|
||||
const getOrCreateNetwork = useCallback(async (chainId: string, networkData?: NetworksFormData) => {
|
||||
const isCreated = await isWalletCreated();
|
||||
|
||||
if (!isCreated) {
|
||||
console.log("Wallet not found, creating wallet...");
|
||||
await createWallet(networksData);
|
||||
}
|
||||
|
||||
const isNetworkPresent = await isChainIdPresent(chainId);
|
||||
|
||||
let resolvedNetworkData: NetworksFormData | undefined = undefined;
|
||||
|
||||
if (!isNetworkPresent) {
|
||||
if (!networkData || chainId !== networkData.chainId) {
|
||||
console.log("Network data not available.");
|
||||
return [];
|
||||
const getOrCreateNetwork = useCallback(
|
||||
async (chainId: string, networkData?: NetworksFormData, sourceOrigin?: string) => {
|
||||
if (!sourceOrigin) {
|
||||
return;
|
||||
}
|
||||
|
||||
console.log("ChainId not found. Adding network");
|
||||
try {
|
||||
const isCreated = await isWalletCreated();
|
||||
|
||||
resolvedNetworkData = {
|
||||
chainId: networkData.chainId,
|
||||
namespace: networkData.namespace,
|
||||
networkName: networkData.networkName,
|
||||
rpcUrl: networkData.rpcUrl,
|
||||
blockExplorerUrl: networkData.blockExplorerUrl || "",
|
||||
addressPrefix: networkData.addressPrefix || "",
|
||||
coinType: networkData.coinType || "",
|
||||
nativeDenom: networkData.nativeDenom || "",
|
||||
gasPrice: networkData.gasPrice || String(import.meta.env.REACT_APP_DEFAULT_GAS_PRICE || ""),
|
||||
currencySymbol: networkData.currencySymbol || "",
|
||||
isDefault: false,
|
||||
};
|
||||
if (!isCreated) {
|
||||
console.log("Wallet not found, creating wallet...");
|
||||
await createWallet(networksData);
|
||||
}
|
||||
|
||||
const retrievedNetworksData = await addNewNetwork(resolvedNetworkData);
|
||||
setNetworksData(retrievedNetworksData);
|
||||
} else {
|
||||
// fallback if the network already exists, try to find it from networksData
|
||||
resolvedNetworkData = networksData.find(net => net.chainId === chainId);
|
||||
}
|
||||
const isNetworkPresent = await isChainIdPresent(chainId);
|
||||
|
||||
if (!resolvedNetworkData) {
|
||||
console.warn("Resolved network data is not available");
|
||||
return [];
|
||||
}
|
||||
if (!isNetworkPresent) {
|
||||
if (!networkData || chainId !== networkData.chainId) {
|
||||
console.log("Network data not available.");
|
||||
if (sourceOrigin) {
|
||||
sendMessage(window.parent, "NETWORK_ADD_FAILED", {
|
||||
type: "NETWORK_ADD_FAILED",
|
||||
message: "Invalid or missing network data"
|
||||
}, sourceOrigin);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
const accounts = await retrieveAccounts({ ...resolvedNetworkData, networkId: '' });
|
||||
console.log("ChainId not found. Adding network");
|
||||
|
||||
if (!accounts) {
|
||||
return [];
|
||||
}
|
||||
const resolvedNetworkData = {
|
||||
chainId: networkData.chainId,
|
||||
namespace: networkData.namespace,
|
||||
networkName: networkData.networkName,
|
||||
rpcUrl: networkData.rpcUrl,
|
||||
blockExplorerUrl: networkData.blockExplorerUrl || "",
|
||||
addressPrefix: networkData.addressPrefix || "",
|
||||
coinType: networkData.coinType || "",
|
||||
nativeDenom: networkData.nativeDenom || "",
|
||||
gasPrice: networkData.gasPrice || String(import.meta.env.REACT_APP_DEFAULT_GAS_PRICE || ""),
|
||||
currencySymbol: networkData.currencySymbol || "",
|
||||
isDefault: false,
|
||||
};
|
||||
|
||||
setAccounts(accounts);
|
||||
const retrievedNetworksData = await addNewNetwork(resolvedNetworkData);
|
||||
setNetworksData(retrievedNetworksData);
|
||||
|
||||
return accounts;
|
||||
}, [networksData, setAccounts, setNetworksData]);
|
||||
sendMessage(window.parent, "NETWORK_ADDED_SUCCESSFULLY", {
|
||||
type: "NETWORK_ADDED_SUCCESSFULLY",
|
||||
chainId
|
||||
}, sourceOrigin);
|
||||
} else {
|
||||
sendMessage(window.parent, "NETWORK_ALREADY_EXISTS", {
|
||||
type: "NETWORK_ALREADY_EXISTS",
|
||||
chainId
|
||||
}, sourceOrigin);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("Error in getOrCreateNetwork:", error);
|
||||
sendMessage(window.parent, "NETWORK_ADD_FAILED", {
|
||||
type: "NETWORK_ADD_FAILED",
|
||||
message: error instanceof Error ? error.message : "Unknown error"
|
||||
}, sourceOrigin);
|
||||
}
|
||||
},
|
||||
[networksData, setNetworksData]
|
||||
);
|
||||
|
||||
useEffect(() => {
|
||||
const handleCreateAccounts = async (event: MessageEvent) => {
|
||||
if (event.data.type !== ADD_NETWORK) return;
|
||||
|
||||
if (!REACT_APP_ALLOWED_URLS) {
|
||||
console.log('Allowed URLs are not set');
|
||||
console.log("Allowed URLs are not set");
|
||||
return;
|
||||
}
|
||||
|
||||
const allowedUrls = REACT_APP_ALLOWED_URLS.split(',').map(url => url.trim());
|
||||
const allowedUrls = REACT_APP_ALLOWED_URLS.split(",").map(url => url.trim());
|
||||
|
||||
if (!allowedUrls.includes(event.origin)) {
|
||||
console.log('Unauthorized app.');
|
||||
console.log("Unauthorized app.");
|
||||
return;
|
||||
}
|
||||
|
||||
const { chainId, networkData } = event.data;
|
||||
|
||||
const accountsData = await getOrCreateNetwork(chainId, networkData);
|
||||
const accountsAddressList = accountsData.map(account => account.address);
|
||||
console.log('Sending WALLET_ACCOUNTS_DATA accounts:', accountsAddressList);
|
||||
|
||||
sendMessage(
|
||||
event.source as Window, WALLET_ACCOUNTS_DATA,
|
||||
accountsAddressList,
|
||||
event.origin
|
||||
);
|
||||
await getOrCreateNetwork(chainId, networkData, event.origin);
|
||||
};
|
||||
|
||||
const autoCreateAccounts = async () => {
|
||||
const defaultChainId = networksData[0]?.chainId;
|
||||
|
||||
if (!defaultChainId) {
|
||||
console.log('useGetOrCreateAccounts: No default chainId found');
|
||||
return;
|
||||
}
|
||||
const accounts = await getOrCreateNetwork(defaultChainId);
|
||||
|
||||
// Only notify Android when we actually have accounts
|
||||
if (accounts.length > 0 && window.Android?.onAccountsReady) {
|
||||
window.Android.onAccountsReady();
|
||||
} else {
|
||||
console.log('No accounts created or Android bridge not available');
|
||||
}
|
||||
};
|
||||
|
||||
window.addEventListener('message', handleCreateAccounts);
|
||||
|
||||
const isAndroidWebView = !!(window.Android);
|
||||
|
||||
if (isAndroidWebView) {
|
||||
autoCreateAccounts();
|
||||
}
|
||||
|
||||
window.addEventListener("message", handleCreateAccounts);
|
||||
return () => {
|
||||
window.removeEventListener('message', handleCreateAccounts);
|
||||
window.removeEventListener("message", handleCreateAccounts);
|
||||
};
|
||||
}, [networksData, getAccountsData, getOrCreateNetwork]);
|
||||
}, [getOrCreateNetwork]);
|
||||
};
|
||||
|
||||
export default useGetOrCreateNetwork;
|
||||
|
Loading…
Reference in New Issue
Block a user