// // InboundAccountsPresenter.swift // GME Remit // // Created by InKwon James Kim on 2019/11/12. //Copyright © 2019 Gobal Money Express Co. Ltd. All rights reserved. // import RxSwift import RxCocoa class InboundAccountsPresenter: ViewModelType { var interactor: InboundAccountsInteractorInput? var wireframe: InboundAccountsWireframeInput? struct Input { let viewWillAppear: Driver let add: Driver let pennyTest: Driver let refresh: Driver let delete: Driver } struct Output { let isError: Driver let isProgress: Driver let accounts: Driver<[InboundAccount]> let deleteMessage: Driver } private let disposeBag = DisposeBag() private let progressLinker = PublishSubject() private let errorLinker = PublishSubject() private let accounts = PublishSubject<[InboundAccount]>() private let deleteMessage = PublishSubject() func transform(input: Input) -> Output { input.viewWillAppear.drive(onNext: {[weak self] in self?.progressLinker.onNext(true) self?.interactor?.fetchAccounts() }).disposed(by: disposeBag) input.add.drive(onNext: {[weak self] in self?.wireframe?.addAccount(delegate: self) }).disposed(by: disposeBag) input.pennyTest.drive(onNext: {[weak self] in self?.wireframe?.pennyTest(with: $0, delegate: self) }).disposed(by: disposeBag) input.refresh.drive(onNext: {[weak self] in self?.progressLinker.onNext(true) self?.interactor?.fetchAccounts() }).disposed(by: disposeBag) input.delete.drive(onNext: {[weak self] in self?.progressLinker.onNext(true) self?.interactor?.delete(with: $0) }).disposed(by: disposeBag) return Output( isError: errorLinker.asDriverOnErrorJustComplete(), isProgress: progressLinker.asDriverOnErrorJustComplete(), accounts: accounts.asDriverOnErrorJustComplete(), deleteMessage: deleteMessage.asDriverOnErrorJustComplete() ) } } // MARK: InboundAccounts interactor output interface extension InboundAccountsPresenter: InboundAccountsInteractorOutput { func setAccounts(_ accounts: [InboundAccount]) { progressLinker.onNext(false) self.accounts.onNext(accounts) } func setError(with error: Error) { progressLinker.onNext(false) errorLinker.onNext(error) } func deleteSuccess(message: String) { progressLinker.onNext(false) deleteMessage.onNext(message) } } extension InboundAccountsPresenter: InboundPennyTestSubmitDelegate { func didSuccess(_ viewController: UIViewController) { progressLinker.onNext(true) interactor?.fetchAccounts() } func didCancel(_ viewController: UIViewController) { progressLinker.onNext(true) interactor?.fetchAccounts() } }