Browse Source

Separated Fetch CardList

pull/1/head
InKwon James Kim 5 years ago
parent
commit
f74905e434
  1. 4
      GME Remit/Modules/Home/User Interface/View/Cell/HomeCollectionTableViewCell.swift
  2. 61
      GME Remit/Modules/PowerCallModules/PhoneCardRecharge/Application Logic/Interactor/PhoneCardRechargeInteractor.swift
  3. 7
      GME Remit/Modules/PowerCallModules/PhoneCardRecharge/Application Logic/Interactor/PhoneCardRechargeInteractorIO.swift
  4. 62
      GME Remit/Modules/PowerCallModules/PhoneCardRecharge/User Interface/Presenter/PhoneCardRechargePresenter.swift
  5. 32
      GME Remit/Modules/PowerCallModules/PhoneCardRecharge/User Interface/View/PhoneCardRechargeViewController.swift

4
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
}

61
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)
}
}
}

7
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)
}

62
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<Void>
let selectedMobile: Driver<String>
let contactOpenTap: Driver<Void>
let selectedRechargeType: Driver<PhoneCardRechargeViewController.RechargeType>
let selectedRechargeType: Driver<RechargeType>
let selectedAmountButtonTag: Driver<Int?>
let selectedCarrierType: Driver<PaymentServiceType?>
let selectedCarrierPlan: Driver<PaymentServiceType?>
@ -38,19 +52,27 @@ class PhoneCardRechargePresenter: ViewModelType {
private let errorLinker = PublishSubject<Error>()
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 {
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) {

32
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)

Loading…
Cancel
Save