1
+ // @flow
1
2
import { NativeModules , NativeEventEmitter } from 'react-native' ;
2
3
3
4
import { Base } from './base' ;
@@ -7,26 +8,30 @@ import promisify from '../utils/promisify';
7
8
const FirestackAuth = NativeModules . FirestackAuth ;
8
9
const FirestackAuthEvt = new NativeEventEmitter ( FirestackAuth ) ;
9
10
11
+ type AuthResultType = { authenticated : boolean , user : Object | null } ;
12
+
10
13
export default class Auth extends Base {
11
- constructor ( firestack , options = { } ) {
14
+ _user : User | null ;
15
+ _authResult : AuthResultType | null ;
16
+ authenticated : boolean ;
17
+
18
+ constructor ( firestack : Object , options : Object = { } ) {
12
19
super ( firestack , options ) ;
20
+ this . _user = null ;
13
21
this . _authResult = null ;
14
22
this . authenticated = false ;
15
- this . _user = null ;
16
23
17
24
// start listening straight away
18
25
// generally though the initial event fired will get ignored
19
26
// but this is ok as we fake it with the getCurrentUser below
20
27
FirestackAuth . listenForAuth ( ) ;
21
28
22
- this . getCurrentUser ( ) . then ( ( u ) => {
23
- const authResult = { authenticated : ! ! u } ;
24
- if ( u ) authResult . user = u ;
25
- this . _onAuthStateChanged ( authResult ) ;
29
+ this . getCurrentUser ( ) . then ( ( u : Object ) => {
30
+ this . _onAuthStateChanged ( { authenticated : ! ! u , user : u || null } ) ;
26
31
this . _startListening ( ) ;
27
32
} ) . catch ( ( ) => {
28
33
// todo check if error contains user disabled message maybe and add a disabled flag?
29
- this . _onAuthStateChanged ( { authenticated : false } ) ;
34
+ this . _onAuthStateChanged ( { authenticated : false , user : null } ) ;
30
35
this . _startListening ( ) ;
31
36
} ) ;
32
37
}
@@ -45,13 +50,13 @@ export default class Auth extends Base {
45
50
* @param auth
46
51
* @private
47
52
*/
48
- _onAuthStateChanged ( auth ) {
53
+ _onAuthStateChanged ( auth : AuthResultType ) {
49
54
this . _authResult = auth ;
50
- this . emit ( 'onAuthStateChanged' , this . _authResult . user || null ) ;
51
55
this . authenticated = auth ? auth . authenticated || false : false ;
52
56
if ( auth && auth . user && ! this . _user ) this . _user = new User ( this , auth ) ;
53
57
else if ( ( ! auth || ! auth . user ) && this . _user ) this . _user = null ;
54
- else this . _user ? this . _user . _updateValues ( auth ) : null ;
58
+ else if ( this . _user ) this . _user . _updateValues ( auth ) ;
59
+ this . emit ( 'onAuthStateChanged' , this . _authResult . user || null ) ;
55
60
}
56
61
57
62
/*
@@ -62,7 +67,7 @@ export default class Auth extends Base {
62
67
* Listen for auth changes.
63
68
* @param listener
64
69
*/
65
- onAuthStateChanged ( listener ) {
70
+ onAuthStateChanged ( listener : Function ) {
66
71
this . log . info ( 'Creating onAuthStateChanged listener' ) ;
67
72
this . on ( 'onAuthStateChanged' , listener ) ;
68
73
if ( this . _authResult ) listener ( this . _authResult . user || null ) ;
@@ -72,7 +77,7 @@ export default class Auth extends Base {
72
77
* Remove auth change listener
73
78
* @param listener
74
79
*/
75
- offAuthStateChanged ( listener ) {
80
+ offAuthStateChanged ( listener : Function ) {
76
81
this . log . info ( 'Removing onAuthStateChanged listener' ) ;
77
82
this . removeListener ( 'onAuthStateChanged' , listener ) ;
78
83
}
@@ -83,7 +88,7 @@ export default class Auth extends Base {
83
88
* @param {string } password The user's password
84
89
* @return {Promise } A promise indicating the completion
85
90
*/
86
- createUserWithEmailAndPassword ( email , password ) {
91
+ createUserWithEmailAndPassword ( email : string , password : string ) : Promise < Object > {
87
92
this . log . info ( 'Creating user with email and password' , email ) ;
88
93
return promisify ( 'createUserWithEmail' , FirestackAuth ) ( email , password ) ;
89
94
}
@@ -94,9 +99,9 @@ export default class Auth extends Base {
94
99
* @param {string } password The user's password
95
100
* @return {Promise } A promise that is resolved upon completion
96
101
*/
97
- signInWithEmailAndPassword ( email , password ) {
102
+ signInWithEmailAndPassword ( email : string , password : string ) : Promise < Object > {
98
103
this . log . info ( 'Signing in user with email and password' , email ) ;
99
- return promisify ( 'signInWithEmail' , FirestackAuth ) ( email , password )
104
+ return promisify ( 'signInWithEmail' , FirestackAuth ) ( email , password ) ;
100
105
}
101
106
102
107
@@ -105,14 +110,14 @@ export default class Auth extends Base {
105
110
* @param {string } email The user's _new_ email
106
111
* @return {Promise } A promise resolved upon completion
107
112
*/
108
- updateEmail ( email ) {
113
+ updateEmail ( email : string ) : Promise < Object > {
109
114
return promisify ( 'updateUserEmail' , FirestackAuth ) ( email ) ;
110
115
}
111
116
112
117
/**
113
118
* Send verification email to current user.
114
119
*/
115
- sendEmailVerification ( ) {
120
+ sendEmailVerification ( ) : Promise < Object > {
116
121
return promisify ( 'sendEmailVerification' , FirestackAuth ) ( ) ;
117
122
}
118
123
@@ -121,7 +126,7 @@ export default class Auth extends Base {
121
126
* @param {string } password the new password
122
127
* @return {Promise }
123
128
*/
124
- updatePassword ( password ) {
129
+ updatePassword ( password : string ) : Promise < Object > {
125
130
return promisify ( 'updateUserPassword' , FirestackAuth ) ( password ) ;
126
131
}
127
132
@@ -130,7 +135,7 @@ export default class Auth extends Base {
130
135
* @param {Object } updates An object containing the keys listed [here](https://firebase.google.com/docs/auth/ios/manage-users#update_a_users_profile)
131
136
* @return {Promise }
132
137
*/
133
- updateProfile ( updates ) {
138
+ updateProfile ( updates : Object = { } ) : Promise < Object > {
134
139
return promisify ( 'updateUserProfile' , FirestackAuth ) ( updates ) ;
135
140
}
136
141
@@ -139,62 +144,63 @@ export default class Auth extends Base {
139
144
* @param {string } customToken A self-signed custom auth token.
140
145
* @return {Promise } A promise resolved upon completion
141
146
*/
142
- signInWithCustomToken ( customToken ) {
143
- return promisify ( 'signInWithCustomToken' , FirestackAuth ) ( customToken )
147
+ signInWithCustomToken ( customToken : string ) : Promise < Object > {
148
+ return promisify ( 'signInWithCustomToken' , FirestackAuth ) ( customToken ) ;
144
149
}
145
150
151
+ // TODO - below methods are not in web api / i think the're signInWithCredential
146
152
/**
147
153
* Sign the user in with a third-party authentication provider
148
154
* @param {string } provider The name of the provider to use for login
149
155
* @param {string } authToken The authToken granted by the provider
150
156
* @param {string } authSecret The authToken secret granted by the provider
151
157
* @return {Promise } A promise resolved upon completion
152
158
*/
153
- signInWithProvider ( provider , authToken , authSecret ) {
154
- return promisify ( 'signInWithProvider' , FirestackAuth ) ( provider , authToken , authSecret )
159
+ signInWithProvider ( provider : string , authToken : string , authSecret : string ) : Promise < Object > {
160
+ return promisify ( 'signInWithProvider' , FirestackAuth ) ( provider , authToken , authSecret ) ;
155
161
}
156
162
157
163
/**
158
- * Reauthenticate a user with a third-party authentication provider
164
+ * Re-authenticate a user with a third-party authentication provider
159
165
* @param {string } provider The provider name
160
166
* @param {string } token The authToken granted by the provider
161
167
* @param {string } secret The authTokenSecret granted by the provider
162
168
* @return {Promise } A promise resolved upon completion
163
169
*/
164
- reauthenticateWithCredentialForProvider ( provider , token , secret ) {
165
- return promisify ( 'reauthenticateWithCredentialForProvider' , FirestackAuth ) ( provider , token , secret )
170
+ reauthenticateWithCredentialForProvider ( provider : string , token : string , secret : string ) : Promise < Object > {
171
+ return promisify ( 'reauthenticateWithCredentialForProvider' , FirestackAuth ) ( provider , token , secret ) ;
166
172
}
167
173
168
174
169
175
/**
170
176
* Sign a user in anonymously
171
177
* @return {Promise } A promise resolved upon completion
172
178
*/
173
- signInAnonymously ( ) {
179
+ signInAnonymously ( ) : Promise < Object > {
174
180
return promisify ( 'signInAnonymously' , FirestackAuth ) ( ) ;
175
181
}
176
182
177
183
/**
178
184
* Send reset password instructions via email
179
185
* @param {string } email The email to send password reset instructions
180
186
*/
181
- sendPasswordResetWithEmail ( email ) {
187
+ sendPasswordResetWithEmail ( email : string ) : Promise < Object > {
182
188
return promisify ( 'sendPasswordResetWithEmail' , FirestackAuth ) ( email ) ;
183
189
}
184
190
185
191
/**
186
192
* Delete the current user
187
193
* @return {Promise }
188
194
*/
189
- deleteUser ( ) {
195
+ deleteUser ( ) : Promise < Object > {
190
196
return promisify ( 'deleteUser' , FirestackAuth ) ( ) ;
191
197
}
192
198
193
199
/**
194
200
* get the token of current user
195
201
* @return {Promise }
196
202
*/
197
- getToken ( ) {
203
+ getToken ( ) : Promise < Object > {
198
204
return promisify ( 'getToken' , FirestackAuth ) ( ) ;
199
205
}
200
206
@@ -203,27 +209,27 @@ export default class Auth extends Base {
203
209
* Sign the current user out
204
210
* @return {Promise }
205
211
*/
206
- signOut ( ) {
212
+ signOut ( ) : Promise < Object > {
207
213
return promisify ( 'signOut' , FirestackAuth ) ( ) ;
208
214
}
209
215
210
216
/**
211
217
* Get the currently signed in user
212
218
* @return {Promise }
213
219
*/
214
- getCurrentUser ( ) {
220
+ getCurrentUser ( ) : Promise < Object > {
215
221
return promisify ( 'getCurrentUser' , FirestackAuth ) ( ) ;
216
222
}
217
223
218
224
/**
219
225
* Get the currently signed in user
220
226
* @return {Promise }
221
227
*/
222
- get currentUser ( ) {
228
+ get currentUser ( ) : User | null {
223
229
return this . _user ;
224
230
}
225
231
226
- get namespace ( ) {
232
+ get namespace ( ) : string {
227
233
return 'firestack:auth' ;
228
234
}
229
235
}
0 commit comments