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.

287 lines
7.8 KiB

5 years ago
5 years ago
5 years ago
  1. //
  2. // AutoDebitViewController.swift
  3. // GME Remit
  4. //
  5. // Created by Mac on 12/19/18.
  6. //Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
  7. //
  8. import UIKit
  9. import IQKeyboardManagerSwift
  10. class AutoDebitViewController: UIViewController {
  11. struct MultiLanguages {
  12. let navigationTitle = "auto_debit_title_text".localized()
  13. let languageUnavailableError = "no_lanugages_available_text".localized()
  14. let pickerTitle = "select_language_text".localized()
  15. let cancelText = "cancel_text".localized()
  16. let deleteTitleText = "auto_debit_delete_confirm_description".localized()
  17. let confirmationText = "are_you_sure_text".localized()
  18. let deleteText = "delete_text".localized()
  19. let editText = "Edit".localized()
  20. let tokenRenewalText = "token_renewal_text".localized()
  21. let swipeInfoText = "swift_to_delete_account_text".localized()
  22. }
  23. // MARK: IBOutlets
  24. @IBOutlet private weak var tableView: UITableView!
  25. @IBOutlet private weak var viewAddAccount: UIView!
  26. @IBOutlet private weak var labelSwipeInfo: UILabel!
  27. @IBOutlet private weak var tokenRenewalLabel: UILabel!
  28. // MARK: properties
  29. var presenter: AutoDebitModuleInterface?
  30. var languages: [String] = ["--- Select Language ---"]
  31. lazy var languageTextField = UITextField(frame: .zero)
  32. var selectedLanguage: KftcLanguage?
  33. private lazy var refreshControl = UIRefreshControl()
  34. private var kftcDetail: KFTCModel? {
  35. didSet {
  36. accounts = kftcDetail?.model
  37. tableView.reloadData()
  38. if languages.count < 2 {
  39. let originalLanguages = kftcDetail?.languages?.map { $0.value ?? ""}
  40. languages.append(contentsOf: originalLanguages ?? [])
  41. }
  42. }
  43. }
  44. private var accounts: [Account]? {
  45. didSet {
  46. guard
  47. let account = accounts,
  48. !account.isEmpty
  49. else {
  50. labelSwipeInfo.isHidden = true
  51. viewAddAccount.isHidden = true
  52. return
  53. }
  54. tableView.isHidden = false
  55. labelSwipeInfo.isHidden = false
  56. labelSwipeInfo.isHidden = false
  57. viewAddAccount.isHidden = false
  58. }
  59. }
  60. private let multiLanguages = MultiLanguages()
  61. // MARK: Life Cycle
  62. override func viewWillAppear(_ animated: Bool) {
  63. super.viewWillAppear(animated)
  64. setupNormalNavigation()
  65. navigationItem.title = multiLanguages.navigationTitle
  66. presenter?.fetchKFTCBankAccountList()
  67. }
  68. override func viewDidLoad() {
  69. super.viewDidLoad()
  70. setupDelegates()
  71. viewAddAccount.layer.cornerRadius = 5
  72. if self.presentingViewController == nil {
  73. self.navigationItem.leftBarButtonItem = nil
  74. }
  75. }
  76. override func viewWillDisappear(_ animated: Bool) {
  77. super.viewWillDisappear(animated)
  78. navigationItem.title = ""
  79. view.endEditing(true)
  80. }
  81. // MARK: IBAction
  82. @IBAction func touchAddAccountCellButton(_ sender: UIButton) {
  83. presenter?.goAddAccount(model: kftcDetail)
  84. }
  85. private func refreshAccount() {
  86. alertWithOkCancel(
  87. type: .normal,
  88. message: "token_renewal_confirm_text".localized(),
  89. title: "token_renewal_text".localized(),
  90. okTitle: "yes_text".localized(),
  91. cancelTitle: "no_text".localized(),
  92. okAction: {
  93. let languagePickerView = UIPickerView()
  94. languagePickerView.delegate = self
  95. languagePickerView.dataSource = self
  96. languagePickerView.backgroundColor = .white
  97. self.languageTextField.inputView = languagePickerView
  98. self.languageTextField.placeholder = "token_renewal_placeholder_text".localized()
  99. self.languageTextField.becomeFirstResponder()
  100. self.languageTextField
  101. .keyboardToolbar
  102. .doneBarButton
  103. .setTarget(self, action: #selector(self.editingDidEnd(_:)))
  104. },
  105. cancelAction: nil
  106. )
  107. }
  108. @IBAction func touchClose(_ sender: UIBarButtonItem) {
  109. // GMEDB.shared.user.set("", .redirectTo)
  110. dismiss(animated: true, completion: nil)
  111. }
  112. @objc func editingDidEnd(_ textField: UITextField) {
  113. presenter?.goRefreshToken(selectedLanguage: selectedLanguage)
  114. }
  115. @IBAction
  116. private func addNewAccount(_ sender: UITapGestureRecognizer) {
  117. refreshAccount()
  118. }
  119. // MARK: other functions
  120. private func setupDelegates() {
  121. tableView.delegate = self
  122. tableView.dataSource = self
  123. configureText()
  124. view.addSubview(languageTextField)
  125. }
  126. private func configureText() {
  127. tokenRenewalLabel.text = multiLanguages.tokenRenewalText
  128. labelSwipeInfo.text = multiLanguages.swipeInfoText
  129. }
  130. }
  131. // MARK: - UITableViewDataSource
  132. extension AutoDebitViewController: UITableViewDataSource {
  133. func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
  134. return 82
  135. }
  136. func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  137. return accounts?.count ?? 0
  138. }
  139. func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  140. guard let cell = tableView.dequeueReusableCell(
  141. withIdentifier: "AutoDebitTableViewCell",
  142. for: indexPath
  143. ) as? AutoDebitTableViewCell else { return UITableViewCell() }
  144. cell.setup(with: accounts?.elementAt(index: indexPath.row))
  145. return cell
  146. }
  147. }
  148. // MARK: - UITableViewDelegate
  149. extension AutoDebitViewController: UITableViewDelegate {
  150. func tableView(
  151. _ tableView: UITableView,
  152. editActionsForRowAt indexPath: IndexPath
  153. ) -> [UITableViewRowAction]? {
  154. let delete = UITableViewRowAction(
  155. style: .destructive,
  156. title: multiLanguages.deleteText
  157. ) { [weak self] (_, indexPath) in
  158. guard let `self` = self else { return }
  159. self.alertWithOkCancel(
  160. message: self.multiLanguages.deleteTitleText,
  161. title: self.multiLanguages.confirmationText,
  162. okTitle: self.multiLanguages.deleteText,
  163. okAction: { [weak self] in
  164. guard let `self` = self else { return }
  165. let email = GMEDB.shared.user.string(.userId) ?? ""
  166. guard let account = self.accounts?.elementAt(index: indexPath.row) else { return }
  167. self.presenter?.deleteKFTCBankAccount(of: email, with: account)
  168. }
  169. )
  170. }
  171. delete.backgroundColor = UIColor.init(hex: "DE333C")
  172. return [delete]
  173. }
  174. }
  175. // MARK: - AutoDebitViewInterface
  176. extension AutoDebitViewController: AutoDebitViewInterface {
  177. func didFailRefreshToken(with error: Error) {
  178. alert(type: .error, message: error.localizedDescription)
  179. }
  180. func didDeleteAccount() {
  181. presenter?.fetchKFTCBankAccountList()
  182. }
  183. func didFailDeleteAccount(with error: Error) {
  184. alert(
  185. type: .error,
  186. message: error.localizedDescription,
  187. title: "Failed Delete",
  188. okAction: nil
  189. )
  190. }
  191. func startLoading() {
  192. showProgressHud()
  193. }
  194. func endLoading() {
  195. hideProgressHud()
  196. }
  197. func setModel(with model: KFTCModel?) {
  198. kftcDetail = model
  199. }
  200. func didFailSetModel(with error: Error) {
  201. alert(
  202. type: .error,
  203. message: error.localizedDescription,
  204. title: "Failed Fetch KFTC Account List",
  205. okAction: nil
  206. )
  207. }
  208. }
  209. // MARK: - UIPickerViewDelegate
  210. extension AutoDebitViewController: UIPickerViewDelegate {
  211. func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
  212. return languages[row]
  213. }
  214. func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
  215. if row > 0 {
  216. selectedLanguage = kftcDetail?.languages?[row - 1]
  217. }
  218. }
  219. }
  220. // MARK: - UIPickerViewDataSource
  221. extension AutoDebitViewController: UIPickerViewDataSource {
  222. func numberOfComponents(in pickerView: UIPickerView) -> Int {
  223. return 1
  224. }
  225. func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
  226. return languages.count
  227. }
  228. }