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.

318 lines
8.8 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
  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. import XLPagerTabStrip
  11. class AutoDebitViewController: UIViewController {
  12. struct MultiLanguages {
  13. let navigationTitle = "auto_debit_title_text".localized()
  14. let languageUnavailableError = "no_lanugages_available_text".localized()
  15. let pickerTitle = "select_language_text".localized()
  16. let cancelText = "cancel_text".localized()
  17. let deleteTitleText = "auto_debit_delete_confirm_description".localized()
  18. let confirmationText = "are_you_sure_text".localized()
  19. let deleteText = "delete_text".localized()
  20. let editText = "Edit".localized()
  21. let tokenRenewalText = "token_renewal_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 tokenRenewalLabel: UILabel!
  27. @IBOutlet private weak var registerInboundImageView: UIImageView!
  28. @IBOutlet private weak var registerInboundLabel: UILabel!
  29. // MARK: properties
  30. var presenter: AutoDebitModuleInterface?
  31. var languages: [String] = ["--- Select Language ---"]
  32. lazy var languageTextField = UITextField(frame: .zero)
  33. var selectedLanguage: KftcLanguage?
  34. private lazy var refreshControl = UIRefreshControl()
  35. private var kftcDetail: KFTCModel? {
  36. didSet {
  37. tableView.refreshControl?.endRefreshing()
  38. accounts = kftcDetail?.model
  39. tableView.reloadData()
  40. if languages.count < 2 {
  41. let originalLanguages = kftcDetail?.languages?.map { $0.value ?? ""}
  42. languages.append(contentsOf: originalLanguages ?? [])
  43. }
  44. }
  45. }
  46. private var accounts: [Account]? {
  47. didSet {
  48. guard
  49. let account = accounts,
  50. !account.isEmpty
  51. else {
  52. viewAddAccount.isHidden = true
  53. return
  54. }
  55. tableView.isHidden = false
  56. viewAddAccount.isHidden = false
  57. }
  58. }
  59. private let multiLanguages = MultiLanguages()
  60. // MARK: Life Cycle
  61. override func viewWillAppear(_ animated: Bool) {
  62. super.viewWillAppear(animated)
  63. setupNormalNavigation()
  64. setupNavigationShadow(isUse: false)
  65. navigationItem.title = multiLanguages.navigationTitle
  66. presenter?.fetchKFTCBankAccountList()
  67. }
  68. override func viewDidLoad() {
  69. super.viewDidLoad()
  70. setupDelegates()
  71. viewAddAccount.layer.cornerRadius = 5
  72. registerInboundImageView.tintColor = .themeText
  73. registerInboundImageView.image = #imageLiteral(resourceName: "ic_register_Inbound").withRenderingMode(UIImage.RenderingMode.alwaysTemplate)
  74. if self.presentingViewController == nil {
  75. self.navigationItem.leftBarButtonItem = nil
  76. }
  77. registerInboundLabel.text = "register_inbound_text".localized()
  78. }
  79. override func viewWillDisappear(_ animated: Bool) {
  80. super.viewWillDisappear(animated)
  81. navigationItem.title = ""
  82. setupNavigationShadow(isUse: true)
  83. view.endEditing(true)
  84. }
  85. // MARK: IBAction
  86. @IBAction func touchAddAccountCellButton(_ sender: UIButton) {
  87. presenter?.goAddAccount(model: kftcDetail)
  88. }
  89. private func refreshAccount() {
  90. alertWithOkCancel(
  91. type: .normal,
  92. message: "token_renewal_confirm_text".localized(),
  93. title: "token_renewal_text".localized(),
  94. okTitle: "yes_text".localized(),
  95. cancelTitle: "no_text".localized(),
  96. okAction: {
  97. let languagePickerView = UIPickerView()
  98. languagePickerView.delegate = self
  99. languagePickerView.dataSource = self
  100. languagePickerView.backgroundColor = .themeMainBackground
  101. self.languageTextField.inputView = languagePickerView
  102. self.languageTextField.placeholder = "token_renewal_placeholder_text".localized()
  103. self.languageTextField.becomeFirstResponder()
  104. self.languageTextField
  105. .keyboardToolbar
  106. .doneBarButton
  107. .setTarget(self, action: #selector(self.editingDidEnd(_:)))
  108. },
  109. cancelAction: nil
  110. )
  111. }
  112. @IBAction func touchClose(_ sender: UIBarButtonItem) {
  113. // GMEDB.shared.user.set("", .redirectTo)
  114. dismiss(animated: true, completion: nil)
  115. }
  116. @objc func editingDidEnd(_ textField: UITextField) {
  117. presenter?.goRefreshToken(selectedLanguage: selectedLanguage)
  118. }
  119. @IBAction
  120. private func addNewAccount(_ sender: UITapGestureRecognizer) {
  121. refreshAccount()
  122. }
  123. // MARK: other functions
  124. private func setupDelegates() {
  125. tableView.dataSource = self
  126. configureText()
  127. view.addSubview(languageTextField)
  128. addRefreshControl()
  129. }
  130. private func configureText() {
  131. tokenRenewalLabel.text = multiLanguages.tokenRenewalText
  132. }
  133. private func addRefreshControl() {
  134. let colorOption = [NSAttributedString.Key.foregroundColor : UIColor.themeWhite]
  135. let title = NSAttributedString(string: "pull to refresh", attributes: colorOption)
  136. refreshControl.attributedTitle = title
  137. refreshControl.backgroundColor = .themeBlue
  138. refreshControl.tintColor = .themeWhite
  139. refreshControl.addTarget(self, action: #selector(refresh), for: .valueChanged)
  140. tableView.refreshControl = refreshControl
  141. }
  142. @objc
  143. private func refresh() {
  144. presenter?.fetchKFTCBankAccountList()
  145. }
  146. }
  147. // MARK: - UITableViewDataSource
  148. extension AutoDebitViewController: UITableViewDataSource {
  149. func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
  150. return 82
  151. }
  152. func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  153. return accounts?.count ?? 0
  154. }
  155. func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  156. guard let cell = tableView.dequeueReusableCell(
  157. withIdentifier: "AutoDebitTableViewCell",
  158. for: indexPath
  159. ) as? AutoDebitTableViewCell else { return UITableViewCell() }
  160. cell.setup(with: accounts?.elementAt(index: indexPath.row))
  161. cell.delegate = self
  162. return cell
  163. }
  164. }
  165. // MARK: - AutoDebitViewInterface
  166. extension AutoDebitViewController: AutoDebitViewInterface {
  167. func didFailRefreshToken(with error: Error) {
  168. alert(type: .error, message: error.localizedDescription)
  169. }
  170. func didDeleteAccount() {
  171. presenter?.fetchKFTCBankAccountList()
  172. }
  173. func didFailDeleteAccount(with error: Error) {
  174. alert(
  175. type: .error,
  176. message: error.localizedDescription,
  177. title: "Failed Delete",
  178. okAction: nil
  179. )
  180. }
  181. func startLoading() {
  182. showProgressHud()
  183. }
  184. func endLoading() {
  185. hideProgressHud()
  186. }
  187. func setModel(with model: KFTCModel?) {
  188. kftcDetail = model
  189. }
  190. func didFailSetModel(with error: Error) {
  191. alert(
  192. type: .error,
  193. message: error.localizedDescription,
  194. title: "Failed Fetch KFTC Account List",
  195. okAction: nil
  196. )
  197. }
  198. }
  199. // MARK: - UIPickerViewDelegate
  200. extension AutoDebitViewController: UIPickerViewDelegate {
  201. func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
  202. return languages[row]
  203. }
  204. func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
  205. if row > 0 {
  206. selectedLanguage = kftcDetail?.languages?[row - 1]
  207. }
  208. }
  209. }
  210. // MARK: - UIPickerViewDataSource
  211. extension AutoDebitViewController: UIPickerViewDataSource {
  212. func numberOfComponents(in pickerView: UIPickerView) -> Int {
  213. return 1
  214. }
  215. func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
  216. return languages.count
  217. }
  218. }
  219. // MARK: - XLPagerTabStrip's IndicatorInfoProvider
  220. extension AutoDebitViewController: IndicatorInfoProvider {
  221. func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo {
  222. return IndicatorInfo.init(title: "AutoDebit")
  223. }
  224. }
  225. // MARK: AutoDebitTableViewCellDelegate
  226. extension AutoDebitViewController: AutoDebitTableViewCellDelegate {
  227. func migrate(of model: Account?) {
  228. let bank = BankInformation(bankCode: model?.bankCode, bankName: model?.bankName)
  229. let model = PenneyTestRequest(
  230. accountID: model?.kftcAccountId,
  231. accountType: "autodebit",
  232. bank: bank,
  233. account: model?.accountNumMasked ?? ""
  234. )
  235. presenter?.openRegisterInboundAccount(with: model)
  236. }
  237. func delete(of model: Account?) {
  238. alertWithOkCancel(
  239. message: multiLanguages.deleteTitleText,
  240. title: multiLanguages.confirmationText,
  241. okTitle: multiLanguages.deleteText,
  242. okAction: { [weak self] in
  243. guard let `self` = self else { return }
  244. let email = GMEDB.shared.user.string(.userId) ?? ""
  245. guard let account = model else { return }
  246. self.presenter?.deleteKFTCBankAccount(of: email, with: account)
  247. }
  248. )
  249. }
  250. }