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.
 
 
 
 

96 lines
2.9 KiB

//
// 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<Void>
let searchText: Driver<String>
let calandarTap: Driver<Void>
let periodCloseTap: Driver<Void>
let refresh: Driver<Void>
}
struct Output {
let isError: Driver<Error>
let isProgress: Driver<Bool>
let histories: Driver<[RechargeHistory]>
let fromTo: Driver<(String, String)?>
}
private let disposeBag = DisposeBag()
private let progressLinker = PublishSubject<Bool>()
private let errorLinker = PublishSubject<Error>()
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)
}
}