mirror of
https://github.com/copyrighttxt/watrbx-game-engine.git
synced 2026-09-05 13:17:49 +00:00
356 lines
12 KiB
Objective-C
356 lines
12 KiB
Objective-C
//
|
|
// RBAccountManagerEmailViewController.m
|
|
// RobloxMobile
|
|
//
|
|
// Created by Kyler Mulherin on 9/26/14.
|
|
// Copyright (c) 2014 ROBLOX. All rights reserved.
|
|
//
|
|
|
|
#import "RBAccountManagerEmailViewController.h"
|
|
#import "RobloxTheme.h"
|
|
#import "RobloxInfo.h"
|
|
#import "RobloxHUD.h"
|
|
#import "UserInfo.h"
|
|
#import "LoginManager.h"
|
|
#import "RobloxData.h"
|
|
#import "UIView+Position.h"
|
|
#import "SignUpVerifier.h"
|
|
#import "RBXFunctions.h"
|
|
|
|
#define DEFAULT_VIEW_SIZE CGRectMake(0, 0, 540, 344)
|
|
@interface RBAccountManagerEmailViewController ()
|
|
@property (nonatomic, strong) NSString* hiddenEmail;
|
|
@end
|
|
|
|
//----------------CHANGE EMAIL SCREEN----------------
|
|
@implementation RBAccountManagerEmailViewController
|
|
{
|
|
UITapGestureRecognizer* _touches;
|
|
}
|
|
|
|
#pragma mark Lifecycle Functions
|
|
- (void)viewDidLoad
|
|
{
|
|
//configure the modal popup superclass
|
|
[self shouldAddCloseButton:NO];
|
|
[self shouldApplyModalTheme:NO];
|
|
[super viewDidLoad];
|
|
|
|
_touches = [[UITapGestureRecognizer alloc] init];
|
|
[_touches setNumberOfTouchesRequired:1];
|
|
[_touches setNumberOfTapsRequired:1];
|
|
[_touches setDelegate:self];
|
|
[_touches setEnabled:YES];
|
|
[self.view addGestureRecognizer:_touches];
|
|
|
|
|
|
//figure out what to ask the user for
|
|
NSString* titleText;
|
|
if ([UserInfo CurrentPlayer].userEmail != nil)
|
|
{
|
|
_hiddenEmail = [[SignupVerifier sharedInstance] obfuscateEmail:[UserInfo CurrentPlayer].userEmail];
|
|
[_txtEmail setText:_hiddenEmail];
|
|
[_btnSave setTitle:NSLocalizedString(@"SaveWord",nil) forState:UIControlStateNormal ];
|
|
titleText = NSLocalizedString(@"ChangeEmailWord", nil);
|
|
}
|
|
else
|
|
{
|
|
[_btnSave setTitle:NSLocalizedString(@"AddWord", nil) forState:UIControlStateNormal];
|
|
titleText = NSLocalizedString(@"AddEmailWord", nil);
|
|
}
|
|
|
|
[_lblTitle setText:titleText];
|
|
[_lblAlertReason setText:NSLocalizedString(@"AddEmailSuggestion", nil)];
|
|
[_lblAlertReason setFont:[RobloxTheme fontBody]];
|
|
[_lblAlertReason setTextColor:[RobloxTheme colorRed3]];
|
|
|
|
if (![RobloxInfo thisDeviceIsATablet])
|
|
{
|
|
[_whiteView.layer setShadowColor:[UIColor blackColor].CGColor];
|
|
[_whiteView.layer setShadowOpacity:0.4];
|
|
[_whiteView.layer setShadowRadius:2.0];
|
|
[_whiteView.layer setShadowOffset:CGSizeMake(0.0, 0.5)];
|
|
//[_lblTitle setText:titleText];
|
|
}
|
|
//else
|
|
//{
|
|
// self.navigationItem.title = titleText;
|
|
//}
|
|
|
|
[_btnCancel setTitle:NSLocalizedString(@"CancelWord",nil) forState:UIControlStateNormal ];
|
|
[RobloxTheme applyToModalCancelButton:_btnCancel];
|
|
[RobloxTheme applyToModalSubmitButton:_btnSave];
|
|
|
|
__weak RBAccountManagerEmailViewController* weakSelf = self;
|
|
|
|
|
|
|
|
//[_txtEmail setText:[UserInfo CurrentPlayer].userEmail ? [UserInfo CurrentPlayer].userEmail : nil];
|
|
[_txtEmail setTitle:[UserInfo CurrentPlayer].userOver13 ? NSLocalizedString(@"EmailWord", nil) : NSLocalizedString(@"EmailUnder13Word", nil)];
|
|
[_txtEmail setHint:NSLocalizedString(@"ChangeEmailExample", nil)];
|
|
[_txtEmail setKeyboardType:UIKeyboardTypeEmailAddress];
|
|
[_txtEmail setNextResponder:_txtPassword];
|
|
[_txtEmail setValidationBlock:^{
|
|
if ([weakSelf matchesOriginalEmail:weakSelf.txtEmail.text])
|
|
{
|
|
[weakSelf.txtEmail markAsInvalid];
|
|
[weakSelf.txtEmail showError:NSLocalizedString(@"ErrorSameEmail", nil)];
|
|
return;
|
|
}
|
|
|
|
[[SignupVerifier sharedInstance] checkIfValidEmail:weakSelf.txtEmail.text completion:^(BOOL success, NSString *message)
|
|
{
|
|
if (success)
|
|
[weakSelf.txtEmail markAsValid];
|
|
else
|
|
{
|
|
[weakSelf.txtEmail markAsInvalid];
|
|
[weakSelf.txtEmail showError:message];
|
|
}
|
|
}];
|
|
}];
|
|
|
|
[_txtPassword setTitle:NSLocalizedString(@"PasswordCurrentWord", nil)];
|
|
[_txtPassword setHint:NSLocalizedString(@"PasswordCurrentPhrase", nil)];
|
|
[_txtPassword setProtectedTextEntry:YES];
|
|
[_txtPassword setValidationBlock:^{
|
|
if (weakSelf.txtPassword.text && weakSelf.txtPassword.text.length > 0)
|
|
[weakSelf.txtPassword markAsValid];
|
|
else
|
|
[weakSelf.txtPassword markAsNormal];
|
|
}];
|
|
|
|
|
|
}
|
|
-(void) viewWillLayoutSubviews
|
|
{
|
|
[super viewWillLayoutSubviews];
|
|
|
|
|
|
if ([UserInfo CurrentPlayer].userEmail == nil)
|
|
{
|
|
CGSize textSize = [_lblAlertReason.text sizeWithAttributes:@{NSFontAttributeName:_lblAlertReason.font}];
|
|
int numRows = ceilf(textSize.width / _lblAlertReason.width);
|
|
|
|
_imgAlert.hidden = NO;
|
|
_lblAlertReason.hidden = NO;
|
|
[_lblAlertReason setY:_lblTitle.bottom];
|
|
[_lblAlertReason setHeight:MAX(20.0, MIN(textSize.height * numRows, 60.0))]; //clamp the height
|
|
[_lblAlertReason setNumberOfLines:numRows];
|
|
[_lblAlertReason sizeToFit];
|
|
[_imgAlert setY:_lblAlertReason.center.y - (_imgAlert.height * 0.5) ];
|
|
|
|
int contentHeight = _lblTitle.height + _lblAlertReason.height + _txtPassword.height + _txtPassword.height + _btnCancel.height;
|
|
int margin = (([RobloxInfo thisDeviceIsATablet] ? self.view.height : _whiteView.height) - contentHeight) / 5 ;
|
|
|
|
//move the other text fields down to compensate
|
|
[_txtEmail setY:_lblAlertReason.bottom + margin];
|
|
[_txtPassword setY:_txtEmail.bottom + margin];
|
|
|
|
if ([RobloxInfo thisDeviceIsATablet])
|
|
{
|
|
float lowest = _txtPassword.bottom + margin;
|
|
[_btnCancel setY:lowest];
|
|
[_btnSave setY:lowest];
|
|
}
|
|
}
|
|
else
|
|
{
|
|
_imgAlert.hidden = YES;
|
|
_lblAlertReason.hidden = YES;
|
|
|
|
int contentHeight = _lblTitle.height + _txtPassword.height + _txtPassword.height + _btnCancel.height;
|
|
int margin = (([RobloxInfo thisDeviceIsATablet] ? self.view.height : _whiteView.height) - contentHeight) / 4 ;
|
|
|
|
//move the other text fields down to compensate
|
|
[_txtEmail setY:_lblTitle.bottom + (margin * 0.5)];
|
|
[_txtPassword setY:_txtEmail.bottom + margin];
|
|
|
|
if ([RobloxInfo thisDeviceIsATablet])
|
|
{
|
|
float lowest = self.view.height - (_btnCancel.height + 10);
|
|
[_btnCancel setY:lowest];
|
|
[_btnSave setY:lowest];
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
|
|
#pragma mark Helper Functions
|
|
|
|
-(void) disableUI
|
|
{
|
|
[_btnCancel setEnabled:NO];
|
|
[_btnSave setEnabled:NO];
|
|
[RobloxHUD showSpinnerWithLabel:NSLocalizedString(@"ChangeEmailVerb", nil) dimBackground:YES];
|
|
}
|
|
-(void) enableUI
|
|
{
|
|
[_btnCancel setEnabled:YES];
|
|
[_btnSave setEnabled:YES];
|
|
[RobloxHUD hideSpinner:YES];
|
|
|
|
}
|
|
-(bool) matchesOriginalEmail:(NSString*)email
|
|
{
|
|
if (![UserInfo CurrentPlayer].userEmail)
|
|
return NO;
|
|
|
|
bool matchesHidden = [email isEqualToString:_hiddenEmail];
|
|
bool matchesExisting = [email isEqualToString:[UserInfo CurrentPlayer].userEmail];
|
|
return (matchesHidden || matchesExisting);
|
|
}
|
|
|
|
|
|
#pragma mark UI Actions
|
|
- (void)returnToPrevious:(id)sender { NSLog(@"Returning to previous"); [self.navigationController popViewControllerAnimated:YES]; }
|
|
- (IBAction)saveEmailChange:(id)sender
|
|
{
|
|
//[_txtEmail resignFirstResponder];
|
|
//[_txtPassword resignFirstResponder];
|
|
[RBXFunctions dispatchOnMainThread:^{ [self disableUI]; }];
|
|
|
|
[RBXFunctions dispatchAfter:1.0 onMainThread:^
|
|
{
|
|
////////////////////////////////////////////////////////////////////////////////////////////////
|
|
///CHECKS ROUND 1 - check if any required fields are missing
|
|
|
|
//check if the required field is missing
|
|
bool hasEmail = _txtEmail.text && _txtEmail.text.length > 0;
|
|
bool hasPassword = _txtPassword.text && _txtPassword.text.length > 0;
|
|
bool invalidEmail = NO;
|
|
|
|
if (!hasEmail)
|
|
{
|
|
//[RobloxHUD showMessage:NSLocalizedString(@"FieldsIncomplete", nil)];
|
|
[_txtEmail showError:NSLocalizedString(@"MissingEmailWord", nil)];
|
|
[_txtEmail markAsInvalid];
|
|
|
|
[_txtEmail becomeFirstResponder];
|
|
}
|
|
else
|
|
{
|
|
////////////////////////////////////////////////////////////////////////////////////////////////
|
|
///CHECKS ROUND 1.5 - check that the email is valid
|
|
if ([self matchesOriginalEmail:_txtEmail.text])
|
|
{
|
|
[_txtEmail markAsInvalid];
|
|
[_txtEmail showError:NSLocalizedString(@"ErrorSameEmail", nil)];
|
|
|
|
[_txtEmail becomeFirstResponder];
|
|
}
|
|
}
|
|
|
|
if (!hasPassword)
|
|
{
|
|
//[RobloxHUD showMessage:NSLocalizedString(@"FieldsIncomplete", nil)];
|
|
[_txtPassword showError:NSLocalizedString(@"PasswordCurrentPhrase", nil)];
|
|
[_txtPassword markAsInvalid];
|
|
|
|
//goto the missing field
|
|
if (![_txtEmail isFirstResponder])
|
|
[_txtPassword becomeFirstResponder];
|
|
}
|
|
|
|
|
|
//do not proceed until checks 1 and 1.5 succeed
|
|
if (!hasEmail || !hasPassword || invalidEmail)
|
|
{
|
|
[self enableUI];
|
|
return;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////
|
|
///CHECKS ROUND2 - validation checks
|
|
if (!_txtEmail.isValidated)
|
|
{
|
|
[_txtEmail becomeFirstResponder];
|
|
[self enableUI];
|
|
return;
|
|
}
|
|
|
|
|
|
|
|
//display the loading spinner
|
|
//[RobloxHUD showSpinnerWithLabel:NSLocalizedString(@"ChangeEmailVerb", nil) dimBackground:YES];
|
|
|
|
//send the request and alert the player with the response
|
|
[RobloxData changeUserEmail:_txtEmail.text
|
|
withPassword:_txtPassword.text
|
|
andCompletion:^(BOOL success, NSString *message)
|
|
{
|
|
NSString* title = NSLocalizedString(@"ErrorWord", nil);
|
|
if (success)
|
|
{
|
|
//clear the UI
|
|
[_txtPassword setText:@""];
|
|
title = NSLocalizedString(@"SuccessWord", nil);
|
|
|
|
[UserInfo CurrentPlayer].userEmail = _txtEmail.text;
|
|
[[UserInfo CurrentPlayer] UpdateAccountInfo];
|
|
|
|
[RBXFunctions dispatchOnMainThread:^{
|
|
_hiddenEmail = [[SignupVerifier sharedInstance] obfuscateEmail:_txtEmail.text];
|
|
[_txtEmail setText:_hiddenEmail];
|
|
}];
|
|
|
|
//hide the warning and resize the view
|
|
[UIView animateWithDuration:1.0
|
|
animations:^
|
|
{
|
|
_imgAlert.alpha = 0.0;
|
|
_lblAlertReason.alpha = 0.0;
|
|
}
|
|
completion:^(BOOL finished)
|
|
{
|
|
[RBXFunctions dispatchOnMainThread:^{
|
|
[_lblTitle setText:NSLocalizedString(@"ChangeEmailWord", nil)];
|
|
[self viewWillLayoutSubviews];
|
|
}];
|
|
}];
|
|
}
|
|
else
|
|
{
|
|
[RBXFunctions dispatchOnMainThread:^{
|
|
[_txtEmail markAsInvalid];
|
|
[_txtEmail showError:message];
|
|
[_txtEmail becomeFirstResponder];
|
|
}];
|
|
}
|
|
|
|
//tell the user what's going on
|
|
//[RobloxHUD hideSpinner:YES];
|
|
[self enableUI];
|
|
[RobloxHUD prompt:message withTitle:title];
|
|
}];
|
|
}];
|
|
}
|
|
- (IBAction)closeController:(id)sender {
|
|
//[[RBXEventReporter sharedInstance] reportButtonClick:RBXAButtonClose withContext:RBXAContextLogin];
|
|
[self.navigationController popViewControllerAnimated:YES];
|
|
}
|
|
|
|
- (void) resignAllResponders
|
|
{
|
|
[self.view endEditing:YES];
|
|
//[_txtEmail resignFirstResponder];
|
|
//[_txtPassword resignFirstResponder];
|
|
}
|
|
|
|
//Delegate functions
|
|
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
|
|
{
|
|
//NSLog(@"GestureRecognizer : %@", touch);
|
|
UIView* touchedView = touch.view;
|
|
if (touchedView == self.view || touchedView == _whiteView)
|
|
{
|
|
[self resignAllResponders];
|
|
return YES;
|
|
}
|
|
return NO;
|
|
}
|
|
|
|
|
|
@end
|