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

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. }
  132. override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
  133. if segue.identifier == "redirectToOTP" {
  134. let fillcodeViewController = segue.destination as! FillSignUpCodeController
  135. fillcodeViewController.deviceORpassword = 1
  136. fillcodeViewController.redirectToOTP = self.redirectMessage
  137. }
  138. }
  139. }
  140. extension LoginViewController: UITextFieldDelegate {
  141. func textFieldDidBeginEditing(_ textField: UITextField) {
  142. activeTextField = textField
  143. checkScroll()
  144. }
  145. func textFieldDidEndEditing(_ textField: UITextField) {
  146. checkScroll()
  147. }
  148. func textFieldShouldReturn(_ textField: UITextField) -> Bool {
  149. if textField == textFieldUsername {
  150. textFieldPassword.becomeFirstResponder()
  151. } else if textField == textFieldPassword {
  152. textFieldPassword.resignFirstResponder()
  153. }
  154. return true
  155. }
  156. }
  157. extension LoginViewController: ScrollableProtocol {
  158. /**
  159. - Returns offset value to animate
  160. */
  161. var offset: CGFloat {
  162. get {
  163. return viewContent.frame.origin.y - 40
  164. }
  165. }
  166. /**
  167. - Returns Bool value to scroll
  168. */
  169. var viewScrolled: Bool {
  170. get {
  171. return isScrolled
  172. }
  173. }
  174. /**
  175. Check if textfield is active and required scroll
  176. */
  177. func checkScroll() {
  178. if !viewScrolled {
  179. performScroll(direction: 0)
  180. isScrolled = !isScrolled
  181. } else {
  182. performScroll(direction: 1)
  183. isScrolled = !isScrolled
  184. }
  185. }
  186. /**
  187. Dissmiss keyboard when tap outside to textfield
  188. */
  189. func registerTapListener() {
  190. let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(clearKeyboard))
  191. view.addGestureRecognizer(tap)
  192. }
  193. /**
  194. Dissmiss keyboard
  195. */
  196. @objc func clearKeyboard() {
  197. activeTextField?.resignFirstResponder()
  198. if viewScrolled {
  199. performScroll(direction: 1)
  200. isScrolled = !isScrolled
  201. }
  202. }
  203. /**
  204. Animate scroll UI in case when textfield is active and also if inactive.
  205. */
  206. func performScroll(direction: Int) {
  207. if direction == 0 {
  208. UIView.animate(withDuration: 0.3, animations: {
  209. self.view.frame = self.view.frame.offsetBy(dx: 0, dy: self.offset * -1)
  210. })
  211. } else if direction == 1 {
  212. UIView.animate(withDuration: 0.3, animations: {
  213. self.view.frame = self.view.frame.offsetBy(dx: 0, dy: self.offset)
  214. })
  215. }
  216. }
  217. }