From 4cc53550aa4bc2f0a6f55331eb90fd0c50f7edcf Mon Sep 17 00:00:00 2001 From: rakeshup Date: Tue, 31 Oct 2023 12:26:35 +0530 Subject: [PATCH] APP-2549: Field validation for WC QR code input (#1086) * wc uri validation wip * wc uri validation done * lint fic * review changes * crowdin key --- .../dAppValidationModal/index.tsx | 44 ++++++++++++------- .../useWalletConnectInterceptor.ts | 5 ++- src/locales/en/common.json | 3 +- src/services/walletConnectInterceptor.ts | 10 +++++ src/utils/constants/regex.ts | 2 + 5 files changed, 45 insertions(+), 19 deletions(-) diff --git a/src/containers/walletConnect/dAppValidationModal/index.tsx b/src/containers/walletConnect/dAppValidationModal/index.tsx index 30e9613e4..89aa1a470 100644 --- a/src/containers/walletConnect/dAppValidationModal/index.tsx +++ b/src/containers/walletConnect/dAppValidationModal/index.tsx @@ -60,7 +60,7 @@ const WCdAppValidation: React.FC = props => { ConnectionState.WAITING ); - const {wcConnect, sessions} = useWalletConnectContext(); + const {wcConnect, validateURI, sessions} = useWalletConnectContext(); const {control} = useFormContext(); const {errors} = useFormState({control}); @@ -209,27 +209,37 @@ const WCdAppValidation: React.FC = props => { ( - handleAdornmentClick(value, onChange)} - /> + <> + handleAdornmentClick(value, onChange)} + /> +
+ {error?.message && ( + + )} +
+ )} /> diff --git a/src/containers/walletConnect/walletConnectProvider/useWalletConnectInterceptor.ts b/src/containers/walletConnect/walletConnectProvider/useWalletConnectInterceptor.ts index e14565261..c4dfe6e51 100644 --- a/src/containers/walletConnect/walletConnectProvider/useWalletConnectInterceptor.ts +++ b/src/containers/walletConnect/walletConnectProvider/useWalletConnectInterceptor.ts @@ -26,6 +26,7 @@ export type VerifyConnectionOptions = { export type WcInterceptorValues = { wcConnect: (options: WcConnectOptions) => Promise; wcDisconnect: (topic: string) => Promise; + validateURI: (uri: string) => string | undefined; sessions: WcSession[]; actions: WcActionRequest[]; }; @@ -45,6 +46,8 @@ export function useWalletConnectInterceptor(): WcInterceptorValues { const [actions, setActions] = useState([]); + const validateURI = walletConnectInterceptor.validateURI; + const updateActiveSessions = useCallback(() => { const newSessions = walletConnectInterceptor.getActiveSessions( daoDetails?.address @@ -181,5 +184,5 @@ export function useWalletConnectInterceptor(): WcInterceptorValues { }; }, [handleRequest]); - return {wcConnect, wcDisconnect, sessions, actions}; + return {wcConnect, wcDisconnect, sessions, actions, validateURI}; } diff --git a/src/locales/en/common.json b/src/locales/en/common.json index 334102889..3d05e6d57 100644 --- a/src/locales/en/common.json +++ b/src/locales/en/common.json @@ -1320,7 +1320,8 @@ "alertCriticalDapp": "The QR code provided is not from {{dappName}}.", "alertSuccess": "{{dappName}} connected", "codeInputPlaceholder": "wc: …", - "alertCriticalQRcode": "The QR code provided is not from {{dappName}}." + "alertCriticalQRcode": "The QR code provided is not from {{dappName}}.", + "alertInvalid": "Invalid code" }, "detaildApp": { "spinnerLabel": "Listening for actions…", diff --git a/src/services/walletConnectInterceptor.ts b/src/services/walletConnectInterceptor.ts index 358e0516b..297e7a204 100644 --- a/src/services/walletConnectInterceptor.ts +++ b/src/services/walletConnectInterceptor.ts @@ -4,7 +4,10 @@ import Web3WalletClient, {Web3Wallet} from '@walletconnect/web3wallet'; import {AuthClientTypes} from '@walletconnect/auth-client'; import {Web3WalletTypes} from '@walletconnect/web3wallet'; import {PairingTypes, SessionTypes} from '@walletconnect/types'; +import {WC_URI_PATTERN} from 'utils/constants'; +import {i18n} from '../../i18n.config'; +const URI_REGEX = new RegExp(WC_URI_PATTERN); class WalletConnectInterceptor { clientMetadata: AuthClientTypes.Metadata = { name: 'Aragon DAO', @@ -21,6 +24,13 @@ class WalletConnectInterceptor { this.initClient(); } + validateURI(uri: string) { + // TODO: Get crowdin key for this + return URI_REGEX.test(uri) + ? undefined + : i18n.t('modal.dappConnect.validation.alertInvalid'); + } + subscribeConnectProposal( cb: (event: Web3WalletTypes.SessionProposal) => void ) { diff --git a/src/utils/constants/regex.ts b/src/utils/constants/regex.ts index 17ba16c5d..4eb978bb2 100644 --- a/src/utils/constants/regex.ts +++ b/src/utils/constants/regex.ts @@ -16,3 +16,5 @@ export const ISO_DATE_PATTERN = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*))(?:Z|(\+|-)([\d|:]*))?$/; export const BIGINT_PATTERN = /^\d+n$/; + +export const WC_URI_PATTERN = /^wc:[\w\d-]+@[12]\?([^=&\s]+=[^=&\s]+&?)+$/;