diff --git a/GME Remit/Modules/Home/User Interface/View/Cell/HomeCollectionTableViewCell.swift b/GME Remit/Modules/Home/User Interface/View/Cell/HomeCollectionTableViewCell.swift index 07d97fc8..0b016433 100644 --- a/GME Remit/Modules/Home/User Interface/View/Cell/HomeCollectionTableViewCell.swift +++ b/GME Remit/Modules/Home/User Interface/View/Cell/HomeCollectionTableViewCell.swift @@ -132,8 +132,8 @@ class HomeCollectionTableViewCell: UITableViewCell, UICollectionViewDelegateFlow cardRecharge.icon = #imageLiteral(resourceName: "ic_menu_domestic") // FIXME: Check Menues. - let menus = [sendMoneyMenu, toadaysRateMenu, domesticRemitMenu, trackTransferMenu] - //,prepaidPhoneRecharge, cardRecharge] + let menus = [sendMoneyMenu, toadaysRateMenu, domesticRemitMenu, trackTransferMenu, + prepaidPhoneRecharge, cardRecharge] return menus } diff --git a/GME Remit/Modules/PowerCallModules/PhoneCardRecharge/Application Logic/Interactor/PhoneCardRechargeInteractor.swift b/GME Remit/Modules/PowerCallModules/PhoneCardRecharge/Application Logic/Interactor/PhoneCardRechargeInteractor.swift index 0d300bca..3c0641a9 100644 --- a/GME Remit/Modules/PowerCallModules/PhoneCardRecharge/Application Logic/Interactor/PhoneCardRechargeInteractor.swift +++ b/GME Remit/Modules/PowerCallModules/PhoneCardRecharge/Application Logic/Interactor/PhoneCardRechargeInteractor.swift @@ -15,23 +15,37 @@ class PhoneCardRechargeInteractor { weak var output: PhoneCardRechargeInteractorOutput? private let service: PhoneCardRechargeServiceType + private var regularModel: [PriceModel]? + private var fixedModel: [CardInformation]? + private var dataOnlyModel: [CardInformation]? + + private var selectedMobile: String? // MARK: Initialization init(service: PhoneCardRechargeServiceType) { self.service = service } -} - -// MARK: PhoneCardRecharge interactor input interface - -extension PhoneCardRechargeInteractor: PhoneCardRechargeInteractorInput { - func fetchCardList(type: String, mobile: String) { + private func fetchCardListService(type: String, mobile: String) { service.fetchCardList( type: type, mobile: mobile, - success: {[weak self] in - self?.output?.setModel(with: $0) + success: {[weak self] model in + guard + let typeString = model.type, + let typeInt = Int(typeString), + let type = RechargeType(rawValue: typeInt) + else { + let error = NSError(domain: "Wrong Response", code: 0, message: "Card Types is wrong") + self?.output?.setError(with: error) + return + } + + switch type { + case .regular: self?.output?.setRegularModel(with: model.buttonPrices ?? []) + case .fixed: self?.output?.setFixedModel(with: model.cardInfomations ?? []) + case .dataOnly: self?.output?.setDataOnlyModel(with: model.cardInfomations ?? []) + } }, failure: {[weak self] in self?.output?.setError(with: $0) @@ -39,3 +53,34 @@ extension PhoneCardRechargeInteractor: PhoneCardRechargeInteractorInput { ) } } + +// MARK: PhoneCardRecharge interactor input interface + +extension PhoneCardRechargeInteractor: PhoneCardRechargeInteractorInput { + func fetchCardList(type: RechargeType, mobile: String) { + switch type { + case .regular: + guard let model = regularModel, selectedMobile == mobile else { + selectedMobile = mobile + fetchCardListService(type: type.value, mobile: mobile) + return + } + output?.setRegularModel(with: model) + case .fixed: + guard let model = fixedModel, selectedMobile == mobile else { + selectedMobile = mobile + fetchCardListService(type: type.value, mobile: mobile) + return + } + output?.setFixedModel(with: model) + case .dataOnly: + guard let model = dataOnlyModel, selectedMobile == mobile else { + selectedMobile = mobile + fetchCardListService(type: type.value, mobile: mobile) + return + } + output?.setDataOnlyModel(with: model) + } + + } +} diff --git a/GME Remit/Modules/PowerCallModules/PhoneCardRecharge/Application Logic/Interactor/PhoneCardRechargeInteractorIO.swift b/GME Remit/Modules/PowerCallModules/PhoneCardRecharge/Application Logic/Interactor/PhoneCardRechargeInteractorIO.swift index 9095b5e5..9c2c207d 100644 --- a/GME Remit/Modules/PowerCallModules/PhoneCardRecharge/Application Logic/Interactor/PhoneCardRechargeInteractorIO.swift +++ b/GME Remit/Modules/PowerCallModules/PhoneCardRecharge/Application Logic/Interactor/PhoneCardRechargeInteractorIO.swift @@ -7,10 +7,13 @@ // protocol PhoneCardRechargeInteractorInput: class { - func fetchCardList(type: String, mobile: String) + func fetchCardList(type: RechargeType, mobile: String) } protocol PhoneCardRechargeInteractorOutput: class { - func setModel(with model: CardList) + func setRegularModel(with model: [PriceModel]) + func setFixedModel(with model: [CardInformation]) + func setDataOnlyModel(with model: [CardInformation]) + func setError(with error: Error) } diff --git a/GME Remit/Modules/PowerCallModules/PhoneCardRecharge/User Interface/Presenter/PhoneCardRechargePresenter.swift b/GME Remit/Modules/PowerCallModules/PhoneCardRecharge/User Interface/Presenter/PhoneCardRechargePresenter.swift index a3cba09b..850d438f 100644 --- a/GME Remit/Modules/PowerCallModules/PhoneCardRecharge/User Interface/Presenter/PhoneCardRechargePresenter.swift +++ b/GME Remit/Modules/PowerCallModules/PhoneCardRecharge/User Interface/Presenter/PhoneCardRechargePresenter.swift @@ -9,6 +9,20 @@ import RxSwift 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 { var interactor: PhoneCardRechargeInteractorInput? var wireframe: PhoneCardRechargeWireframeInput? @@ -17,7 +31,7 @@ class PhoneCardRechargePresenter: ViewModelType { let viewWillAppear: Driver let selectedMobile: Driver let contactOpenTap: Driver - let selectedRechargeType: Driver + let selectedRechargeType: Driver let selectedAmountButtonTag: Driver let selectedCarrierType: Driver let selectedCarrierPlan: Driver @@ -38,19 +52,27 @@ class PhoneCardRechargePresenter: ViewModelType { private let errorLinker = PublishSubject() private let isSuccessPayment = PublishSubject() + private let regularModel = BehaviorSubject<[PriceModel]>(value: []) + private let fixedModel = BehaviorSubject<[CardInformation]>(value: []) + private let dataOnlyModel = BehaviorSubject<[CardInformation]>(value: []) + 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?.interactor?.fetchCardList(type: "", mobile: $0) + self?.interactor?.fetchCardList(type: type, mobile: mobile) } }) .disposed(by: disposeBag) let combinedInput = Observable.combineLatest( 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.selectedCarrierPlan.asObservable(), input.selectedDataOnlyType.asObservable() @@ -62,30 +84,19 @@ class PhoneCardRechargePresenter: ViewModelType { case .regular: return amountTag != nil case .fixed: return carrierType != nil && carrierPlan != nil case .dataOnly: return dataOnlyType != nil - case .nil: return false } } input.nextTap .withLatestFrom(combinedInput.asDriverOnErrorJustComplete()) {$1} - .map { (type, amountTag, carrierType, carrierPlan, dataOnlyType) -> RechargeModel? in + .map { (type, regularModel, carrierType, carrierPlan, dataOnlyType) -> RechargeModel? in switch type { 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: break case .dataOnly: break - case .nil: - return nil } return RechargeModel(paymentAmount: "1000") @@ -106,8 +117,19 @@ class PhoneCardRechargePresenter: ViewModelType { // MARK: PhoneCardRecharge interactor output interface 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) + dataOnlyModel.onNext(model) } func setError(with error: Error) { diff --git a/GME Remit/Modules/PowerCallModules/PhoneCardRecharge/User Interface/View/PhoneCardRechargeViewController.swift b/GME Remit/Modules/PowerCallModules/PhoneCardRecharge/User Interface/View/PhoneCardRechargeViewController.swift index 69148d1d..6a356c1f 100644 --- a/GME Remit/Modules/PowerCallModules/PhoneCardRecharge/User Interface/View/PhoneCardRechargeViewController.swift +++ b/GME Remit/Modules/PowerCallModules/PhoneCardRecharge/User Interface/View/PhoneCardRechargeViewController.swift @@ -14,13 +14,6 @@ import ContactsUI class PhoneCardRechargeViewController: UIViewController { - enum RechargeType: Int { - case regular - case fixed - case dataOnly - case `nil` - } - // MARK: Properties var presenter: PhoneCardRechargePresenter! @@ -133,7 +126,7 @@ extension PhoneCardRechargeViewController { .mapToVoid().asDriverOnErrorJustComplete() let selectedRechargeType = typeSegment.rx.selectedSegmentIndex - .map { RechargeType(rawValue: $0) ?? .nil}.asDriverOnErrorJustComplete() + .map { RechargeType(rawValue: $0) ?? .regular}.asDriverOnErrorJustComplete() let selectedCarrierType = carrierTypeTextField.selectedItem.map {$0 as? PaymentServiceType} let selectedCarrierPlan = carrierPlanTextField.selectedItem.map {$0 as? PaymentServiceType} @@ -178,13 +171,13 @@ extension PhoneCardRechargeViewController { } }).disposed(by: disposeBag) - Driver.combineLatest( - output.isEnableNext, - typeSegment.rx.selectedSegmentIndex.map {RechargeType(rawValue: $0) ?? .nil} - .asDriverOnErrorJustComplete() - ) {[weak self] (isEnable, rechargeType) -> Bool in + output.isEnableNext.map {[weak self] isEnable -> Bool in guard let `self` = self else { return false } + guard let rechargeType = RechargeType(rawValue: self.typeSegment.selectedSegmentIndex) else { + return false + } + self.nextButton.backgroundColor = isEnable ? .themeRed : .lightGray switch rechargeType { case .regular: @@ -197,19 +190,14 @@ extension PhoneCardRechargeViewController { } case .dataOnly: self.dataOnlyTypeInfoContainerView.animateHidden(isHidden: !isEnable) - case .nil: - self.regularTypeInfoContainerView.animateHidden(isHidden: true) - self.carrierPlanDetailView.animateHidden(isHidden: true) - self.fixedChargeTypeInfoContainerView.animateHidden(isHidden: true) - self.dataOnlyTypeInfoContainerView.animateHidden(isHidden: true) } return isEnable } .drive(nextButton.rx.isEnabled) .disposed(by: disposeBag) -// + typeSegment.rx.selectedSegmentIndex - .map { RechargeType(rawValue: $0) ?? .nil } + .map { RechargeType(rawValue: $0) ?? .regular } .bind { [weak self] in guard let `self` = self else { return } @@ -226,10 +214,6 @@ extension PhoneCardRechargeViewController { self.regularTypeContainerView.isHidden = true self.fixedChargeTypeContainerView.isHidden = true self.dataOnlyTypeContainerView.animateHidden(isHidden: false) - case .nil: - self.regularTypeContainerView.isHidden = true - self.fixedChargeTypeContainerView.isHidden = true - self.dataOnlyTypeContainerView.isHidden = true } } .disposed(by: disposeBag)