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.

186 lines
5.7 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
  1. //
  2. // RecipientsViewModel.swift
  3. // GME Remit
  4. //
  5. // Created by InKwon James Kim on 08/08/2019.
  6. // Copyright © 2019 Gobal Money Express Co. Ltd. All rights reserved.
  7. //
  8. import RxSwift
  9. import RxCocoa
  10. class RecipientsViewModel: ViewModelType {
  11. var presenter: RecipientsModuleInterface?
  12. struct Input {
  13. let fetchTrigger: Driver<Void>
  14. let refreshTrigger: Driver<Void>
  15. let addTrigger: Driver<Void>
  16. let selectTrigger: Driver<IndexPath>
  17. let editTrigger: Driver<IndexPath>
  18. let deleteTrigger: Driver<IndexPath>
  19. let needEditTrigger: Driver<Void>
  20. let filterText: Driver<String?>
  21. }
  22. struct Output {
  23. let recipients: Driver<[Recipient]>
  24. let isNeedEdit: Driver<Void>
  25. let isPartnerChanged: Driver<Void>
  26. let isError: Driver<Error>
  27. let isProgress: Driver<Bool>
  28. }
  29. private let disposeBag = DisposeBag()
  30. private var selectedRecipientID: String?
  31. private let recipientsLinker = BehaviorSubject<[Recipient]>(value: [])
  32. private let filteredRecipientLinker = BehaviorSubject<[Recipient]>(value: [])
  33. private let accountsLinker = BehaviorSubject<[Account]>(value: [])
  34. private let editLinker = PublishSubject<Recipient>()
  35. private let deleteLinker = PublishSubject<Recipient>()
  36. private let progressLinker = PublishSubject<Bool>()
  37. private let errorLinker = PublishSubject<Error>()
  38. private var selectedRecipient: Recipient?
  39. private var isNeedEditRecipient = PublishSubject<Void>()
  40. private var isPartnerChanged = PublishSubject<Void>()
  41. func transform(input: Input) -> Output {
  42. input
  43. .fetchTrigger
  44. .drive(onNext: { [weak self] in guard let `self` = self else { return }
  45. self.presenter?.fetchRecipients(isRefresh: false)
  46. })
  47. .disposed(by: disposeBag)
  48. input
  49. .refreshTrigger
  50. .drive(onNext: { [weak self] in guard let `self` = self else { return }
  51. self.presenter?.fetchRecipients(isRefresh: true)
  52. })
  53. .disposed(by: disposeBag)
  54. let recipients = Observable.combineLatest(
  55. recipientsLinker, input.filterText.asObservable()
  56. ) { recipients, searchText -> [Recipient] in
  57. guard let searchText = searchText, searchText != "" else {
  58. return recipients
  59. }
  60. return recipients.filter {( $0.fullName?.lowercased().contains(searchText.lowercased()) ?? false )}
  61. }.asDriverOnErrorJustComplete()
  62. input.selectTrigger
  63. .withLatestFrom(recipients) { (indexPath, recipients) -> Recipient in
  64. return recipients[indexPath.row]
  65. }
  66. .drive(onNext: { [weak self] in guard let `self` = self else { return }
  67. self.selectedRecipient = $0
  68. guard let paymentMode = self.selectedRecipient?.paymentMethod else {
  69. self.isNeedEditRecipient.onNext(())
  70. return
  71. }
  72. if paymentMode.id == nil {
  73. self.isNeedEditRecipient.onNext(())
  74. return
  75. }
  76. if self.selectedRecipient?.isPartnerChanged == "1" {
  77. self.isPartnerChanged.onNext(())
  78. return
  79. }
  80. let accounts = try? self.accountsLinker.value()
  81. self.presenter?.openSelectAccount(with: accounts ?? [])
  82. })
  83. .disposed(by: disposeBag)
  84. input.editTrigger
  85. .withLatestFrom(recipients) { (indexPath, recipients) -> Recipient in
  86. return recipients[indexPath.row]
  87. }
  88. .drive(onNext: { [weak self] in guard let `self` = self else { return }
  89. self.presenter?.openEditRecipient(who: $0, with: self)
  90. })
  91. .disposed(by: disposeBag)
  92. input.deleteTrigger
  93. .withLatestFrom(recipients) { (indexPath, recipients) -> Recipient in
  94. return recipients[indexPath.row]
  95. }
  96. .drive(onNext: { [weak self] in guard let `self` = self else { return }
  97. self.presenter?.deleteRecipient(who: $0)
  98. })
  99. .disposed(by: disposeBag)
  100. input.addTrigger
  101. .drive(onNext: { [weak self] in guard let `self` = self else { return }
  102. self.presenter?.openAddRecipient(with: self)
  103. })
  104. .disposed(by: disposeBag)
  105. input.needEditTrigger
  106. .drive(onNext: { [weak self] in guard let `self` = self else { return }
  107. guard let recipient = self.selectedRecipient else {return}
  108. self.presenter?.openEditRecipient(who: recipient, with: self)
  109. })
  110. .disposed(by: disposeBag)
  111. return Output(
  112. recipients: recipients,
  113. isNeedEdit: isNeedEditRecipient.asDriverOnErrorJustComplete(),
  114. isPartnerChanged: isPartnerChanged.asDriverOnErrorJustComplete(),
  115. isError: errorLinker.asDriverOnErrorJustComplete(),
  116. isProgress: progressLinker.asDriverOnErrorJustComplete()
  117. )
  118. }
  119. }
  120. // MARK: - RecipientsViewModelInterface
  121. extension RecipientsViewModel: RecipientsViewModelInterface {
  122. func setSelectedAccount(_ account: Account) {
  123. guard let recipient = selectedRecipient else { return }
  124. presenter?.goNextStep(who: recipient, with: account)
  125. }
  126. func setRecipients(using model: [Recipient]) {
  127. recipientsLinker.onNext(model)
  128. guard let selectedID = selectedRecipientID else {
  129. return
  130. }
  131. selectedRecipient = model.filter({$0.receiverID == selectedID}).first
  132. let accounts = try? self.accountsLinker.value()
  133. presenter?.openSelectAccount(with: accounts ?? [])
  134. selectedRecipientID = nil
  135. }
  136. func setAccounts(using model: [Account]) {
  137. accountsLinker.onNext(model)
  138. }
  139. func setError(with error: Error) {
  140. errorLinker.onNext(error)
  141. }
  142. func progress(isShow: Bool) {
  143. progressLinker.onNext(isShow)
  144. }
  145. }
  146. extension RecipientsViewModel: SetupRecipientDelegate {
  147. func setupRecieient(_ viewController: SetupRecipientViewController, didSelectRecipientID: String?) {
  148. selectedRecipientID = didSelectRecipientID
  149. presenter?.fetchRecipients(isRefresh: true)
  150. }
  151. }