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.

98 lines
2.7 KiB

  1. //
  2. // InternationalTopupPresenter.swift
  3. // GME Remit
  4. //
  5. // Created by InKwon James Kim on 2019/10/30.
  6. //Copyright © 2019 Gobal Money Express Co. Ltd. All rights reserved.
  7. //
  8. import RxSwift
  9. import RxCocoa
  10. class InternationalTopupPresenter: ViewModelType {
  11. var interactor: InternationalTopupInteractorInput?
  12. var wireframe: InternationalTopupWireframeInput?
  13. struct Input {
  14. let viewWillAppear: Driver<Void>
  15. let walletBalance: Driver<String>
  16. let selectCellPhoneNumber: Driver<String>
  17. let selectedCallingCard: Driver<MainCardInformation?>
  18. let selectedAmount: Driver<PriceModel?>
  19. }
  20. struct Output {
  21. let isError: Driver<Error>
  22. let isProgress: Driver<Bool>
  23. let isHiddenStep2ContainerView: Driver<Bool>
  24. let isEnableNext: Driver<Bool>
  25. let model: Driver<CardList>
  26. }
  27. private let disposeBag = DisposeBag()
  28. private let progressLinker = PublishSubject<Bool>()
  29. private let errorLinker = PublishSubject<Error>()
  30. private let model = PublishSubject<CardList>()
  31. func transform(input: Input) -> Output {
  32. let isHiddenStep2ContainerView = PublishSubject<Bool>()
  33. Driver.combineLatest(input.viewWillAppear, input.selectCellPhoneNumber)
  34. .drive(
  35. onNext: {[weak self] (_, cellPhone) in
  36. self?.interactor?.fetchCardList(type: "2", mobile: cellPhone)
  37. }
  38. ).disposed(by: disposeBag)
  39. input.selectedCallingCard.drive(
  40. onNext: {
  41. $0 != nil ? isHiddenStep2ContainerView.onNext(false) : isHiddenStep2ContainerView.onNext(true)
  42. }
  43. ).disposed(by: disposeBag)
  44. let merged = Driver.combineLatest(
  45. input.walletBalance.map {Int($0) ?? 0},
  46. input.selectCellPhoneNumber,
  47. input.selectedCallingCard,
  48. input.selectedAmount
  49. )
  50. let isEnableNext = merged.map { (balance, _, cardModel, amountModel) -> Bool in
  51. guard
  52. cardModel != nil,
  53. let price = amountModel?.price,
  54. let amount = Int(price) else {
  55. return false
  56. }
  57. return balance - amount > 0
  58. }
  59. // model
  60. // .map {models in
  61. // models.countryPriceCode?.filter{
  62. // $0.countryCode
  63. // }
  64. // }
  65. return Output(
  66. isError: errorLinker.asDriverOnErrorJustComplete(),
  67. isProgress: progressLinker.asDriverOnErrorJustComplete(),
  68. isHiddenStep2ContainerView: isHiddenStep2ContainerView.asDriverOnErrorJustComplete(),
  69. isEnableNext: isEnableNext,
  70. model: model.asDriverOnErrorJustComplete()
  71. )
  72. }
  73. }
  74. // MARK: InternationalTopup interactor output interface
  75. extension InternationalTopupPresenter: InternationalTopupInteractorOutput {
  76. func setModel(with model: CardList) {
  77. self.model.onNext(model)
  78. }
  79. func setError(with error: Error) {
  80. }
  81. }