@@ -61,34 +61,44 @@ const openAuthSessionAndroid = async (url: string, redirectUrls: string[]) => {
61
61
62
62
return redirectUrl ;
63
63
} finally {
64
- appStateListener ?. remove ( ) ;
65
- redirectListener ?. remove ( ) ;
66
- appStateListener = undefined ;
67
- redirectListener = undefined ;
64
+ removeAppStateListener ( ) ;
65
+ removeRedirectListener ( ) ;
68
66
}
69
67
} ;
70
68
71
69
const getAppStatePromise = ( ) : Promise < null > =>
72
70
new Promise ( resolve => {
73
- appStateListener = AppState . addEventListener ( 'change' , nextAppState => {
74
- // if current state is null, the change is from initialization
75
- if ( AppState . currentState === null ) {
76
- return ;
77
- }
71
+ // remove any stray listeners before creating new ones
72
+ removeAppStateListener ( ) ;
78
73
79
- if ( nextAppState === 'active' ) {
80
- appStateListener ?. remove ( ) ;
81
- appStateListener = undefined ;
74
+ let previousState = AppState . currentState ;
75
+ appStateListener = AppState . addEventListener ( 'change' , nextAppState => {
76
+ if ( previousState !== 'active' && nextAppState === 'active' ) {
77
+ removeAppStateListener ( ) ;
82
78
resolve ( null ) ;
83
79
}
80
+ previousState = nextAppState ;
84
81
} ) ;
85
82
} ) ;
86
83
87
84
const getRedirectPromise = ( redirectUrls : string [ ] ) : Promise < string > =>
88
85
new Promise ( resolve => {
86
+ // remove any stray listeners before creating new ones
87
+ removeRedirectListener ( ) ;
88
+
89
89
redirectListener = Linking . addEventListener ( 'url' , event => {
90
90
if ( redirectUrls . some ( url => event . url . startsWith ( url ) ) ) {
91
91
resolve ( event . url ) ;
92
92
}
93
93
} ) ;
94
94
} ) ;
95
+
96
+ const removeAppStateListener = ( ) => {
97
+ appStateListener ?. remove ( ) ;
98
+ appStateListener = undefined ;
99
+ } ;
100
+
101
+ const removeRedirectListener = ( ) => {
102
+ redirectListener ?. remove ( ) ;
103
+ redirectListener = undefined ;
104
+ } ;
0 commit comments