1
- import { useEffect } from 'react' ;
1
+ import { useEffect , useRef } from 'react' ;
2
2
import { useDispatch , useSelector } from 'react-redux' ;
3
3
4
4
import { useNavigation } from '@react-navigation/native' ;
5
5
import * as Linking from 'expo-linking' ;
6
6
7
7
import { connectPopupDeeplinkThunk , selectConnectPopupCall } from '@suite-common/connect-popup' ;
8
+ import { selectPendingProposal , walletConnectPairThunk } from '@suite-common/walletconnect' ;
8
9
import { isDevelopOrDebugEnv } from '@suite-native/config' ;
9
10
import { FeatureFlag , useFeatureFlag } from '@suite-native/feature-flags' ;
11
+ import { useOpenLink } from '@suite-native/link' ;
10
12
import {
11
13
RootStackParamList ,
12
14
RootStackRoutes ,
@@ -30,26 +32,51 @@ const isConnectPopupUrl = (url: string): boolean => {
30
32
return false ;
31
33
} ;
32
34
35
+ const isWalletConnectUrl = ( url : string ) : boolean =>
36
+ url . startsWith ( 'trezorsuitelite://walletconnect' ) ;
37
+
33
38
// TODO: will be necessary to handle if device is not connected/unlocked so we probably want to wait until user unlock device
34
39
// we already have some modals like biometrics or coin enabled which are waiting for device to be connected
35
40
export const useConnectPopupNavigation = ( ) => {
36
41
const featureFlagEnabled = useFeatureFlag ( FeatureFlag . IsConnectPopupEnabled ) ;
42
+ const featureFlagWalletConnectEnabled = useFeatureFlag ( FeatureFlag . IsWalletConnectEnabled ) ;
37
43
const navigation = useNavigation < NavigationProp > ( ) ;
38
44
const dispatch = useDispatch ( ) ;
39
45
const connectPopupCall = useSelector ( selectConnectPopupCall ) ;
46
+ const walletConnectProposal = useSelector ( selectPendingProposal ) ;
47
+ const lastProposalId = useRef < number | null > ( null ) ;
48
+ const openLink = useOpenLink ( ) ;
40
49
41
50
// Handle deeplink
42
51
const url = Linking . useURL ( ) ;
43
52
44
53
useEffect ( ( ) => {
45
- if ( ! featureFlagEnabled ) return ;
46
- if ( ! url || ! isConnectPopupUrl ( url ) ) return ;
47
- dispatch ( connectPopupDeeplinkThunk ( { url } ) ) ;
48
- } , [ url , featureFlagEnabled , dispatch ] ) ;
54
+ if ( ! featureFlagEnabled || ! url ) return ;
55
+
56
+ if ( isConnectPopupUrl ( url ) ) {
57
+ dispatch ( connectPopupDeeplinkThunk ( { url } ) ) ;
58
+ } else if ( featureFlagWalletConnectEnabled && isWalletConnectUrl ( url ) ) {
59
+ const parsedUrl = new URL ( url ) ;
60
+ const wcUri = parsedUrl ?. searchParams ?. get ( 'uri' ) ;
61
+ if ( wcUri ) dispatch ( walletConnectPairThunk ( { uri : wcUri } ) ) ;
62
+ }
63
+ } , [ url , featureFlagEnabled , featureFlagWalletConnectEnabled , dispatch ] ) ;
49
64
50
65
useEffect ( ( ) => {
51
- if ( connectPopupCall ) {
66
+ if ( connectPopupCall ?. state === 'deeplink-callback' ) {
67
+ openLink ( connectPopupCall . callbackUrl ) ;
68
+ } else if ( connectPopupCall ) {
52
69
navigation . navigate ( RootStackRoutes . ConnectPopup ) ;
53
70
}
54
- } , [ connectPopupCall , navigation ] ) ;
71
+ } , [ connectPopupCall , navigation , openLink ] ) ;
72
+ useEffect ( ( ) => {
73
+ if (
74
+ walletConnectProposal &&
75
+ ! walletConnectProposal . expired &&
76
+ walletConnectProposal . eventId !== lastProposalId . current
77
+ ) {
78
+ lastProposalId . current = walletConnectProposal . eventId ;
79
+ navigation . navigate ( RootStackRoutes . WalletConnectSessionPopup ) ;
80
+ }
81
+ } , [ walletConnectProposal , navigation ] ) ;
55
82
} ;
0 commit comments