// // ChangePinAndPasswordViewController.swift // GME Remit // // Created by Shiran on 9/17/20. // Copyright © 2020 Gobal Money Express Co. Ltd. All rights reserved. // import UIKit import Localize_Swift class ChangePinAndPasswordViewController: UIViewController { enum PasswordType { case old case new case newConfirm } enum PinType { case old case new case newConfirm } struct StringConstants { let emptyPasswordError = "password_empty_error".localized() let emptyPinError = "new_pin_error_text".localized() let confirmPasswordError = "password_confirm_empty_error".localized() let titleText = "change_pin_password_title_text".localized() let newPassword = "new_password_text".localized() let currentPin = "currentPin_text".localized() let newPin = "newPin_text".localized() let confirmNewPin = "confirmNewPin_text".localized() let currentPassword = "current_password_text".localized() let confirmPassword = "confirm_password_text".localized() let save = "save_password_text".localized() } var encryptedCurrentPassword = "" var encryptedNewPassword = "" var encryptedConfirmPassword = "" var encryptedCurrentPin = "" var encryptedNewPin = "" var encryptedConfirmPin = "" @IBOutlet weak var currentPasswordTextField: ValidationTextField! @IBOutlet weak var newPasswordTextField: ValidationTextField! @IBOutlet weak var confirmPasswordTextField: ValidationTextField! @IBOutlet weak var currentPinTextField: ValidationTextField! @IBOutlet weak var newPinTextField: ValidationTextField! @IBOutlet weak var confirmPinTextField: ValidationTextField! @IBOutlet weak var saveButton: UIButton! @IBOutlet weak var contentView: UIView! @IBOutlet weak var currentPassToggle: UIButton! @IBOutlet weak var newPassToggle: UIButton! @IBOutlet weak var confirmPassToggle: UIButton! @IBOutlet weak var currentPinToggle: UIButton! @IBOutlet weak var newPinToggle: UIButton! @IBOutlet weak var confirmPinToggle: UIButton! private var selectedPasswordType: PasswordType = .old private var selectedPinType: PinType = .old private var isValid = false { didSet { saveButton.isEnabled = true saveButton.backgroundColor = isValid ? .themeRed : .themeRed } } // MARK: Life Cycle override func viewDidLoad() { super.viewDidLoad() self.setupNormalNavigation() self.isValid = false self.newPasswordTextField.isSecureTextEntry = true self.confirmPasswordTextField.isSecureTextEntry = true self.currentPasswordTextField.isSecureTextEntry = true self.newPinTextField.isSecureTextEntry = true self.currentPinTextField.isSecureTextEntry = true self.confirmPinTextField.isSecureTextEntry = true newPasswordTextField.addTarget(self, action: #selector(editingChanged(_:)), for: .editingChanged) confirmPasswordTextField.addTarget(self, action: #selector(editingChanged(_:)), for: .editingChanged) currentPasswordTextField.addTarget(self, action: #selector(editingChanged(_:)), for: .editingChanged) newPinTextField.addTarget(self, action: #selector(editingChanged(_:)), for: .editingChanged) confirmPinTextField.addTarget(self, action: #selector(editingChanged(_:)), for: .editingChanged) currentPinTextField.addTarget(self, action: #selector(editingChanged(_:)), for: .editingChanged) currentPinTextField.validCondition = {$0.count > 5} newPinTextField.validCondition = {$0.count > 5} confirmPinTextField.validCondition = {$0.count > 5} currentPasswordTextField.validCondition = { !$0.isEmpty} newPasswordTextField.validCondition = { !$0.isEmpty && $0.validateRegex(regex: passwordRegex)} confirmPasswordTextField.validCondition = { !$0.isEmpty && $0.validateRegex(regex: passwordRegex)} configureLanguage() saveButton.layer.cornerRadius = 6 } override func viewWillAppear(_ animated: Bool) { super.viewWillDisappear(animated) self.navigationItem.title = StringConstants().titleText } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) self.navigationItem.title = "" } func configureLanguage() { self.currentPasswordTextField.placeholder = StringConstants().currentPassword currentPasswordTextField.errorMessage = "password_error_text".localized() currentPasswordTextField.titleText = StringConstants().currentPassword self.newPasswordTextField.placeholder = StringConstants().newPassword newPasswordTextField.errorMessage = "password_error_text".localized() self.newPasswordTextField.titleText = StringConstants().newPassword self.confirmPasswordTextField.placeholder = StringConstants().confirmPassword confirmPasswordTextField.errorMessage = "password_error_text".localized() self.confirmPasswordTextField.titleText = StringConstants().confirmPassword self.currentPinTextField.placeholder = StringConstants().currentPin self.currentPinTextField.titleText = StringConstants().currentPin currentPinTextField.errorMessage = "new_pin_error_text".localized() self.newPinTextField.placeholder = StringConstants().newPin self.newPinTextField.titleText = StringConstants().newPin self.newPinTextField.errorMessage = "new_pin_error_text".localized() self.confirmPinTextField.placeholder = StringConstants().confirmNewPin self.confirmPinTextField.titleText = StringConstants().confirmNewPin self.confirmPinTextField.errorMessage = "new_pin_error_text".localized() self.saveButton.setTitle(StringConstants().save, for: UIControl.State.normal) } @IBAction func currentPassButton(_ sender: UIButton) { currentPasswordTextField.isSecureTextEntry = !currentPasswordTextField.isSecureTextEntry currentPasswordTextField.isSecureTextEntry ? currentPassToggle.setImage(UIImage(named: "Show"), for: .normal) : currentPassToggle.setImage(UIImage(named: "Hide"), for: .normal) } @IBAction func newPassButton(_ sender: UIButton) { newPasswordTextField.isSecureTextEntry = !newPasswordTextField.isSecureTextEntry newPasswordTextField.isSecureTextEntry ? newPassToggle.setImage(UIImage(named: "Show"), for: .normal) : newPassToggle.setImage(UIImage(named: "Hide"), for: .normal) } @IBAction func confirmPassButton(_ sender: UIButton) { confirmPasswordTextField.isSecureTextEntry = !confirmPasswordTextField.isSecureTextEntry confirmPasswordTextField.isSecureTextEntry ? confirmPassToggle.setImage(UIImage(named: "Show"), for: .normal) : confirmPassToggle.setImage(UIImage(named: "Hide"), for: .normal) } @IBAction func currentPinButton(_ sender: UIButton) { currentPinTextField.isSecureTextEntry = !currentPinTextField.isSecureTextEntry currentPinTextField.isSecureTextEntry ? currentPinToggle.setImage(UIImage(named: "Show"), for: .normal) : currentPinToggle.setImage(UIImage(named: "Hide"), for: .normal) } @IBAction func newPinButton(_ sender: UIButton) { newPinTextField.isSecureTextEntry = !newPinTextField.isSecureTextEntry newPinTextField.isSecureTextEntry ? newPinToggle.setImage(UIImage(named: "Show"), for: .normal) : newPinToggle.setImage(UIImage(named: "Hide"), for: .normal) } @IBAction func confirmPinButton(_ sender: UIButton) { confirmPinTextField.isSecureTextEntry = !confirmPinTextField.isSecureTextEntry confirmPinTextField.isSecureTextEntry ? confirmPassToggle.setImage(UIImage(named: "Show"), for: .normal) : confirmPassToggle.setImage(UIImage(named: "Hide"), for: .normal) } @IBAction func savePasswordChanges(_ sender: Any) { let currentPassword = self.encryptedCurrentPassword let newPassword = self.encryptedNewPassword let confirmPassword = self.encryptedConfirmPassword let currentPin = self.encryptedCurrentPin let newPin = self.encryptedNewPin let confirmPin = self.encryptedConfirmPin let result = self.isValid(currentPassword: currentPassword, password: newPassword, confirmPassword: confirmPassword, currentPin: currentPin, pin: newPin, confirmPin: confirmPin) if result.isValid { let userId = Utility.getMyUserName() let param = [ "UserId": userId, "CurrentPassword": currentPassword, "NewPassword": newPassword, "ConfirmNewPassword": confirmPassword, "CurrentPin": currentPin, "NewPin": newPin, "ConfirmNewPin": confirmPin ] print("params:\(param)") self.updatePinAndPassword(param: param) } else { let message = result.error self.alertWithOk(type: .error, message: message.localizedDescription, title: "Error", okTitle: "Ok", okAction: nil) } } func updatePinAndPassword(param: [String: String]) { self.updatePinAndPassword( params: param, success: { (message) in self.alertWithOk( type: .success, message: message, title: "success_text".localized(), okTitle: "Ok") { KeyChain.shared.save(data: self.encryptedNewPassword, key: .password) self.navigationController?.popViewController(animated: true) } }, failure: { (error) in self.alertWithOk(type: .error, message: error.localizedDescription, title: "Error", okTitle: "Ok", okAction: nil) }) } } extension ChangePinAndPasswordViewController { private func isValidPasword(password: String, confirmPassword: String, pin: String, confirmPin: String) -> (isValid: Bool, error: String) { var error = "" var isValid = true if password.isEmpty { error = "\(error)\n\(StringConstants().emptyPasswordError)" isValid = false } if confirmPassword.isEmpty { error = "\(error)\n\(StringConstants().emptyPasswordError)" isValid = false } if pin.isEmpty { error = "\(error)\n\(StringConstants().emptyPasswordError)" isValid = false } if confirmPin.isEmpty { error = "\(error)\n\(StringConstants().emptyPasswordError)" isValid = false } return (isValid, error) } private func isValid( currentPassword: String, password: String, confirmPassword: String, currentPin: String, pin: String, confirmPin: String ) -> (isValid: Bool, error: Error) { var error = "" var isValid = true if currentPassword.isEmpty { error = "\(error)\n\(StringConstants().emptyPasswordError)" isValid = false } if currentPin.isEmpty { error = "\(error)\n\(StringConstants().emptyPasswordError)" isValid = false } let result = self.isValidPasword(password: password, confirmPassword: confirmPassword, pin: pin, confirmPin: confirmPin) if !result.isValid { error = "\(error) \(result.error)" isValid = false } let newError = NSError( domain: "LoginInteractor", code: 0, userInfo: [NSLocalizedDescriptionKey : error] ) return (isValid, newError) } } extension ChangePinAndPasswordViewController: UpdatePinAndPasswordService { } protocol UpdatePinAndPasswordService: ApiServiceType { func updatePinAndPassword( params: [String: String], success: @escaping (String?) -> Void, failure: @escaping (Error) -> Void ) } extension UpdatePinAndPasswordService { func updatePinAndPassword( params: [String: String], success: @escaping (String?) -> Void, failure: @escaping (Error) -> Void ) { let url = baseUrl + "/mobile/changePasswordAndTxnPin" auth.request( method: .post, url: url, params: params, needsAuthorization: true, success: { (response: SuccessMessageContainer) in if (response.errorCode ?? "") == "1" { let error = NSError( domain: "Network", code: 0, userInfo: [NSLocalizedDescriptionKey : response.message ?? ""] ) failure(error) } else { success(response.data?.message) } }, failure: { (error) in failure(error) } ) } } extension ChangePinAndPasswordViewController { @objc private func editingChanged(_ textField: UITextField) { switch textField { case currentPasswordTextField: encryptedCurrentPassword = textField.text ?? "" case newPasswordTextField: encryptedNewPassword = textField.text ?? "" case confirmPasswordTextField: encryptedConfirmPassword = textField.text ?? "" case currentPinTextField: encryptedCurrentPin = textField.text ?? "" case newPinTextField: encryptedNewPin = textField.text ?? "" case confirmPinTextField: encryptedConfirmPin = textField.text ?? "" default: break } self.isValid = (encryptedCurrentPassword != "" && encryptedNewPassword != "" && encryptedConfirmPassword != "") } }