|
@ -9,6 +9,20 @@ |
|
|
import RxSwift |
|
|
import RxSwift |
|
|
import RxCocoa |
|
|
import RxCocoa |
|
|
|
|
|
|
|
|
|
|
|
enum RechargeType: Int { |
|
|
|
|
|
case regular |
|
|
|
|
|
case fixed |
|
|
|
|
|
case dataOnly |
|
|
|
|
|
|
|
|
|
|
|
var value: String { |
|
|
|
|
|
switch self { |
|
|
|
|
|
case .regular: return "1" |
|
|
|
|
|
case .fixed: return "6" |
|
|
|
|
|
case .dataOnly: return "5" |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
class PhoneCardRechargePresenter: ViewModelType { |
|
|
class PhoneCardRechargePresenter: ViewModelType { |
|
|
var interactor: PhoneCardRechargeInteractorInput? |
|
|
var interactor: PhoneCardRechargeInteractorInput? |
|
|
var wireframe: PhoneCardRechargeWireframeInput? |
|
|
var wireframe: PhoneCardRechargeWireframeInput? |
|
@ -17,7 +31,7 @@ class PhoneCardRechargePresenter: ViewModelType { |
|
|
let viewWillAppear: Driver<Void> |
|
|
let viewWillAppear: Driver<Void> |
|
|
let selectedMobile: Driver<String> |
|
|
let selectedMobile: Driver<String> |
|
|
let contactOpenTap: Driver<Void> |
|
|
let contactOpenTap: Driver<Void> |
|
|
let selectedRechargeType: Driver<PhoneCardRechargeViewController.RechargeType> |
|
|
|
|
|
|
|
|
let selectedRechargeType: Driver<RechargeType> |
|
|
let selectedAmountButtonTag: Driver<Int?> |
|
|
let selectedAmountButtonTag: Driver<Int?> |
|
|
let selectedCarrierType: Driver<PaymentServiceType?> |
|
|
let selectedCarrierType: Driver<PaymentServiceType?> |
|
|
let selectedCarrierPlan: Driver<PaymentServiceType?> |
|
|
let selectedCarrierPlan: Driver<PaymentServiceType?> |
|
@ -38,19 +52,27 @@ class PhoneCardRechargePresenter: ViewModelType { |
|
|
private let errorLinker = PublishSubject<Error>() |
|
|
private let errorLinker = PublishSubject<Error>() |
|
|
private let isSuccessPayment = PublishSubject<CreditCardReceipt>() |
|
|
private let isSuccessPayment = PublishSubject<CreditCardReceipt>() |
|
|
|
|
|
|
|
|
|
|
|
private let regularModel = BehaviorSubject<[PriceModel]>(value: []) |
|
|
|
|
|
private let fixedModel = BehaviorSubject<[CardInformation]>(value: []) |
|
|
|
|
|
private let dataOnlyModel = BehaviorSubject<[CardInformation]>(value: []) |
|
|
|
|
|
|
|
|
func transform(input: Input) -> Output { |
|
|
func transform(input: Input) -> Output { |
|
|
Driver.combineLatest(input.viewWillAppear, input.selectedMobile) {$1} |
|
|
|
|
|
.drive(onNext: { [weak self] in |
|
|
|
|
|
if $0 != "" { |
|
|
|
|
|
|
|
|
Driver.combineLatest(input.viewWillAppear, input.selectedMobile, input.selectedRechargeType) |
|
|
|
|
|
.drive(onNext: { [weak self] (_, mobile, type) in |
|
|
|
|
|
if mobile != "" { |
|
|
self?.progressLinker.onNext(true) |
|
|
self?.progressLinker.onNext(true) |
|
|
self?.interactor?.fetchCardList(type: "", mobile: $0) |
|
|
|
|
|
|
|
|
self?.interactor?.fetchCardList(type: type, mobile: mobile) |
|
|
} |
|
|
} |
|
|
}) |
|
|
}) |
|
|
.disposed(by: disposeBag) |
|
|
.disposed(by: disposeBag) |
|
|
|
|
|
|
|
|
let combinedInput = Observable.combineLatest( |
|
|
let combinedInput = Observable.combineLatest( |
|
|
input.selectedRechargeType.asObservable(), |
|
|
input.selectedRechargeType.asObservable(), |
|
|
input.selectedAmountButtonTag.asObservable(), |
|
|
|
|
|
|
|
|
input.selectedAmountButtonTag.asObservable() |
|
|
|
|
|
.withLatestFrom(regularModel) { tag, model -> PriceModel? in |
|
|
|
|
|
guard let index = tag, model.count > 0 else { return nil } |
|
|
|
|
|
return model[index] |
|
|
|
|
|
}, |
|
|
input.selectedCarrierType.asObservable(), |
|
|
input.selectedCarrierType.asObservable(), |
|
|
input.selectedCarrierPlan.asObservable(), |
|
|
input.selectedCarrierPlan.asObservable(), |
|
|
input.selectedDataOnlyType.asObservable() |
|
|
input.selectedDataOnlyType.asObservable() |
|
@ -62,30 +84,19 @@ class PhoneCardRechargePresenter: ViewModelType { |
|
|
case .regular: return amountTag != nil |
|
|
case .regular: return amountTag != nil |
|
|
case .fixed: return carrierType != nil && carrierPlan != nil |
|
|
case .fixed: return carrierType != nil && carrierPlan != nil |
|
|
case .dataOnly: return dataOnlyType != nil |
|
|
case .dataOnly: return dataOnlyType != nil |
|
|
case .nil: return false |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
input.nextTap |
|
|
input.nextTap |
|
|
.withLatestFrom(combinedInput.asDriverOnErrorJustComplete()) {$1} |
|
|
.withLatestFrom(combinedInput.asDriverOnErrorJustComplete()) {$1} |
|
|
.map { (type, amountTag, carrierType, carrierPlan, dataOnlyType) -> RechargeModel? in |
|
|
|
|
|
|
|
|
.map { (type, regularModel, carrierType, carrierPlan, dataOnlyType) -> RechargeModel? in |
|
|
switch type { |
|
|
switch type { |
|
|
case .regular: |
|
|
case .regular: |
|
|
switch amountTag ?? 0 { |
|
|
|
|
|
case 0: return RechargeModel(paymentAmount: "10000") |
|
|
|
|
|
case 1: return RechargeModel(paymentAmount: "20000") |
|
|
|
|
|
case 2: return RechargeModel(paymentAmount: "30000") |
|
|
|
|
|
case 3: return RechargeModel(paymentAmount: "40000") |
|
|
|
|
|
case 4: return RechargeModel(paymentAmount: "50000") |
|
|
|
|
|
case 5: return RechargeModel(paymentAmount: "100000") |
|
|
|
|
|
default: () |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
return RechargeModel(paymentAmount: regularModel?.price ?? "0") |
|
|
case .fixed: |
|
|
case .fixed: |
|
|
break |
|
|
break |
|
|
case .dataOnly: |
|
|
case .dataOnly: |
|
|
break |
|
|
break |
|
|
case .nil: |
|
|
|
|
|
return nil |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
return RechargeModel(paymentAmount: "1000") |
|
|
return RechargeModel(paymentAmount: "1000") |
|
@ -106,8 +117,19 @@ class PhoneCardRechargePresenter: ViewModelType { |
|
|
|
|
|
|
|
|
// MARK: PhoneCardRecharge interactor output interface |
|
|
// MARK: PhoneCardRecharge interactor output interface |
|
|
extension PhoneCardRechargePresenter: PhoneCardRechargeInteractorOutput { |
|
|
extension PhoneCardRechargePresenter: PhoneCardRechargeInteractorOutput { |
|
|
func setModel(with model: CardList) { |
|
|
|
|
|
|
|
|
func setRegularModel(with model: [PriceModel]) { |
|
|
|
|
|
progressLinker.onNext(false) |
|
|
|
|
|
regularModel.onNext(model) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func setFixedModel(with model: [CardInformation]) { |
|
|
|
|
|
progressLinker.onNext(false) |
|
|
|
|
|
fixedModel.onNext(model) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func setDataOnlyModel(with model: [CardInformation]) { |
|
|
progressLinker.onNext(false) |
|
|
progressLinker.onNext(false) |
|
|
|
|
|
dataOnlyModel.onNext(model) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
func setError(with error: Error) { |
|
|
func setError(with error: Error) { |
|
|