diff --git a/GME Remit.xcodeproj/project.pbxproj b/GME Remit.xcodeproj/project.pbxproj index 213f08d5..6b476bcc 100644 --- a/GME Remit.xcodeproj/project.pbxproj +++ b/GME Remit.xcodeproj/project.pbxproj @@ -290,6 +290,7 @@ 734BF6882353F7D8004E8D60 /* PhoneCardRechargeWireframeInputOutput.swift in Sources */ = {isa = PBXBuildFile; fileRef = 734BF67E2353F7D8004E8D60 /* PhoneCardRechargeWireframeInputOutput.swift */; }; 734BF6892353F7D8004E8D60 /* PhoneCardRechargeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 734BF6802353F7D8004E8D60 /* PhoneCardRechargeViewController.swift */; }; 734BF68A2353F7D8004E8D60 /* PhoneCardRecharge.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 734BF6812353F7D8004E8D60 /* PhoneCardRecharge.storyboard */; }; + 734DD31A2366881600BFA7EE /* VerificationAndBuy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 734DD3192366881600BFA7EE /* VerificationAndBuy.swift */; }; 73538B2222EFC5FA00188CDD /* CommonServiceType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73538B2122EFC5FA00188CDD /* CommonServiceType.swift */; }; 7366BECC235D326C00A8AE7C /* CardList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7366BECB235D326C00A8AE7C /* CardList.swift */; }; 7366BECE235D331B00A8AE7C /* PriceModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7366BECD235D331B00A8AE7C /* PriceModel.swift */; }; @@ -2558,6 +2559,7 @@ 734BF67E2353F7D8004E8D60 /* PhoneCardRechargeWireframeInputOutput.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PhoneCardRechargeWireframeInputOutput.swift; sourceTree = ""; }; 734BF6802353F7D8004E8D60 /* PhoneCardRechargeViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PhoneCardRechargeViewController.swift; sourceTree = ""; }; 734BF6812353F7D8004E8D60 /* PhoneCardRecharge.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = PhoneCardRecharge.storyboard; sourceTree = ""; }; + 734DD3192366881600BFA7EE /* VerificationAndBuy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VerificationAndBuy.swift; sourceTree = ""; }; 73538B2122EFC5FA00188CDD /* CommonServiceType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommonServiceType.swift; sourceTree = ""; }; 7366BECB235D326C00A8AE7C /* CardList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CardList.swift; sourceTree = ""; }; 7366BECD235D331B00A8AE7C /* PriceModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PriceModel.swift; sourceTree = ""; }; @@ -6133,6 +6135,7 @@ isa = PBXGroup; children = ( 733E8F76235804810050E499 /* CreditCardReceipt.swift */, + 734DD3192366881600BFA7EE /* VerificationAndBuy.swift */, ); path = Model; sourceTree = ""; @@ -14539,6 +14542,7 @@ 73B6D68E2306413100A0CB6E /* RecipientCommonType.swift in Sources */, D962231E212C126500B7A115 /* ExchangeModel.swift in Sources */, D903113D214786EA00AD5BA9 /* ForgotPasswordServiceType.swift in Sources */, + 734DD31A2366881600BFA7EE /* VerificationAndBuy.swift in Sources */, D9B39677214F7DDC0072A9B8 /* ImageCroper.swift in Sources */, 730D78B9227A94F2007E517E /* SearchAddressInteractor.swift in Sources */, D923EBBB215C7E67008A3026 /* HomeCollectionModel.swift in Sources */, diff --git a/GME Remit/APIs/Router/APIRouter.swift b/GME Remit/APIs/Router/APIRouter.swift index fdcb41af..4cdf80b1 100644 --- a/GME Remit/APIs/Router/APIRouter.swift +++ b/GME Remit/APIs/Router/APIRouter.swift @@ -54,7 +54,8 @@ enum APIRouter { // MARK: - Recharge Prepiad Phone case fetchCardList(type: String, mobile: String) - case verificationAndBuy + case verificationAndBuy(model: RechargeModel) + case verifyPassword(password: String) } // MARK: - Request @@ -449,6 +450,8 @@ extension APIRouter { return "\(baseUrl)/powerCall/GetCardList/" case .verificationAndBuy: return "\(baseUrl)/powerCall/VerificationAndBuy/" + case .verifyPassword: + return "\(baseUrl)/powerCall/VerificationAndBuy/" } } } @@ -517,6 +520,8 @@ extension APIRouter { return .post case .verificationAndBuy: return .post + case .verifyPassword: + return .post } } @@ -724,18 +729,23 @@ extension APIRouter { "getcardType": type, "phoneNo": mobile ] - case .verificationAndBuy: + case .verificationAndBuy(let model): + let senderID = GMEDB.shared.user.string(.senderId) ?? "" return [ - "BuyType" : "1", - "CustomerId" : "40154", - "ReceiptId" : "qwkeljklal", - "OrderNo" : "gmesub_000000002", - "ChargeType": "PPS_01", - "PhoneNo" : "01059394397 ", - "Price" : "10000", - "UseWalletPrice" : "0", + "BuyType" : model.type, + "CustomerId" : senderID, + "ReceiptId" : model.receiptID ?? "", + "OrderNo" : model.orderNo ?? "", + "ChargeType": model.chargeType, + "PhoneNo" : model.mobile, + "ProductPrice" : model.productPrice ?? "", + "UseBalancePrice" : model.useBalancePrice ?? "" ] + case .verifyPassword(let password): + return [ + "password": password + ] default: return nil } diff --git a/GME Remit/Modules/PowerCallModules/PhoneCardRecharge/Application Logic/Model/RechargeModel.swift b/GME Remit/Modules/PowerCallModules/PhoneCardRecharge/Application Logic/Model/RechargeModel.swift index 9cc42d66..74e7356c 100644 --- a/GME Remit/Modules/PowerCallModules/PhoneCardRecharge/Application Logic/Model/RechargeModel.swift +++ b/GME Remit/Modules/PowerCallModules/PhoneCardRecharge/Application Logic/Model/RechargeModel.swift @@ -7,5 +7,37 @@ // struct RechargeModel { - let paymentAmount: String + let type: String + let chargeType: String + let mobile: String + var productPrice: String? + var useBalancePrice: String? + var receiptID: String? + var orderNo: String? + var password: String? + + init( + type: String, + chargeType: String, + mobile: String, + price: String + ) { + self.type = type + self.chargeType = chargeType + self.mobile = mobile + self.productPrice = price + } + + mutating func addReceipt(_ data: [String: Any]?) { + self.orderNo = data?["order_id"] as? String ?? "" + self.receiptID = data?["receipt_id"] as? String ?? "" + } + + mutating func addUseBalance(_ balance: String) { + self.useBalancePrice = balance + } + + mutating func addPassword(_ password: String) { + self.password = password + } } 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 e846f4df..cd117062 100644 --- a/GME Remit/Modules/PowerCallModules/PhoneCardRecharge/User Interface/Presenter/PhoneCardRechargePresenter.swift +++ b/GME Remit/Modules/PowerCallModules/PhoneCardRecharge/User Interface/Presenter/PhoneCardRechargePresenter.swift @@ -59,7 +59,7 @@ class PhoneCardRechargePresenter: ViewModelType { let isError: Driver let isProgress: Driver let isEnableNext: Driver - let isSuccessPayment: Driver + let isSuccessPayment: Driver let regularModel: Driver<[PriceModel]> let fixedModel: Driver<[MainCardInformation]> let carrierPlanModel: Driver<[CardInformation]> @@ -71,7 +71,7 @@ class PhoneCardRechargePresenter: ViewModelType { private let progressLinker = PublishSubject() private let errorLinker = PublishSubject() - private let isSuccessPayment = PublishSubject() + private let isSuccessPayment = PublishSubject() private let regularModel = BehaviorSubject<[PriceModel]>(value: []) private let fixedModel = BehaviorSubject<[MainCardInformation]>(value: []) @@ -88,6 +88,7 @@ class PhoneCardRechargePresenter: ViewModelType { .disposed(by: disposeBag) let combinedInput = Observable.combineLatest( + input.selectedMobile.asObservable(), input.selectedRechargeType.asObservable(), input.selectedAmountButtonTag.asObservable() .withLatestFrom(regularModel) { tag, model -> PriceModel? in @@ -103,7 +104,7 @@ class PhoneCardRechargePresenter: ViewModelType { let detailCarrierPlanModel = input.selectedCarrierPlan.map { $0?.planInfo } let isEnableNext = combinedInput - .map { type, priceModel, carrierType, carrierPlan, dataOnlyType -> Bool in + .map { _, type, priceModel, carrierType, carrierPlan, dataOnlyType -> Bool in switch type { case .regular: return priceModel != nil case .fixed: return carrierType != nil && carrierPlan != nil @@ -113,11 +114,29 @@ class PhoneCardRechargePresenter: ViewModelType { input.nextTap .withLatestFrom(combinedInput.asDriverOnErrorJustComplete()) {$1} - .map { (type, priceModel, _, carrierPlan, dataOnlyType) -> RechargeModel? in + .map { ( mobile, type, priceModel, _, carrierPlan, dataOnlyType) -> RechargeModel? in switch type { - case .regular: return RechargeModel(paymentAmount: priceModel?.price ?? "0") - case .fixed: return RechargeModel(paymentAmount: carrierPlan?.facePrice ?? "0") - case .dataOnly: return RechargeModel(paymentAmount: dataOnlyType?.facePrice ?? "0") + case .regular: + return RechargeModel( + type: type.value, + chargeType: "", + mobile: mobile, + price: priceModel?.price ?? "0" + ) + case .fixed: + return RechargeModel( + type: type.value, + chargeType: carrierPlan?.cardType ?? "", + mobile: mobile, + price: carrierPlan?.facePrice ?? "0" + ) + case .dataOnly: + return RechargeModel( + type: type.value, + chargeType: dataOnlyType?.cardCode ?? "", + mobile: mobile, + price: dataOnlyType?.facePrice ?? "0" + ) } }.drive(onNext: { guard let model = $0 else { return } @@ -166,7 +185,7 @@ extension PhoneCardRechargePresenter: PhoneCardRechargeWireframeOutput { } extension PhoneCardRechargePresenter: RechargePayementDelegate { - func rechargePayment(_ viewController: RechargePaymentViewController, didComplete data: CreditCardReceipt) { + func rechargePayment(_ viewController: UIViewController, didComplete data: VerificationAndBuy) { isSuccessPayment.onNext(data) } } 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 6f1f4b03..c9f80b10 100644 --- a/GME Remit/Modules/PowerCallModules/PhoneCardRecharge/User Interface/View/PhoneCardRechargeViewController.swift +++ b/GME Remit/Modules/PowerCallModules/PhoneCardRecharge/User Interface/View/PhoneCardRechargeViewController.swift @@ -180,16 +180,8 @@ extension PhoneCardRechargeViewController { output.isSuccessPayment .drive( onNext: {[weak self] receipt in - self?.alertWithOk( - type: .normal, - message: "You will receive message about recharge result through SMS.", - title: "Payment Request completed", - okTitle: "Ok" - ) { - print(receipt) - // TODO: Receipt send to Server - self?.navigationController?.popToRootViewController(animated: true) - } + print("receipt: \(receipt)") + self?.navigationController?.popToRootViewController(animated: true) }).disposed(by: disposeBag) output.isEnableNext diff --git a/GME Remit/Modules/PowerCallModules/PhoneCardRecharge/User Interface/Wireframe/PhoneCardRechargeWireframe.swift b/GME Remit/Modules/PowerCallModules/PhoneCardRecharge/User Interface/Wireframe/PhoneCardRechargeWireframe.swift index 37d702db..6f603cb2 100644 --- a/GME Remit/Modules/PowerCallModules/PhoneCardRecharge/User Interface/Wireframe/PhoneCardRechargeWireframe.swift +++ b/GME Remit/Modules/PowerCallModules/PhoneCardRecharge/User Interface/Wireframe/PhoneCardRechargeWireframe.swift @@ -14,7 +14,7 @@ class PhoneCardRechargeWireframe { } extension PhoneCardRechargeWireframe: PhoneCardRechargeWireframeInput { - + var storyboardName: String {return "PhoneCardRecharge"} func getMainView() -> UIViewController { diff --git a/GME Remit/Modules/PowerCallModules/RechargePayment/Application Logic/Interactor/RechargePaymentInteractor.swift b/GME Remit/Modules/PowerCallModules/RechargePayment/Application Logic/Interactor/RechargePaymentInteractor.swift index 5d282d2b..f1744b22 100644 --- a/GME Remit/Modules/PowerCallModules/RechargePayment/Application Logic/Interactor/RechargePaymentInteractor.swift +++ b/GME Remit/Modules/PowerCallModules/RechargePayment/Application Logic/Interactor/RechargePaymentInteractor.swift @@ -30,4 +30,30 @@ extension RechargePaymentInteractor: RechargePaymentInteractorInput { func fetchModel() { output?.setModel(with: model) } + + func verify(of password: String) { + service.verify( + of: password, + success: { [weak self] in + self?.output?.setSuccess() + }, + failure: { [weak self] in + self?.output?.setError(with: $0) + } + ) + } + + func submit(with model: RechargeModel) { + print("model: \(model)") + + service.submit( + of: model, + success: { [weak self] in + self?.output?.setSubmitSuccess(with: $0) + }, + failure: {[weak self] in + self?.output?.setError(with: $0) + } + ) + } } diff --git a/GME Remit/Modules/PowerCallModules/RechargePayment/Application Logic/Interactor/RechargePaymentInteractorIO.swift b/GME Remit/Modules/PowerCallModules/RechargePayment/Application Logic/Interactor/RechargePaymentInteractorIO.swift index b7442280..cbe6bf1e 100644 --- a/GME Remit/Modules/PowerCallModules/RechargePayment/Application Logic/Interactor/RechargePaymentInteractorIO.swift +++ b/GME Remit/Modules/PowerCallModules/RechargePayment/Application Logic/Interactor/RechargePaymentInteractorIO.swift @@ -8,8 +8,13 @@ protocol RechargePaymentInteractorInput: class { func fetchModel() + func verify(of password: String) + func submit(with model: RechargeModel) } protocol RechargePaymentInteractorOutput: class { func setModel(with model: RechargeModel?) + func setSubmitSuccess(with model: VerificationAndBuy) + func setSuccess() + func setError(with error: Error) } diff --git a/GME Remit/Modules/PowerCallModules/RechargePayment/Application Logic/Model/CreditCardReceipt.swift b/GME Remit/Modules/PowerCallModules/RechargePayment/Application Logic/Model/CreditCardReceipt.swift index c71aaebf..c76ac963 100644 --- a/GME Remit/Modules/PowerCallModules/RechargePayment/Application Logic/Model/CreditCardReceipt.swift +++ b/GME Remit/Modules/PowerCallModules/RechargePayment/Application Logic/Model/CreditCardReceipt.swift @@ -7,55 +7,68 @@ // struct CreditCardReceipt { - let pgName: String - let taxFree: String - let purchasedAt: String +// let pgName: String +// let taxFree: String +// let purchasedAt: String let price: String - let cardOtherPayType: String - let amount: String - let params: [String: Any]? - let url: String - let cardQuota: String - let status: String +// let cardOtherPayType: String +// let amount: String +// let params: [String: Any]? +// let url: String +// let cardQuota: String +// let status: String let orderID: String - let paymentGroup: String - let requestedAt: String - let itemName: String - let paymentName: String - let methodName: String - let cardNo: String - let pg: String - let cardName: String - let paymentGroupName: String - let cardCode: String - let method: String - let action: String +// let paymentGroup: String +// let requestedAt: String +// let itemName: String +// let paymentName: String +// let methodName: String +// let cardNo: String +// let pg: String +// let cardName: String +// let paymentGroupName: String +// let cardCode: String +// let method: String +// let action: String let receiptID: String + let password: String - init(data: [String: Any]) { - pgName = data["pg_name"] as? String ?? "" - taxFree = data["tax_free"] as? String ?? "" - purchasedAt = data["purchased_at"] as? String ?? "" - price = data["price"] as? String ?? "" - cardOtherPayType = data["card_other_pay_type"] as? String ?? "" - amount = data["amount"] as? String ?? "" - params = data["params"] as? [String: Any] - url = data["url"] as? String ?? "" - cardQuota = data["card_quota"] as? String ?? "" - status = data["status"] as? String ?? "" - orderID = data["order_id"] as? String ?? "" - paymentGroup = data["payment_group"] as? String ?? "" - requestedAt = data["requested_at"] as? String ?? "" - itemName = data["item_name"] as? String ?? "" - paymentName = data["payment_name"] as? String ?? "" - methodName = data["method_name"] as? String ?? "" - cardNo = data["card_no"] as? String ?? "" - pg = data["pg"] as? String ?? "" - cardName = data["card_name"] as? String ?? "" - paymentGroupName = data["payment_group_name"] as? String ?? "" - cardCode = data["card_code"] as? String ?? "" - method = data["method"] as? String ?? "" - action = data["action"] as? String ?? "" - receiptID = data["receipt_id"] as? String ?? "" + init(data: [String: Any], password: String) { +// "BuyType" : "1", +// "CustomerId" : "40154", +// "ReceiptId" : "qwkeljklal", +// "OrderNo" : "gmesub_000000002", +// "ChargeType": "", +// "PhoneNo" : "01059394397 ", +// "Price" : "10000", +// "UseWalletPrice" : "0", +// "PassWord" : "123" +// pgName = data["pg_name"] as? String ?? "" +// taxFree = data["tax_free"] as? String ?? "" +// purchasedAt = data["purchased_at"] as? String ?? "" + price = data["price"] as? String ?? "" // +// cardOtherPayType = data["card_other_pay_type"] as? String ?? "" +// amount = data["amount"] as? String ?? "" +// params = data["params"] as? [String: Any] +// url = data["url"] as? String ?? "" +// cardQuota = data["card_quota"] as? String ?? "" +// status = data["status"] as? String ?? "" + orderID = data["order_id"] as? String ?? "" // +// paymentGroup = data["payment_group"] as? String ?? "" +// requestedAt = data["requested_at"] as? String ?? "" +// itemName = data["item_name"] as? String ?? "" +// paymentName = data["payment_name"] as? String ?? "" +// methodName = data["method_name"] as? String ?? "" +// cardNo = data["card_no"] as? String ?? "" +// pg = data["pg"] as? String ?? "" +// cardName = data["card_name"] as? String ?? "" +// paymentGroupName = data["payment_group_name"] as? String ?? "" +// cardCode = data["card_code"] as? String ?? "" +// method = data["method"] as? String ?? "" +// action = data["action"] as? String ?? "" + receiptID = data["receipt_id"] as? String ?? "" // + self.password = password } + +// func add(at model:) } diff --git a/GME Remit/Modules/PowerCallModules/RechargePayment/Application Logic/Model/VerificationAndBuy.swift b/GME Remit/Modules/PowerCallModules/RechargePayment/Application Logic/Model/VerificationAndBuy.swift new file mode 100644 index 00000000..64b222e1 --- /dev/null +++ b/GME Remit/Modules/PowerCallModules/RechargePayment/Application Logic/Model/VerificationAndBuy.swift @@ -0,0 +1,39 @@ +// +// VerificationAndBuy.swift +// GME Remit +// +// Created by InKwon James Kim on 2019/10/28. +// Copyright © 2019 Gobal Money Express Co. Ltd. All rights reserved. +// + +import ObjectMapper + +struct VerificationAndBuy: Mappable { + var result: String? + var cause: String? + var currentMoney: String? + var successCnt: String? + var saleNo: String? + var saleType: String? + var cardNo: String? + var cardNo2: String? + var cardType: String? + var totalPayDeposit: String? + var totalSalePrice: String? + + init?(map: Map) { } + + mutating func mapping(map: Map) { + result <- map["result"] + cause <- map["cause"] + currentMoney <- map["current_money"] + successCnt <- map["success_cnt"] + saleNo <- map["sale_no"] + saleType <- map["sale_type"] + cardNo <- map["card_no"] + cardNo2 <- map["card_no2"] + cardType <- map["card_type"] + totalPayDeposit <- map["total_pay_deposit"] + totalSalePrice <- map["total_sale_price"] + } +} diff --git a/GME Remit/Modules/PowerCallModules/RechargePayment/Application Logic/Service/RechargePaymentService.swift b/GME Remit/Modules/PowerCallModules/RechargePayment/Application Logic/Service/RechargePaymentService.swift index 09fd7ee5..ad9907e7 100644 --- a/GME Remit/Modules/PowerCallModules/RechargePayment/Application Logic/Service/RechargePaymentService.swift +++ b/GME Remit/Modules/PowerCallModules/RechargePayment/Application Logic/Service/RechargePaymentService.swift @@ -9,5 +9,51 @@ import Foundation class RechargePaymentService: RechargePaymentServiceType { + func verify(of password: String, success: @escaping () -> Void, failure: @escaping (Error) -> Void) { + //FIXME: Test +// APIRouter.verifyPassword(password: password) +// .json(success: success, failure: failure) + success() + } + func submit(of model: RechargeModel, success: @escaping (VerificationAndBuy) -> Void, failure: @escaping (Error) -> Void) { + //FIXME: Test + + let text = + """ +{ + "ErrorCode": "0", + "Msg": "Success", + "Id": "", + "Extra": "", + "Extra2": "", + "Data": { + "result": "0000", + "cause": "1000", + "current_money": "2000", + "success_cnt": "1", + "sale_no": "gmesub_000000002", + "sale_type": "3", + "card_no": "26866721587", + "card_no2": "", + "card_type": "PPS_06", + "total_pay_deposit": "9000", + "total_sale_price": "10000" + } +} +""" + guard + let json = ResponseContainerObject(JSONString: text), + let data = json.data else { + let error = NSError(domain: "Test Error", code: 0, message: "Test JSON Error") + failure(error) + return + } + + success(data) +// APIRouter.verificationAndBuy(model: model).json( +// success: success, +// failure: failure +// ) + } } diff --git a/GME Remit/Modules/PowerCallModules/RechargePayment/Application Logic/Service/RechargePaymentServiceType.swift b/GME Remit/Modules/PowerCallModules/RechargePayment/Application Logic/Service/RechargePaymentServiceType.swift index ce552cd1..bc127ee4 100644 --- a/GME Remit/Modules/PowerCallModules/RechargePayment/Application Logic/Service/RechargePaymentServiceType.swift +++ b/GME Remit/Modules/PowerCallModules/RechargePayment/Application Logic/Service/RechargePaymentServiceType.swift @@ -7,5 +7,11 @@ // protocol RechargePaymentServiceType: class { + func verify(of password: String, success: @escaping () -> Void, failure: @escaping (Error) -> Void) + func submit( + of model: RechargeModel, + success: @escaping (VerificationAndBuy) -> Void, + failure: @escaping (Error) -> Void + ) } diff --git a/GME Remit/Modules/PowerCallModules/RechargePayment/User Interface/Presenter/RechargePaymentPresenter.swift b/GME Remit/Modules/PowerCallModules/RechargePayment/User Interface/Presenter/RechargePaymentPresenter.swift index 2263c3c3..047c5ad5 100644 --- a/GME Remit/Modules/PowerCallModules/RechargePayment/User Interface/Presenter/RechargePaymentPresenter.swift +++ b/GME Remit/Modules/PowerCallModules/RechargePayment/User Interface/Presenter/RechargePaymentPresenter.swift @@ -13,21 +13,24 @@ class RechargePaymentPresenter: ViewModelType { var interactor: RechargePaymentInteractorInput? var wireframe: RechargePaymentWireframeInput? - private var model = BehaviorSubject(value: nil) - struct Input { let viewWillAppear: Driver let availableBalance: Driver let useBalance: Driver let rechargeSuccess: Driver + let password: Driver + let submit: Driver<[String: Any]?> } struct Output { let isError: Driver let isProgress: Driver + let rechargeModel: Driver let paymentAmount: Driver let isAvailableUseBalance: Driver let finalPaymentAmount: Driver + let verifySuccess: Driver + let submitSuccess: Driver } private let disposeBag = DisposeBag() @@ -35,6 +38,10 @@ class RechargePaymentPresenter: ViewModelType { private let progressLinker = PublishSubject() private let errorLinker = PublishSubject() + private var model = BehaviorSubject(value: nil) + private var verifySuccess = PublishSubject() + private var submitSuccess = PublishSubject() + func transform(input: Input) -> Output { input.viewWillAppear.withLatestFrom(model.asDriverOnErrorJustComplete()) {$1} @@ -42,7 +49,6 @@ class RechargePaymentPresenter: ViewModelType { if model == nil { self?.interactor?.fetchModel() } - }).disposed(by: disposeBag) input.rechargeSuccess.withLatestFrom(model.asDriverOnErrorJustComplete()) {($0, $1)} @@ -51,6 +57,30 @@ class RechargePaymentPresenter: ViewModelType { self?.wireframe?.goReceipt(receiptModel: receipt, rechargeModel: model) }).disposed(by: disposeBag) + input.password.drive(onNext: {[weak self] in + self?.progressLinker.onNext(true) + self?.interactor?.verify(of: $0) + }).disposed(by: disposeBag) + + let requestModel = Driver.combineLatest( + model.asDriverOnErrorJustComplete(), + input.useBalance.map {$0.currencyToDecimal()}, + input.password + ).map { (model, balance, password) -> RechargeModel? in + var addedModel = model + addedModel?.addPassword(password) + addedModel?.addUseBalance(balance) + return addedModel + } + + input.submit.withLatestFrom(requestModel) {($0, $1)} + .drive(onNext: {[weak self] (receipt, model) in + guard var model = model else { return } + model.addReceipt(receipt) + + self?.interactor?.submit(with: model) + }).disposed(by: disposeBag) + let mergeAvailableBalanceAndUseBalance = Driver .combineLatest( input.availableBalance.map {Int($0.stringRemovingComma()) ?? 0}, @@ -62,7 +92,7 @@ class RechargePaymentPresenter: ViewModelType { .debounce(0.2) .distinctUntilChanged() .withLatestFrom( - model.asDriverOnErrorJustComplete().map { Int($0?.paymentAmount ?? "0") ?? 0} + model.asDriverOnErrorJustComplete().map { Int($0?.productPrice ?? "0") ?? 0} ) { ($0, $1) } .map { (balance, paymentAmount) -> String in guard let balance = balance else { return "\(paymentAmount)" } @@ -73,7 +103,7 @@ class RechargePaymentPresenter: ViewModelType { let isAvailableUseBalance = mergeAvailableBalanceAndUseBalance .withLatestFrom( - model.asDriverOnErrorJustComplete().map { Int($0?.paymentAmount ?? "0") ?? 0} + model.asDriverOnErrorJustComplete().map { Int($0?.productPrice ?? "0") ?? 0} ) { ($0, $1) } .map { (balance, paymentAmount) -> Bool in guard let balance = balance else { return false } @@ -85,18 +115,35 @@ class RechargePaymentPresenter: ViewModelType { return Output( isError: errorLinker.asDriverOnErrorJustComplete(), isProgress: progressLinker.asDriverOnErrorJustComplete(), - paymentAmount: model.map {$0?.paymentAmount ?? "0"}.asDriverOnErrorJustComplete(), + rechargeModel: model.asDriverOnErrorJustComplete(), + paymentAmount: model.map {$0?.productPrice ?? "0"}.asDriverOnErrorJustComplete(), isAvailableUseBalance: isAvailableUseBalance, - finalPaymentAmount: finalPaymentAmount + finalPaymentAmount: finalPaymentAmount, + verifySuccess: verifySuccess.asDriverOnErrorJustComplete(), + submitSuccess: submitSuccess.asDriverOnErrorJustComplete() ) } } // MARK: RechargePayment interactor output interface extension RechargePaymentPresenter: RechargePaymentInteractorOutput { + func setSuccess() { + progressLinker.onNext(false) + verifySuccess.onNext(()) + } + + func setError(with error: Error) { + progressLinker.onNext(false) + errorLinker.onNext(error) + } + func setModel(with model: RechargeModel?) { self.model.onNext(model) } + + func setSubmitSuccess(with model: VerificationAndBuy) { + submitSuccess.onNext(model) + } } // MARK: RechargePayment wireframe output interface diff --git a/GME Remit/Modules/PowerCallModules/RechargePayment/User Interface/View/RechargePayment.storyboard b/GME Remit/Modules/PowerCallModules/RechargePayment/User Interface/View/RechargePayment.storyboard index f9d92f40..f7fc638d 100644 --- a/GME Remit/Modules/PowerCallModules/RechargePayment/User Interface/View/RechargePayment.storyboard +++ b/GME Remit/Modules/PowerCallModules/RechargePayment/User Interface/View/RechargePayment.storyboard @@ -29,7 +29,7 @@ - + @@ -65,13 +65,13 @@ - + - + - + @@ -119,10 +119,10 @@ - + - + @@ -209,8 +209,31 @@ + + + + + + +