You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

273 lines
8.5 KiB

//
// 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)
})
}
}
}