From 6089085a0a033ffad3ce731485bded57a0407745 Mon Sep 17 00:00:00 2001 From: pranavjadhav007 Date: Wed, 30 Jul 2025 20:15:06 +0530 Subject: [PATCH] Import account using mnemonic --- src/global.d.ts | 4 +- src/hooks/useWebViewHandler.ts | 71 +++++++++++++++++++++++----------- 2 files changed, 51 insertions(+), 24 deletions(-) diff --git a/src/global.d.ts b/src/global.d.ts index e3611ef..ab2343e 100644 --- a/src/global.d.ts +++ b/src/global.d.ts @@ -37,8 +37,8 @@ declare global { // Handles incoming transfer requests from Android receiveTransferRequestFromAndroid?: (to: string, amount: string, namespace: String, chainId: string, memo: string) => void; - // Handles account creation requests from Android - receiveGetOrCreateAccountFromAndroid?: (chainId: string) => void; + // Handles account import requests from Android + receiveImportAccountFromAndroid?: (mnemonic: string, chainId: string) => void; } } diff --git a/src/hooks/useWebViewHandler.ts b/src/hooks/useWebViewHandler.ts index 5b0fb12..070f7ad 100644 --- a/src/hooks/useWebViewHandler.ts +++ b/src/hooks/useWebViewHandler.ts @@ -6,34 +6,61 @@ import { useAccounts } from '../context/AccountsContext'; import { useNetworks } from '../context/NetworksContext'; import { StackParamsList } from '../types'; -import useGetOrCreateAccounts from './useGetOrCreateAccounts'; -import { retrieveAccountsForNetwork } from '../utils/accounts'; +import { retrieveAccountsForNetwork, createWallet, retrieveNetworksData } from '../utils/accounts'; export const useWebViewHandler = () => { // Navigation and context hooks const navigation = useNavigation>(); - const { selectedNetwork } = useNetworks(); - const { accounts, currentIndex } = useAccounts(); - const { getOrCreateAccountsForChain } = useGetOrCreateAccounts(); + const { selectedNetwork, setNetworksData, setSelectedNetwork } = useNetworks(); + const { accounts, currentIndex, setAccounts } = useAccounts(); - // Initialize accounts - const handleGetOrCreateAccount = useCallback(async (chainId: string) => { + // Import account using mnemonic + const handleImportAccount = useCallback(async (mnemonic: string, chainId: string) => { try { - - const accountsData = await getOrCreateAccountsForChain(chainId); - - if (!accountsData || accountsData.length === 0) { - window.Android?.onAccountError?.('Failed to create/retrieve account'); - + // Get available networks data + const networksData = await retrieveNetworksData(); + + if (!networksData || networksData.length === 0) { + window.Android?.onAccountError?.('No networks configured'); return; } - window.Android?.onAccountCreated?.(JSON.stringify(accountsData[0])); + // Create wallet using the provided mnemonic + await createWallet(networksData, mnemonic); + + // Find the requested network + const requestedNetwork = networksData.find(network => network.chainId === chainId); + if (!requestedNetwork) { + window.Android?.onAccountError?.(`Network with chainId '${chainId}' not found`); + return; + } + + // Update networks context + setNetworksData(networksData); + setSelectedNetwork(requestedNetwork); + + // Retrieve accounts for the requested network + const accounts = await retrieveAccountsForNetwork( + `${requestedNetwork.namespace}:${requestedNetwork.chainId}`, + '0' + ); + + if (!accounts || accounts.length === 0) { + window.Android?.onAccountError?.('Failed to import account'); + return; + } + + // Update accounts context + setAccounts(accounts); + + // Notify Android that account was successfully imported for the requested chain + window.Android?.onAccountCreated?.(JSON.stringify(accounts[0])); + } catch (error) { - console.error('Account operation error:', error); - window.Android?.onAccountError?.(`Operation failed: ${error}`); + console.error('Import account error:', error); + window.Android?.onAccountError?.(`Import failed: ${error}`); } - }, [getOrCreateAccountsForChain]); + }, [setNetworksData, setSelectedNetwork, setAccounts]); // Core navigation handler const navigateToSignRequest = useCallback((message: string) => { @@ -146,13 +173,13 @@ export const useWebViewHandler = () => { window.receiveSignRequestFromAndroid = navigateToSignRequest; window.receiveTransferRequestFromAndroid = navigateToTransfer; - - window.receiveGetOrCreateAccountFromAndroid = handleGetOrCreateAccount; - + + window.receiveImportAccountFromAndroid = handleImportAccount; + return () => { window.receiveSignRequestFromAndroid = undefined; window.receiveTransferRequestFromAndroid = undefined; - window.receiveGetOrCreateAccountFromAndroid = undefined; + window.receiveImportAccountFromAndroid = undefined; }; - }, [navigateToSignRequest, navigateToTransfer, handleGetOrCreateAccount]); // Only the function reference as dependency + }, [navigateToSignRequest, navigateToTransfer, handleImportAccount]); // Only the function reference as dependency };