diff --git a/package.json b/package.json index c2f4bc8..fcf0e1c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "web-wallet", - "version": "0.1.7-nym-0.1.1", + "version": "0.1.7-nym-0.1.2", "private": true, "dependencies": { "@cerc-io/registry-sdk": "^0.2.5", diff --git a/src/global.d.ts b/src/global.d.ts index e3611ef..c691cf7 100644 --- a/src/global.d.ts +++ b/src/global.d.ts @@ -39,6 +39,9 @@ declare global { // Handles account creation requests from Android receiveGetOrCreateAccountFromAndroid?: (chainId: string) => void; + + // Handles account import requests from Android + receiveImportAccountFromAndroid?: (chainId: string, mnemonic: string) => void; } } diff --git a/src/hooks/useWebViewHandler.ts b/src/hooks/useWebViewHandler.ts index 5b0fb12..b306a8f 100644 --- a/src/hooks/useWebViewHandler.ts +++ b/src/hooks/useWebViewHandler.ts @@ -7,14 +7,14 @@ import { useNetworks } from '../context/NetworksContext'; import { StackParamsList } from '../types'; import useGetOrCreateAccounts from './useGetOrCreateAccounts'; -import { retrieveAccountsForNetwork } from '../utils/accounts'; +import { retrieveAccountsForNetwork, createWallet, retrieveNetworksData, isWalletCreated } 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) => { @@ -35,6 +35,57 @@ export const useWebViewHandler = () => { } }, [getOrCreateAccountsForChain]); + // Import account using mnemonic + const handleImportAccount = useCallback(async (chainId: string, mnemonic: string) => { + try { + // Get available networks data + const networksData = await retrieveNetworksData(); + + if (!networksData || networksData.length === 0) { + window.Android?.onAccountError?.('No networks configured'); + return; + } + + // Create wallet using the provided mnemonic if it doesn't exist + const walletExists = await isWalletCreated(); + if (!walletExists) { + 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('Import account error:', error); + window.Android?.onAccountError?.(`Import failed: ${error}`); + } + }, [setNetworksData, setSelectedNetwork, setAccounts]); + // Core navigation handler const navigateToSignRequest = useCallback((message: string) => { try { @@ -146,13 +197,16 @@ 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, handleGetOrCreateAccount, handleImportAccount]); // Only the function reference as dependency };