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.

96 lines
2.9 KiB

  1. //
  2. // RechargeHistoryPresenter.swift
  3. // GME Remit
  4. //
  5. // Created by InKwon James Kim on 2019/11/04.
  6. //Copyright © 2019 Gobal Money Express Co. Ltd. All rights reserved.
  7. //
  8. import RxSwift
  9. import RxCocoa
  10. class RechargeHistoryPresenter: ViewModelType {
  11. var interactor: RechargeHistoryInteractorInput?
  12. var wireframe: RechargeHistoryWireframeInput?
  13. struct Input {
  14. let viewWillAppear: Driver<Void>
  15. let searchText: Driver<String>
  16. let calandarTap: Driver<Void>
  17. let periodCloseTap: Driver<Void>
  18. let refresh: Driver<Void>
  19. }
  20. struct Output {
  21. let isError: Driver<Error>
  22. let isProgress: Driver<Bool>
  23. let histories: Driver<[RechargeHistory]>
  24. let fromTo: Driver<(String, String)?>
  25. }
  26. private let disposeBag = DisposeBag()
  27. private let progressLinker = PublishSubject<Bool>()
  28. private let errorLinker = PublishSubject<Error>()
  29. private let histories = PublishSubject<[RechargeHistory]>()
  30. func transform(input: Input) -> Output {
  31. input.viewWillAppear
  32. .drive(onNext: {[weak self] in
  33. self?.progressLinker.onNext(true)
  34. self?.interactor?.fetchHistory(from: "", to: "")
  35. }).disposed(by: disposeBag)
  36. input.periodCloseTap
  37. .drive(onNext: {[weak self] in
  38. self?.progressLinker.onNext(true)
  39. self?.interactor?.fetchHistory(from: "", to: "")
  40. }).disposed(by: disposeBag)
  41. input.searchText.distinctUntilChanged().drive(onNext: { [weak self] in
  42. self?.progressLinker.onNext(true)
  43. self?.interactor?.fetchFilteredHistory(search: $0)
  44. }).disposed(by: disposeBag)
  45. let fromTo = BehaviorSubject<(String, String)?>(value: nil)
  46. input.calandarTap.drive(onNext: { [weak self] in
  47. self?.wireframe?.view.presentDatePicker { (from, to) in
  48. guard
  49. let startDate = from,
  50. let endDate = to else { return }
  51. self?.progressLinker.onNext(true)
  52. self?.interactor?.fetchHistory(from: startDate, to: endDate)
  53. fromTo.onNext((startDate, endDate))
  54. }
  55. }).disposed(by: disposeBag)
  56. input.refresh.withLatestFrom(fromTo.asDriverOnErrorJustComplete()) {$1}
  57. .drive(onNext: {[weak self] in
  58. self?.progressLinker.onNext(true)
  59. self?.interactor?.fetchHistory(from: $0?.0 ?? "", to: $0?.1 ?? "")
  60. }).disposed(by: disposeBag)
  61. return Output(
  62. isError: errorLinker.asDriverOnErrorJustComplete(),
  63. isProgress: progressLinker.asDriverOnErrorJustComplete(),
  64. histories: histories.asDriverOnErrorJustComplete(),
  65. fromTo: fromTo.asDriverOnErrorJustComplete()
  66. )
  67. }
  68. }
  69. // MARK: RechargeHistory interactor output interface
  70. extension RechargeHistoryPresenter: RechargeHistoryInteractorOutput {
  71. func setModel(with model: [RechargeHistory]) {
  72. progressLinker.onNext(false)
  73. histories.onNext(model)
  74. }
  75. func setError(with error: Error) {
  76. progressLinker.onNext(false)
  77. errorLinker.onNext(error)
  78. }
  79. }