import React, { useEffect, useState } from 'react'; import { ScrollView, TouchableOpacity, View } from 'react-native'; import { Button, List, Text, useTheme } from 'react-native-paper'; import mergeWith from 'lodash/mergeWith'; import { useNavigation } from '@react-navigation/native'; import { NativeStackNavigationProp } from '@react-navigation/native-stack'; import { AccountsProps, StackParamsList, Account } from '../types'; import { addAccount } from '../utils/accounts'; import styles from '../styles/stylesheet'; import HDPathDialog from './HDPathDialog'; import AccountDetails from './AccountDetails'; import { useAccounts } from '../context/AccountsContext'; import { web3wallet } from '../utils/wallet-connect/WalletConnectUtils'; import { EIP155_SIGNING_METHODS } from '../utils/wallet-connect/EIP155Data'; import { COSMOS_METHODS } from '../utils/wallet-connect/COSMOSData'; import { useNetworks } from '../context/NetworksContext'; import { COSMOS, EIP155 } from '../utils/constants'; import { NETWORK_METHODS } from '../utils/wallet-connect/common-data'; const Accounts = ({ currentIndex, updateIndex }: AccountsProps) => { const navigation = useNavigation>(); const { accounts, setAccounts } = useAccounts(); const { selectedNetwork } = useNetworks(); const [expanded, setExpanded] = useState(false); const [isAccountCreating, setIsAccountCreating] = useState(false); const [hdDialog, setHdDialog] = useState(false); const [pathCode, setPathCode] = useState(''); const theme = useTheme(); const handlePress = () => setExpanded(!expanded); const updateAccounts = (account: Account) => { setAccounts([...accounts, account]); }; useEffect(() => { const updateSessions = async () => { const sessions = (web3wallet && web3wallet.getActiveSessions()) || {}; // Iterate through each session for (const topic in sessions) { const session = sessions[topic]; const combinedNamespaces = mergeWith( session.requiredNamespaces, session.optionalNamespaces, (obj, src) => Array.isArray(obj) && Array.isArray(src) ? [...src, ...obj] : undefined, ); const namespaceChainId = `${selectedNetwork?.namespace}:${selectedNetwork?.chainId}`; let updatedNamespaces; switch (selectedNetwork?.namespace) { case EIP155: updatedNamespaces = { eip155: { chains: [namespaceChainId], // TODO: Debug optional namespace methods and events being required for approval methods: [ ...Object.values(EIP155_SIGNING_METHODS), ...Object.values(NETWORK_METHODS), ...(combinedNamespaces.eip155?.methods ?? []), ], events: [...(combinedNamespaces.eip155?.events ?? [])], accounts: accounts.map(ethAccount => { return `${namespaceChainId}:${ethAccount.address}`; }), }, cosmos: { chains: [], methods: [], events: [], accounts: [], }, }; break; case COSMOS: updatedNamespaces = { cosmos: { chains: [namespaceChainId], methods: [ ...Object.values(COSMOS_METHODS), ...Object.values(NETWORK_METHODS), ...(combinedNamespaces.cosmos?.methods ?? []), ], events: [...(combinedNamespaces.cosmos?.events ?? [])], accounts: accounts.map(cosmosAccount => { return `${namespaceChainId}:${cosmosAccount.address}`; }), }, eip155: { chains: [], methods: [], events: [], accounts: [], }, }; break; default: break; } if (!updatedNamespaces) { return; } await web3wallet!.updateSession({ topic, namespaces: updatedNamespaces, }); } }; // Call the updateSessions function when the 'accounts' dependency changes updateSessions(); // eslint-disable-next-line react-hooks/exhaustive-deps }, [accounts]); const addAccountHandler = async () => { setIsAccountCreating(true); const newAccount = await addAccount(selectedNetwork!); setIsAccountCreating(false); if (newAccount) { updateAccounts(newAccount); updateIndex(newAccount.index); } }; const renderAccountItems = () => accounts.map(account => ( { updateIndex(account.index); setExpanded(false); }} /> )); return ( setHdDialog(false)} updateAccounts={updateAccounts} updateIndex={updateIndex} pathCode={pathCode} /> {renderAccountItems()} { navigation.navigate('SignMessage', { selectedNamespace: selectedNetwork!.namespace, selectedChainId: selectedNetwork!.chainId, accountInfo: accounts[currentIndex], }); }}> Sign Message { navigation.navigate('AddNetwork'); }}> Add Network ); }; export default Accounts;