From 3bdd40bf42c7d3b936875a10aeb71d3d0a09e657 Mon Sep 17 00:00:00 2001 From: Goktug Poyraz Date: Wed, 19 Apr 2023 09:49:30 +0200 Subject: [PATCH] feat: trigger qrsigning modal using approval controller --- app/components/Nav/Main/RootRPCMethodsUI.js | 101 ++++++++++++++------ app/core/RPCMethods/RPCMethodMiddleware.ts | 1 + 2 files changed, 71 insertions(+), 31 deletions(-) diff --git a/app/components/Nav/Main/RootRPCMethodsUI.js b/app/components/Nav/Main/RootRPCMethodsUI.js index e64c09fd019..3a5e28c0cd9 100644 --- a/app/components/Nav/Main/RootRPCMethodsUI.js +++ b/app/components/Nav/Main/RootRPCMethodsUI.js @@ -6,6 +6,7 @@ import { connect, useSelector } from 'react-redux'; import { ethers } from 'ethers'; import abi from 'human-standard-token-abi'; import { ethErrors } from 'eth-json-rpc-errors'; +import { v1 as random } from 'uuid'; import Approval from '../../Views/Approval'; import NotificationManager from '../../../core/NotificationManager'; @@ -86,6 +87,7 @@ const RootRPCMethodsUI = (props) => { const [customNetworkToAdd, setCustomNetworkToAdd] = useState(null); const [customNetworkToSwitch, setCustomNetworkToSwitch] = useState(null); + const [qrSigningState, setQrSigningState] = useState(null); const [hostToApprove, setHostToApprove] = useState(null); @@ -96,6 +98,28 @@ const RootRPCMethodsUI = (props) => { const toggleApproveModal = props.toggleApproveModal; const toggleDappTransactionModal = props.toggleDappTransactionModal; const setEtherTransaction = props.setEtherTransaction; + const QRState = props.QRState; + const isSigningQRObject = props.isSigningQRObject; + + // Reject pending approval using MetaMask SDK. + const rejectPendingApproval = (id, error) => { + const { ApprovalController } = Engine.context; + try { + ApprovalController.reject(id, error); + } catch (error) { + Logger.error(error, 'Reject while rejecting pending connection request'); + } + }; + + // Accept pending approval using MetaMask SDK. + const acceptPendingApproval = (id, requestData) => { + const { ApprovalController } = Engine.context; + try { + ApprovalController.accept(id, requestData); + } catch (err) { + // Ignore err if request already approved or doesn't exists. + } + }; const showPendingApprovalModal = ({ type, origin }) => { InteractionManager.runAfterInteractions(() => { @@ -438,21 +462,30 @@ const RootRPCMethodsUI = (props) => { ); + const onQRSigningApproval = () => { + setShowPendingApproval(false); + acceptPendingApproval(qrSigningState.id, qrSigningState.data); + setQrSigningState(undefined); + }; + + const onQRSigningRejected = () => { + setShowPendingApproval(false); + rejectPendingApproval(qrSigningState.id, qrSigningState.data); + setQrSigningState(undefined); + }; + const renderQRSigningModal = () => { - const { - isSigningQRObject, - QRState, - approveModalVisible, - dappTransactionModalVisible, - } = props; + const { QRState, approveModalVisible, dappTransactionModalVisible } = props; const shouldRenderThisModal = - !showPendingApproval && - !approveModalVisible && - !dappTransactionModalVisible && - isSigningQRObject; + !approveModalVisible && !dappTransactionModalVisible; return ( shouldRenderThisModal && ( - + ) ); }; @@ -516,26 +549,6 @@ const RootRPCMethodsUI = (props) => { ); - // Reject pending approval using MetaMask SDK. - const rejectPendingApproval = (id, error) => { - const { ApprovalController } = Engine.context; - try { - ApprovalController.reject(id, error); - } catch (error) { - Logger.error(error, 'Reject while rejecting pending connection request'); - } - }; - - // Accept pending approval using MetaMask SDK. - const acceptPendingApproval = (id, requestData) => { - const { ApprovalController } = Engine.context; - try { - ApprovalController.accept(id, requestData); - } catch (err) { - // Ignore err if request already approved or doesn't exists. - } - }; - const onAddCustomNetworkReject = () => { setShowPendingApproval(false); rejectPendingApproval( @@ -766,6 +779,13 @@ const RootRPCMethodsUI = (props) => { origin: request.origin, }); break; + case ApprovalTypes.QR_SIGNING: + setQrSigningState({ data: requestData, id: request.id }); + showPendingApprovalModal({ + type: ApprovalTypes.QR_SIGNING, + origin: request.origin, + }); + break; default: break; } @@ -774,6 +794,25 @@ const RootRPCMethodsUI = (props) => { } }; + useEffect(() => { + async function checkAndAddQRSigningApproval() { + if (isSigningQRObject) { + const { ApprovalController } = Engine.context; + try { + await ApprovalController.add({ + id: random(), + origin: 'QR_signing', + requestData: QRState, + type: ApprovalTypes.QR_SIGNING, + }); + } catch (error) { + throw new Error('QR signing failed'); + } + } + } + checkAndAddQRSigningApproval(); + }, [QRState, isSigningQRObject]); + useEffect(() => { initializeWalletConnect(); onWalletConnectSessionRequest(); diff --git a/app/core/RPCMethods/RPCMethodMiddleware.ts b/app/core/RPCMethods/RPCMethodMiddleware.ts index 86201a09e92..5d6cf5c7be2 100644 --- a/app/core/RPCMethods/RPCMethodMiddleware.ts +++ b/app/core/RPCMethods/RPCMethodMiddleware.ts @@ -30,6 +30,7 @@ export enum ApprovalTypes { ADD_ETHEREUM_CHAIN = 'ADD_ETHEREUM_CHAIN', SWITCH_ETHEREUM_CHAIN = 'SWITCH_ETHEREUM_CHAIN', REQUEST_PERMISSIONS = 'wallet_requestPermissions', + QR_SIGNING = 'QR_SIGNING', } interface RPCMethodsMiddleParameters {