@@ -12,6 +12,8 @@ @implementation Firestack
1212
1313@synthesize bridge = _bridge;
1414
15+ typedef void (^UserWithTokenResponse)(NSDictionary *, NSError *);
16+
1517RCT_EXPORT_MODULE (Firestack);
1618
1719RCT_EXPORT_METHOD (configureWithOptions:(NSDictionary *) opts
@@ -98,6 +100,28 @@ @implementation Firestack
98100 callback: callback];
99101}
100102
103+
104+ RCT_EXPORT_METHOD (signInWithCustomToken:
105+ (NSString *)customToken
106+ callback:(RCTResponseSenderBlock) callback)
107+ {
108+ [[FIRAuth auth ]
109+ signInWithCustomToken: customToken
110+ completion: ^(FIRUser *user, NSError *error) {
111+
112+ if (user != nil ) {
113+ NSDictionary *userProps = [self userPropsFromFIRUser: user];
114+ callback (@[[NSNull null ], userProps]);
115+ } else {
116+ NSDictionary *err =
117+ [self handleFirebaseError: @" signinError"
118+ error: error
119+ withUser: user];
120+ callback (@[err]);
121+ }
122+ }];
123+ }
124+
101125RCT_EXPORT_METHOD (signInWithProvider:
102126 (NSString *)provider
103127 token:(NSString *)authToken
@@ -114,8 +138,6 @@ @implementation Firestack
114138 return callback (@[err]);
115139 }
116140
117- NSLog (@" signinWithCredential: %@ " , credential);
118-
119141 @try {
120142 [[FIRAuth auth ] signInWithCredential: credential
121143 completion: ^(FIRUser *user, NSError *error) {
@@ -164,13 +186,21 @@ @implementation Firestack
164186
165187 if (user != nil ) {
166188 // User is signed in.
167- NSDictionary *userProps = [self userPropsFromFIRUser: user];
168- // callback(@[[NSNull null], userProps]);
169- [self sendJSEvent: @" listenForAuth" props: @{
170- @" eventName" : @" user" ,
171- @" authenticated" : @(true ),
172- @" user" : userProps
173- }];
189+ [self userPropsFromFIRUserWithToken: user
190+ andCallback: ^(NSDictionary *userProps, NSError * error) {
191+ if (error != nil ) {
192+ [self sendJSEvent: @" listenForAuth" props: @{
193+ @" eventName" : @" userTokenError" ,
194+ @" msg" : [error localizedFailureReason ]
195+ }];
196+ } else {
197+ [self sendJSEvent: @" listenForAuth" props: @{
198+ @" eventName" : @" user" ,
199+ @" authenticated" : @(true ),
200+ @" user" : userProps
201+ }];
202+ }
203+ }];
174204 } else {
175205 // TODO: Update this with different error states
176206 NSDictionary *err = @{
@@ -242,7 +272,10 @@ @implementation Firestack
242272 completion: ^(FIRUser *user, NSError *error) {
243273 if (user != nil ) {
244274 NSDictionary *userProps = [self userPropsFromFIRUser: user];
245- callback (@[[NSNull null ], userProps]);
275+
276+ callback (@[[NSNull null ], @{
277+ @" user" : userProps
278+ }]);
246279 } else {
247280 NSDictionary *err =
248281 [self handleFirebaseError: @" signinError"
@@ -347,7 +380,8 @@ @implementation Firestack
347380 withUser: user];
348381 callback (@[err]);
349382 } else {
350- callback (@[[NSNull null ], @{@" token" : token}]);
383+ NSDictionary *userProps = [self userPropsFromFIRUser: user];
384+ callback (@[[NSNull null ], @{@" token" : token, @" user" : userProps}]);
351385 }
352386 }];
353387}
@@ -359,12 +393,13 @@ @implementation Firestack
359393 [user getTokenWithCompletion: ^(NSString *token , NSError *_Nullable error) {
360394 if (error) {
361395 NSDictionary *err =
362- [self handleFirebaseError: @" deleteUserError "
396+ [self handleFirebaseError: @" getTokenWithCompletion "
363397 error: error
364398 withUser: user];
365399 callback (@[err]);
366400 } else {
367- callback (@[[NSNull null ], @{@" result" : token}]);
401+ NSDictionary *userProps = [self userPropsFromFIRUser: user];
402+ callback (@[[NSNull null ], @{@" token" : token, @" user" : userProps}]);
368403 }
369404 }];
370405}
@@ -618,6 +653,8 @@ - (NSString *) getStorageUrl
618653 }];
619654}
620655
656+ #pragma mark Database
657+
621658#pragma mark Helpers
622659
623660- (NSDictionary *) getConfig
@@ -667,7 +704,9 @@ - (NSDictionary *) userPropsFromFIRUser:(FIRUser *) user
667704 @" email" : user.email ? user.email : @" " ,
668705 @" emailVerified" : @(user.emailVerified ),
669706 @" anonymous" : @(user.anonymous ),
670- @" displayName" : user.displayName ? user.displayName : @" "
707+ @" displayName" : user.displayName ? user.displayName : @" " ,
708+ @" refreshToken" : user.refreshToken ,
709+ @" providerID" : user.providerID
671710 } mutableCopy];
672711
673712 if ([user valueForKey: @" photoURL" ] != nil ) {
@@ -678,6 +717,20 @@ - (NSDictionary *) userPropsFromFIRUser:(FIRUser *) user
678717 return userProps;
679718}
680719
720+ - (void ) userPropsFromFIRUserWithToken : (FIRUser *) user
721+ andCallback : (UserWithTokenResponse) callback
722+ {
723+ NSMutableDictionary *userProps = [[self userPropsFromFIRUser: user] mutableCopy ];
724+ [user getTokenWithCompletion: ^(NSString * _Nullable token, NSError * _Nullable error) {
725+ if (error != nil ) {
726+ return callback (nil , error);
727+ }
728+
729+ [userProps setValue: token forKey: @" idToken" ];
730+ callback (userProps, nil );
731+ }];
732+ }
733+
681734- (FIRAuthCredential *)getCredentialForProvider : (NSString *)provider
682735 token : (NSString *)authToken
683736 secret : (NSString *)authTokenSecret
0 commit comments