Add method to import account from android using mnemonic #41

Merged
nabarun merged 4 commits from pj-import-wallet into nym-vpn-app 2025-08-02 12:31:01 +00:00
3 changed files with 64 additions and 7 deletions

View File

@ -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",

3
src/global.d.ts vendored
View File

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

View File

@ -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<NativeStackNavigationProp<StackParamsList>>();
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
};