// // RechargeHistoryPresenter.swift // GME Remit // // Created by InKwon James Kim on 2019/11/04. //Copyright © 2019 Gobal Money Express Co. Ltd. All rights reserved. // import RxSwift import RxCocoa class RechargeHistoryPresenter: ViewModelType { var interactor: RechargeHistoryInteractorInput? var wireframe: RechargeHistoryWireframeInput? struct Input { let viewWillAppear: Driver let searchText: Driver let calandarTap: Driver let periodCloseTap: Driver let refresh: Driver } struct Output { let isError: Driver let isProgress: Driver let histories: Driver<[RechargeHistory]> let fromTo: Driver<(String, String)?> } private let disposeBag = DisposeBag() private let progressLinker = PublishSubject() private let errorLinker = PublishSubject() private let histories = PublishSubject<[RechargeHistory]>() func transform(input: Input) -> Output { input.viewWillAppear .drive(onNext: {[weak self] in self?.progressLinker.onNext(true) self?.interactor?.fetchHistory(from: "", to: "") }).disposed(by: disposeBag) input.periodCloseTap .drive(onNext: {[weak self] in self?.progressLinker.onNext(true) self?.interactor?.fetchHistory(from: "", to: "") }).disposed(by: disposeBag) input.searchText.distinctUntilChanged().drive(onNext: { [weak self] in self?.progressLinker.onNext(true) self?.interactor?.fetchFilteredHistory(search: $0) }).disposed(by: disposeBag) let fromTo = BehaviorSubject<(String, String)?>(value: nil) input.calandarTap.drive(onNext: { [weak self] in self?.wireframe?.view.presentDatePicker { (from, to) in guard let startDate = from, let endDate = to else { return } self?.progressLinker.onNext(true) self?.interactor?.fetchHistory(from: startDate, to: endDate) fromTo.onNext((startDate, endDate)) } }).disposed(by: disposeBag) input.refresh.withLatestFrom(fromTo.asDriverOnErrorJustComplete()) {$1} .drive(onNext: {[weak self] in self?.progressLinker.onNext(true) self?.interactor?.fetchHistory(from: $0?.0 ?? "", to: $0?.1 ?? "") }).disposed(by: disposeBag) return Output( isError: errorLinker.asDriverOnErrorJustComplete(), isProgress: progressLinker.asDriverOnErrorJustComplete(), histories: histories.asDriverOnErrorJustComplete(), fromTo: fromTo.asDriverOnErrorJustComplete() ) } } // MARK: RechargeHistory interactor output interface extension RechargeHistoryPresenter: RechargeHistoryInteractorOutput { func setModel(with model: [RechargeHistory]) { progressLinker.onNext(false) histories.onNext(model) } func setError(with error: Error) { progressLinker.onNext(false) errorLinker.onNext(error) } }