// // ProfileChangePasswordViewController.swift // GMERemittance // // Created by Fm-user on 1/9/18. // Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved. // import UIKit class ProfileChangePasswordViewController: UIViewController { private var isScrolled: Bool = false @IBOutlet weak var textFieldCurrentPassword: UITextField! @IBOutlet weak var textFieldNewPassword: UITextField! @IBOutlet weak var textFieldConfirmPassword: UITextField! @IBOutlet weak var topLabel: UILabel! @IBOutlet weak var contentView: UIView! private var changepasswordviewmodel = ChangePasswordViewModel() private var activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView() @objc func appMovedToForeground() { resignAllResponders() if isScrolled { isScrolled = !isScrolled } } override func viewDidLoad() { super.viewDidLoad() NotificationCenter.default.addObserver(self, selector: #selector(appMovedToForeground), name: Notification.Name.UIApplicationWillEnterForeground, object: nil) registerTapListener() setUpNavBar(id: 201,title: "Profile") setUpAnotherLoginListener(genericviewmodel: changepasswordviewmodel) textFieldCurrentPassword.delegate = self textFieldNewPassword.delegate = self textFieldConfirmPassword.delegate = self changepasswordviewmodel.passwordConnectionTimeOut.value = nil /** connection timeout */ changepasswordviewmodel.passwordConnectionTimeOut.bind { [unowned self] in guard $0 != nil else { return } self.enableUserInteractions() self.dismissActivityIndicator(activityIndicator: self.activityIndicator) self.popUpMessage(value: 20) } changepasswordviewmodel.internetConnection.value = nil /** Internet check */ changepasswordviewmodel.internetConnection.bind { [unowned self] in guard $0 != nil else { return } self.enableUserInteractions() self.dismissActivityIndicator(activityIndicator: self.activityIndicator) self.popUpMessage(value: 15) } /** Update request for change password */ changepasswordviewmodel.passwordChanged.bind { [unowned self] in guard $0 != nil else { return } self.dismissActivityIndicator(activityIndicator: self.activityIndicator) self.enableUserInteractions() guard $0! else { self.popUpMessageError(value: 10, message: self.changepasswordviewmodel.getErrorMessage()) return } let alert = UIAlertController(title: "Password changed", message: "Successfully changed", preferredStyle: UIAlertControllerStyle.alert) alert.addAction(UIAlertAction(title: "Ok", style: .default, handler: {Void in self.navigationController?.popViewController(animated: true)})) self.present(alert, animated: true, completion: nil) } } @IBAction func savePasswordChanges(_ sender: Any) { resignAllResponders() switch changepasswordviewmodel.validateFields() { case .Valid: showActivityIndicator(activityIndicator: activityIndicator) disableUserInteractions() changepasswordviewmodel.requestPasswordChanges() return case .InValid(let error): self.popUpMessageError(value: 11, message: error) } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } func resignAllResponders() { textFieldCurrentPassword.resignFirstResponder() textFieldNewPassword.resignFirstResponder() textFieldConfirmPassword.resignFirstResponder() } func popOutCurrentViewController() { dismiss(animated: true, completion: nil) navigationController?.popViewController(animated: true) } } extension ProfileChangePasswordViewController: UITextFieldDelegate { func textFieldDidBeginEditing(_ textField: UITextField) { checkScroll() } func textFieldDidEndEditing(_ textField: UITextField) { checkScroll() } func textFieldShouldReturn(_ textField: UITextField) -> Bool { switch textField { case textFieldCurrentPassword: textFieldNewPassword.becomeFirstResponder() return true case textFieldNewPassword: textFieldConfirmPassword.becomeFirstResponder() return true case textFieldConfirmPassword: textFieldConfirmPassword.resignFirstResponder() return true default: return false } } func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { let inputCharacters = (textField.text! as NSString).replacingCharacters(in: range, with: string) switch textField { case textFieldCurrentPassword: changepasswordviewmodel.updateOldPassword(inputString: inputCharacters) return true case textFieldNewPassword: changepasswordviewmodel.updateNewPassword(inputString: inputCharacters) return true case textFieldConfirmPassword: changepasswordviewmodel.updateConfirmPassword(inputString: inputCharacters) return true default: return false } } } extension ProfileChangePasswordViewController: ScrollableProtocol { var offset: CGFloat { get { return topLabel.frame.origin.y + topLabel.frame.height } } var viewScrolled: Bool { get { return isScrolled } } func checkScroll() { if !viewScrolled { performScroll(direction: 0) isScrolled = !isScrolled } else { performScroll(direction: 1) isScrolled = !isScrolled } } func registerTapListener() { let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(clearKeyboard)) view.addGestureRecognizer(tap) } @objc func clearKeyboard() { resignAllResponders() if viewScrolled { performScroll(direction: 1) isScrolled = !isScrolled } } func performScroll(direction: Int) { if direction == 0 { UIView.animate(withDuration: 0.3, animations: { self.view.frame = self.view.frame.offsetBy(dx: 0, dy: self.offset * -1) }) } else if direction == 1 { UIView.animate(withDuration: 0.3, animations: { self.view.frame = self.view.frame.offsetBy(dx: 0, dy: self.offset) }) } } }