Add method to import account from android using mnemonic (#41)
Part of https://www.notion.so/Integrate-eSIM-buy-flow-into-app-18aa6b22d47280d4a77cf1b27e2ba193 Co-authored-by: pranavjadhav007 <jadhavpranav89@gmail.com> Reviewed-on: LaconicNetwork/laconic-wallet-web#41
This commit is contained in:
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "web-wallet",
|
"name": "web-wallet",
|
||||||
"version": "0.1.7-nym-0.1.1",
|
"version": "0.1.7-nym-0.1.2",
|
||||||
"private": true,
|
"private": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@cerc-io/registry-sdk": "^0.2.5",
|
"@cerc-io/registry-sdk": "^0.2.5",
|
||||||
|
|||||||
Vendored
+3
@@ -39,6 +39,9 @@ declare global {
|
|||||||
|
|
||||||
// Handles account creation requests from Android
|
// Handles account creation requests from Android
|
||||||
receiveGetOrCreateAccountFromAndroid?: (chainId: string) => void;
|
receiveGetOrCreateAccountFromAndroid?: (chainId: string) => void;
|
||||||
|
|
||||||
|
// Handles account import requests from Android
|
||||||
|
receiveImportAccountFromAndroid?: (chainId: string, mnemonic: string) => void;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -7,14 +7,14 @@ import { useNetworks } from '../context/NetworksContext';
|
|||||||
|
|
||||||
import { StackParamsList } from '../types';
|
import { StackParamsList } from '../types';
|
||||||
import useGetOrCreateAccounts from './useGetOrCreateAccounts';
|
import useGetOrCreateAccounts from './useGetOrCreateAccounts';
|
||||||
import { retrieveAccountsForNetwork } from '../utils/accounts';
|
import { retrieveAccountsForNetwork, createWallet, retrieveNetworksData, isWalletCreated } from '../utils/accounts';
|
||||||
|
|
||||||
export const useWebViewHandler = () => {
|
export const useWebViewHandler = () => {
|
||||||
// Navigation and context hooks
|
// Navigation and context hooks
|
||||||
const navigation = useNavigation<NativeStackNavigationProp<StackParamsList>>();
|
const navigation = useNavigation<NativeStackNavigationProp<StackParamsList>>();
|
||||||
const { selectedNetwork } = useNetworks();
|
|
||||||
const { accounts, currentIndex } = useAccounts();
|
|
||||||
const { getOrCreateAccountsForChain } = useGetOrCreateAccounts();
|
const { getOrCreateAccountsForChain } = useGetOrCreateAccounts();
|
||||||
|
const { selectedNetwork, setNetworksData, setSelectedNetwork } = useNetworks();
|
||||||
|
const { accounts, currentIndex, setAccounts } = useAccounts();
|
||||||
|
|
||||||
// Initialize accounts
|
// Initialize accounts
|
||||||
const handleGetOrCreateAccount = useCallback(async (chainId: string) => {
|
const handleGetOrCreateAccount = useCallback(async (chainId: string) => {
|
||||||
@@ -35,6 +35,57 @@ export const useWebViewHandler = () => {
|
|||||||
}
|
}
|
||||||
}, [getOrCreateAccountsForChain]);
|
}, [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
|
// Core navigation handler
|
||||||
const navigateToSignRequest = useCallback((message: string) => {
|
const navigateToSignRequest = useCallback((message: string) => {
|
||||||
try {
|
try {
|
||||||
@@ -149,10 +200,13 @@ export const useWebViewHandler = () => {
|
|||||||
|
|
||||||
window.receiveGetOrCreateAccountFromAndroid = handleGetOrCreateAccount;
|
window.receiveGetOrCreateAccountFromAndroid = handleGetOrCreateAccount;
|
||||||
|
|
||||||
|
window.receiveImportAccountFromAndroid = handleImportAccount;
|
||||||
|
|
||||||
return () => {
|
return () => {
|
||||||
window.receiveSignRequestFromAndroid = undefined;
|
window.receiveSignRequestFromAndroid = undefined;
|
||||||
window.receiveTransferRequestFromAndroid = undefined;
|
window.receiveTransferRequestFromAndroid = undefined;
|
||||||
window.receiveGetOrCreateAccountFromAndroid = 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
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user