Browse Source

Link Test API

pull/1/head
InKwon James Kim 5 years ago
parent
commit
ee2fc41136
  1. 8
      GME Remit.xcodeproj/project.pbxproj
  2. 4
      GME Remit/Extensions/String+Ext.swift
  3. 19
      GME Remit/Modules/PowerCallModules/PhoneCardRecharge/Application Logic/Interactor/PhoneCardRechargeInteractor.swift
  4. 4
      GME Remit/Modules/PowerCallModules/PhoneCardRecharge/Application Logic/Interactor/PhoneCardRechargeInteractorIO.swift
  5. 8
      GME Remit/Modules/PowerCallModules/PhoneCardRecharge/Application Logic/Model/CardList.swift
  6. 1
      GME Remit/Modules/PowerCallModules/PhoneCardRecharge/Application Logic/Model/CountryPriceModel.swift
  7. 65
      GME Remit/Modules/PowerCallModules/PhoneCardRecharge/User Interface/Presenter/PhoneCardRechargePresenter.swift
  8. 263
      GME Remit/Modules/PowerCallModules/PhoneCardRecharge/User Interface/View/PhoneCardRecharge.storyboard
  9. 151
      GME Remit/Modules/PowerCallModules/PhoneCardRecharge/User Interface/View/PhoneCardRechargeViewController.swift
  10. 5
      GME Remit/Supported Files/Info.plist
  11. 19
      GME Remit/Utilities/CustomUI/ValidationTextField.swift
  12. 8
      GME Remit/Utilities/TablePresenter/Application Logic/Model/TablePresenterProtocol.swift

8
GME Remit.xcodeproj/project.pbxproj

@ -307,6 +307,8 @@
736A8C492277EB2A00337A50 /* BiometricNotificationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 736A8C3E2277EB2900337A50 /* BiometricNotificationViewController.swift */; };
736A8C4A2277EB2A00337A50 /* BiometricNotificationViewInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 736A8C3F2277EB2900337A50 /* BiometricNotificationViewInterface.swift */; };
736E321A230A3CC1005799AA /* UIDevice+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 736E3219230A3CC1005799AA /* UIDevice+Ext.swift */; };
7372430C235E961100FA47DD /* MainCardInformation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7372430B235E961100FA47DD /* MainCardInformation.swift */; };
7372430E235EBABE00FA47DD /* DetailPlanInformation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7372430D235EBABE00FA47DD /* DetailPlanInformation.swift */; };
7383F43622DEB864003D6393 /* GMEDB.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7383F43522DEB864003D6393 /* GMEDB.swift */; };
7383F43822DEB87D003D6393 /* DatabaseTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7383F43722DEB87D003D6393 /* DatabaseTest.swift */; };
7383F43E22DF15B8003D6393 /* UserDefaultsWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7383F43D22DF15B8003D6393 /* UserDefaultsWrapper.swift */; };
@ -2573,6 +2575,8 @@
736A8C3E2277EB2900337A50 /* BiometricNotificationViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BiometricNotificationViewController.swift; sourceTree = "<group>"; };
736A8C3F2277EB2900337A50 /* BiometricNotificationViewInterface.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BiometricNotificationViewInterface.swift; sourceTree = "<group>"; };
736E3219230A3CC1005799AA /* UIDevice+Ext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIDevice+Ext.swift"; sourceTree = "<group>"; };
7372430B235E961100FA47DD /* MainCardInformation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainCardInformation.swift; sourceTree = "<group>"; };
7372430D235EBABE00FA47DD /* DetailPlanInformation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailPlanInformation.swift; sourceTree = "<group>"; };
7383F43522DEB864003D6393 /* GMEDB.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GMEDB.swift; sourceTree = "<group>"; };
7383F43722DEB87D003D6393 /* DatabaseTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DatabaseTest.swift; sourceTree = "<group>"; };
7383F43D22DF15B8003D6393 /* UserDefaultsWrapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserDefaultsWrapper.swift; sourceTree = "<group>"; };
@ -6414,6 +6418,8 @@
7366BECD235D331B00A8AE7C /* PriceModel.swift */,
7366BECF235D33A600A8AE7C /* CountryPriceModel.swift */,
7366BED1235D343100A8AE7C /* CardInformation.swift */,
7372430B235E961100FA47DD /* MainCardInformation.swift */,
7372430D235EBABE00FA47DD /* DetailPlanInformation.swift */,
);
path = Model;
sourceTree = "<group>";
@ -14286,6 +14292,7 @@
D96BD1212164828D00DFE7D8 /* WalletStatement.swift in Sources */,
04498A722039416E00AC4D99 /* SettingViewController.swift in Sources */,
BEF000C7226757D600AB5663 /* SecureKeypad.swift in Sources */,
7372430C235E961100FA47DD /* MainCardInformation.swift in Sources */,
D9DAFE27213530A800483E71 /* PaymentModeRecipientViewModel.swift in Sources */,
731154CA227BF4CA00FEBF7F /* Redeem.swift in Sources */,
73BCCDD2228993040057B161 /* RewardGroupInteractor.swift in Sources */,
@ -14740,6 +14747,7 @@
045976B221A3D8F30001E92A /* AutoRefundsViewController.swift in Sources */,
733A3B9F23554DAF00E6B87E /* RechargePaymentViewController.swift in Sources */,
734BF6842353F7D8004E8D60 /* PhoneCardRechargeInteractor.swift in Sources */,
7372430E235EBABE00FA47DD /* DetailPlanInformation.swift in Sources */,
043770EF21AD04240005B22D /* PennyTestViewInterface.swift in Sources */,
73071AC62296CF9B008840FD /* HotLineServiceType.swift in Sources */,
734BF6852353F7D8004E8D60 /* PhoneCardRechargeInteractorIO.swift in Sources */,

4
GME Remit/Extensions/String+Ext.swift

@ -15,8 +15,8 @@ enum CurrencyType {
var front: String {
switch self {
case .usd: return "USD "
case .krw: return "KRW "
case .usd: return "$ "
case .krw: return " "
case .nil: return ""
}
}

19
GME Remit/Modules/PowerCallModules/PhoneCardRecharge/Application Logic/Interactor/PhoneCardRechargeInteractor.swift

@ -16,8 +16,8 @@ class PhoneCardRechargeInteractor {
private let service: PhoneCardRechargeServiceType
private var regularModel: [PriceModel]?
private var fixedModel: [CardInformation]?
private var dataOnlyModel: [CardInformation]?
private var fixedModel: [MainCardInformation]?
private var dataOnlyModel: [MainCardInformation]?
private var selectedMobile: String?
// MARK: Initialization
@ -33,8 +33,7 @@ class PhoneCardRechargeInteractor {
success: {[weak self] model in
guard
let typeString = model.type,
let typeInt = Int(typeString),
let type = RechargeType(rawValue: typeInt)
let type = RechargeType(value: typeString)
else {
let error = NSError(domain: "Wrong Response", code: 0, message: "Card Types is wrong")
self?.output?.setError(with: error)
@ -42,9 +41,15 @@ class PhoneCardRechargeInteractor {
}
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 ?? [])
case .regular:
self?.regularModel = model.buttonPrices
self?.output?.setRegularModel(with: model.buttonPrices ?? [])
case .fixed:
self?.fixedModel = model.cardInfomations
self?.output?.setFixedModel(with: model.cardInfomations ?? [])
case .dataOnly:
self?.dataOnlyModel = model.cardInfomations
self?.output?.setDataOnlyModel(with: model.cardInfomations ?? [])
}
},
failure: {[weak self] in

4
GME Remit/Modules/PowerCallModules/PhoneCardRecharge/Application Logic/Interactor/PhoneCardRechargeInteractorIO.swift

@ -12,8 +12,8 @@ protocol PhoneCardRechargeInteractorInput: class {
protocol PhoneCardRechargeInteractorOutput: class {
func setRegularModel(with model: [PriceModel])
func setFixedModel(with model: [CardInformation])
func setDataOnlyModel(with model: [CardInformation])
func setFixedModel(with model: [MainCardInformation])
func setDataOnlyModel(with model: [MainCardInformation])
func setError(with error: Error)
}

8
GME Remit/Modules/PowerCallModules/PhoneCardRecharge/Application Logic/Model/CardList.swift

@ -12,15 +12,15 @@ struct CardList: Mappable {
var type: String?
var buttonPrices: [PriceModel]?
var countryPriceCode: [CountryPriceModel]?
var cardInfomations: [CardInformation]?
var cardInfomations: [MainCardInformation]?
init?(map: Map) {
}
mutating func mapping(map: Map) {
type <- map["CardListType"]
buttonPrices <- map["buttonsGrid"]
countryPriceCode <- map["countryPriceCode"]
cardInfomations <- map["cardInfo"]
buttonPrices <- map["ButtonsGrid"]
countryPriceCode <- map["CountryPriceCode"]
cardInfomations <- map["CardInfo"]
}
}

1
GME Remit/Modules/PowerCallModules/PhoneCardRecharge/Application Logic/Model/CountryPriceModel.swift

@ -23,4 +23,3 @@ struct CountryPriceModel: Mappable {
wireless <- map["Wireless"]
}
}

65
GME Remit/Modules/PowerCallModules/PhoneCardRecharge/User Interface/Presenter/PhoneCardRechargePresenter.swift

@ -23,9 +23,25 @@ enum RechargeType: Int {
}
}
extension RechargeType {
init?(value: String) {
switch value {
case "1":
self = .regular
case "6":
self = .fixed
case "5":
self = .dataOnly
default:
self = .regular
}
}
}
class PhoneCardRechargePresenter: ViewModelType {
var interactor: PhoneCardRechargeInteractorInput?
var wireframe: PhoneCardRechargeWireframeInput?
// typealias Status = (type: RechargeType, isEnable: Bool)
struct Input {
let viewWillAppear: Driver<Void>
@ -33,9 +49,9 @@ class PhoneCardRechargePresenter: ViewModelType {
let contactOpenTap: Driver<Void>
let selectedRechargeType: Driver<RechargeType>
let selectedAmountButtonTag: Driver<Int?>
let selectedCarrierType: Driver<PaymentServiceType?>
let selectedCarrierPlan: Driver<PaymentServiceType?>
let selectedDataOnlyType: Driver<PaymentServiceType?>
let selectedCarrierType: Driver<MainCardInformation?>
let selectedCarrierPlan: Driver<CardInformation?>
let selectedDataOnlyType: Driver<MainCardInformation?>
let nextTap: Driver<Void>
}
@ -44,6 +60,11 @@ class PhoneCardRechargePresenter: ViewModelType {
let isProgress: Driver<Bool>
let isEnableNext: Driver<Bool>
let isSuccessPayment: Driver<CreditCardReceipt>
let regularModel: Driver<[PriceModel]>
let fixedModel: Driver<[MainCardInformation]>
let carrierPlanModel: Driver<[CardInformation]>
let detailCarrierPlanModel: Driver<DetailPlanInformation?>
let dataOnlyModel: Driver<[MainCardInformation]>
}
private let disposeBag = DisposeBag()
@ -53,8 +74,8 @@ class PhoneCardRechargePresenter: ViewModelType {
private let isSuccessPayment = PublishSubject<CreditCardReceipt>()
private let regularModel = BehaviorSubject<[PriceModel]>(value: [])
private let fixedModel = BehaviorSubject<[CardInformation]>(value: [])
private let dataOnlyModel = BehaviorSubject<[CardInformation]>(value: [])
private let fixedModel = BehaviorSubject<[MainCardInformation]>(value: [])
private let dataOnlyModel = BehaviorSubject<[MainCardInformation]>(value: [])
func transform(input: Input) -> Output {
Driver.combineLatest(input.viewWillAppear, input.selectedMobile, input.selectedRechargeType)
@ -78,10 +99,13 @@ class PhoneCardRechargePresenter: ViewModelType {
input.selectedDataOnlyType.asObservable()
)
let carrierPlanModel = input.selectedCarrierType.map { $0?.subCardInfo ?? [] }
let detailCarrierPlanModel = input.selectedCarrierPlan.map { $0?.planInfo }
let isEnableNext = combinedInput
.map { type, amountTag, carrierType, carrierPlan, dataOnlyType -> Bool in
.map { type, priceModel, carrierType, carrierPlan, dataOnlyType -> Bool in
switch type {
case .regular: return amountTag != nil
case .regular: return priceModel != nil
case .fixed: return carrierType != nil && carrierPlan != nil
case .dataOnly: return dataOnlyType != nil
}
@ -89,19 +113,13 @@ class PhoneCardRechargePresenter: ViewModelType {
input.nextTap
.withLatestFrom(combinedInput.asDriverOnErrorJustComplete()) {$1}
.map { (type, regularModel, carrierType, carrierPlan, dataOnlyType) -> RechargeModel? in
.map { (type, priceModel, _, carrierPlan, dataOnlyType) -> RechargeModel? in
switch type {
case .regular:
return RechargeModel(paymentAmount: regularModel?.price ?? "0")
case .fixed:
break
case .dataOnly:
break
case .regular: return RechargeModel(paymentAmount: priceModel?.price ?? "0")
case .fixed: return RechargeModel(paymentAmount: carrierPlan?.facePrice ?? "0")
case .dataOnly: return RechargeModel(paymentAmount: dataOnlyType?.facePrice ?? "0")
}
return RechargeModel(paymentAmount: "1000")
}
.drive(onNext: {
}.drive(onNext: {
guard let model = $0 else { return }
self.wireframe?.nextStep(with: model, delegate: self)
}).disposed(by: disposeBag)
@ -110,7 +128,12 @@ class PhoneCardRechargePresenter: ViewModelType {
isError: errorLinker.asDriverOnErrorJustComplete(),
isProgress: progressLinker.asDriverOnErrorJustComplete(),
isEnableNext: isEnableNext.asDriverOnErrorJustComplete(),
isSuccessPayment: isSuccessPayment.asDriverOnErrorJustComplete()
isSuccessPayment: isSuccessPayment.asDriverOnErrorJustComplete(),
regularModel: regularModel.asDriverOnErrorJustComplete(),
fixedModel: fixedModel.asDriverOnErrorJustComplete(),
carrierPlanModel: carrierPlanModel,
detailCarrierPlanModel: detailCarrierPlanModel,
dataOnlyModel: dataOnlyModel.asDriverOnErrorJustComplete()
)
}
}
@ -122,12 +145,12 @@ extension PhoneCardRechargePresenter: PhoneCardRechargeInteractorOutput {
regularModel.onNext(model)
}
func setFixedModel(with model: [CardInformation]) {
func setFixedModel(with model: [MainCardInformation]) {
progressLinker.onNext(false)
fixedModel.onNext(model)
}
func setDataOnlyModel(with model: [CardInformation]) {
func setDataOnlyModel(with model: [MainCardInformation]) {
progressLinker.onNext(false)
dataOnlyModel.onNext(model)
}

263
GME Remit/Modules/PowerCallModules/PhoneCardRecharge/User Interface/View/PhoneCardRecharge.storyboard

@ -81,19 +81,19 @@
<rect key="frame" x="0.0" y="57" width="335" height="58.5"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Wallet Balance" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="3sX-PN-Zns">
<rect key="frame" x="0.0" y="0.0" width="112.5" height="58.5"/>
<rect key="frame" x="0.0" y="0.0" width="106.5" height="58.5"/>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Regular" family="San Francisco Display" pointSize="17"/>
<color key="textColor" name="ThemeText"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" verticalHuggingPriority="251" text="₩" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="nhP-WU-Prr">
<rect key="frame" x="112.5" y="0.0" width="179.5" height="58.5"/>
<rect key="frame" x="106.5" y="0.0" width="187.5" height="58.5"/>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Regular" family="San Francisco Display" pointSize="17"/>
<color key="textColor" name="ThemeText"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="252" verticalHuggingPriority="251" text="2,000" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ao5-ep-Uh6">
<rect key="frame" x="292" y="0.0" width="43" height="58.5"/>
<rect key="frame" x="294" y="0.0" width="41" height="58.5"/>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Regular" family="San Francisco Display" pointSize="17"/>
<color key="textColor" name="ThemeText"/>
<nil key="highlightedColor"/>
@ -147,13 +147,13 @@
</constraints>
</view>
<view contentMode="scaleToFill" placeholderIntrinsicWidth="375" placeholderIntrinsicHeight="956" translatesAutoresizingMaskIntoConstraints="NO" id="bLc-vG-GQk">
<rect key="frame" x="0.0" y="196" width="375" height="1627"/>
<rect key="frame" x="0.0" y="196" width="375" height="1824"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="3x2-QU-b5r">
<rect key="frame" x="0.0" y="0.0" width="375" height="1627"/>
<rect key="frame" x="0.0" y="0.0" width="375" height="1824"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="1" translatesAutoresizingMaskIntoConstraints="NO" id="rcN-b3-Pc0">
<rect key="frame" x="10" y="0.0" width="355" height="1627"/>
<rect key="frame" x="10" y="0.0" width="355" height="1824"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="CmC-Q1-ZRq">
<rect key="frame" x="0.0" y="0.0" width="355" height="190"/>
@ -269,10 +269,10 @@
<rect key="frame" x="0.0" y="10" width="335" height="69.5"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" spacing="2" translatesAutoresizingMaskIntoConstraints="NO" id="uk7-rt-Oum">
<rect key="frame" x="0.0" y="0.0" width="335" height="16.5"/>
<rect key="frame" x="0.0" y="0.0" width="335" height="17"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="252" verticalHuggingPriority="252" text="●" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" translatesAutoresizingMaskIntoConstraints="NO" id="c1L-jN-mgO">
<rect key="frame" x="0.0" y="0.0" width="8.5" height="16.5"/>
<rect key="frame" x="0.0" y="0.0" width="8.5" height="17"/>
<constraints>
<constraint firstAttribute="width" constant="8.5" id="vWz-Yk-S3s"/>
</constraints>
@ -281,7 +281,7 @@
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="252" text="Confirm cellphone number &amp; recharge amount." lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" translatesAutoresizingMaskIntoConstraints="NO" id="IYY-b3-pG3">
<rect key="frame" x="10.5" y="0.0" width="324.5" height="16.5"/>
<rect key="frame" x="10.5" y="0.0" width="324.5" height="17"/>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Medium" family="San Francisco Display" pointSize="14"/>
<color key="textColor" name="ThemeBlack"/>
<nil key="highlightedColor"/>
@ -289,10 +289,10 @@
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" spacing="2" translatesAutoresizingMaskIntoConstraints="NO" id="VCk-AG-ieT">
<rect key="frame" x="0.0" y="18.5" width="335" height="51"/>
<rect key="frame" x="0.0" y="19" width="335" height="50.5"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="252" verticalHuggingPriority="252" text="●" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" translatesAutoresizingMaskIntoConstraints="NO" id="8Cm-Kc-EwB">
<rect key="frame" x="0.0" y="0.0" width="8.5" height="51"/>
<rect key="frame" x="0.0" y="0.0" width="8.5" height="50.5"/>
<constraints>
<constraint firstAttribute="width" constant="8.5" id="QO3-HC-fAp"/>
</constraints>
@ -301,7 +301,7 @@
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="After completing recharge, refund is not available." lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" translatesAutoresizingMaskIntoConstraints="NO" id="0i8-dF-xEP">
<rect key="frame" x="10.5" y="0.0" width="324.5" height="51"/>
<rect key="frame" x="10.5" y="0.0" width="324.5" height="50.5"/>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Medium" family="San Francisco Display" pointSize="14"/>
<color key="textColor" name="ThemeBlack"/>
<nil key="highlightedColor"/>
@ -331,16 +331,16 @@
</constraints>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="irB-sa-xqC">
<rect key="frame" x="0.0" y="191" width="355" height="601.5"/>
<rect key="frame" x="0.0" y="191" width="355" height="798.5"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="10" translatesAutoresizingMaskIntoConstraints="NO" id="fPQ-wq-qAt">
<rect key="frame" x="10" y="0.0" width="335" height="596.5"/>
<rect key="frame" x="10" y="0.0" width="335" height="793.5"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" alignment="center" translatesAutoresizingMaskIntoConstraints="NO" id="2bQ-l7-oxs">
<rect key="frame" x="0.0" y="0.0" width="335" height="50"/>
<subviews>
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="O2g-I1-ksu" customClass="ValidationTextField" customModule="GME_Remit" customModuleProvider="target">
<rect key="frame" x="0.0" y="15" width="335" height="20"/>
<rect key="frame" x="0.0" y="14.5" width="335" height="21"/>
<color key="textColor" name="ThemeText"/>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Regular" family="San Francisco Display" pointSize="17"/>
<textInputTraits key="textInputTraits"/>
@ -360,7 +360,7 @@
<rect key="frame" x="0.0" y="60" width="335" height="50"/>
<subviews>
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="12I-NP-LBC" customClass="ValidationTextField" customModule="GME_Remit" customModuleProvider="target">
<rect key="frame" x="0.0" y="15" width="335" height="20"/>
<rect key="frame" x="0.0" y="14.5" width="335" height="21"/>
<color key="textColor" name="ThemeText"/>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Regular" family="San Francisco Display" pointSize="17"/>
<textInputTraits key="textInputTraits"/>
@ -396,116 +396,121 @@
</constraints>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Xrc-cG-LWK">
<rect key="frame" x="0.0" y="140.5" width="335" height="456"/>
<rect key="frame" x="0.0" y="140.5" width="335" height="653"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="2" translatesAutoresizingMaskIntoConstraints="NO" id="iTj-Fy-9el">
<rect key="frame" x="0.0" y="10" width="335" height="446"/>
<rect key="frame" x="0.0" y="10" width="335" height="643"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="LIi-3m-pgI" customClass="ShadowView" customModule="GME_Remit" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" width="335" height="220"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" distribution="fillEqually" spacing="4" translatesAutoresizingMaskIntoConstraints="NO" id="7WW-aG-jMK">
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="4" translatesAutoresizingMaskIntoConstraints="NO" id="7WW-aG-jMK">
<rect key="frame" x="15" y="40" width="305" height="170"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="POP-gZ-c0C">
<rect key="frame" x="0.0" y="0.0" width="305" height="25"/>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" distribution="fillEqually" spacing="4" translatesAutoresizingMaskIntoConstraints="NO" id="sX4-W4-F7g">
<rect key="frame" x="0.0" y="0.0" width="305" height="141"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="252" verticalHuggingPriority="251" text="Cell Phone" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ATr-GR-fdE">
<rect key="frame" x="0.0" y="0.0" width="68" height="25"/>
<constraints>
<constraint firstAttribute="height" constant="25" id="DmQ-fW-QTA"/>
</constraints>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Regular" family="San Francisco Display" pointSize="14"/>
<color key="textColor" name="ThemeText"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="01052850125" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="F3s-hq-mVr">
<rect key="frame" x="68" y="0.0" width="237" height="25"/>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Regular" family="San Francisco Display" pointSize="14"/>
<color key="textColor" name="ThemeText"/>
<nil key="highlightedColor"/>
</label>
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="DKk-RY-wp1">
<rect key="frame" x="0.0" y="29" width="305" height="25"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="252" verticalHuggingPriority="251" text="Charge Type" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="592-jP-xgS">
<rect key="frame" x="0.0" y="0.0" width="78.5" height="25"/>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Regular" family="San Francisco Display" pointSize="14"/>
<color key="textColor" name="ThemeText"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="mediaLog 11G(50,600)" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="CiS-wv-umW">
<rect key="frame" x="78.5" y="0.0" width="226.5" height="25"/>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Regular" family="San Francisco Display" pointSize="14"/>
<color key="textColor" name="ThemeText"/>
<nil key="highlightedColor"/>
</label>
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ocB-vl-Jt3">
<rect key="frame" x="0.0" y="58" width="305" height="25"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="252" verticalHuggingPriority="251" text="Data" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="798-HQ-YHW">
<rect key="frame" x="0.0" y="0.0" width="29.5" height="25"/>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Regular" family="San Francisco Display" pointSize="14"/>
<color key="textColor" name="ThemeText"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="11GB + 3M Unlimited" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="VyR-26-utb">
<rect key="frame" x="29.5" y="0.0" width="275.5" height="25"/>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Regular" family="San Francisco Display" pointSize="14"/>
<color key="textColor" name="ThemeText"/>
<nil key="highlightedColor"/>
</label>
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="zgr-y4-qkM">
<rect key="frame" x="0.0" y="87" width="305" height="25"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="252" verticalHuggingPriority="251" text="Voice" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="P5S-MB-7Q1">
<rect key="frame" x="0.0" y="0.0" width="34" height="25"/>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Regular" family="San Francisco Display" pointSize="14"/>
<color key="textColor" name="ThemeText"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Unlimited" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="EL5-jZ-vOn">
<rect key="frame" x="34" y="0.0" width="271" height="25"/>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Regular" family="San Francisco Display" pointSize="14"/>
<color key="textColor" name="ThemeText"/>
<nil key="highlightedColor"/>
</label>
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="0xQ-a7-XMl">
<rect key="frame" x="0.0" y="116" width="305" height="25"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="252" verticalHuggingPriority="251" text="SMS" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ozC-cy-dC6">
<rect key="frame" x="0.0" y="0.0" width="30.5" height="25"/>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Regular" family="San Francisco Display" pointSize="14"/>
<color key="textColor" name="ThemeText"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Unlimited" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="OnW-ui-fSi">
<rect key="frame" x="30.5" y="0.0" width="274.5" height="25"/>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Regular" family="San Francisco Display" pointSize="14"/>
<color key="textColor" name="ThemeText"/>
<nil key="highlightedColor"/>
</label>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="POP-gZ-c0C">
<rect key="frame" x="0.0" y="0.0" width="305" height="25"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="252" verticalHuggingPriority="251" text="Cell Phone" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ATr-GR-fdE">
<rect key="frame" x="0.0" y="0.0" width="64" height="25"/>
<constraints>
<constraint firstAttribute="height" constant="25" id="DmQ-fW-QTA"/>
</constraints>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Regular" family="San Francisco Display" pointSize="14"/>
<color key="textColor" name="ThemeText"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="01052850125" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" translatesAutoresizingMaskIntoConstraints="NO" id="F3s-hq-mVr">
<rect key="frame" x="64" y="0.0" width="241" height="25"/>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Regular" family="San Francisco Display" pointSize="14"/>
<color key="textColor" name="ThemeText"/>
<nil key="highlightedColor"/>
</label>
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="DKk-RY-wp1">
<rect key="frame" x="0.0" y="29" width="305" height="25"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="252" verticalHuggingPriority="251" text="Charge Type" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="592-jP-xgS">
<rect key="frame" x="0.0" y="0.0" width="74.5" height="25"/>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Regular" family="San Francisco Display" pointSize="14"/>
<color key="textColor" name="ThemeText"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="mediaLog 11G(50,600)" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" translatesAutoresizingMaskIntoConstraints="NO" id="CiS-wv-umW">
<rect key="frame" x="74.5" y="0.0" width="230.5" height="25"/>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Regular" family="San Francisco Display" pointSize="14"/>
<color key="textColor" name="ThemeText"/>
<nil key="highlightedColor"/>
</label>
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ocB-vl-Jt3">
<rect key="frame" x="0.0" y="58" width="305" height="25"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="252" verticalHuggingPriority="251" text="Data" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="798-HQ-YHW">
<rect key="frame" x="0.0" y="0.0" width="28" height="25"/>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Regular" family="San Francisco Display" pointSize="14"/>
<color key="textColor" name="ThemeText"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="11GB + 3M Unlimited" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" translatesAutoresizingMaskIntoConstraints="NO" id="VyR-26-utb">
<rect key="frame" x="28" y="0.0" width="277" height="25"/>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Regular" family="San Francisco Display" pointSize="14"/>
<color key="textColor" name="ThemeText"/>
<nil key="highlightedColor"/>
</label>
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="zgr-y4-qkM">
<rect key="frame" x="0.0" y="87" width="305" height="25"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="252" verticalHuggingPriority="251" text="Voice" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="P5S-MB-7Q1">
<rect key="frame" x="0.0" y="0.0" width="33" height="25"/>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Regular" family="San Francisco Display" pointSize="14"/>
<color key="textColor" name="ThemeText"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Unlimited" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" translatesAutoresizingMaskIntoConstraints="NO" id="EL5-jZ-vOn">
<rect key="frame" x="33" y="0.0" width="272" height="25"/>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Regular" family="San Francisco Display" pointSize="14"/>
<color key="textColor" name="ThemeText"/>
<nil key="highlightedColor"/>
</label>
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="0xQ-a7-XMl">
<rect key="frame" x="0.0" y="116" width="305" height="25"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="252" verticalHuggingPriority="251" text="SMS" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ozC-cy-dC6">
<rect key="frame" x="0.0" y="0.0" width="26.5" height="25"/>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Regular" family="San Francisco Display" pointSize="14"/>
<color key="textColor" name="ThemeText"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Unlimited" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" translatesAutoresizingMaskIntoConstraints="NO" id="OnW-ui-fSi">
<rect key="frame" x="26.5" y="0.0" width="278.5" height="25"/>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Regular" family="San Francisco Display" pointSize="14"/>
<color key="textColor" name="ThemeText"/>
<nil key="highlightedColor"/>
</label>
</subviews>
</stackView>
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="cC3-tj-otz">
<rect key="frame" x="0.0" y="145" width="305" height="25"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="252" verticalHuggingPriority="251" text="Payment Amount" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="wtY-Oq-MdK">
<rect key="frame" x="0.0" y="0.0" width="108.5" height="25"/>
<rect key="frame" x="0.0" y="0.0" width="106" height="25"/>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Medium" family="San Francisco Display" pointSize="14"/>
<color key="textColor" name="ThemeRed"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="₩ 50,100" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="XLT-1R-BKf">
<rect key="frame" x="108.5" y="0.0" width="196.5" height="25"/>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="₩ 50,100" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" translatesAutoresizingMaskIntoConstraints="NO" id="XLT-1R-BKf">
<rect key="frame" x="106" y="0.0" width="199" height="25"/>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Medium" family="San Francisco Display" pointSize="14"/>
<color key="textColor" name="ThemeRed"/>
<nil key="highlightedColor"/>
@ -513,6 +518,9 @@
</subviews>
</stackView>
</subviews>
<constraints>
<constraint firstItem="cC3-tj-otz" firstAttribute="height" secondItem="0xQ-a7-XMl" secondAttribute="height" id="kJG-h5-acv"/>
</constraints>
</stackView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Detail" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ImS-lb-OZb">
<rect key="frame" x="10" y="10" width="36" height="20"/>
@ -535,16 +543,16 @@
</constraints>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="hbN-HI-gl0">
<rect key="frame" x="0.0" y="222" width="335" height="224"/>
<rect key="frame" x="0.0" y="222" width="335" height="421"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="2" translatesAutoresizingMaskIntoConstraints="NO" id="z3d-G4-G07">
<rect key="frame" x="0.0" y="20" width="335" height="204"/>
<rect key="frame" x="0.0" y="20" width="335" height="401"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" spacing="2" translatesAutoresizingMaskIntoConstraints="NO" id="dXa-Gh-kNs">
<rect key="frame" x="0.0" y="0.0" width="335" height="16.5"/>
<rect key="frame" x="0.0" y="0.0" width="335" height="17"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="252" verticalHuggingPriority="252" text="●" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" translatesAutoresizingMaskIntoConstraints="NO" id="Czd-41-Vk3">
<rect key="frame" x="0.0" y="0.0" width="8.5" height="16.5"/>
<rect key="frame" x="0.0" y="0.0" width="8.5" height="17"/>
<constraints>
<constraint firstAttribute="width" constant="8.5" id="tyc-K4-8wu"/>
</constraints>
@ -553,7 +561,7 @@
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="252" text="This is available for monthly fixed charge." lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" translatesAutoresizingMaskIntoConstraints="NO" id="MlR-IB-new">
<rect key="frame" x="10.5" y="0.0" width="324.5" height="16.5"/>
<rect key="frame" x="10.5" y="0.0" width="324.5" height="17"/>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Medium" family="San Francisco Display" pointSize="14"/>
<color key="textColor" name="ThemeBlack"/>
<nil key="highlightedColor"/>
@ -561,10 +569,10 @@
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" spacing="2" translatesAutoresizingMaskIntoConstraints="NO" id="gwe-Rt-4lK">
<rect key="frame" x="0.0" y="18.5" width="335" height="167"/>
<rect key="frame" x="0.0" y="19" width="335" height="363"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="252" verticalHuggingPriority="252" text="●" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" translatesAutoresizingMaskIntoConstraints="NO" id="6rr-ub-Cmq">
<rect key="frame" x="0.0" y="0.0" width="8.5" height="167"/>
<rect key="frame" x="0.0" y="0.0" width="8.5" height="363"/>
<constraints>
<constraint firstAttribute="width" constant="8.5" id="yQj-kq-4gN"/>
</constraints>
@ -573,7 +581,7 @@
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Confirm cellphone number &amp; recharge amount." lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" translatesAutoresizingMaskIntoConstraints="NO" id="QFt-Cb-h3B">
<rect key="frame" x="10.5" y="0.0" width="324.5" height="167"/>
<rect key="frame" x="10.5" y="0.0" width="324.5" height="363"/>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Medium" family="San Francisco Display" pointSize="14"/>
<color key="textColor" name="ThemeBlack"/>
<nil key="highlightedColor"/>
@ -581,10 +589,10 @@
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" spacing="2" translatesAutoresizingMaskIntoConstraints="NO" id="h7D-b7-B9G">
<rect key="frame" x="0.0" y="187.5" width="335" height="16.5"/>
<rect key="frame" x="0.0" y="384" width="335" height="17"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="252" verticalHuggingPriority="252" text="●" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" translatesAutoresizingMaskIntoConstraints="NO" id="hHD-KN-nNI">
<rect key="frame" x="0.0" y="0.0" width="8.5" height="16.5"/>
<rect key="frame" x="0.0" y="0.0" width="8.5" height="17"/>
<constraints>
<constraint firstAttribute="width" constant="8.5" id="ix9-RB-VWd"/>
</constraints>
@ -593,7 +601,7 @@
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="After completing recharge, refund is not available." lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" translatesAutoresizingMaskIntoConstraints="NO" id="mrS-0b-fFC">
<rect key="frame" x="10.5" y="0.0" width="324.5" height="16.5"/>
<rect key="frame" x="10.5" y="0.0" width="324.5" height="17"/>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Medium" family="San Francisco Display" pointSize="14"/>
<color key="textColor" name="ThemeBlack"/>
<nil key="highlightedColor"/>
@ -634,7 +642,7 @@
</constraints>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Tcd-5I-gDG">
<rect key="frame" x="0.0" y="793.5" width="355" height="162.5"/>
<rect key="frame" x="0.0" y="990.5" width="355" height="162.5"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="10" translatesAutoresizingMaskIntoConstraints="NO" id="CQZ-gn-EPy">
<rect key="frame" x="10" y="0.0" width="335" height="157.5"/>
@ -643,7 +651,7 @@
<rect key="frame" x="0.0" y="0.0" width="335" height="50"/>
<subviews>
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="xy0-Q3-NhX" customClass="ValidationTextField" customModule="GME_Remit" customModuleProvider="target">
<rect key="frame" x="0.0" y="15" width="335" height="20"/>
<rect key="frame" x="0.0" y="14.5" width="335" height="21"/>
<color key="textColor" name="ThemeText"/>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Regular" family="San Francisco Display" pointSize="17"/>
<textInputTraits key="textInputTraits"/>
@ -729,7 +737,7 @@
</constraints>
</view>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="100" text="" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="euR-3e-5qe">
<rect key="frame" x="0.0" y="957" width="355" height="670"/>
<rect key="frame" x="0.0" y="1154" width="355" height="670"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
@ -809,6 +817,19 @@
<outlet property="dataOnlyTypeContainerView" destination="Tcd-5I-gDG" id="SOV-6N-xyA"/>
<outlet property="dataOnlyTypeInfoContainerView" destination="hi1-a8-7Dd" id="bVm-dI-Qc7"/>
<outlet property="dataOnlyTypeTextField" destination="xy0-Q3-NhX" id="w6p-F9-kpT"/>
<outlet property="detailCellphoneContentLabel" destination="F3s-hq-mVr" id="6p4-5X-egk"/>
<outlet property="detailCellphoneTitleLabel" destination="ATr-GR-fdE" id="HTz-yf-Xpl"/>
<outlet property="detailChargeTypeContentLabel" destination="CiS-wv-umW" id="1zW-Rp-NEM"/>
<outlet property="detailChargeTypeTitleLabel" destination="592-jP-xgS" id="7yH-aQ-Gu8"/>
<outlet property="detailDataContentLabel" destination="VyR-26-utb" id="rnj-0Q-DjZ"/>
<outlet property="detailDataTitleLabel" destination="798-HQ-YHW" id="OTT-bR-TmD"/>
<outlet property="detailInformationContainerView" destination="sX4-W4-F7g" id="gnI-CD-pO5"/>
<outlet property="detailPaymentAmountContentLabel" destination="XLT-1R-BKf" id="Tj6-sS-xc7"/>
<outlet property="detailPaymentAmountTitleLabel" destination="wtY-Oq-MdK" id="Idb-Bw-c43"/>
<outlet property="detailSMSContentLabel" destination="OnW-ui-fSi" id="567-rk-l79"/>
<outlet property="detailSMSTitleLabel" destination="ozC-cy-dC6" id="yVP-YZ-QJv"/>
<outlet property="detailVoiceContentLabel" destination="EL5-jZ-vOn" id="Niy-n5-LYz"/>
<outlet property="detailVoiceTitleLabel" destination="P5S-MB-7Q1" id="Toa-rH-DaZ"/>
<outlet property="fixedChargeTypeContainerView" destination="irB-sa-xqC" id="R07-eK-uNN"/>
<outlet property="fixedChargeTypeInfoContainerView" destination="hbN-HI-gl0" id="bMV-e4-rCR"/>
<outlet property="mainContainerView" destination="3x2-QU-b5r" id="J1j-8a-Kgh"/>

151
GME Remit/Modules/PowerCallModules/PhoneCardRecharge/User Interface/View/PhoneCardRechargeViewController.swift

@ -51,6 +51,21 @@ class PhoneCardRechargeViewController: UIViewController {
@IBOutlet private weak var carrierPlanDetailView: ShadowView!
@IBOutlet private weak var fixedChargeTypeInfoContainerView: UIView!
// Detail
@IBOutlet private weak var detailInformationContainerView: UIStackView!
@IBOutlet private weak var detailCellphoneTitleLabel: UILabel!
@IBOutlet private weak var detailCellphoneContentLabel: UILabel!
@IBOutlet private weak var detailChargeTypeTitleLabel: UILabel!
@IBOutlet private weak var detailChargeTypeContentLabel: UILabel!
@IBOutlet private weak var detailDataTitleLabel: UILabel!
@IBOutlet private weak var detailDataContentLabel: UILabel!
@IBOutlet private weak var detailVoiceTitleLabel: UILabel!
@IBOutlet private weak var detailVoiceContentLabel: UILabel!
@IBOutlet private weak var detailSMSTitleLabel: UILabel!
@IBOutlet private weak var detailSMSContentLabel: UILabel!
@IBOutlet private weak var detailPaymentAmountTitleLabel: UILabel!
@IBOutlet private weak var detailPaymentAmountContentLabel: UILabel!
// Data Only
@IBOutlet private weak var dataOnlyTypeContainerView: UIView!
@IBOutlet private weak var dataOnlyTypeTextField: ValidationTextField!
@ -85,10 +100,9 @@ class PhoneCardRechargeViewController: UIViewController {
extension PhoneCardRechargeViewController {
private func setup() {
// all setup should be done here
setUI()
setBinding()
setUIBinding()
test()
setUI()
}
private func setUI() {
@ -117,6 +131,7 @@ extension PhoneCardRechargeViewController {
mycashAmountLabel.text = GMEDB.shared.user.string(.availableBalance) ?? "0"
selectedMobile.onNext(GMEDB.shared.user.string(.mobileNumber) ?? "")
amountButtons = [
amountButton1, amountButton2, amountButton3,
amountButton4, amountButton5, amountButton6
@ -130,9 +145,9 @@ extension PhoneCardRechargeViewController {
let selectedRechargeType = typeSegment.rx.selectedSegmentIndex
.map { RechargeType(rawValue: $0) ?? .regular}.asDriverOnErrorJustComplete()
let selectedCarrierType = carrierTypeTextField.selectedItem.map {$0 as? PaymentServiceType}
let selectedCarrierPlan = carrierPlanTextField.selectedItem.map {$0 as? PaymentServiceType}
let selectedDataOnlyType = dataOnlyTypeTextField.selectedItem.map {$0 as? PaymentServiceType}
let selectedCarrierType = carrierTypeTextField.selectedItem.map {$0 as? MainCardInformation}
let selectedCarrierPlan = carrierPlanTextField.selectedItem.map {$0 as? CardInformation}
let selectedDataOnlyType = dataOnlyTypeTextField.selectedItem.map {$0 as? MainCardInformation}
let input = PhoneCardRechargePresenter.Input(
viewWillAppear: viewWillAppear,
@ -173,30 +188,85 @@ extension PhoneCardRechargeViewController {
}
}).disposed(by: disposeBag)
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
output.isEnableNext
.map {[weak self] in
self?.nextButton.backgroundColor = $0 ? .themeRed : .lightGray
return $0
}
.drive(nextButton.rx.isEnabled)
.disposed(by: disposeBag)
output.regularModel.drive(onNext: { [weak self] model in
guard let `self` = self, model.count == self.amountButtons.count else { return }
self.amountButtons.enumerated().forEach { index, button in
button.setTitle(model[index].price?.decimalToCurrency(as: .krw, isFront: true), for: .normal)
}
}).disposed(by: disposeBag)
output.fixedModel.drive(onNext: {[weak self] in
let configuration = TablePresenterConfiguration(presenterTitle: "Select Type")
self?.carrierTypeTextField.useAsDropDown(with: configuration, items: $0)
}).disposed(by: disposeBag)
output.carrierPlanModel.drive(onNext: {[weak self] in
let configuration = TablePresenterConfiguration(presenterTitle: "Select Plan")
self?.carrierPlanTextField.useAsDropDown(with: configuration, items: $0)
self.nextButton.backgroundColor = isEnable ? .themeRed : .lightGray
switch rechargeType {
case .regular:
self.regularTypeInfoContainerView.animateHidden(isHidden: !isEnable)
case .fixed:
self.carrierPlanDetailView.animateHidden(isHidden: !isEnable) {
self.fixedChargeTypeInfoContainerView.animateHidden(isHidden: !isEnable, duration: 0.1) {
self.scrollView.toBottom()
}).disposed(by: disposeBag)
output.dataOnlyModel.drive(onNext: {[weak self] in
let configuration = TablePresenterConfiguration(presenterTitle: "Select Type")
self?.dataOnlyTypeTextField.useAsDropDown(with: configuration, items: $0)
}).disposed(by: disposeBag)
selectedMobile.asDriver(onErrorJustReturn: "")
.drive(detailCellphoneContentLabel.rx.text)
.disposed(by: disposeBag)
selectedCarrierPlan.map {$0?.cardName}.asDriver(onErrorJustReturn: nil)
.drive(detailChargeTypeContentLabel.rx.text)
.disposed(by: disposeBag)
selectedCarrierPlan.map {$0?.facePrice?.decimalToCurrency(as: .krw, isFront: true)}
.asDriverOnErrorJustComplete()
.drive(detailPaymentAmountContentLabel.rx.text)
.disposed(by: disposeBag)
selectedAmountButton.map {$0 == nil}.asDriverOnErrorJustComplete()
.drive(onNext: { [weak self] in
self?.regularTypeInfoContainerView.animateHidden(isHidden: $0)
}).disposed(by: disposeBag)
selectedCarrierPlan.map { $0 == nil }.asDriverOnErrorJustComplete()
.drive(onNext: { [weak self] isHidden in
self?.carrierPlanDetailView.animateHidden(isHidden: isHidden) {
self?.fixedChargeTypeInfoContainerView.animateHidden(isHidden: isHidden, duration: 0.1) {
self?.scrollView.toBottom()
}
}
case .dataOnly:
self.dataOnlyTypeInfoContainerView.animateHidden(isHidden: !isEnable)
}
return isEnable
}
.drive(nextButton.rx.isEnabled)
.disposed(by: disposeBag)
}).disposed(by: disposeBag)
selectedDataOnlyType.map { $0 == nil }.asDriverOnErrorJustComplete()
.drive(onNext: { [weak self] in
self?.dataOnlyTypeInfoContainerView.animateHidden(isHidden: $0)
}).disposed(by: disposeBag)
output.detailCarrierPlanModel.map {$0 == nil}
.drive(detailInformationContainerView.rx.isHidden)
.disposed(by: disposeBag)
output.detailCarrierPlanModel.map {$0?.data}
.drive(detailDataContentLabel.rx.text)
.disposed(by: disposeBag)
output.detailCarrierPlanModel.map {$0?.sms}
.drive(detailSMSContentLabel.rx.text)
.disposed(by: disposeBag)
output.detailCarrierPlanModel.map {$0?.voice}
.drive(detailVoiceContentLabel.rx.text)
.disposed(by: disposeBag)
}
private func setUIBinding() {
@ -260,37 +330,6 @@ extension PhoneCardRechargeViewController {
}
}
// MARK: Test
extension PhoneCardRechargeViewController {
private func test() {
let item1 = PaymentServiceType()
item1.subtitle = "Main Item 1"
let item2 = PaymentServiceType()
item2.subtitle = "Main Item 2"
let item3 = PaymentServiceType()
item3.subtitle = "Main Item 3"
let mainConfiguration = TablePresenterConfiguration(presenterTitle: "Main Items")
carrierTypeTextField.useAsDropDown(with: mainConfiguration, items: [item1, item2, item3])
let sitem1 = PaymentServiceType()
sitem1.subtitle = "Sub Item 1"
let sitem2 = PaymentServiceType()
sitem2.subtitle = "Sub Item 2"
let sitem3 = PaymentServiceType()
sitem3.subtitle = "Sub Item 3"
let subConfiguration = TablePresenterConfiguration(presenterTitle: "Sub Items")
carrierPlanTextField.useAsDropDown(with: subConfiguration, items: [sitem1, sitem2, sitem3])
dataOnlyTypeTextField.useAsDropDown(with: mainConfiguration, items: [item1, item2, item3])
}
}
// MARK: CNContactPickerDelegate
extension PhoneCardRechargeViewController: CNContactPickerDelegate {
func contactPicker(_ picker: CNContactPickerViewController, didSelect contact: CNContact) {

5
GME Remit/Supported Files/Info.plist

@ -3,7 +3,10 @@
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<array/>
<array>
<string>en_US</string>
<string>ko_KR</string>
</array>
<key>CFBundleDisplayName</key>
<string>GME Remit</string>
<key>CFBundleExecutable</key>

19
GME Remit/Utilities/CustomUI/ValidationTextField.swift

@ -759,6 +759,25 @@ extension ValidationTextField {
extension ValidationTextField {
func useAsDropDown(with configure: TablePresenterConfiguration? = nil, items: [TablePresenterProtocol]?) {
func isEqual(target1: [TablePresenterProtocol]?, target2: [TablePresenterProtocol]?) -> Bool {
guard let model1 = target1, let model2 = target2 else { return false}
if model1.count != model2.count {
return false
}
for i in 0..<model1.count where model1[i].cellTitle != model2[i].cellTitle {
return false
}
return true
}
if !isEqual(target1: dropwDownItems, target2: items) {
selectedItem.onNext(nil)
text = nil
sendActions(for: .editingChanged)
}
self.type = .dropdown
self.dropwDownItems = items
self.configure = configure

8
GME Remit/Utilities/TablePresenter/Application Logic/Model/TablePresenterProtocol.swift

@ -9,4 +9,12 @@
protocol TablePresenterProtocol {
var cellTitle: String? { get }
var cellImage: UIImage? { get }
func isEqual(with: TablePresenterProtocol) -> Bool
}
extension TablePresenterProtocol {
func isEqual(with target: TablePresenterProtocol) -> Bool {
return target.cellTitle == self.cellTitle
}
}
Loading…
Cancel
Save