import React, { useEffect, useState } from 'react'; import { ScrollView, TouchableOpacity, View } from 'react-native'; import { Button, List, Text, useTheme } from 'react-native-paper'; import { setInternetCredentials } from 'react-native-keychain'; import { useNavigation } from '@react-navigation/native'; import { NativeStackNavigationProp } from '@react-navigation/native-stack'; import { 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 { useNetworks } from '../context/NetworksContext'; import ConfirmDialog from './ConfirmDialog'; import { getNamespaces } from '../utils/wallet-connect/helpers'; import ShowPKDialog from './ShowPKDialog'; const Accounts = () => { const navigation = useNavigation>(); const { accounts, setAccounts, setCurrentIndex, currentIndex } = useAccounts(); const { networksData, selectedNetwork, setNetworksData, setSelectedNetwork } = useNetworks(); const [expanded, setExpanded] = useState(false); const [isAccountCreating, setIsAccountCreating] = useState(false); const [hdDialog, setHdDialog] = useState(false); const [pathCode, setPathCode] = useState(''); const [deleteNetworkDialog, setDeleteNetworkDialog] = useState(false); const theme = useTheme(); const handlePress = () => setExpanded(!expanded); const hideDeleteNetworkDialog = () => setDeleteNetworkDialog(false); 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 { optionalNamespaces, requiredNamespaces } = session; const updatedNamespaces = await getNamespaces( optionalNamespaces, requiredNamespaces, networksData, selectedNetwork!, accounts, currentIndex, ); 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); setCurrentIndex(newAccount.index); } }; const renderAccountItems = () => accounts.map(account => ( { setCurrentIndex(account.index); setExpanded(false); }} /> )); const handleRemove = async () => { const updatedNetworks = networksData.filter( networkData => selectedNetwork!.networkId !== networkData.networkId, ); await setInternetCredentials( 'networks', '_', JSON.stringify(updatedNetworks), ); setSelectedNetwork(updatedNetworks[0]); setCurrentIndex(0); setDeleteNetworkDialog(false); setNetworksData(updatedNetworks); }; return ( setHdDialog(false)} updateAccounts={updateAccounts} pathCode={pathCode} /> {renderAccountItems()} { navigation.navigate('SignMessage', { selectedNamespace: selectedNetwork!.namespace, selectedChainId: selectedNetwork!.chainId, accountInfo: accounts[currentIndex], }); }}> Sign Message { navigation.navigate('AddNetwork'); }}> Add Network { navigation.navigate('EditNetwork', { selectedNetwork: selectedNetwork!, }); }}> Edit Network {!selectedNetwork!.isDefault && ( { setDeleteNetworkDialog(true); }}> Delete Network )} ); }; export default Accounts;