// // LoginViewController.swift // GMERemittance // // Created by Sujal on 12/12/17. // Copyright © 2017 Gobal Money Express Co. Ltd. All rights reserved. // import Foundation import UIKit class LoginViewController: UIViewController { @IBOutlet weak var viewContent: UIView! private var isScrolled: Bool = false private var activeTextField: UITextField? private var redirectMessage: String = "nil" var noConnectionTimeOutDialog: Bool? private var activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView() private var loginviewmodel = LoginViewModel() @IBOutlet weak var textFieldUsername: UITextField! @IBOutlet weak var textFieldPassword: UITextField! @IBAction func forgetPasswordAction(_ sender: Any) { self.performSegue(withIdentifier: "forgetPasswordIdentifier", sender: nil) clearKeyboard() activeTextField?.resignFirstResponder() if viewScrolled { performScroll(direction: 1) isScrolled = !isScrolled } } @IBAction func logIn(_ sender: Any) { activeTextField?.resignFirstResponder() if viewScrolled { performScroll(direction: 1) isScrolled = !isScrolled } disableUserInteractions() showActivityIndicator(activityIndicator: activityIndicator) switch loginviewmodel.checkParams(username: textFieldUsername.text!, password: textFieldPassword.text!) { case .Valid: loginviewmodel.setCredentials(userId: textFieldUsername.text!, password: textFieldPassword.text!) loginviewmodel.logIn() case .InValid(let error): dismissActivityIndicator(activityIndicator: activityIndicator) self.popUpMessageError(value: 11, message: error) enableUserInteractions() } } @objc func appMovedToForeground() { activeTextField?.resignFirstResponder() if isScrolled { isScrolled = !isScrolled } } override func viewDidLoad() { super.viewDidLoad() setUpNavBar(id: 100, title: "") NotificationCenter.default.addObserver(self, selector: #selector(appMovedToForeground), name: Notification.Name.UIApplicationWillEnterForeground, object: nil) registerTapListener() textFieldUsername.delegate = self textFieldPassword.delegate = self noConnectionTimeOutDialog = false textFieldUsername.layer.borderColor = UIColor(red:0.91, green:0.93, blue:0.95, alpha:1.0).cgColor textFieldUsername.layer.borderWidth = 1.0 textFieldUsername.layer.cornerRadius = 5 textFieldPassword.layer.borderColor = UIColor(red:0.91, green:0.93, blue:0.95, alpha:1.0).cgColor textFieldPassword.layer.borderWidth = 1.0 textFieldPassword.layer.cornerRadius = 5 textFieldUsername.text = UserDefaults.standard.object(forKey: "com.gmeremit.username") as? String loginviewmodel.loggedInConnectionTimeOut.value = nil /** connection timeout */ loginviewmodel.loggedInConnectionTimeOut.bind { [unowned self] in guard $0 != nil else { return } if !self.noConnectionTimeOutDialog! { self.enableUserInteractions() self.dismissActivityIndicator(activityIndicator: self.activityIndicator) self.popUpMessage(value: 20) } self.noConnectionTimeOutDialog = true print("12345") } loginviewmodel.internetConnection.value = nil /** internet check */ loginviewmodel.internetConnection.bind { [unowned self] in guard $0 != nil else { return } self.enableUserInteractions() self.dismissActivityIndicator(activityIndicator: self.activityIndicator) self.popUpMessage(value: 15) } /** Update user login Info */ loginviewmodel.loggedin.bind { [unowned self] in guard $0 != nil else { return } self.dismissActivityIndicator(activityIndicator: self.activityIndicator) self.enableUserInteractions() guard $0! else { if self.loginviewmodel.redirectToCodeFillUp() { if let userId = UserDefaults.standard.object(forKey: "com.gmeremit.username") as? String{ self.redirectMessage = "\(userId) is already registered, please click Resend code and enter four digit code that is sent to \(userId) OR call our customer center number: +82 1588-6864" }else{ self.redirectMessage = "userId is already registered, please click Resend code and enter four digit code that is sent to userId OR call our customer center number: +82 1588-6864" } self.performSegue(withIdentifier: "redirectToOTP", sender: nil) } else { self.popUpMessageError(value: 10, message: self.loginviewmodel.getErrorMessage()) } return } guard self.isVerified() else { guard self.isKYCSubmitted() else { self.performSegue(withIdentifier: "fillKYCPersonalInfo", sender: nil) return } self.redirectToHomeViewController() return } self.redirectToHomeViewController() } } func redirectToHomeViewController(){ self.performSegue(withIdentifier: "homeFromLogin", sender: nil) } override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "redirectToOTP" { let fillcodeViewController = segue.destination as! FillSignUpCodeController fillcodeViewController.deviceORpassword = 1 fillcodeViewController.redirectToOTP = self.redirectMessage } } } extension LoginViewController: UITextFieldDelegate { func textFieldDidBeginEditing(_ textField: UITextField) { activeTextField = textField checkScroll() } func textFieldDidEndEditing(_ textField: UITextField) { checkScroll() } func textFieldShouldReturn(_ textField: UITextField) -> Bool { if textField == textFieldUsername { textFieldPassword.becomeFirstResponder() } else if textField == textFieldPassword { textFieldPassword.resignFirstResponder() } return true } } extension LoginViewController: ScrollableProtocol { /** - Returns offset value to animate */ var offset: CGFloat { get { return viewContent.frame.origin.y - 40 } } /** - Returns Bool value to scroll */ var viewScrolled: Bool { get { return isScrolled } } /** Check if textfield is active and required scroll */ func checkScroll() { if !viewScrolled { performScroll(direction: 0) isScrolled = !isScrolled } else { performScroll(direction: 1) isScrolled = !isScrolled } } /** Dissmiss keyboard when tap outside to textfield */ func registerTapListener() { let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(clearKeyboard)) view.addGestureRecognizer(tap) } /** Dissmiss keyboard */ @objc func clearKeyboard() { activeTextField?.resignFirstResponder() if viewScrolled { performScroll(direction: 1) isScrolled = !isScrolled } } /** Animate scroll UI in case when textfield is active and also if inactive. */ 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) }) } } }