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

//
// 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<Void>
let add: Driver<Void>
let pennyTest: Driver<PenneyTestRequest>
let refresh: Driver<Void>
let delete: Driver<InboundAccount>
}
struct Output {
let isError: Driver<Error>
let isProgress: Driver<Bool>
let accounts: Driver<[InboundAccount]>
let deleteMessage: Driver<String>
}
private let disposeBag = DisposeBag()
private let progressLinker = PublishSubject<Bool>()
private let errorLinker = PublishSubject<Error>()
private let accounts = PublishSubject<[InboundAccount]>()
private let deleteMessage = PublishSubject<String>()
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()
}
}