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.

322 lines
9.5 KiB

6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
  1. //
  2. // RegisterViewController.swift
  3. // GMERemittance
  4. //
  5. // Created by gme_2 on 10/09/2018.
  6. //Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
  7. //
  8. import UIKit
  9. import Localize_Swift
  10. class RegisterViewController: UIViewController {
  11. struct StringConstants {
  12. let userIdTitle = "userid_title_text".localized()
  13. let useridPlaceholder = "userid_placeholder_text".localized()
  14. let useridError = "userid_error_text".localized()
  15. let passwordTitle = "password_text".localized()
  16. let passwordPlaceholder = "password_policy_error".localized()
  17. let passwordError = "password_policy_error".localized()
  18. let confirmPasswordTitle = "confirm_password_text".localized()
  19. let confirmPasswordPlaceholder = "confirm_password_text".localized()
  20. let dobTitlePlaceholder = "dob_text".localized()
  21. let alreadyHaveAccountText = "already_have_account_text".localized()
  22. let loginText = "login_text".localized()
  23. let registerText = "register_text".localized()
  24. let registerHeader = "register_title_text".localized()
  25. let registerSubtitle = "register_subtitle_text".localized()
  26. let mobileNumber = "mobile_number_text".localized()
  27. let mobilePlaceholder = "010xxxxxxxx"//"mobile_number_placeholder_text".localized()
  28. let nativeCountry = "native_country_text".localized()
  29. let nativeCountryPlaceholder = "native_country_placeholder_text".localized()
  30. let nativeCountryError = "kyc_native_country_error".localized()
  31. let mobileNumberError = "kyc_mobile_invalid_number_error".localized()
  32. }
  33. // MARK: IBOutlets
  34. @IBOutlet weak var idTextField: ValidationTextField!
  35. @IBOutlet weak var passwordTextField: ValidationTextField!
  36. @IBOutlet weak var nativeCountryTextField: ValidationTextField!
  37. @IBOutlet weak var mobileTextField: ValidationTextField!
  38. // header labels
  39. @IBOutlet weak var headerLabel: UILabel!
  40. @IBOutlet weak var alreadyHaveAccountLabel: UILabel!
  41. // buttons
  42. @IBOutlet weak var loginButton: UIButton!
  43. @IBOutlet weak var registerButton: UIButton!
  44. // MARK: Properties
  45. var presenter: RegisterModuleInterface?
  46. private var encryptedPassword: String = ""
  47. private lazy var countries = StaticModels().nativeCountries
  48. private var validDic = [
  49. "id": false,
  50. "password": false,
  51. "country": false,
  52. "mobile": false
  53. ]
  54. private var selectedNativeCountry: NativeCountryModel? {
  55. didSet {
  56. nativeCountryTextField.text = selectedNativeCountry?.text
  57. nativeCountryTextField.sendActions(for: .editingChanged)
  58. }
  59. }
  60. private var isValid = false {
  61. didSet {
  62. registerButton.isEnabled = isValid
  63. registerButton.backgroundColor = isValid ? .themeRed : .lightGray
  64. }
  65. }
  66. private var isNotDuplicate = true {
  67. didSet {
  68. idTextField.sendActions(for: .editingChanged)
  69. }
  70. }
  71. // MARK: VC's Life cycle
  72. override func viewDidLoad() {
  73. super.viewDidLoad()
  74. self.setup()
  75. idTextField.delegate = self
  76. }
  77. override func viewWillAppear(_ animated: Bool) {
  78. super.viewWillAppear(animated)
  79. self.setupPicturedNavBar()
  80. }
  81. override func viewWillDisappear(_ animated: Bool) {
  82. super.viewWillDisappear(animated)
  83. self.navigationItem.title = ""
  84. }
  85. // MARK: IBActions
  86. @IBAction func login(_ sender: UIButton) {
  87. self.presenter?.login()
  88. }
  89. @IBAction func register(_ sender: UIButton) {
  90. let model = RegisterRequestModel()
  91. model.username = idTextField.text
  92. model.encryptedPassword = encryptedPassword
  93. model.nativeCountry = selectedNativeCountry?.id
  94. model.mobileNumber = mobileTextField.text
  95. self.presenter?.register(model: model)
  96. }
  97. // MARK: Other Functions
  98. private func setup() {
  99. // all setup should be done here
  100. setupPicturedNavBar()
  101. configureLanguage()
  102. passwordTextField.delegate = self
  103. nativeCountryTextField.delegate = self
  104. setCustomTextFields()
  105. removeNonASCII(
  106. textFields: [
  107. idTextField,
  108. passwordTextField,
  109. nativeCountryTextField,
  110. mobileTextField
  111. ]
  112. )
  113. registerButton.layer.cornerRadius = 5
  114. }
  115. private func setCustomTextFields() {
  116. passwordTextField.inputView = UIView()
  117. passwordTextField.keyboardToolbar.isHidden = true
  118. nativeCountryTextField.inputView = UIView()
  119. nativeCountryTextField.keyboardToolbar.isHidden = true
  120. }
  121. private func configureLanguage() {
  122. headerLabel.text = StringConstants().registerHeader
  123. alreadyHaveAccountLabel.text = StringConstants().alreadyHaveAccountText
  124. idTextField.titleText = StringConstants().userIdTitle
  125. idTextField.placeholder = StringConstants().useridPlaceholder
  126. idTextField.errorMessage = StringConstants().useridError
  127. idTextField.validCondition = {3 < $0.count && $0.count < 51 && self.isNotDuplicate}
  128. passwordTextField.titleText = StringConstants().passwordTitle
  129. passwordTextField.placeholder = StringConstants().passwordPlaceholder
  130. passwordTextField.errorMessage = StringConstants().passwordError
  131. passwordTextField.validCondition = { $0.count > 5 }
  132. nativeCountryTextField.titleText = StringConstants().nativeCountry
  133. nativeCountryTextField.placeholder = StringConstants().nativeCountryPlaceholder
  134. nativeCountryTextField.errorMessage = StringConstants().nativeCountryError
  135. nativeCountryTextField.validCondition = { !$0.isEmpty }
  136. mobileTextField.titleText = StringConstants().mobileNumber
  137. mobileTextField.placeholder = StringConstants().mobilePlaceholder
  138. mobileTextField.errorMessage = StringConstants().mobileNumberError
  139. mobileTextField.validCondition = { $0.count > 9 && $0.count < 12}
  140. loginButton.setTitle(StringConstants().loginText, for: .normal)
  141. registerButton.setTitle(StringConstants().registerText, for: .normal)
  142. }
  143. private func showCountryPickerview() {
  144. TablePresenterWireframe().openWith(
  145. tag: 0,
  146. delegate: self,
  147. model: countries,
  148. source: self
  149. )
  150. }
  151. private func removeNonASCII(textFields: [UITextField]) {
  152. textFields.forEach {
  153. $0.addTarget(self, action: #selector(editingChanged(_:)), for: .editingChanged)
  154. }
  155. }
  156. @objc private func editingChanged(_ textField: UITextField) {
  157. guard let tf = textField as? ValidationTextField else {return}
  158. switch tf {
  159. case idTextField:
  160. textField.removeNonASCII()
  161. idTextField.filterForUserIDFormat()
  162. idTextField.errorMessage = StringConstants().useridError
  163. validDic["id"] = tf.isValid
  164. case passwordTextField:
  165. validDic["password"] = tf.isValid
  166. case nativeCountryTextField:
  167. textField.removeNonASCII()
  168. validDic["country"] = tf.isValid
  169. case mobileTextField:
  170. textField.removeNonASCII()
  171. validDic["mobile"] = tf.isValid
  172. default:
  173. break
  174. }
  175. isValid = validDic.allSatisfy { $0.value }
  176. }
  177. }
  178. // MARK: RegisterViewInterface
  179. extension RegisterViewController: RegisterViewInterface {
  180. func showLoading() {
  181. self.showProgressHud()
  182. }
  183. func hideLoading() {
  184. self.hideProgressHud()
  185. }
  186. func show(error: String) {
  187. self.alert(type: .error, message: error)
  188. }
  189. func show(message: String) {
  190. self.alertWithOk(
  191. type: .success,
  192. message: message,
  193. title: "Success",
  194. okTitle: "Ok"
  195. ) {
  196. GMEDB.shared.user.set(self.selectedNativeCountry?.code, .countryCode)
  197. GMEDB.shared.user.set(self.mobileTextField.text, .mobileNumber)
  198. guard let id = self.idTextField.text else {
  199. return
  200. }
  201. GMEDB.shared.user.set(id, .userId)
  202. KeyChain.shared.save(data: id, key: .temporaryID)
  203. KeyChain.shared.save(data: self.encryptedPassword, key: .temporaryPW)
  204. self.presenter?.showKyc()
  205. }
  206. }
  207. func isNotDuplicate(_ bool: Bool, _ message: String?) {
  208. isNotDuplicate = bool
  209. idTextField.errorMessage = bool ? StringConstants().useridError : message ?? "duplicated id"
  210. }
  211. }
  212. // MARK: - UITextFieldDelegate
  213. extension RegisterViewController: UITextFieldDelegate {
  214. func textFieldDidBeginEditing(_ textField: UITextField) {
  215. switch textField {
  216. case idTextField:
  217. isNotDuplicate = true
  218. case passwordTextField:
  219. let secureKeypad = SecureKeypad(target: self)
  220. secureKeypad.delegate = self
  221. secureKeypad.present(animated: true)
  222. case nativeCountryTextField:
  223. showCountryPickerview()
  224. default: ()
  225. }
  226. }
  227. func textFieldDidEndEditing(_ textField: UITextField) {
  228. if textField == idTextField {
  229. let text = textField.text ?? ""
  230. if text.count > 3 && text.count < 51 {
  231. presenter?.isDuplicate(userName: text)
  232. }
  233. }
  234. }
  235. }
  236. // MARK: - SecureKeypadDelegate
  237. extension RegisterViewController: SecureKeypadDelegate {
  238. func didComplete(_ encryptedString: String, garbagePassword: String, length: Int) {
  239. encryptedPassword = encryptedString
  240. passwordTextField.text = garbagePassword
  241. passwordTextField.sendActions(for: .editingChanged)
  242. }
  243. }
  244. // MARK: - TablePresenterDelegate
  245. extension RegisterViewController: TablePresenterDelegate {
  246. func tablePresenterView(_ viewController: TablePresenterViewController) -> TablePresenterConfiguration {
  247. return TablePresenterConfiguration(
  248. presenterTitle: "select_country_text".localized(),
  249. closeButtonTitle: "cancel_text".localized(),
  250. notFoundTitle: "no_result_found_text".localized(),
  251. searchBarPlaceHolder: "search_country_text".localized()
  252. )
  253. }
  254. func tablePresenterView(
  255. _ viewController: TablePresenterViewController,
  256. didSelectModel model: TablePresenterProtocol?
  257. ) {
  258. selectedNativeCountry = (model as? NativeCountryModel) ?? selectedNativeCountry
  259. }
  260. }