UNPKG

5.86 kBPlain TextView Raw
1#import "RNFirebaseuiAuth.h"
2
3@interface RNFirebaseuiAuth ()
4@property (nonatomic, retain) FUIAuth *authUI;
5@property (nonatomic, retain) FIRAdditionalUserInfo *additionalUserInfo;
6@property (nonatomic) RCTPromiseResolveBlock _resolve;
7@property (nonatomic) RCTPromiseRejectBlock _reject;
8@end
9
10@implementation RNFirebaseuiAuth
11
12/** @const ERROR_USER_CANCELLED
13 @brief Indicates the user cancelled a sign-in flow.
14 */
15NSString* const ERROR_USER_CANCELLED = @"ERROR_USER_CANCELLED";
16
17/** @const ERROR_FIREBASE
18 @brief Indicates firebase encountered an error.
19 */
20NSString* const ERROR_FIREBASE = @"ERROR_FIREBASE";
21
22- (dispatch_queue_t)methodQueue
23{
24 return dispatch_get_main_queue();
25}
26
27+ (BOOL)requiresMainQueueSetup
28{
29 return YES;
30}
31
32- (instancetype)init {
33 self = [super init];
34 if (self) {
35 self.authUI = [FUIAuth defaultAuthUI];
36 self.authUI.delegate = self;
37 }
38 return self;
39}
40
41RCT_EXPORT_MODULE();
42
43RCT_EXPORT_METHOD(signIn:(NSDictionary *)options
44 resolver:(RCTPromiseResolveBlock)resolve
45 rejecter:(RCTPromiseRejectBlock)reject)
46{
47 NSMutableArray<id<FUIAuthProvider>> *providers = [[NSMutableArray alloc] init];
48 NSArray<NSString *> *optProviders = [options objectForKey:@"providers"];
49
50 for (int i = 0; i < [optProviders count]; i++)
51 {
52 if ([optProviders[i] isEqualToString:@"anonymous"]) {
53 [providers addObject:[[FUIAnonymousAuth alloc] init]];
54 break;
55 }
56 if ([optProviders[i] isEqualToString:@"facebook"]) {
57 [providers addObject:[[FUIFacebookAuth alloc] init]];
58 }
59 else if ([optProviders[i] isEqualToString:@"google"]) {
60 [providers addObject:[[FUIGoogleAuth alloc] init]];
61 }
62 else if ([optProviders[i] isEqualToString:@"email"]) {
63 [providers addObject:[[FUIEmailAuth alloc] init]];
64 }
65 else if ([optProviders[i] isEqualToString:@"phone"]) {
66 [providers addObject:[[FUIPhoneAuth alloc] initWithAuthUI:[FUIAuth defaultAuthUI]]];
67 }
68 else if ([optProviders[i] isEqualToString:@"apple"]) {
69 if (@available(iOS 13.0, *)) {
70 [providers addObject:[FUIOAuth appleAuthProvider]];
71 }
72 }
73 else if ([optProviders[i] isEqualToString:@"yahoo"]) {
74 [providers addObject:[FUIOAuth yahooAuthProvider]];
75 }
76 else if ([optProviders[i] isEqualToString:@"github"]) {
77 [providers addObject:[FUIOAuth githubAuthProvider]];
78 }
79 else if ([optProviders[i] isEqualToString:@"twitter"]) {
80 [providers addObject:[FUIOAuth twitterAuthProvider]];
81 }
82 else if ([optProviders[i] isEqualToString:@"microsoft"]) {
83 [providers addObject:[FUIOAuth microsoftAuthProvider]];
84 }
85 }
86
87 self.authUI.providers = providers;
88 self.authUI.TOSURL = [NSURL URLWithString:options[@"tosUrl"]];
89 self.authUI.privacyPolicyURL = [NSURL URLWithString:options[@"privacyPolicyUrl"]];
90
91 UINavigationController *authViewController = [self.authUI authViewController];
92 UIViewController *rootVC = UIApplication.sharedApplication.delegate.window.rootViewController;
93 [rootVC presentViewController:authViewController animated:YES completion:nil];
94
95 self._resolve = resolve;
96 self._reject = reject;
97}
98
99RCT_EXPORT_METHOD(getCurrentUser:(RCTPromiseResolveBlock)resolve
100 rejecter:(RCTPromiseRejectBlock)reject)
101{
102 FIRUser *user = self.authUI.auth.currentUser;
103 if (user) {
104 NSDictionary *authResultDict = [self mapUser:user];
105 resolve(authResultDict);
106 return;
107 }
108 resolve([NSNull null]);
109}
110
111RCT_EXPORT_METHOD(signOut:(RCTPromiseResolveBlock)resolve
112 rejecter:(RCTPromiseRejectBlock)reject)
113{
114 NSError *error;
115 [self.authUI signOutWithError:&error];
116 if (error) {
117 reject(ERROR_FIREBASE, @"Sign out error", error);
118 return;
119 }
120 resolve(@YES);
121}
122
123RCT_EXPORT_METHOD(delete:(RCTPromiseResolveBlock)resolve
124 rejecter:(RCTPromiseRejectBlock)reject)
125{
126 FIRUser *user = self.authUI.auth.currentUser;
127 [user deleteWithCompletion:^(NSError *_Nullable error) {
128 if (error) {
129 reject(ERROR_FIREBASE, @"Delete user error", error);
130 return;
131 }
132 resolve(@YES);
133 }];
134}
135
136- (void)authUI:(FUIAuth *)authUI
137didSignInWithAuthDataResult:(nullable FIRAuthDataResult *)authDataResult
138 error:(nullable NSError *)error{
139
140 if (error) {
141 if (error.code == FUIAuthErrorCodeUserCancelledSignIn) {
142 self._reject(ERROR_USER_CANCELLED, @"User cancelled the sign-in process", error);
143 } else {
144 self._reject(ERROR_FIREBASE, error.localizedDescription, error);
145 }
146 return;
147 }
148
149 FIRUser *user = authDataResult.user;
150 if (user) {
151 self.additionalUserInfo = authDataResult.additionalUserInfo;
152 NSDictionary *authResultDict = [self mapUser:user];
153 self._resolve(authResultDict);
154 return;
155 }
156}
157
158- (NSDictionary*)mapUser:(nullable FIRUser*)user {
159 return @{
160 @"uid": user.uid ?: [NSNull null],
161 @"displayName": user.displayName ?: [NSNull null],
162 @"photoURL": user.photoURL ?: [NSNull null],
163 @"email": user.email ?: [NSNull null],
164 @"phoneNumber": user.phoneNumber ?: [NSNull null],
165 @"providerID": user.providerID ?: [NSNull null],
166 @"isNewUser": self.additionalUserInfo?
167 @(self.additionalUserInfo.isNewUser) : [NSNull null],
168 @"creationTimestamp": user.metadata ?
169 @(user.metadata.creationDate.timeIntervalSince1970 * 1000) : [NSNull null],
170 @"lastSignInTimestamp": user.metadata ?
171 @(user.metadata.lastSignInDate.timeIntervalSince1970 * 1000) : [NSNull null],
172 };
173}
174
175@end