import React, { useCallback, useEffect, useState } from 'react'; import { Button, Snackbar } from 'react-native-paper'; import Icon from 'react-native-vector-icons/MaterialCommunityIcons'; import { SignClientTypes } from '@walletconnect/types'; import { useNavigation } from '@react-navigation/native'; import { NativeStackNavigationProp, createNativeStackNavigator, } from '@react-navigation/native-stack'; import SignMessage from './components/SignMessage'; import HomeScreen from './components/HomeScreen'; import SignRequest from './components/SignRequest'; import InvalidPath from './components/InvalidPath'; import PairingModal from './components/PairingModal'; import AddSession from './components/AddSession'; import WalletConnect from './components/WalletConnect'; import { StackParamsList } from './types'; import useInitialization, { web3wallet, } from './utils/wallet-connect/WalletConnectUtils'; import { EIP155_SIGNING_METHODS } from './utils/wallet-connect/EIP155Lib'; import { getSignParamsMessage } from './utils/wallet-connect/Helpers'; import { useRequests } from './context/RequestContext'; const Stack = createNativeStackNavigator(); const App = (): React.JSX.Element => { useInitialization(); const navigation = useNavigation>(); const { requestSession, setRequestSession } = useRequests(); const [modalVisible, setModalVisible] = useState(false); const [toastVisible, setToastVisible] = useState(false); const [currentProposal, setCurrentProposal] = useState< SignClientTypes.EventArguments['session_proposal'] | undefined >(); const onSessionProposal = useCallback( (proposal: SignClientTypes.EventArguments['session_proposal']) => { setModalVisible(true); setCurrentProposal(proposal); }, [], ); const onSessionRequest = useCallback( async (requestEvent: SignClientTypes.EventArguments['session_request']) => { const { topic, params } = requestEvent; const { request } = params; const requestSessionData = web3wallet.engine.signClient.session.get(topic); setRequestSession(requestSessionData); switch (request.method) { case EIP155_SIGNING_METHODS.PERSONAL_SIGN: navigation.navigate('SignRequest', { network: 'eth', address: request.params[1], message: getSignParamsMessage(request.params), requestEvent, requestSession, }); break; case 'cosmos_signDirect': navigation.navigate('SignRequest', { network: 'cosmos', address: request.params.signerAddress, message: request.params.signDoc.bodyBytes, requestEvent, requestSession, }); break; case 'cosmos_signAmino': navigation.navigate('SignRequest', { network: 'cosmos', address: request.params.signerAddress, message: request.params.signDoc.memo, requestEvent, requestSession, }); break; default: throw new Error('Invalid method'); } }, [requestSession, setRequestSession, navigation], ); useEffect(() => { web3wallet?.on('session_proposal', onSessionProposal); web3wallet?.on('session_request', onSessionRequest); return () => { web3wallet?.off('session_proposal', onSessionProposal); web3wallet?.off('session_request', onSessionRequest); }; //TODO: Investigate dependencies }); return ( <> ( ), }} /> setToastVisible(false)} action={{ label: 'Ok', onPress: () => { setToastVisible(false); }, }}> Session approved ); }; export default App;