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 |
|
13 |
|
14 |
|
15 | NSString* const ERROR_USER_CANCELLED = @"ERROR_USER_CANCELLED";
|
16 |
|
17 |
|
18 |
|
19 |
|
20 | NSString* 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 |
|
41 | RCT_EXPORT_MODULE();
|
42 |
|
43 | RCT_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 |
|
99 | RCT_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 |
|
111 | RCT_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 |
|
123 | RCT_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
|
137 | didSignInWithAuthDataResult:(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
|