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.

85 lines
2.3 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. class InboundReceiptPresenter: ViewModelType {
  11. var interactor: InboundReceiptInteractorInput?
  12. var wireframe: InboundReceiptWireframeInput?
  13. struct Input {
  14. let viewWillAppear: Driver<Void>
  15. let register: Driver<Void>
  16. let cancel: Driver<Void>
  17. }
  18. struct Output {
  19. let isError: Driver<Error>
  20. let isProgress: Driver<Bool>
  21. let model: Driver<TransactionModel>
  22. let status: Driver<InboundStatus>
  23. }
  24. private let disposeBag = DisposeBag()
  25. private let progressLinker = PublishSubject<Bool>()
  26. private let errorLinker = PublishSubject<Error>()
  27. private let model = PublishSubject<TransactionModel>()
  28. private let status = PublishSubject<InboundStatus>()
  29. func transform(input: Input) -> Output {
  30. input.viewWillAppear.drive(onNext: {[weak self] in
  31. self?.interactor?.fetch()
  32. }).disposed(by: disposeBag)
  33. input.register.withLatestFrom(model.asDriverOnErrorJustComplete()) {$1}
  34. .drive(onNext: {[weak self] in
  35. guard let `self` = self else { return }
  36. self.wireframe?.openAddInboundAccount(with: $0, delegate: self)
  37. }).disposed(by: disposeBag)
  38. return Output(
  39. isError: errorLinker.asDriverOnErrorJustComplete(),
  40. isProgress: progressLinker.asDriverOnErrorJustComplete(),
  41. model: model.asDriverOnErrorJustComplete(),
  42. status: status.asDriverOnErrorJustComplete()
  43. )
  44. }
  45. }
  46. // MARK: InboundReceipt interactor output interface
  47. extension InboundReceiptPresenter: InboundReceiptInteractorOutput {
  48. func setModel(with model: TransactionModel) {
  49. self.model.onNext(model)
  50. guard
  51. let inboundStatus = model.inboundStatus?.lowercased() else {
  52. return
  53. }
  54. let type = InboundStatus(rawValue: inboundStatus) ?? .processing
  55. status.onNext(type)
  56. }
  57. func setError(with error: Error) {
  58. errorLinker.onNext(error)
  59. }
  60. }
  61. // MARK: InboundPennyTestSubmitDelegate
  62. extension InboundReceiptPresenter: InboundPennyTestSubmitDelegate {
  63. func didSuccess(_ viewController: UIViewController) {
  64. wireframe?.pop()
  65. }
  66. func didCancel(_ viewController: UIViewController) {
  67. // if canceled penny test verification.
  68. }
  69. }