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.

216 lines
6.5 KiB

5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
  1. //
  2. // AddAccountViewController.swift
  3. // GME Remit
  4. //
  5. // Created by InKwon Devik Kim on 12/04/2019.
  6. //Copyright © 2019 Gobal Money Express Co. Ltd. All rights reserved.
  7. //
  8. import UIKit
  9. import RxSwift
  10. import RxCocoa
  11. class AddAccountViewController: UIViewController {
  12. // MARK: Properties
  13. var presenter: AddAccountModuleInterface?
  14. private var selectedLanguage: KftcLanguage?
  15. private var selectedBank: BankInformation?
  16. private let disposeBag = DisposeBag()
  17. private lazy var languagePickerView = UIPickerView()
  18. private lazy var bankPickerView = UIPickerView()
  19. private var validDic = [
  20. "bank": false,
  21. "account": false,
  22. "language": false
  23. ]
  24. private var isValid = false {
  25. didSet {
  26. verifyAccountButton.isEnabled = isValid
  27. verifyAccountButton.backgroundColor = isValid ? .themeRed : .lightGray
  28. }
  29. }
  30. private var banks: [String]? = ["--- Select Bank ---"]
  31. private var languages: [String]? = ["--- Select Language ---"]
  32. private var model: (bankList: [BankInformation]?, kftcModel: KFTCModel?) {
  33. didSet {
  34. let bankConfigure = TablePresenterConfiguration(presenterTitle: "Select Bank")
  35. bankNameTextField.useAsDropDown(with: bankConfigure, items: model.bankList)
  36. let languageConfigure = TablePresenterConfiguration(presenterTitle: "Select Bank")
  37. languageTextField.useAsDropDown(with: languageConfigure, items: model.kftcModel?.languages)
  38. }
  39. }
  40. // MARK: IBOutlets
  41. @IBOutlet private weak var bankNameTextField: ValidationTextField!
  42. @IBOutlet private weak var accountTextField: ValidationTextField!
  43. @IBOutlet private weak var languageTextField: ValidationTextField!
  44. @IBOutlet private weak var verifyAccountButton: UIButton!
  45. @IBOutlet weak var closeButton: UIBarButtonItem!
  46. @IBOutlet weak var titleInfoLabel: UILabel!
  47. // MARK: VC's Life cycle
  48. override func viewDidLoad() {
  49. super.viewDidLoad()
  50. setup()
  51. bankNameTextField.selectedItem.map {$0 as? BankInformation}.asDriverOnErrorJustComplete()
  52. .drive(onNext: {[weak self] in
  53. self?.selectedBank = $0
  54. self?.bankNameTextField.setBank(with: $0?.bankCode)
  55. }).disposed(by: disposeBag)
  56. languageTextField.selectedItem.map {$0 as? KftcLanguage}.asDriverOnErrorJustComplete()
  57. .drive(onNext: {[weak self] in
  58. self?.selectedLanguage = $0
  59. }).disposed(by: disposeBag)
  60. }
  61. override func viewWillAppear(_ animated: Bool) {
  62. super.viewWillAppear(animated)
  63. title = "add_auto_debit_account_text".localized()
  64. setupNormalNavigation()
  65. }
  66. override func viewDidAppear(_ animated: Bool) {
  67. super.viewDidAppear(animated)
  68. }
  69. override func viewWillDisappear(_ animated: Bool) {
  70. super.viewWillDisappear(animated)
  71. title = ""
  72. view.endEditing(true)
  73. }
  74. // MARK: IBActions
  75. @IBAction private func verifyAccountButtonTouch(_ sender: UIButton) {
  76. presenter?.verifyAccount(
  77. customerID: GMEDB.shared.user.string(.senderId) ?? "", // senderID
  78. bankCode: selectedBank?.bankCode ?? "",
  79. accountNumber: accountTextField.text ?? "")
  80. }
  81. @IBAction private func closeButtonTouch(_ sender: UIBarButtonItem) {
  82. dismiss(animated: true, completion: nil)
  83. }
  84. // MARK: Other Functions
  85. private func setup() {
  86. // all setup should be done here
  87. presenter?.viewIsReady()
  88. verifyAccountButton.layer.cornerRadius = 5
  89. setValidTextField()
  90. setMultilanguage()
  91. }
  92. private func setValidTextField() {
  93. bankNameTextField.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged)
  94. languageTextField.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged)
  95. accountTextField.addTarget(self, action: #selector(self.textFieldDidChange(_:)), for: .editingChanged)
  96. accountTextField.validCondition = {$0.count > 9}
  97. languageTextField.validCondition = {$0.count > 1}
  98. bankNameTextField.validCondition = {$0.count > 1}
  99. }
  100. @objc
  101. func textFieldDidChange(_ textfield: UITextField) {
  102. guard let tf = textfield as? ValidationTextField else { return }
  103. switch tf {
  104. case bankNameTextField:
  105. validDic["bank"] = tf.isValid
  106. case accountTextField:
  107. validDic["account"] = tf.isValid
  108. case languageTextField:
  109. validDic["language"] = tf.isValid
  110. default:
  111. break
  112. }
  113. isValid = validDic.allSatisfy {$0.value}
  114. }
  115. private func setMultilanguage() {
  116. closeButton.title = "penny_test_close_text".localized()
  117. titleInfoLabel.text = "to_add_account_enter_information".localized()
  118. bankNameTextField.placeholder = "select_your_bank".localized()
  119. accountTextField.placeholder = "enter_bank_ac_no".localized()
  120. languageTextField.placeholder = "select_language".localized()
  121. verifyAccountButton.setTitle("verify_account_button_text".localized(), for: .normal)
  122. }
  123. }
  124. // MARK: AddAccountViewInterface
  125. extension AddAccountViewController: AddAccountViewInterface {
  126. func setModel(model: (bankList: [BankInformation]?, kftcModel: KFTCModel?)) {
  127. self.model = model
  128. }
  129. func failureSetModel(error: Error) {
  130. alert(type: .error, message: error.localizedDescription) {[weak self] in
  131. guard let `self` = self else {return}
  132. self.dismiss(animated: true, completion: nil)
  133. }
  134. }
  135. func successVerify() {
  136. let url = "\(model.kftcModel?.url ?? "")&lang=\(selectedLanguage?.key ?? "")"
  137. var header = [String: String]()
  138. model.kftcModel?.header?.forEach({
  139. header[$0.key ?? ""] = $0.value ?? ""
  140. })
  141. header["Kftc-Bfop-BankCodeStd"] = selectedBank?.bankCode ?? ""
  142. header["Kftc-Bfop-AccountNum"] = accountTextField.text ?? ""
  143. presenter?.doGetTestURL(url: url, header: header)
  144. }
  145. func successTestURL(url: String) {
  146. presenter?.goKFTC(url: url, header: self.model.kftcModel?.header)
  147. }
  148. func failure(error: Error) {
  149. if error.localizedDescription.contains("JSON") {
  150. let url = "\(model.kftcModel?.url ?? "")&lang=\(selectedLanguage?.key ?? "")"
  151. let bankCode = KftcHeader(key: "Kftc-Bfop-BankCodeStd", value: selectedBank?.bankCode ?? "")
  152. let accountNumber = KftcHeader(key: "Kftc-Bfop-AccountNum", value: accountTextField.text ?? "")
  153. model.kftcModel?.header?.append(bankCode)
  154. model.kftcModel?.header?.append(accountNumber)
  155. presenter?.goKFTC(url: url, header: self.model.kftcModel?.header)
  156. } else {
  157. alert(type: .error, message: error.localizedDescription, okAction: nil)
  158. }
  159. }
  160. func startLoading() {
  161. showProgressHud()
  162. }
  163. func endLoading() {
  164. hideProgressHud()
  165. }
  166. }