Files
nirvana-ios/Pods/FirebasePhoneAuthUI/FirebasePhoneAuthUI/Sources/FUIPhoneAuth.m
T

237 lines
8.1 KiB
Objective-C

//
// Copyright (c) 2016 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
#import "FirebasePhoneAuthUI/Sources/FUIPhoneAuth_Internal.h"
#import <FirebaseAuthUI/FirebaseAuthUI.h>
#import "FirebasePhoneAuthUI/Sources/FUICountryCodes.h"
#import "FirebasePhoneAuthUI/Sources/FUIPhoneAuthStrings.h"
#import "FirebasePhoneAuthUI/Sources/FUIPhoneEntryViewController.h"
NS_ASSUME_NONNULL_BEGIN
@implementation FUIPhoneAuth {
/** The @c FUIAuth instance of the application. */
FUIAuth *_authUI;
/** The callback which should be invoked when the sign in flow completes (or is cancelled.) */
FUIAuthProviderSignInCompletionBlock _pendingSignInCallback;
/** Available country codes For the authUI to use. */
FUICountryCodes *_countryCodes;
}
+ (NSBundle *)bundle {
return [FUIAuthUtils bundleNamed:FUIPhoneAuthBundleName
inFrameworkBundle:[NSBundle bundleForClass:[self class]]];
}
- (instancetype)initWithAuthUI:(FUIAuth *)authUI {
if (self = [super init]) {
_authUI = authUI;
_countryCodes = [[FUICountryCodes alloc] init];
}
return self;
}
- (instancetype)initWithAuthUI:(FUIAuth *)authUI
whitelistedCountries:(NSSet<NSString *> *)countries {
NSParameterAssert(countries);
NSParameterAssert(countries.count > 0);
if (self = [self initWithAuthUI:authUI]) {
[_countryCodes whitelistCountries:countries];
NSAssert(_countryCodes.count, @"No available country code found.");
if (!_countryCodes.count) {
return nil;
}
}
return self;
}
- (instancetype)initWithAuthUI:(FUIAuth *)authUI
blacklistedCountries:(NSSet<NSString *> *)countries {
if (!countries.count) {
return nil;
}
if (self = [self initWithAuthUI:authUI]) {
[_countryCodes blacklistCountries:countries];
NSAssert(_countryCodes.count, @"No available country code found.");
if (!_countryCodes.count) {
return nil;
}
}
return self;
}
#pragma mark - FUIAuthProvider
- (nullable NSString *)providerID {
return FIRPhoneAuthProviderID;
}
/** @fn accessToken:
@brief Phone Auth token is matched by FirebaseUI User Access Token
*/
- (nullable NSString *)accessToken {
return nil;
}
/** @fn idToken:
@brief Phone Auth Token Secret is matched by FirebaseUI User Id Token
*/
- (nullable NSString *)idToken {
return nil;
}
- (NSString *)shortName {
return @"Phone";
}
- (NSString *)signInLabel {
return FUIPhoneAuthLocalizedString(kPAStr_SignInWithPhone);
}
- (UIImage *)icon {
return [FUIAuthUtils imageNamed:@"ic_phone" fromBundle:[FUIPhoneAuth bundle]];
}
- (UIColor *)buttonBackgroundColor {
return [UIColor colorWithRed:68.0f/255.0f green:197.0f/255.0f blue:166.0f/255.0f alpha:1.0f];
}
- (UIColor *)buttonTextColor {
return [UIColor whiteColor];
}
- (void)signInWithPresentingViewController:(UIViewController *)presentingViewController {
[self signInWithPresentingViewController:presentingViewController phoneNumber:nil];
}
- (void)signInWithPresentingViewController:(UIViewController *)presentingViewController
phoneNumber:(nullable NSString *)phoneNumber {
[_authUI signInWithProviderUI:self presentingViewController:presentingViewController
defaultValue:phoneNumber];
}
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-implementations"
- (void)signInWithEmail:(nullable NSString *)email
presentingViewController:(nullable UIViewController *)presentingViewController
completion:(nullable FUIAuthProviderSignInCompletionBlock)completion {
[self signInWithDefaultValue:email
presentingViewController:presentingViewController
completion:completion];
}
#pragma clang diagnostic pop
- (void)signInWithDefaultValue:(nullable NSString *)defaultValue
presentingViewController:(nullable UIViewController *)presentingViewController
completion:(nullable FUIAuthProviderSignInCompletionBlock)completion {
_pendingSignInCallback = completion;
FUIPhoneAuth *delegate = [_authUI providerWithID:FIRPhoneAuthProviderID];
if (!delegate) {
NSError *error = [FUIAuthErrorUtils errorWithCode:FUIAuthErrorCodeCantFindProvider
userInfo:@{
FUIAuthErrorUserInfoProviderIDKey : FIRPhoneAuthProviderID
}];
[self callbackWithCredential:nil error:error result:^(FIRUser *_Nullable user,
NSError *_Nullable error) {
if (error) {
[FUIAuthBaseViewController showAlertWithMessage:error.localizedDescription
presentingViewController:presentingViewController];
}
}];
return;
}
UIViewController *controller = [[FUIPhoneEntryViewController alloc] initWithAuthUI:_authUI
phoneNumber:defaultValue
countryCodes:_countryCodes];
UINavigationController *navigationController =
[[UINavigationController alloc] initWithRootViewController:controller];
[presentingViewController presentViewController:navigationController animated:YES completion:nil];
}
- (void)signOut {
return;
}
- (BOOL)handleOpenURL:(NSURL *)URL sourceApplication:(nullable NSString *)sourceApplication {
return NO;
}
- (void)callbackWithCredential:(nullable FIRAuthCredential *)credential
error:(nullable NSError *)error
result:(nullable FIRAuthResultCallback)result {
FUIAuthProviderSignInCompletionBlock callback = _pendingSignInCallback;
FIRAuthResultCallback resultAuthCallback = ^(FIRUser *_Nullable user, NSError *_Nullable error) {
if (!error) {
self->_pendingSignInCallback = nil;
}
if (result) {
result(user, error);
}
};
if (callback) {
callback(credential, error, resultAuthCallback, nil);
}
}
+ (UIAlertController *)alertControllerForError:(NSError *)error
actionHandler:(nullable FUIAuthAlertActionHandler)actionHandler {
NSString *message;
if (error.code == FIRAuthErrorCodeInvalidPhoneNumber) {
message = FUIPhoneAuthLocalizedString(kPAStr_IncorrectPhoneMessage);
} else if (error.code == FIRAuthErrorCodeInvalidVerificationCode) {
message = FUIPhoneAuthLocalizedString(kPAStr_IncorrectCodeMessage);
} else if (error.code == FIRAuthErrorCodeTooManyRequests) {
message = FUIPhoneAuthLocalizedString(kPAStr_TooManyCodesSent);
} else if (error.code == FIRAuthErrorCodeQuotaExceeded) {
message = FUIPhoneAuthLocalizedString(kPAStr_MessageQuotaExceeded);
} else if (error.code == FIRAuthErrorCodeSessionExpired) {
message = FUIPhoneAuthLocalizedString(kPAStr_MessageExpired);
} else if ((error.code >= FIRAuthErrorCodeMissingPhoneNumber
&& error.code <= FIRAuthErrorCodeAppNotVerified)
|| error.code >= FIRAuthErrorCodeInternalError) {
message = FUIPhoneAuthLocalizedString(kPAStr_InternalErrorMessage);
} else {
message = error.localizedDescription;
}
UIAlertController *alertController =
[UIAlertController alertControllerWithTitle:nil
message:message
preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *okAction =
[UIAlertAction actionWithTitle:FUIPhoneAuthLocalizedString(kPAStr_Done)
style:UIAlertActionStyleDefault
handler:^(UIAlertAction *_Nonnull action) {
if (actionHandler) {
actionHandler();
}
}];
[alertController addAction:okAction];
return alertController;
}
@end
NS_ASSUME_NONNULL_END