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.

90 lines
2.6 KiB

  1. //
  2. // InboundReceiptPresenter.swift
  3. // GME Remit
  4. //
  5. // Created by InKwon James Kim on 2019/11/14.
  6. //Copyright © 2019 Gobal Money Express Co. Ltd. All rights reserved.
  7. //
  8. import RxSwift
  9. import RxCocoa
  10. protocol InboundReceiptInterface: class {
  11. func redeem(password: String)
  12. }
  13. class InboundReceiptPresenter: ViewModelType, InboundReceiptInterface {
  14. var interactor: InboundReceiptInteractorInput?
  15. var wireframe: InboundReceiptWireframeInput?
  16. weak var view: InboundReceiptViewInterface?
  17. struct Input {
  18. let viewWillAppear: Driver<Void>
  19. let register: Driver<Void>
  20. let cancel: Driver<Void>
  21. }
  22. struct Output {
  23. let isError: Driver<Error>
  24. let isProgress: Driver<Bool>
  25. let model: Driver<TransactionModel>
  26. let status: Driver<InboundStatus>
  27. }
  28. private let disposeBag = DisposeBag()
  29. private let progressLinker = PublishSubject<Bool>()
  30. private let errorLinker = PublishSubject<Error>()
  31. private let model = PublishSubject<TransactionModel>()
  32. private let status = PublishSubject<InboundStatus>()
  33. func transform(input: Input) -> Output {
  34. input.viewWillAppear.drive(onNext: {[weak self] in
  35. self?.interactor?.fetch()
  36. }).disposed(by: disposeBag)
  37. input.register.withLatestFrom(model.asDriverOnErrorJustComplete()) {$1}
  38. .drive(onNext: {[weak self] in
  39. guard let `self` = self else { return }
  40. }).disposed(by: disposeBag)
  41. return Output(
  42. isError: errorLinker.asDriverOnErrorJustComplete(),
  43. isProgress: progressLinker.asDriverOnErrorJustComplete(),
  44. model: model.asDriverOnErrorJustComplete(),
  45. status: status.asDriverOnErrorJustComplete()
  46. )
  47. }
  48. func redeem(password: String) {
  49. self.view?.showLoading()
  50. self.interactor?.redeem(password: password)
  51. }
  52. }
  53. // MARK: InboundReceipt interactor output interface
  54. extension InboundReceiptPresenter: InboundReceiptInteractorOutput {
  55. func success(message: String) {
  56. self.view?.hideLoading()
  57. self.view?.show(message: message)
  58. }
  59. func setModel(with model: TransactionModel) {
  60. self.view?.hideLoading()
  61. self.model.onNext(model)
  62. guard
  63. let inboundStatus = model.status?.lowercased() else {
  64. return
  65. }
  66. let type = InboundStatus(rawValue: inboundStatus) ?? .processing
  67. status.onNext(type)
  68. }
  69. func setError(with error: Error) {
  70. errorLinker.onNext(error)
  71. }
  72. }