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.
 
 
 
 

90 lines
2.6 KiB

//
// InboundReceiptPresenter.swift
// GME Remit
//
// Created by InKwon James Kim on 2019/11/14.
//Copyright © 2019 Gobal Money Express Co. Ltd. All rights reserved.
//
import RxSwift
import RxCocoa
protocol InboundReceiptInterface: class {
func redeem(password: String)
}
class InboundReceiptPresenter: ViewModelType, InboundReceiptInterface {
var interactor: InboundReceiptInteractorInput?
var wireframe: InboundReceiptWireframeInput?
weak var view: InboundReceiptViewInterface?
struct Input {
let viewWillAppear: Driver<Void>
let register: Driver<Void>
let cancel: Driver<Void>
}
struct Output {
let isError: Driver<Error>
let isProgress: Driver<Bool>
let model: Driver<TransactionModel>
let status: Driver<InboundStatus>
}
private let disposeBag = DisposeBag()
private let progressLinker = PublishSubject<Bool>()
private let errorLinker = PublishSubject<Error>()
private let model = PublishSubject<TransactionModel>()
private let status = PublishSubject<InboundStatus>()
func transform(input: Input) -> Output {
input.viewWillAppear.drive(onNext: {[weak self] in
self?.interactor?.fetch()
}).disposed(by: disposeBag)
input.register.withLatestFrom(model.asDriverOnErrorJustComplete()) {$1}
.drive(onNext: {[weak self] in
guard let `self` = self else { return }
}).disposed(by: disposeBag)
return Output(
isError: errorLinker.asDriverOnErrorJustComplete(),
isProgress: progressLinker.asDriverOnErrorJustComplete(),
model: model.asDriverOnErrorJustComplete(),
status: status.asDriverOnErrorJustComplete()
)
}
func redeem(password: String) {
self.view?.showLoading()
self.interactor?.redeem(password: password)
}
}
// MARK: InboundReceipt interactor output interface
extension InboundReceiptPresenter: InboundReceiptInteractorOutput {
func success(message: String) {
self.view?.hideLoading()
self.view?.show(message: message)
}
func setModel(with model: TransactionModel) {
self.view?.hideLoading()
self.model.onNext(model)
guard
let inboundStatus = model.status?.lowercased() else {
return
}
let type = InboundStatus(rawValue: inboundStatus) ?? .processing
status.onNext(type)
}
func setError(with error: Error) {
errorLinker.onNext(error)
}
}