2017-03-09 15:26:28 +00:00
# import "RNFirebaseAuth.h"
# import "RNFirebaseEvents.h"
2017-06-29 16:24:34 +00:00
# import "RCTDefines.h"
2017-03-09 15:26:28 +00:00
2017-05-25 14:33:41 +00:00
# if __has _include ( < FirebaseAuth / FIRAuth . h > )
2017-06-29 16:24:34 +00:00
2017-05-25 14:33:41 +00:00
@ implementation RNFirebaseAuth
RCT_EXPORT _MODULE ( ) ;
2017-03-09 15:26:28 +00:00
2017-07-17 19:56:08 +00:00
- ( id ) init {
self = [ super init ] ;
if ( self ! = nil ) {
_authStateHandlers = [ [ NSMutableDictionary alloc ] init ] ;
2017-09-21 15:48:54 +00:00
_idTokenHandlers = [ [ NSMutableDictionary alloc ] init ] ;
2017-07-17 19:56:08 +00:00
}
return self ;
}
2017-03-17 19:08:51 +00:00
/ * *
addAuthStateListener
2017-05-31 14:22:15 +00:00
2017-03-17 19:08:51 +00:00
* /
2017-06-29 16:24:34 +00:00
RCT_EXPORT _METHOD ( addAuthStateListener :
( NSString * ) appName ) {
2017-07-17 19:56:08 +00:00
if ( ! [ _authStateHandlers valueForKey : appName ] ) {
FIRApp * firApp = [ FIRApp appNamed : appName ] ;
FIRAuthStateDidChangeListenerHandle newListenerHandle = [ [ FIRAuth authWithApp : firApp ] addAuthStateDidChangeListener : ^ ( FIRAuth * _Nonnull auth , FIRUser * _Nullable user ) {
if ( user ! = nil ) {
[ self sendJSEventWithAppName : appName title : AUTH_CHANGED _EVENT props : [ @ { @ "authenticated" : @ ( true ) , @ "user" : [ self firebaseUserToDict : user ] } mutableCopy ] ] ;
} else {
[ self sendJSEventWithAppName : appName title : AUTH_CHANGED _EVENT props : [ @ { @ "authenticated" : @ ( false ) } mutableCopy ] ] ;
}
} ] ;
_authStateHandlers [ appName ] = [ NSValue valueWithNonretainedObject : newListenerHandle ] ;
}
2017-03-17 19:08:51 +00:00
}
/ * *
removeAuthStateListener
2017-05-31 14:22:15 +00:00
2017-03-17 19:08:51 +00:00
* /
2017-06-29 16:24:34 +00:00
RCT_EXPORT _METHOD ( removeAuthStateListener :
( NSString * ) appName ) {
2017-07-17 19:56:08 +00:00
if ( [ _authStateHandlers valueForKey : appName ] ) {
FIRApp * firApp = [ FIRApp appNamed : appName ] ;
[ [ FIRAuth authWithApp : firApp ] removeAuthStateDidChangeListener : [ _authStateHandlers valueForKey : appName ] ] ;
[ _authStateHandlers removeObjectForKey : appName ] ;
2017-03-17 19:08:51 +00:00
}
}
2017-09-21 15:48:54 +00:00
/ * *
addIdTokenListener
* /
RCT_EXPORT _METHOD ( addIdTokenListener :
( NSString * ) appName ) {
if ( ! [ _idTokenHandlers valueForKey : appName ] ) {
FIRApp * firApp = [ FIRApp appNamed : appName ] ;
FIRIDTokenDidChangeListenerHandle newListenerHandle = [ [ FIRAuth authWithApp : firApp ] addIDTokenDidChangeListener : ^ ( FIRAuth * _Nonnull auth , FIRUser * _Nullable user ) {
if ( user ! = nil ) {
[ self sendJSEventWithAppName : appName title : AUTH_ID _TOKEN _CHANGED _EVENT props : [ @ { @ "authenticated" : @ ( true ) , @ "user" : [ self firebaseUserToDict : user ] } mutableCopy ] ] ;
} else {
[ self sendJSEventWithAppName : appName title : AUTH_ID _TOKEN _CHANGED _EVENT props : [ @ { @ "authenticated" : @ ( false ) } mutableCopy ] ] ;
}
} ] ;
_idTokenHandlers [ appName ] = [ NSValue valueWithNonretainedObject : newListenerHandle ] ;
}
}
/ * *
removeAuthStateListener
* /
RCT_EXPORT _METHOD ( removeIdTokenListener :
( NSString * ) appName ) {
if ( [ _idTokenHandlers valueForKey : appName ] ) {
FIRApp * firApp = [ FIRApp appNamed : appName ] ;
[ [ FIRAuth authWithApp : firApp ] removeIDTokenDidChangeListener : [ _idTokenHandlers valueForKey : appName ] ] ;
[ _idTokenHandlers removeObjectForKey : appName ] ;
}
}
2017-06-29 16:24:34 +00:00
2017-03-14 19:04:16 +00:00
/ * *
signOut
2017-05-31 14:22:15 +00:00
2017-03-14 19:04:16 +00:00
@ param RCTPromiseResolveBlock resolve
@ param RCTPromiseRejectBlock reject
@ return
* /
2017-06-29 16:24:34 +00:00
RCT_EXPORT _METHOD ( signOut :
2017-06-30 16:23:32 +00:00
( NSString * ) appName
resolver :
( RCTPromiseResolveBlock ) resolve
2017-06-29 16:24:34 +00:00
rejecter :
( RCTPromiseRejectBlock ) reject ) {
2017-06-30 16:23:32 +00:00
FIRApp * firApp = [ FIRApp appNamed : appName ] ;
2017-03-14 19:04:16 +00:00
FIRUser * user = [ FIRAuth auth ] . currentUser ;
2017-05-31 14:22:15 +00:00
2017-03-14 19:04:16 +00:00
if ( user ) {
NSError * error ;
2017-06-30 16:23:32 +00:00
[ [ FIRAuth authWithApp : firApp ] signOut : & error ] ;
2017-03-14 19:04:16 +00:00
if ( ! error ) [ self promiseNoUser : resolve rejecter : reject isError : NO ] ;
2017-03-17 21:41:17 +00:00
else [ self promiseRejectAuthException : reject error : error ] ;
2017-03-14 19:04:16 +00:00
} else {
[ self promiseNoUser : resolve rejecter : reject isError : YES ] ;
2017-03-09 15:26:28 +00:00
}
}
2017-03-14 19:04:16 +00:00
/ * *
signInAnonymously
2017-05-31 14:22:15 +00:00
2017-03-14 19:04:16 +00:00
@ param RCTPromiseResolveBlock resolve
@ param RCTPromiseRejectBlock reject
@ return
* /
2017-06-29 16:24:34 +00:00
RCT_EXPORT _METHOD ( signInAnonymously :
2017-06-30 16:23:32 +00:00
( NSString * ) appName
resolver :
( RCTPromiseResolveBlock ) resolve
2017-06-29 16:24:34 +00:00
rejecter :
( RCTPromiseRejectBlock ) reject ) {
2017-06-30 16:23:32 +00:00
FIRApp * firApp = [ FIRApp appNamed : appName ] ;
[ [ FIRAuth authWithApp : firApp ] signInAnonymouslyWithCompletion : ^ ( FIRUser * user , NSError * error ) {
2017-03-14 19:04:16 +00:00
if ( error ) {
2017-03-17 21:41:17 +00:00
[ self promiseRejectAuthException : reject error : error ] ;
2017-03-14 19:04:16 +00:00
} else {
[ self promiseWithUser : resolve rejecter : reject user : user ] ;
}
} ] ;
2017-05-31 14:22:15 +00:00
2017-03-14 19:04:16 +00:00
}
/ * *
signInWithEmailAndPassword
2017-05-31 14:22:15 +00:00
2017-03-14 19:04:16 +00:00
@ param NSString NSString email
@ param NSString NSString password
@ param RCTPromiseResolveBlock resolve
@ param RCTPromiseRejectBlock reject
@ return return
* /
2017-06-29 16:24:34 +00:00
RCT_EXPORT _METHOD ( signInWithEmailAndPassword :
2017-06-30 16:23:32 +00:00
( NSString * ) appName
email :
( NSString * ) email
2017-06-29 16:24:34 +00:00
pass :
( NSString * ) password
resolver :
( RCTPromiseResolveBlock ) resolve
rejecter :
( RCTPromiseRejectBlock ) reject ) {
2017-06-30 16:23:32 +00:00
FIRApp * firApp = [ FIRApp appNamed : appName ] ;
[ [ FIRAuth authWithApp : firApp ] signInWithEmail : email password : password completion : ^ ( FIRUser * user , NSError * error ) {
2017-03-14 19:04:16 +00:00
if ( error ) {
2017-03-17 21:41:17 +00:00
[ self promiseRejectAuthException : reject error : error ] ;
2017-03-14 19:04:16 +00:00
} else {
[ self promiseWithUser : resolve rejecter : reject user : user ] ;
}
} ] ;
}
/ * *
createUserWithEmailAndPassword
2017-05-31 14:22:15 +00:00
2017-03-14 19:04:16 +00:00
@ param NSString NSString email
@ param NSString NSString password
@ param RCTPromiseResolveBlock resolve
@ param RCTPromiseRejectBlock reject
@ return return
* /
2017-06-29 16:24:34 +00:00
RCT_EXPORT _METHOD ( createUserWithEmailAndPassword :
2017-06-30 16:23:32 +00:00
( NSString * ) appName
email :
( NSString * ) email
2017-06-29 16:24:34 +00:00
pass :
( NSString * ) password
resolver :
( RCTPromiseResolveBlock ) resolve
rejecter :
( RCTPromiseRejectBlock ) reject ) {
2017-06-30 16:23:32 +00:00
FIRApp * firApp = [ FIRApp appNamed : appName ] ;
[ [ FIRAuth authWithApp : firApp ] createUserWithEmail : email password : password completion : ^ ( FIRUser * user , NSError * error ) {
2017-03-14 19:04:16 +00:00
if ( error ) {
2017-03-17 21:41:17 +00:00
[ self promiseRejectAuthException : reject error : error ] ;
2017-03-14 19:04:16 +00:00
} else {
[ self promiseWithUser : resolve rejecter : reject user : user ] ;
}
} ] ;
}
/ * *
deleteUser
2017-05-31 14:22:15 +00:00
2017-03-14 19:04:16 +00:00
@ param RCTPromiseResolveBlock resolve
@ param RCTPromiseRejectBlock reject
@ return return
* /
2017-06-29 16:24:34 +00:00
RCT_EXPORT _METHOD ( delete :
2017-06-30 16:23:32 +00:00
( NSString * ) appName
resolver :
( RCTPromiseResolveBlock ) resolve
2017-06-29 16:24:34 +00:00
rejecter :
( RCTPromiseRejectBlock ) reject ) {
2017-06-30 16:23:32 +00:00
FIRApp * firApp = [ FIRApp appNamed : appName ] ;
FIRUser * user = [ FIRAuth authWithApp : firApp ] . currentUser ;
2017-05-31 14:22:15 +00:00
2017-03-14 19:04:16 +00:00
if ( user ) {
[ user deleteWithCompletion : ^ ( NSError * _Nullable error ) {
if ( error ) {
2017-03-17 21:41:17 +00:00
[ self promiseRejectAuthException : reject error : error ] ;
2017-03-14 19:04:16 +00:00
} else {
[ self promiseNoUser : resolve rejecter : reject isError : NO ] ;
}
} ] ;
} else {
[ self promiseNoUser : resolve rejecter : reject isError : YES ] ;
}
}
2017-03-18 00:31:02 +00:00
/ * *
reload
2017-05-31 14:22:15 +00:00
2017-03-18 00:31:02 +00:00
@ param RCTPromiseResolveBlock resolve
@ param RCTPromiseRejectBlock reject
@ return return
* /
2017-06-29 16:24:34 +00:00
RCT_EXPORT _METHOD ( reload :
2017-06-30 16:23:32 +00:00
( NSString * ) appName
resolver :
( RCTPromiseResolveBlock ) resolve
2017-06-29 16:24:34 +00:00
rejecter :
( RCTPromiseRejectBlock ) reject ) {
2017-06-30 16:23:32 +00:00
FIRApp * firApp = [ FIRApp appNamed : appName ] ;
FIRUser * user = [ FIRAuth authWithApp : firApp ] . currentUser ;
2017-05-31 14:22:15 +00:00
2017-03-18 00:31:02 +00:00
if ( user ) {
[ user reloadWithCompletion : ^ ( NSError * _Nullable error ) {
if ( error ) {
[ self promiseRejectAuthException : reject error : error ] ;
} else {
2017-06-30 16:23:32 +00:00
FIRUser * userAfterReload = [ FIRAuth authWithApp : firApp ] . currentUser ;
2017-03-18 00:31:02 +00:00
[ self promiseWithUser : resolve rejecter : reject user : userAfterReload ] ;
}
} ] ;
} else {
[ self promiseNoUser : resolve rejecter : reject isError : YES ] ;
}
}
/ * *
sendEmailVerification
2017-05-31 14:22:15 +00:00
2017-03-18 00:31:02 +00:00
@ param RCTPromiseResolveBlock resolve
@ param RCTPromiseRejectBlock reject
@ return return
* /
2017-06-29 16:24:34 +00:00
RCT_EXPORT _METHOD ( sendEmailVerification :
2017-06-30 16:23:32 +00:00
( NSString * ) appName
resolver :
( RCTPromiseResolveBlock ) resolve
2017-06-29 16:24:34 +00:00
rejecter :
( RCTPromiseRejectBlock ) reject ) {
2017-06-30 16:23:32 +00:00
FIRApp * firApp = [ FIRApp appNamed : appName ] ;
2017-05-31 14:22:15 +00:00
2017-06-30 16:23:32 +00:00
FIRUser * user = [ FIRAuth authWithApp : firApp ] . currentUser ;
2017-03-18 00:31:02 +00:00
if ( user ) {
[ user sendEmailVerificationWithCompletion : ^ ( NSError * _Nullable error ) {
if ( error ) {
[ self promiseRejectAuthException : reject error : error ] ;
} else {
2017-06-30 16:23:32 +00:00
FIRUser * userAfterUpdate = [ FIRAuth authWithApp : firApp ] . currentUser ;
2017-06-20 18:49:45 +00:00
[ self promiseWithUser : resolve rejecter : reject user : userAfterUpdate ] ;
2017-03-18 00:31:02 +00:00
}
} ] ;
} else {
[ self promiseNoUser : resolve rejecter : reject isError : YES ] ;
}
}
/ * *
updateEmail
2017-05-31 14:22:15 +00:00
2017-03-18 00:31:02 +00:00
@ param NSString email
@ param RCTPromiseResolveBlock resolve
@ param RCTPromiseRejectBlock reject
@ return return
* /
2017-06-29 16:24:34 +00:00
RCT_EXPORT _METHOD ( updateEmail :
2017-06-30 16:23:32 +00:00
( NSString * ) appName
email :
( NSString * ) email
2017-06-29 16:24:34 +00:00
resolver :
( RCTPromiseResolveBlock ) resolve
rejecter :
( RCTPromiseRejectBlock ) reject ) {
2017-06-30 16:23:32 +00:00
FIRApp * firApp = [ FIRApp appNamed : appName ] ;
FIRUser * user = [ FIRAuth authWithApp : firApp ] . currentUser ;
2017-05-31 14:22:15 +00:00
2017-03-18 00:31:02 +00:00
if ( user ) {
[ user updateEmail : email completion : ^ ( NSError * _Nullable error ) {
if ( error ) {
[ self promiseRejectAuthException : reject error : error ] ;
} else {
2017-06-30 16:23:32 +00:00
FIRUser * userAfterUpdate = [ FIRAuth authWithApp : firApp ] . currentUser ;
2017-03-18 00:31:02 +00:00
[ self promiseWithUser : resolve rejecter : reject user : userAfterUpdate ] ;
}
} ] ;
} else {
[ self promiseNoUser : resolve rejecter : reject isError : YES ] ;
}
}
2017-03-18 00:41:10 +00:00
/ * *
updatePassword
2017-05-31 14:22:15 +00:00
2017-03-18 00:41:10 +00:00
@ param NSString password
@ param RCTPromiseResolveBlock resolve
@ param RCTPromiseRejectBlock reject
@ return return
* /
2017-06-29 16:24:34 +00:00
RCT_EXPORT _METHOD ( updatePassword :
2017-06-30 16:23:32 +00:00
( NSString * ) appName
password :
( NSString * ) password
2017-06-29 16:24:34 +00:00
resolver :
( RCTPromiseResolveBlock ) resolve
rejecter :
( RCTPromiseRejectBlock ) reject ) {
2017-06-30 16:23:32 +00:00
FIRApp * firApp = [ FIRApp appNamed : appName ] ;
2017-03-18 00:41:10 +00:00
FIRUser * user = [ FIRAuth auth ] . currentUser ;
2017-05-31 14:22:15 +00:00
2017-03-18 00:41:10 +00:00
if ( user ) {
[ user updatePassword : password completion : ^ ( NSError * _Nullable error ) {
if ( error ) {
[ self promiseRejectAuthException : reject error : error ] ;
} else {
2017-06-30 16:23:32 +00:00
FIRUser * userAfterUpdate = [ FIRAuth authWithApp : firApp ] . currentUser ;
2017-03-18 00:41:10 +00:00
[ self promiseWithUser : resolve rejecter : reject user : userAfterUpdate ] ;
}
} ] ;
} else {
[ self promiseNoUser : resolve rejecter : reject isError : YES ] ;
}
}
2017-03-14 19:04:16 +00:00
2017-03-18 01:10:22 +00:00
/ * *
updateProfile
2017-05-31 14:22:15 +00:00
2017-03-18 01:10:22 +00:00
@ param NSDictionary props
@ param RCTPromiseResolveBlock resolve
@ param RCTPromiseRejectBlock reject
@ return return
* /
2017-06-29 16:24:34 +00:00
RCT_EXPORT _METHOD ( updateProfile :
2017-06-30 16:23:32 +00:00
( NSString * ) appName
props :
( NSDictionary * ) props
2017-06-29 16:24:34 +00:00
resolver :
( RCTPromiseResolveBlock ) resolve
rejecter :
( RCTPromiseRejectBlock ) reject ) {
2017-06-30 16:23:32 +00:00
FIRApp * firApp = [ FIRApp appNamed : appName ] ;
FIRUser * user = [ FIRAuth authWithApp : firApp ] . currentUser ;
2017-05-31 14:22:15 +00:00
2017-03-18 01:10:22 +00:00
if ( user ) {
FIRUserProfileChangeRequest * changeRequest = [ user profileChangeRequest ] ;
NSMutableArray * allKeys = [ [ props allKeys ] mutableCopy ] ;
2017-05-31 14:22:15 +00:00
2017-03-18 01:10:22 +00:00
for ( NSString * key in allKeys ) {
@ try {
if ( [ key isEqualToString : @ "photoURL" ] ) {
NSURL * url = [ NSURL URLWithString : [ props valueForKey : key ] ] ;
[ changeRequest setValue : url forKey : key ] ;
} else {
2017-05-25 14:33:41 +00:00
[ changeRequest setValue : props [ key ] forKey : key ] ;
2017-03-18 01:10:22 +00:00
}
} @ catch ( NSException * exception ) {
NSLog ( @ "Exception occurred while configuring: %@" , exception ) ;
}
}
2017-05-31 14:22:15 +00:00
2017-03-18 01:10:22 +00:00
[ changeRequest commitChangesWithCompletion : ^ ( NSError * _Nullable error ) {
if ( error ) {
[ self promiseRejectAuthException : reject error : error ] ;
} else {
2017-06-30 16:23:32 +00:00
FIRUser * userAfterUpdate = [ FIRAuth authWithApp : firApp ] . currentUser ;
2017-03-18 01:10:22 +00:00
[ self promiseWithUser : resolve rejecter : reject user : userAfterUpdate ] ;
}
} ] ;
} else {
[ self promiseNoUser : resolve rejecter : reject isError : YES ] ;
}
}
2017-03-16 12:35:03 +00:00
/ * *
getToken
2017-05-31 14:22:15 +00:00
2017-03-16 12:35:03 +00:00
@ param RCTPromiseResolveBlock resolve
@ param RCTPromiseRejectBlock reject
@ return
* /
2017-06-29 16:24:34 +00:00
RCT_EXPORT _METHOD ( getToken :
2017-06-30 16:23:32 +00:00
( NSString * ) appName
forceRefresh :
( BOOL ) forceRefresh
2017-06-29 16:24:34 +00:00
resolver :
( RCTPromiseResolveBlock ) resolve
rejecter :
( RCTPromiseRejectBlock ) reject ) {
2017-06-30 16:23:32 +00:00
FIRApp * firApp = [ FIRApp appNamed : appName ] ;
FIRUser * user = [ FIRAuth authWithApp : firApp ] . currentUser ;
2017-05-31 14:22:15 +00:00
2017-03-16 12:35:03 +00:00
if ( user ) {
2017-06-30 16:23:32 +00:00
[ user getIDTokenForcingRefresh : ( BOOL ) forceRefresh completion : ^ ( NSString * token , NSError * _Nullable error ) {
2017-03-16 12:35:03 +00:00
if ( error ) {
2017-03-17 21:41:17 +00:00
[ self promiseRejectAuthException : reject error : error ] ;
2017-03-16 12:35:03 +00:00
} else {
resolve ( token ) ;
}
} ] ;
} else {
[ self promiseNoUser : resolve rejecter : reject isError : YES ] ;
}
}
2017-03-14 19:04:16 +00:00
2017-03-17 18:04:13 +00:00
/ * *
signInWithCredential
2017-05-31 14:22:15 +00:00
2017-03-17 18:04:13 +00:00
@ param NSString provider
@ param NSString authToken
@ param NSString authSecret
@ param RCTPromiseResolveBlock resolve
@ param RCTPromiseRejectBlock reject
@ return
* /
2017-06-29 16:24:34 +00:00
RCT_EXPORT _METHOD ( signInWithCredential :
2017-06-30 16:23:32 +00:00
( NSString * ) appName
provider :
( NSString * ) provider
2017-06-29 16:24:34 +00:00
token :
( NSString * ) authToken
secret :
( NSString * ) authSecret
resolver :
( RCTPromiseResolveBlock ) resolve
rejecter :
( RCTPromiseRejectBlock ) reject ) {
2017-06-30 16:23:32 +00:00
FIRApp * firApp = [ FIRApp appNamed : appName ] ;
2017-03-17 18:04:13 +00:00
FIRAuthCredential * credential = [ self getCredentialForProvider : provider token : authToken secret : authSecret ] ;
2017-05-31 14:22:15 +00:00
2017-03-17 18:04:13 +00:00
if ( credential = = nil ) {
2017-03-17 23:33:55 +00:00
return reject ( @ "auth/invalid-credential" , @ "The supplied auth credential is malformed, has expired or is not currently supported." , nil ) ;
2017-03-17 18:04:13 +00:00
}
2017-05-31 14:22:15 +00:00
2017-06-30 16:23:32 +00:00
[ [ FIRAuth authWithApp : firApp ] signInWithCredential : credential completion : ^ ( FIRUser * user , NSError * error ) {
2017-03-17 19:08:51 +00:00
if ( error ) {
2017-03-17 21:41:17 +00:00
[ self promiseRejectAuthException : reject error : error ] ;
2017-03-17 19:08:51 +00:00
} else {
[ self promiseWithUser : resolve rejecter : reject user : user ] ;
2017-03-17 18:04:13 +00:00
}
} ] ;
}
2017-07-04 17:22:18 +00:00
/ * *
confirmPasswordReset
@ param NSString code
@ param NSString newPassword
@ param RCTPromiseResolveBlock resolve
@ param RCTPromiseRejectBlock reject
@ return
* /
2017-07-17 19:56:08 +00:00
RCT_EXPORT _METHOD ( confirmPasswordReset :
( NSString * ) code
newPassword :
( NSString * ) newPassword
resolver :
( RCTPromiseResolveBlock ) resolve
rejecter :
( RCTPromiseRejectBlock ) reject ) {
2017-07-04 17:22:18 +00:00
[ [ FIRAuth auth ] confirmPasswordResetWithCode : code newPassword : newPassword completion : ^ ( NSError * _Nullable error ) {
if ( error ) {
[ self promiseRejectAuthException : reject error : error ] ;
} else {
[ self promiseNoUser : resolve rejecter : reject isError : NO ] ;
}
} ] ;
}
2017-07-05 13:16:35 +00:00
/ * *
* applyActionCode
*
* @ param NSString code
* @ param RCTPromiseResolveBlock resolve
* @ param RCTPromiseRejectBlock reject
* @ return
* /
2017-07-17 19:56:08 +00:00
RCT_EXPORT _METHOD ( applyActionCode :
( NSString * ) code
resolver :
( RCTPromiseResolveBlock ) resolve
rejecter :
( RCTPromiseRejectBlock ) reject ) {
2017-07-05 13:56:18 +00:00
[ [ FIRAuth auth ] applyActionCode : code completion : ^ ( NSError * _Nullable error ) {
2017-07-05 13:16:35 +00:00
if ( error ) {
[ self promiseRejectAuthException : reject error : error ] ;
} else {
[ self promiseNoUser : resolve rejecter : reject isError : NO ] ;
}
} ] ;
}
2017-07-05 13:56:18 +00:00
/ * *
* checkActionCode
*
* @ param NSString code
* @ param RCTPromiseResolveBlock resolve
* @ param RCTPromiseRejectBlock reject
* @ return
* /
2017-07-17 19:56:08 +00:00
RCT_EXPORT _METHOD ( checkActionCode :
( NSString * ) code
resolver :
( RCTPromiseResolveBlock ) resolve
rejecter :
( RCTPromiseRejectBlock ) reject ) {
[ [ FIRAuth auth ] checkActionCode : code completion : ^ ( FIRActionCodeInfo * _Nullable info , NSError * _Nullable error ) {
2017-07-05 13:56:18 +00:00
if ( error ) {
2017-07-17 19:56:08 +00:00
[ self promiseRejectAuthException : reject error : error ] ;
2017-07-05 13:56:18 +00:00
} else {
2017-07-12 11:59:35 +00:00
NSString * actionType = @ "ERROR" ;
switch ( info . operation ) {
case FIRActionCodeOperationPasswordReset :
actionType = @ "PASSWORD_RESET" ;
break ;
case FIRActionCodeOperationVerifyEmail :
actionType = @ "VERIFY_EMAIL" ;
break ;
case FIRActionCodeOperationUnknown :
actionType = @ "UNKNOWN" ;
break ;
}
2017-07-17 19:56:08 +00:00
NSDictionary * result = @ { @ "data" : @ { @ "email" : [ info dataForKey : FIRActionCodeEmailKey ] , @ "fromEmail" : [ info dataForKey : FIRActionCodeFromEmailKey ] , } , @ "actionType" : actionType , } ;
2017-07-05 13:56:18 +00:00
resolve ( result ) ;
}
} ] ;
}
2017-03-17 18:04:13 +00:00
/ * *
sendPasswordResetEmail
2017-05-31 14:22:15 +00:00
2017-03-17 18:04:13 +00:00
@ param NSString email
@ param RCTPromiseResolveBlock resolve
@ param RCTPromiseRejectBlock reject
@ return
* /
2017-07-17 19:56:08 +00:00
RCT_EXPORT _METHOD ( sendPasswordResetEmail :
( NSString * ) appName
email :
( NSString * ) email
2017-06-29 16:24:34 +00:00
resolver :
( RCTPromiseResolveBlock ) resolve
rejecter :
( RCTPromiseRejectBlock ) reject ) {
2017-06-30 16:23:32 +00:00
FIRApp * firApp = [ FIRApp appNamed : appName ] ;
[ [ FIRAuth authWithApp : firApp ] sendPasswordResetWithEmail : email completion : ^ ( NSError * _Nullable error ) {
2017-03-17 18:04:13 +00:00
if ( error ) {
2017-03-17 21:41:17 +00:00
[ self promiseRejectAuthException : reject error : error ] ;
2017-03-17 18:04:13 +00:00
} else {
[ self promiseNoUser : resolve rejecter : reject isError : NO ] ;
}
} ] ;
}
/ * *
getCurrentUser
2017-05-31 14:22:15 +00:00
2017-03-17 18:04:13 +00:00
@ param RCTPromiseResolveBlock resolve
@ param RCTPromiseRejectBlock reject
@ return
* /
2017-07-17 19:56:08 +00:00
RCT_EXPORT _METHOD ( getCurrentUser :
( NSString * ) appName
resolver :
( RCTPromiseResolveBlock ) resolve
2017-06-29 16:24:34 +00:00
rejecter :
( RCTPromiseRejectBlock ) reject ) {
2017-06-30 16:23:32 +00:00
FIRApp * firApp = [ FIRApp appNamed : appName ] ;
FIRUser * user = [ FIRAuth authWithApp : firApp ] . currentUser ;
2017-03-17 19:08:51 +00:00
[ self promiseWithUser : resolve rejecter : reject user : user ] ;
2017-03-17 18:04:13 +00:00
}
2017-03-14 19:04:16 +00:00
2017-03-17 19:08:51 +00:00
/ * *
signInWithCustomToken
2017-05-31 14:22:15 +00:00
2017-03-17 19:08:51 +00:00
@ param RCTPromiseResolveBlock resolve
@ param RCTPromiseRejectBlock reject
@ return
* /
2017-07-17 19:56:08 +00:00
RCT_EXPORT _METHOD ( signInWithCustomToken :
( NSString * ) appName
customToken :
( NSString * ) customToken
2017-06-29 16:24:34 +00:00
resolver :
( RCTPromiseResolveBlock ) resolve
rejecter :
( RCTPromiseRejectBlock ) reject ) {
2017-06-30 16:23:32 +00:00
FIRApp * firApp = [ FIRApp appNamed : appName ] ;
[ [ FIRAuth authWithApp : firApp ] signInWithCustomToken : customToken completion : ^ ( FIRUser * user , NSError * error ) {
2017-03-17 19:08:51 +00:00
if ( error ) {
2017-03-17 21:41:17 +00:00
[ self promiseRejectAuthException : reject error : error ] ;
2017-03-09 15:26:28 +00:00
} else {
2017-03-17 19:08:51 +00:00
[ self promiseWithUser : resolve rejecter : reject user : user ] ;
2017-03-09 15:26:28 +00:00
}
} ] ;
}
2017-08-12 18:07:51 +00:00
/ * *
signInWithPhoneNumber
@ param string phoneNumber
@ param RCTPromiseResolveBlock resolve
@ param RCTPromiseRejectBlock reject
@ return
* /
RCT_EXPORT _METHOD ( signInWithPhoneNumber : ( NSString * ) appName
phoneNumber : ( NSString * ) phoneNumber
resolver : ( RCTPromiseResolveBlock ) resolve
rejecter : ( RCTPromiseRejectBlock ) reject ) {
FIRApp * firApp = [ FIRApp appNamed : appName ] ;
2017-10-03 15:49:03 +00:00
[ [ FIRPhoneAuthProvider providerWithAuth : [ FIRAuth authWithApp : firApp ] ] verifyPhoneNumber : phoneNumber UIDelegate : nil completion : ^ ( NSString * _Nullable verificationID , NSError * _Nullable error ) {
2017-08-12 18:07:51 +00:00
if ( error ) {
[ self promiseRejectAuthException : reject error : error ] ;
} else {
NSUserDefaults * defaults = [ NSUserDefaults standardUserDefaults ] ;
[ defaults setObject : verificationID forKey : @ "authVerificationID" ] ;
resolve ( @ {
@ "verificationId" : verificationID
} ) ;
}
} ] ;
}
2017-10-03 14:41:35 +00:00
/ * *
verifyPhoneNumber
@ param string phoneNumber
@ param RCTPromiseResolveBlock resolve
@ param RCTPromiseRejectBlock reject
@ return
* /
RCT_EXPORT _METHOD ( verifyPhoneNumber : ( NSString * ) appName
phoneNumber : ( NSString * ) phoneNumber
requestKey : ( NSString * ) requestKey ) {
FIRApp * firApp = [ FIRApp appNamed : appName ] ;
2017-10-03 15:49:03 +00:00
[ [ FIRPhoneAuthProvider providerWithAuth : [ FIRAuth authWithApp : firApp ] ] verifyPhoneNumber : phoneNumber UIDelegate : nil completion : ^ ( NSString * _Nullable verificationID , NSError * _Nullable error ) {
2017-10-03 14:41:35 +00:00
if ( error ) {
NSDictionary * jsError = [ self getJSError : ( error ) ] ;
2017-10-03 15:49:03 +00:00
NSMutableDictionary * props = [ @ {
@ "type" : @ "onVerificationFailed" ,
@ "requestKey" : requestKey ,
@ "state" : @ { @ "error" : jsError } ,
} mutableCopy ] ;
[ self sendJSEventWithAppName : appName title : PHONE_AUTH _STATE _CHANGED _EVENT props : props ] ;
2017-10-03 14:41:35 +00:00
} else {
NSUserDefaults * defaults = [ NSUserDefaults standardUserDefaults ] ;
[ defaults setObject : verificationID forKey : @ "authVerificationID" ] ;
2017-10-03 15:49:03 +00:00
NSMutableDictionary * props = [ @ {
@ "type" : @ "onCodeSent" ,
@ "requestKey" : requestKey ,
@ "state" : @ { @ "verificationId" : verificationID } ,
} mutableCopy ] ;
[ self sendJSEventWithAppName : appName title : PHONE_AUTH _STATE _CHANGED _EVENT props : props ] ;
2017-10-03 14:41:35 +00:00
}
} ] ;
}
2017-08-12 18:07:51 +00:00
RCT_EXPORT _METHOD ( _confirmVerificationCode : ( NSString * ) appName
verificationCode : ( NSString * ) verificationCode
resolver : ( RCTPromiseResolveBlock ) resolve
rejecter : ( RCTPromiseRejectBlock ) reject ) {
FIRApp * firApp = [ FIRApp appNamed : appName ] ;
NSUserDefaults * defaults = [ NSUserDefaults standardUserDefaults ] ;
NSString * verificationId = [ defaults stringForKey : @ "authVerificationID" ] ;
FIRAuthCredential * credential = [ [ FIRPhoneAuthProvider provider ] credentialWithVerificationID : verificationId verificationCode : verificationCode ] ;
[ [ FIRAuth authWithApp : firApp ] signInWithCredential : credential completion : ^ ( FIRUser * user , NSError * error ) {
if ( error ) {
[ self promiseRejectAuthException : reject error : error ] ;
} else {
[ self promiseWithUser : resolve rejecter : reject user : user ] ;
}
} ] ;
}
2017-03-17 22:34:35 +00:00
/ * *
link - * insert zelda joke here *
2017-05-31 14:22:15 +00:00
2017-03-17 22:34:35 +00:00
@ param NSString provider
@ param NSString authToken
@ param NSString authSecret
@ param RCTPromiseResolveBlock resolve
@ param RCTPromiseRejectBlock reject
@ return
* /
2017-07-17 19:56:08 +00:00
RCT_EXPORT _METHOD ( link :
( NSString * ) appName
provider :
( NSString * ) provider
2017-06-29 16:24:34 +00:00
authToken :
( NSString * ) authToken
authSecret :
( NSString * ) authSecret
resolver :
( RCTPromiseResolveBlock ) resolve
rejecter :
( RCTPromiseRejectBlock ) reject ) {
2017-06-30 16:23:32 +00:00
FIRApp * firApp = [ FIRApp appNamed : appName ] ;
2017-03-17 22:34:35 +00:00
FIRAuthCredential * credential = [ self getCredentialForProvider : provider token : authToken secret : authSecret ] ;
2017-05-31 14:22:15 +00:00
2017-03-17 22:34:35 +00:00
if ( credential = = nil ) {
return reject ( @ "auth/invalid-credential" , @ "The supplied auth credential is malformed, has expired or is not currently supported." , nil ) ;
}
2017-05-31 14:22:15 +00:00
2017-06-30 16:23:32 +00:00
FIRUser * user = [ FIRAuth authWithApp : firApp ] . currentUser ;
2017-05-31 14:22:15 +00:00
2017-03-17 22:34:35 +00:00
if ( user ) {
2017-05-25 14:33:41 +00:00
[ user linkWithCredential : credential completion : ^ ( FIRUser * _Nullable _user , NSError * _Nullable error ) {
2017-03-17 22:34:35 +00:00
if ( error ) {
[ self promiseRejectAuthException : reject error : error ] ;
} else {
2017-05-25 14:33:41 +00:00
[ self promiseWithUser : resolve rejecter : reject user : _user ] ;
2017-03-17 22:34:35 +00:00
}
} ] ;
} else {
[ self promiseNoUser : resolve rejecter : reject isError : YES ] ;
}
}
2017-07-12 15:26:02 +00:00
/ * *
unlink
@ param NSString provider
@ param NSString authToken
@ param NSString authSecret
@ param RCTPromiseResolveBlock resolve
@ param RCTPromiseRejectBlock reject
@ return
* /
2017-07-17 19:56:08 +00:00
RCT_EXPORT _METHOD ( unlink :
( NSString * ) appName
providerId :
( NSString * ) providerId
resolver :
( RCTPromiseResolveBlock ) resolve
rejecter :
( RCTPromiseRejectBlock ) reject ) {
2017-07-17 17:26:13 +00:00
FIRApp * firApp = [ FIRApp appNamed : appName ] ;
FIRUser * user = [ FIRAuth authWithApp : firApp ] . currentUser ;
2017-07-12 15:26:02 +00:00
if ( user ) {
[ user unlinkFromProvider : providerId completion : ^ ( FIRUser * _Nullable _user , NSError * _Nullable error ) {
if ( error ) {
[ self promiseRejectAuthException : reject error : error ] ;
} else {
[ self promiseWithUser : resolve rejecter : reject user : _user ] ;
}
} ] ;
} else {
[ self promiseNoUser : resolve rejecter : reject isError : YES ] ;
2017-03-17 22:34:35 +00:00
}
}
2017-03-18 00:04:31 +00:00
/ * *
reauthenticate
2017-05-31 14:22:15 +00:00
2017-03-18 00:04:31 +00:00
@ param NSString provider
@ param NSString authToken
@ param NSString authSecret
@ param RCTPromiseResolveBlock resolve
@ param RCTPromiseRejectBlock reject
@ return
* /
2017-07-17 19:56:08 +00:00
RCT_EXPORT _METHOD ( reauthenticate :
( NSString * ) appName
provider :
( NSString * ) provider
2017-06-29 16:24:34 +00:00
authToken :
( NSString * ) authToken
authSecret :
( NSString * ) authSecret
resolver :
( RCTPromiseResolveBlock ) resolve
rejecter :
( RCTPromiseRejectBlock ) reject ) {
2017-06-30 16:23:32 +00:00
FIRApp * firApp = [ FIRApp appNamed : appName ] ;
2017-03-18 00:04:31 +00:00
FIRAuthCredential * credential = [ self getCredentialForProvider : provider token : authToken secret : authSecret ] ;
2017-05-31 14:22:15 +00:00
2017-03-18 00:04:31 +00:00
if ( credential = = nil ) {
return reject ( @ "auth/invalid-credential" , @ "The supplied auth credential is malformed, has expired or is not currently supported." , nil ) ;
}
2017-05-31 14:22:15 +00:00
2017-06-30 16:23:32 +00:00
FIRUser * user = [ FIRAuth authWithApp : firApp ] . currentUser ;
2017-05-31 14:22:15 +00:00
2017-03-18 00:04:31 +00:00
if ( user ) {
[ user reauthenticateWithCredential : credential completion : ^ ( NSError * _Nullable error ) {
if ( error ) {
[ self promiseRejectAuthException : reject error : error ] ;
} else {
2017-06-30 16:23:32 +00:00
FIRUser * userAfterAuth = [ FIRAuth authWithApp : firApp ] . currentUser ;
2017-03-18 00:04:31 +00:00
[ self promiseWithUser : resolve rejecter : reject user : userAfterAuth ] ;
}
} ] ;
} else {
[ self promiseNoUser : resolve rejecter : reject isError : YES ] ;
}
}
2017-05-25 13:45:03 +00:00
/ * *
fetchProvidersForEmail
@ param NSString email
@ param RCTPromiseResolveBlock resolve
@ param RCTPromiseRejectBlock reject
@ return
* /
2017-07-17 19:56:08 +00:00
RCT_EXPORT _METHOD ( fetchProvidersForEmail :
( NSString * ) appName
email :
( NSString * ) email
2017-06-29 16:24:34 +00:00
resolver :
( RCTPromiseResolveBlock ) resolve
rejecter :
( RCTPromiseRejectBlock ) reject ) {
2017-06-30 16:23:32 +00:00
FIRApp * firApp = [ FIRApp appNamed : appName ] ;
[ [ FIRAuth authWithApp : firApp ] fetchProvidersForEmail : email completion : ^ ( NSArray < NSString * > * _Nullable providers , NSError * _Nullable error ) {
2017-05-25 13:45:03 +00:00
if ( error ) {
[ self promiseRejectAuthException : reject error : error ] ;
} else if ( ! providers ) {
NSMutableArray * emptyResponse = [ [ NSMutableArray alloc ] init ] ;
resolve ( emptyResponse ) ;
} else {
resolve ( providers ) ;
}
} ] ;
}
2017-03-17 22:34:35 +00:00
/ * *
getCredentialForProvider
2017-05-31 14:22:15 +00:00
2017-10-03 14:41:35 +00:00
@ param provider string
@ param authToken string
@ param authTokenSecret string
2017-03-17 22:34:35 +00:00
@ return FIRAuthCredential
* /
- ( FIRAuthCredential * ) getCredentialForProvider : ( NSString * ) provider token : ( NSString * ) authToken secret : ( NSString * ) authTokenSecret {
FIRAuthCredential * credential ;
2017-05-31 14:22:15 +00:00
2017-03-17 22:34:35 +00:00
if ( [ provider compare : @ "twitter" options : NSCaseInsensitiveSearch ] = = NSOrderedSame ) {
credential = [ FIRTwitterAuthProvider credentialWithToken : authToken secret : authTokenSecret ] ;
} else if ( [ provider compare : @ "facebook" options : NSCaseInsensitiveSearch ] = = NSOrderedSame ) {
credential = [ FIRFacebookAuthProvider credentialWithAccessToken : authToken ] ;
} else if ( [ provider compare : @ "google" options : NSCaseInsensitiveSearch ] = = NSOrderedSame ) {
credential = [ FIRGoogleAuthProvider credentialWithIDToken : authToken accessToken : authTokenSecret ] ;
} else if ( [ provider compare : @ "password" options : NSCaseInsensitiveSearch ] = = NSOrderedSame ) {
2017-07-30 06:34:41 +00:00
credential = [ FIREmailAuthProvider credentialWithEmail : authToken password : authTokenSecret ] ;
2017-03-17 22:34:35 +00:00
} else if ( [ provider compare : @ "github" options : NSCaseInsensitiveSearch ] = = NSOrderedSame ) {
credential = [ FIRGitHubAuthProvider credentialWithToken : authToken ] ;
2017-09-01 07:47:42 +00:00
} else if ( [ provider compare : @ "phone" options : NSCaseInsensitiveSearch ] = = NSOrderedSame ) {
credential = [ [ FIRPhoneAuthProvider provider ] credentialWithVerificationID : authToken verificationCode : authTokenSecret ] ;
2017-03-17 22:34:35 +00:00
} else {
NSLog ( @ "Provider not yet handled: %@" , provider ) ;
}
2017-05-31 14:22:15 +00:00
2017-03-17 22:34:35 +00:00
return credential ;
}
2017-03-14 19:04:16 +00:00
/ * *
Resolve or reject a promise based on isError value
2017-05-31 14:22:15 +00:00
2017-03-14 19:04:16 +00:00
@ param resolve RCTPromiseResolveBlock
@ param reject RCTPromiseRejectBlock
@ param isError BOOL
* /
2017-06-29 16:24:34 +00:00
- ( void ) promiseNoUser : ( RCTPromiseResolveBlock ) resolve rejecter : ( RCTPromiseRejectBlock ) reject isError : ( BOOL ) isError {
2017-03-14 19:04:16 +00:00
if ( isError ) {
2017-05-25 13:45:03 +00:00
reject ( @ "auth/no-current-user" , @ "No user currently signed in." , nil ) ;
2017-03-14 19:04:16 +00:00
} else {
resolve ( [ NSNull null ] ) ;
}
}
2017-03-17 19:08:51 +00:00
/ * *
Reject a promise with an auth exception
2017-05-31 14:22:15 +00:00
2017-03-17 19:08:51 +00:00
@ param reject RCTPromiseRejectBlock
@ param error NSError
* /
2017-06-29 16:24:34 +00:00
- ( void ) promiseRejectAuthException : ( RCTPromiseRejectBlock ) reject error : ( NSError * ) error {
2017-10-03 14:41:35 +00:00
NSDictionary * jsError = [ self getJSError : ( error ) ] ;
reject ( [ jsError valueForKey : @ "code" ] , [ jsError valueForKey : @ "message" ] , error ) ;
}
/ * *
Reject a promise with an auth exception
@ param error NSError
* /
- ( NSDictionary * ) getJSError : ( NSError * ) error {
2017-03-17 21:41:17 +00:00
NSString * code = @ "auth/unknown" ;
NSString * message = [ error localizedDescription ] ;
2017-10-03 14:41:35 +00:00
NSString * nativeErrorMessage = [ error localizedDescription ] ;
2017-03-17 21:41:17 +00:00
switch ( error . code ) {
case FIRAuthErrorCodeInvalidCustomToken :
code = @ "auth/invalid-custom-token" ;
message = @ "The custom token format is incorrect. Please check the documentation." ;
break ;
case FIRAuthErrorCodeCustomTokenMismatch :
code = @ "auth/custom-token-mismatch" ;
message = @ "The custom token corresponds to a different audience." ;
break ;
case FIRAuthErrorCodeInvalidCredential :
code = @ "auth/invalid-credential" ;
message = @ "The supplied auth credential is malformed or has expired." ;
break ;
case FIRAuthErrorCodeInvalidEmail :
code = @ "auth/invalid-email" ;
message = @ "The email address is badly formatted." ;
break ;
case FIRAuthErrorCodeWrongPassword :
code = @ "auth/wrong-password" ;
message = @ "The password is invalid or the user does not have a password." ;
break ;
case FIRAuthErrorCodeUserMismatch :
code = @ "auth/user-mismatch" ;
message = @ "The supplied credentials do not correspond to the previously signed in user." ;
break ;
case FIRAuthErrorCodeRequiresRecentLogin :
code = @ "auth/requires-recent-login" ;
message = @ "This operation is sensitive and requires recent authentication. Log in again before retrying this request." ;
break ;
case FIRAuthErrorCodeAccountExistsWithDifferentCredential :
code = @ "auth/account-exists-with-different-credential" ;
message = @ "An account already exists with the same email address but different sign-in credentials. Sign in using a provider associated with this email address." ;
break ;
case FIRAuthErrorCodeEmailAlreadyInUse :
code = @ "auth/email-already-in-use" ;
message = @ "The email address is already in use by another account." ;
break ;
case FIRAuthErrorCodeCredentialAlreadyInUse :
code = @ "auth/credential-already-in-use" ;
message = @ "This credential is already associated with a different user account." ;
break ;
case FIRAuthErrorCodeUserDisabled :
code = @ "auth/user-disabled" ;
message = @ "The user account has been disabled by an administrator." ;
break ;
case FIRAuthErrorCodeUserTokenExpired :
code = @ "auth/user-token-expired" ;
message = @ "The user's credential is no longer valid. The user must sign in again." ;
break ;
case FIRAuthErrorCodeUserNotFound :
code = @ "auth/user-not-found" ;
message = @ "There is no user record corresponding to this identifier. The user may have been deleted." ;
break ;
case FIRAuthErrorCodeInvalidUserToken :
code = @ "auth/invalid-user-token" ;
message = @ "The user's credential is no longer valid. The user must sign in again." ;
break ;
case FIRAuthErrorCodeWeakPassword :
code = @ "auth/weak-password" ;
message = @ "The given password is invalid." ;
break ;
case FIRAuthErrorCodeOperationNotAllowed :
code = @ "auth/operation-not-allowed" ;
message = @ "This operation is not allowed. You must enable this service in the console." ;
break ;
case FIRAuthErrorCodeNetworkError :
code = @ "auth/network-error" ;
message = @ "A network error has occurred, please try again." ;
break ;
case FIRAuthErrorCodeInternalError :
code = @ "auth/internal-error" ;
message = @ "An internal error has occurred, please try again." ;
break ;
2017-10-03 14:41:35 +00:00
2017-03-17 22:00:13 +00:00
// unsure of the below codes so leaving them as the default error message
2017-03-17 21:41:17 +00:00
case FIRAuthErrorCodeTooManyRequests :
code = @ "auth/too-many-requests" ;
break ;
case FIRAuthErrorCodeProviderAlreadyLinked :
code = @ "auth/provider-already-linked" ;
break ;
case FIRAuthErrorCodeNoSuchProvider :
code = @ "auth/no-such-provider" ;
break ;
case FIRAuthErrorCodeInvalidAPIKey :
code = @ "auth/invalid-api-key" ;
break ;
case FIRAuthErrorCodeAppNotAuthorized :
code = @ "auth/app-not-authorised" ;
break ;
case FIRAuthErrorCodeExpiredActionCode :
code = @ "auth/expired-action-code" ;
break ;
case FIRAuthErrorCodeInvalidMessagePayload :
code = @ "auth/invalid-message-payload" ;
break ;
case FIRAuthErrorCodeInvalidSender :
code = @ "auth/invalid-sender" ;
break ;
case FIRAuthErrorCodeInvalidRecipientEmail :
code = @ "auth/invalid-recipient-email" ;
break ;
case FIRAuthErrorCodeKeychainError :
code = @ "auth/keychain-error" ;
break ;
default :
break ;
}
2017-10-03 14:41:35 +00:00
return @ {
@ "code" : code ,
@ "message" : message ,
@ "nativeErrorMessage" : nativeErrorMessage ,
} ;
2017-03-17 19:08:51 +00:00
}
2017-10-03 14:41:35 +00:00
2017-03-14 19:04:16 +00:00
/ * *
Resolve or reject a promise based on FIRUser value existance
2017-05-31 14:22:15 +00:00
2017-03-14 19:04:16 +00:00
@ param resolve RCTPromiseResolveBlock
@ param reject RCTPromiseRejectBlock
@ param user FIRUser
* /
2017-06-29 16:24:34 +00:00
- ( void ) promiseWithUser : ( RCTPromiseResolveBlock ) resolve rejecter : ( RCTPromiseRejectBlock ) reject user : ( FIRUser * ) user {
2017-03-14 19:04:16 +00:00
if ( user ) {
NSDictionary * userDict = [ self firebaseUserToDict : user ] ;
resolve ( userDict ) ;
} else {
[ self promiseNoUser : resolve rejecter : reject isError : YES ] ;
}
2017-05-31 14:22:15 +00:00
2017-03-14 19:04:16 +00:00
}
2017-03-17 19:08:51 +00:00
/ * *
wrapper for sendEventWithName for auth events
2017-05-31 14:22:15 +00:00
2017-03-17 19:08:51 +00:00
@ param title sendEventWithName
@ param props < # props description # >
* /
2017-06-29 16:24:34 +00:00
- ( void ) sendJSEvent : ( NSString * ) title props : ( NSDictionary * ) props {
2017-03-17 19:08:51 +00:00
@ try {
2017-06-29 16:24:34 +00:00
[ self sendEventWithName : title body : props ] ;
} @ catch ( NSException * error ) {
2017-03-17 19:08:51 +00:00
NSLog ( @ "An error occurred in sendJSEvent: %@" , [ error debugDescription ] ) ;
}
}
2017-07-17 19:56:08 +00:00
- ( void ) sendJSEventWithAppName : ( NSString * ) appName title : ( NSString * ) title props : ( NSMutableDictionary * ) props {
props [ @ "appName" ] = appName ;
2017-06-29 16:24:34 +00:00
@ try {
[ self sendEventWithName : title body : props ] ;
} @ catch ( NSException * error ) {
NSLog ( @ "An error occurred in sendJSEvent: %@" , [ error debugDescription ] ) ;
}
}
2017-03-17 19:08:51 +00:00
2017-05-12 12:58:16 +00:00
/ * *
2017-05-12 12:13:17 +00:00
Converts an array of FIRUserInfo instances into the correct format to match the web sdk
2017-05-31 14:22:15 +00:00
2017-05-12 12:13:17 +00:00
@ param providerData FIRUser . providerData
@ return NSArray
* /
2017-06-29 16:24:34 +00:00
- ( NSArray < NSObject * > * ) convertProviderData : ( NSArray < id < FIRUserInfo > > * ) providerData {
2017-05-12 12:13:17 +00:00
NSMutableArray * output = [ NSMutableArray array ] ;
2017-05-31 14:22:15 +00:00
2017-06-29 16:24:34 +00:00
for ( id < FIRUserInfo > userInfo in providerData ) {
2017-05-13 12:08:43 +00:00
NSMutableDictionary * pData = [ NSMutableDictionary dictionary ] ;
2017-05-31 14:22:15 +00:00
2017-05-13 00:46:27 +00:00
if ( userInfo . providerID ! = nil ) {
2017-06-29 16:24:34 +00:00
[ pData setValue : userInfo . providerID forKey : @ "providerId" ] ;
2017-05-13 00:46:27 +00:00
}
2017-05-31 14:22:15 +00:00
2017-05-13 00:46:27 +00:00
if ( userInfo . uid ! = nil ) {
2017-06-29 16:24:34 +00:00
[ pData setValue : userInfo . uid forKey : @ "uid" ] ;
2017-05-13 00:46:27 +00:00
}
2017-05-31 14:22:15 +00:00
2017-05-13 00:46:27 +00:00
if ( userInfo . displayName ! = nil ) {
2017-06-29 16:24:34 +00:00
[ pData setValue : userInfo . displayName forKey : @ "displayName" ] ;
2017-05-13 00:46:27 +00:00
}
2017-05-31 14:22:15 +00:00
2017-05-13 00:46:27 +00:00
if ( userInfo . photoURL ! = nil ) {
2017-06-29 16:24:34 +00:00
[ pData setValue : [ userInfo . photoURL absoluteString ] forKey : @ "photoURL" ] ;
2017-05-13 00:46:27 +00:00
}
2017-05-31 14:22:15 +00:00
2017-05-13 00:46:27 +00:00
if ( userInfo . email ! = nil ) {
2017-06-29 16:24:34 +00:00
[ pData setValue : userInfo . email forKey : @ "email" ] ;
2017-05-13 00:46:27 +00:00
}
2017-05-31 14:22:15 +00:00
2017-08-12 18:07:51 +00:00
if ( userInfo . phoneNumber ! = nil ) {
[ pData setValue : userInfo . phoneNumber forKey : @ "phoneNumber" ] ;
}
2017-05-13 00:46:27 +00:00
[ output addObject : pData ] ;
2017-05-12 12:13:17 +00:00
}
2017-05-31 14:22:15 +00:00
2017-05-12 12:13:17 +00:00
return output ;
}
2017-03-14 19:04:16 +00:00
/ * *
Converts a FIRUser instance into a dictionary to send via RNBridge
2017-05-31 14:22:15 +00:00
2017-03-14 19:04:16 +00:00
@ param user FIRUser
@ return NSDictionary
* /
2017-07-17 19:56:08 +00:00
- ( NSMutableDictionary * ) firebaseUserToDict : ( FIRUser * ) user {
2017-08-12 18:07:51 +00:00
NSMutableDictionary * userDict = [ @ { @ "uid" : user . uid , @ "email" : user . email ? user . email : [ NSNull null ] , @ "emailVerified" : @ ( user . emailVerified ) , @ "isAnonymous" : @ ( user . anonymous ) , @ "displayName" : user . displayName ? user . displayName : [ NSNull null ] , @ "refreshToken" : user . refreshToken , @ "providerId" : [ user . providerID lowercaseString ] , @ "phoneNumber" : user . phoneNumber ? user . phoneNumber : [ NSNull null ] , @ "providerData" : [ self convertProviderData : user . providerData ] } mutableCopy ] ;
2017-05-31 14:22:15 +00:00
2017-03-14 19:04:16 +00:00
if ( [ user valueForKey : @ "photoURL" ] ! = nil ) {
2017-06-29 16:24:34 +00:00
[ userDict setValue : [ user . photoURL absoluteString ] forKey : @ "photoURL" ] ;
2017-03-14 19:04:16 +00:00
}
2017-05-31 14:22:15 +00:00
2017-03-14 19:04:16 +00:00
return userDict ;
}
2017-03-09 15:26:28 +00:00
2017-03-17 19:08:51 +00:00
- ( NSArray < NSString * > * ) supportedEvents {
2017-10-03 14:41:35 +00:00
return @ [ AUTH_CHANGED _EVENT , AUTH_ID _TOKEN _CHANGED _EVENT , PHONE_AUTH _STATE _CHANGED _EVENT ] ;
2017-03-17 19:08:51 +00:00
}
2017-03-09 15:26:28 +00:00
@ end
2017-05-25 14:33:41 +00:00
# else
@ implementation RNFirebaseAuth
@ end
# endif