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.

99 lines
2.8 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
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
  1. //
  2. // InboundAccountsPresenter.swift
  3. // GME Remit
  4. //
  5. // Created by InKwon James Kim on 2019/11/12.
  6. //Copyright © 2019 Gobal Money Express Co. Ltd. All rights reserved.
  7. //
  8. import RxSwift
  9. import RxCocoa
  10. class InboundAccountsPresenter: ViewModelType {
  11. var interactor: InboundAccountsInteractorInput?
  12. var wireframe: InboundAccountsWireframeInput?
  13. struct Input {
  14. let viewWillAppear: Driver<Void>
  15. let add: Driver<Void>
  16. let pennyTest: Driver<PenneyTestRequest>
  17. let refresh: Driver<Void>
  18. let delete: Driver<InboundAccount>
  19. }
  20. struct Output {
  21. let isError: Driver<Error>
  22. let isProgress: Driver<Bool>
  23. let accounts: Driver<[InboundAccount]>
  24. let deleteMessage: Driver<String>
  25. }
  26. private let disposeBag = DisposeBag()
  27. private let progressLinker = PublishSubject<Bool>()
  28. private let errorLinker = PublishSubject<Error>()
  29. private let accounts = PublishSubject<[InboundAccount]>()
  30. private let deleteMessage = PublishSubject<String>()
  31. func transform(input: Input) -> Output {
  32. input.viewWillAppear.drive(onNext: {[weak self] in
  33. self?.progressLinker.onNext(true)
  34. self?.interactor?.fetchAccounts()
  35. }).disposed(by: disposeBag)
  36. input.add.drive(onNext: {[weak self] in
  37. self?.wireframe?.addAccount(delegate: self)
  38. }).disposed(by: disposeBag)
  39. input.pennyTest.drive(onNext: {[weak self] in
  40. self?.wireframe?.pennyTest(with: $0, delegate: self)
  41. }).disposed(by: disposeBag)
  42. input.refresh.drive(onNext: {[weak self] in
  43. self?.progressLinker.onNext(true)
  44. self?.interactor?.fetchAccounts()
  45. }).disposed(by: disposeBag)
  46. input.delete.drive(onNext: {[weak self] in
  47. self?.progressLinker.onNext(true)
  48. self?.interactor?.delete(with: $0)
  49. }).disposed(by: disposeBag)
  50. return Output(
  51. isError: errorLinker.asDriverOnErrorJustComplete(),
  52. isProgress: progressLinker.asDriverOnErrorJustComplete(),
  53. accounts: accounts.asDriverOnErrorJustComplete(),
  54. deleteMessage: deleteMessage.asDriverOnErrorJustComplete()
  55. )
  56. }
  57. }
  58. // MARK: InboundAccounts interactor output interface
  59. extension InboundAccountsPresenter: InboundAccountsInteractorOutput {
  60. func setAccounts(_ accounts: [InboundAccount]) {
  61. progressLinker.onNext(false)
  62. self.accounts.onNext(accounts)
  63. }
  64. func setError(with error: Error) {
  65. progressLinker.onNext(false)
  66. errorLinker.onNext(error)
  67. }
  68. func deleteSuccess(message: String) {
  69. progressLinker.onNext(false)
  70. deleteMessage.onNext(message)
  71. }
  72. }
  73. extension InboundAccountsPresenter: InboundPennyTestSubmitDelegate {
  74. func didSuccess(_ viewController: UIViewController) {
  75. progressLinker.onNext(true)
  76. interactor?.fetchAccounts()
  77. }
  78. func didCancel(_ viewController: UIViewController) {
  79. progressLinker.onNext(true)
  80. interactor?.fetchAccounts()
  81. }
  82. }