// // 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 #import #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 () /** @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