Refactor add network hook

This commit is contained in:
IshaVenikar 2025-06-05 14:38:59 +05:30
parent 36bb645e65
commit 08b44293ef

View File

@ -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;