206 lines
6.7 KiB
Objective-C
Executable File
206 lines
6.7 KiB
Objective-C
Executable File
//
|
|
// 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 "FirebaseEmailAuthUI/Sources/Public/FirebaseEmailAuthUI/FUIPasswordRecoveryViewController.h"
|
|
|
|
#import <FirebaseAuth/FirebaseAuth.h>
|
|
#import <FirebaseAuthUI/FirebaseAuthUI.h>
|
|
|
|
#import "FirebaseEmailAuthUI/Sources/Public/FirebaseEmailAuthUI/FUIEmailAuth.h"
|
|
#import "FirebaseEmailAuthUI/Sources/FUIEmailAuthStrings.h"
|
|
|
|
/** @var kCellReuseIdentifier
|
|
@brief The reuse identifier for table view cell.
|
|
*/
|
|
static NSString *const kCellReuseIdentifier = @"cellReuseIdentifier";
|
|
|
|
/** @var kFooterTextViewHorizontalInset
|
|
@brief The horizontal inset for @c footerTextView, which should match the iOS standard margin.
|
|
*/
|
|
static const CGFloat kFooterTextViewHorizontalInset = 8.0f;
|
|
|
|
@interface FUIPasswordRecoveryViewController () <UITableViewDataSource, UITextFieldDelegate>
|
|
/** @property footerTextView
|
|
@brief The text view in the footer of the table.
|
|
*/
|
|
@property(nonatomic, strong) IBOutlet UITextView *footerTextView;
|
|
@property(nonatomic, strong) IBOutlet FUIPrivacyAndTermsOfServiceView *termsOfServiceView;
|
|
|
|
@end
|
|
|
|
@implementation FUIPasswordRecoveryViewController {
|
|
/** @var _email
|
|
@brief The @c email address of the user from the previous screen.
|
|
*/
|
|
NSString *_email;
|
|
|
|
/** @var _emailField
|
|
@brief The @c UITextField that user enters email address into.
|
|
*/
|
|
UITextField *_emailField;
|
|
|
|
/** @var _tableView
|
|
@brief The @c UITableView used to store all UI elements.
|
|
*/
|
|
__weak IBOutlet UITableView *_tableView;
|
|
}
|
|
|
|
- (instancetype)initWithAuthUI:(FUIAuth *)authUI
|
|
email:(NSString *_Nullable)email {
|
|
return [self initWithNibName:NSStringFromClass([self class])
|
|
bundle:[FUIEmailAuth bundle]
|
|
authUI:authUI
|
|
email:email];
|
|
}
|
|
|
|
- (instancetype)initWithNibName:(nullable NSString *)nibNameOrNil
|
|
bundle:(nullable NSBundle *)nibBundleOrNil
|
|
authUI:(FUIAuth *)authUI
|
|
email:(NSString *_Nullable)email {
|
|
self = [super initWithNibName:nibNameOrNil
|
|
bundle:nibBundleOrNil
|
|
authUI:authUI];
|
|
if (self) {
|
|
_email = [email copy];
|
|
|
|
self.title = FUILocalizedString(kStr_PasswordRecoveryTitle);
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (void)viewDidLoad {
|
|
[super viewDidLoad];
|
|
|
|
UIBarButtonItem *sendButtonItem =
|
|
[FUIAuthBaseViewController barItemWithTitle:FUILocalizedString(kStr_Send)
|
|
target:self
|
|
action:@selector(send)];
|
|
self.navigationItem.rightBarButtonItem = sendButtonItem;
|
|
|
|
[self enableDynamicCellHeightForTableView:_tableView];
|
|
|
|
if (@available(iOS 13.0, *)) {
|
|
_tableView.backgroundColor = [UIColor systemBackgroundColor];
|
|
self.footerTextView.textColor = [UIColor secondaryLabelColor];
|
|
}
|
|
}
|
|
|
|
- (void)viewDidLayoutSubviews {
|
|
[super viewDidLayoutSubviews];
|
|
|
|
self.footerTextView.text = FUILocalizedString(kStr_PasswordRecoveryMessage);
|
|
|
|
// Adjust the footerTextView to have standard margins.
|
|
self.footerTextView.textContainer.lineFragmentPadding = 0;
|
|
_footerTextView.textContainerInset =
|
|
UIEdgeInsetsMake(0, kFooterTextViewHorizontalInset, 0, kFooterTextViewHorizontalInset);
|
|
[self.footerTextView sizeToFit];
|
|
|
|
self.termsOfServiceView.authUI = self.authUI;
|
|
[self.termsOfServiceView useFooterMessage];
|
|
}
|
|
|
|
#pragma mark - Actions
|
|
|
|
- (void)send {
|
|
[self recoverEmail:_emailField.text];
|
|
}
|
|
|
|
- (void)recoverEmail:(NSString *)email {
|
|
if (![[self class] isValidEmail:email]) {
|
|
[self showAlertWithMessage:FUILocalizedString(kStr_InvalidEmailError)];
|
|
return;
|
|
}
|
|
|
|
[self incrementActivity];
|
|
|
|
[self.auth sendPasswordResetWithEmail:email
|
|
completion:^(NSError *_Nullable error) {
|
|
[self decrementActivity];
|
|
|
|
if (error) {
|
|
if (error.code == FIRAuthErrorCodeUserNotFound) {
|
|
[self showAlertWithMessage:FUILocalizedString(kStr_UserNotFoundError)];
|
|
return;
|
|
}
|
|
|
|
[self dismissNavigationControllerAnimated:YES completion:^{
|
|
[self.authUI invokeResultCallbackWithAuthDataResult:nil URL:nil error:error];
|
|
}];
|
|
return;
|
|
}
|
|
|
|
NSString *message = [NSString stringWithFormat:
|
|
FUILocalizedString(kStr_PasswordRecoveryEmailSentMessage), email];
|
|
[self showAlertWithMessage:message];
|
|
}];
|
|
}
|
|
|
|
- (void)textFieldDidChange {
|
|
[self didChangeEmail:_emailField.text];
|
|
}
|
|
|
|
- (void)didChangeEmail:(NSString *)email {
|
|
self.navigationItem.rightBarButtonItem.enabled = (email.length > 0);
|
|
|
|
}
|
|
|
|
#pragma mark - UITableViewDataSource
|
|
|
|
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
|
|
return 1;
|
|
}
|
|
|
|
- (UITableViewCell *)tableView:(UITableView *)tableView
|
|
cellForRowAtIndexPath:(NSIndexPath *)indexPath {
|
|
FUIAuthTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellReuseIdentifier];
|
|
if (!cell) {
|
|
UINib *cellNib = [UINib nibWithNibName:NSStringFromClass([FUIAuthTableViewCell class])
|
|
bundle:[FUIAuthUtils authUIBundle]];
|
|
[tableView registerNib:cellNib forCellReuseIdentifier:kCellReuseIdentifier];
|
|
cell = [tableView dequeueReusableCellWithIdentifier:kCellReuseIdentifier];
|
|
}
|
|
cell.label.text = FUILocalizedString(kStr_Email);
|
|
_emailField = cell.textField;
|
|
_emailField.delegate = self;
|
|
_emailField.text = _email;
|
|
_emailField.placeholder = FUILocalizedString(kStr_EnterYourEmail);
|
|
_emailField.secureTextEntry = NO;
|
|
_emailField.returnKeyType = UIReturnKeyNext;
|
|
_emailField.keyboardType = UIKeyboardTypeEmailAddress;
|
|
_emailField.autocorrectionType = UITextAutocorrectionTypeNo;
|
|
_emailField.autocapitalizationType = UITextAutocapitalizationTypeNone;
|
|
if (@available(iOS 11.0, *)) {
|
|
_emailField.textContentType = UITextContentTypeUsername;
|
|
}
|
|
[cell.textField addTarget:self
|
|
action:@selector(textFieldDidChange)
|
|
forControlEvents:UIControlEventEditingChanged];
|
|
[self didChangeEmail:_emailField.text];
|
|
return cell;
|
|
}
|
|
|
|
#pragma mark - UITextFieldDelegate
|
|
|
|
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
|
|
if (textField == _emailField) {
|
|
[self send];
|
|
}
|
|
return NO;
|
|
}
|
|
|
|
@end
|