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.

279 lines
8.8 KiB

6 years ago
6 years ago
  1. //
  2. // LoginViewController.swift
  3. // GMERemittance
  4. //
  5. // Created by Sujal on 12/12/17.
  6. // Copyright © 2017 Gobal Money Express Co. Ltd. All rights reserved.
  7. //
  8. import Foundation
  9. import UIKit
  10. class LoginViewController: UIViewController {
  11. @IBOutlet weak var viewContent: UIView!
  12. private var isScrolled: Bool = false
  13. private var activeTextField: UITextField?
  14. private var redirectMessage: String = "nil"
  15. var noConnectionTimeOutDialog: Bool?
  16. private var activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView()
  17. private var loginviewmodel = LoginViewModel()
  18. @IBOutlet weak var textFieldUsername: UITextField!
  19. @IBOutlet weak var textFieldPassword: UITextField!
  20. @IBAction func forgetPasswordAction(_ sender: Any) {
  21. self.performSegue(withIdentifier: "forgetPasswordIdentifier", sender: nil)
  22. clearKeyboard()
  23. activeTextField?.resignFirstResponder()
  24. if viewScrolled {
  25. performScroll(direction: 1)
  26. isScrolled = !isScrolled
  27. }
  28. }
  29. @IBAction func logIn(_ sender: Any) {
  30. activeTextField?.resignFirstResponder()
  31. if viewScrolled {
  32. performScroll(direction: 1)
  33. isScrolled = !isScrolled
  34. }
  35. disableUserInteractions()
  36. showActivityIndicator(activityIndicator: activityIndicator)
  37. switch loginviewmodel.checkParams(username: textFieldUsername.text!, password: textFieldPassword.text!) {
  38. case .Valid:
  39. loginviewmodel.setCredentials(userId: textFieldUsername.text!, password: textFieldPassword.text!)
  40. loginviewmodel.logIn()
  41. case .InValid(let error):
  42. dismissActivityIndicator(activityIndicator: activityIndicator)
  43. self.popUpMessageError(value: 11, message: error)
  44. enableUserInteractions()
  45. }
  46. }
  47. @objc func appMovedToForeground() {
  48. activeTextField?.resignFirstResponder()
  49. if isScrolled {
  50. isScrolled = !isScrolled
  51. }
  52. }
  53. override func viewDidLoad() {
  54. super.viewDidLoad()
  55. setUpNavBar(id: 100, title: "")
  56. NotificationCenter.default.addObserver(self, selector: #selector(appMovedToForeground), name: Notification.Name.UIApplicationWillEnterForeground, object: nil)
  57. registerTapListener()
  58. textFieldUsername.delegate = self
  59. textFieldPassword.delegate = self
  60. noConnectionTimeOutDialog = false
  61. textFieldUsername.layer.borderColor = UIColor(red:0.91, green:0.93, blue:0.95, alpha:1.0).cgColor
  62. textFieldUsername.layer.borderWidth = 1.0
  63. textFieldUsername.layer.cornerRadius = 5
  64. textFieldPassword.layer.borderColor = UIColor(red:0.91, green:0.93, blue:0.95, alpha:1.0).cgColor
  65. textFieldPassword.layer.borderWidth = 1.0
  66. textFieldPassword.layer.cornerRadius = 5
  67. textFieldUsername.text = UserDefaults.standard.object(forKey: "com.gmeremit.username") as? String
  68. loginviewmodel.loggedInConnectionTimeOut.value = nil
  69. /**
  70. connection timeout
  71. */
  72. loginviewmodel.loggedInConnectionTimeOut.bind { [unowned self] in
  73. guard $0 != nil else {
  74. return
  75. }
  76. if !self.noConnectionTimeOutDialog! {
  77. self.enableUserInteractions()
  78. self.dismissActivityIndicator(activityIndicator: self.activityIndicator)
  79. self.popUpMessage(value: 20)
  80. }
  81. self.noConnectionTimeOutDialog = true
  82. print("12345")
  83. }
  84. loginviewmodel.internetConnection.value = nil
  85. /**
  86. internet check
  87. */
  88. loginviewmodel.internetConnection.bind { [unowned self] in
  89. guard $0 != nil else {
  90. return
  91. }
  92. self.enableUserInteractions()
  93. self.dismissActivityIndicator(activityIndicator: self.activityIndicator)
  94. self.popUpMessage(value: 15)
  95. }
  96. /**
  97. Update user login Info
  98. */
  99. loginviewmodel.loggedin.bind { [unowned self] in
  100. guard $0 != nil else {
  101. return
  102. }
  103. self.dismissActivityIndicator(activityIndicator: self.activityIndicator)
  104. self.enableUserInteractions()
  105. guard $0! else {
  106. if self.loginviewmodel.redirectToCodeFillUp() {
  107. if let userId = UserDefaults.standard.object(forKey: "com.gmeremit.username") as? String{
  108. 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"
  109. }else{
  110. 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"
  111. }
  112. self.performSegue(withIdentifier: "redirectToOTP", sender: nil)
  113. } else {
  114. self.popUpMessageError(value: 10, message: self.loginviewmodel.getErrorMessage())
  115. }
  116. return
  117. }
  118. guard self.isVerified() else {
  119. guard self.isKYCSubmitted() else {
  120. self.performSegue(withIdentifier: "fillKYCPersonalInfo", sender: nil)
  121. return
  122. }
  123. self.redirectToHomeViewController()
  124. return
  125. }
  126. self.redirectToHomeViewController()
  127. }
  128. }
  129. func redirectToHomeViewController() {
  130. // self.performSegue(withIdentifier: "homeFromLogin", sender: nil)
  131. let wireFrame = MainWireframe.shared
  132. let tabBarViewController = wireFrame?.getMainView()
  133. if let delegate = UIApplication.shared.delegate as? AppDelegate {
  134. delegate.window?.rootViewController = tabBarViewController
  135. delegate.window?.makeKeyAndVisible()
  136. }
  137. }
  138. override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
  139. if segue.identifier == "redirectToOTP" {
  140. let fillcodeViewController = segue.destination as! FillSignUpCodeController
  141. fillcodeViewController.deviceORpassword = 1
  142. fillcodeViewController.redirectToOTP = self.redirectMessage
  143. }
  144. }
  145. }
  146. extension LoginViewController: UITextFieldDelegate {
  147. func textFieldDidBeginEditing(_ textField: UITextField) {
  148. activeTextField = textField
  149. checkScroll()
  150. }
  151. func textFieldDidEndEditing(_ textField: UITextField) {
  152. checkScroll()
  153. }
  154. func textFieldShouldReturn(_ textField: UITextField) -> Bool {
  155. if textField == textFieldUsername {
  156. textFieldPassword.becomeFirstResponder()
  157. } else if textField == textFieldPassword {
  158. textFieldPassword.resignFirstResponder()
  159. }
  160. return true
  161. }
  162. }
  163. extension LoginViewController: ScrollableProtocol {
  164. /**
  165. - Returns offset value to animate
  166. */
  167. var offset: CGFloat {
  168. get {
  169. return viewContent.frame.origin.y - 40
  170. }
  171. }
  172. /**
  173. - Returns Bool value to scroll
  174. */
  175. var viewScrolled: Bool {
  176. get {
  177. return isScrolled
  178. }
  179. }
  180. /**
  181. Check if textfield is active and required scroll
  182. */
  183. func checkScroll() {
  184. if !viewScrolled {
  185. performScroll(direction: 0)
  186. isScrolled = !isScrolled
  187. } else {
  188. performScroll(direction: 1)
  189. isScrolled = !isScrolled
  190. }
  191. }
  192. /**
  193. Dissmiss keyboard when tap outside to textfield
  194. */
  195. func registerTapListener() {
  196. let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(clearKeyboard))
  197. view.addGestureRecognizer(tap)
  198. }
  199. /**
  200. Dissmiss keyboard
  201. */
  202. @objc func clearKeyboard() {
  203. activeTextField?.resignFirstResponder()
  204. if viewScrolled {
  205. performScroll(direction: 1)
  206. isScrolled = !isScrolled
  207. }
  208. }
  209. /**
  210. Animate scroll UI in case when textfield is active and also if inactive.
  211. */
  212. func performScroll(direction: Int) {
  213. if direction == 0 {
  214. UIView.animate(withDuration: 0.3, animations: {
  215. self.view.frame = self.view.frame.offsetBy(dx: 0, dy: self.offset * -1)
  216. })
  217. } else if direction == 1 {
  218. UIView.animate(withDuration: 0.3, animations: {
  219. self.view.frame = self.view.frame.offsetBy(dx: 0, dy: self.offset)
  220. })
  221. }
  222. }
  223. }