Browse Source

1. changed validate condition of another id picture field wise select id type

2. linked api of penny test submit
3. implemented step3
pull/1/head
InKwon James Kim 5 years ago
parent
commit
339c069d89
  1. 4
      GME Remit.xcodeproj/project.pbxproj
  2. 13
      GME Remit/APIs/Router/APIRouter.swift
  3. 4
      GME Remit/Models/Response/SuccessMessage.swift
  4. 3
      GME Remit/Modules/Home/User Interface/View/HomeViewController.swift
  5. 2
      GME Remit/Modules/RegisterModules/UserAuthentication/NewRegister/Application Logic/Interactor/NewRegisterInteractor.swift
  6. 11
      GME Remit/Modules/RegisterModules/UserAuthentication/NewRegister/Application Logic/Service/NewRegisterService.swift
  7. 2
      GME Remit/Modules/RegisterModules/UserAuthentication/NewRegister/Application Logic/Service/NewRegisterServiceType.swift
  8. 2
      GME Remit/Modules/RegisterModules/UserAuthentication/NewRegister/User Interface/Presenter/NewRegisterPresenter.swift
  9. 91
      GME Remit/Modules/RegisterModules/UserAuthentication/NewRegister/User Interface/Wireframe/NewRegisterWireframe.swift
  10. 10
      GME Remit/Modules/RegisterModules/UserAuthentication/NewRegisterStep1/Application Logic/Interactor/NewRegisterStep1Interactor.swift
  11. 35
      GME Remit/Modules/RegisterModules/UserAuthentication/NewRegisterStep1/Application Logic/Model/KJBank.swift
  12. 2
      GME Remit/Modules/RegisterModules/UserAuthentication/NewRegisterStep1/Application Logic/Model/KYCInfromation.swift
  13. 3
      GME Remit/Modules/RegisterModules/UserAuthentication/NewRegisterStep1/Application Logic/Model/PrimaryInformation.swift
  14. 29
      GME Remit/Modules/RegisterModules/UserAuthentication/NewRegisterStep1/User Interface/Presenter/NewRegisterStep1Presenter.swift
  15. 14
      GME Remit/Modules/RegisterModules/UserAuthentication/NewRegisterStep1/User Interface/View/NewRegisterStep1.storyboard
  16. 59
      GME Remit/Modules/RegisterModules/UserAuthentication/NewRegisterStep1/User Interface/View/NewRegisterStep1ViewController.swift
  17. 3
      GME Remit/Modules/RegisterModules/UserAuthentication/NewRegisterStep2/User Interface/Presenter/NewRegisterStep2Presenter.swift
  18. 17
      GME Remit/Modules/RegisterModules/UserAuthentication/NewRegisterStep2/User Interface/View/NewRegisterStep2ViewController.swift
  19. 26
      GME Remit/Modules/RegisterModules/UserAuthentication/NewRegisterStep3/Application Logic/Interactor/NewRegisterStep3Interactor.swift
  20. 6
      GME Remit/Modules/RegisterModules/UserAuthentication/NewRegisterStep3/Application Logic/Interactor/NewRegisterStep3InteractorIO.swift
  21. 20
      GME Remit/Modules/RegisterModules/UserAuthentication/NewRegisterStep3/Application Logic/Service/NewRegisterStep3Service.swift
  22. 7
      GME Remit/Modules/RegisterModules/UserAuthentication/NewRegisterStep3/Application Logic/Service/NewRegisterStep3ServiceType.swift
  23. 38
      GME Remit/Modules/RegisterModules/UserAuthentication/NewRegisterStep3/User Interface/Presenter/NewRegisterStep3Presenter.swift
  24. 48
      GME Remit/Modules/RegisterModules/UserAuthentication/NewRegisterStep3/User Interface/View/NewRegisterStep3.storyboard
  25. 98
      GME Remit/Modules/RegisterModules/UserAuthentication/NewRegisterStep3/User Interface/View/NewRegisterStep3ViewController.swift
  26. 8
      GME Remit/Modules/SideMenu/SideMenu.storyboard
  27. 21
      GME Remit/Supported Files/Assets.xcassets/bankCI/deutsche.imageset/Contents.json
  28. BIN
      GME Remit/Supported Files/Assets.xcassets/bankCI/deutsche.imageset/deutsche.png
  29. 21
      GME Remit/Supported Files/Assets.xcassets/bankCI/epost.imageset/Contents.json
  30. BIN
      GME Remit/Supported Files/Assets.xcassets/bankCI/epost.imageset/epost.png
  31. 21
      GME Remit/Supported Files/Assets.xcassets/bankCI/hsbc.imageset/Contents.json
  32. BIN
      GME Remit/Supported Files/Assets.xcassets/bankCI/hsbc.imageset/hsbc.png
  33. 21
      GME Remit/Supported Files/Assets.xcassets/bankCI/kfcc.imageset/Contents.json
  34. BIN
      GME Remit/Supported Files/Assets.xcassets/bankCI/kfcc.imageset/kfcc.png
  35. 21
      GME Remit/Supported Files/Assets.xcassets/bankCI/shinhyup.imageset/Contents.json
  36. BIN
      GME Remit/Supported Files/Assets.xcassets/bankCI/shinhyup.imageset/shinhyup.png
  37. 61
      GME Remit/Utilities/BankEnum.swift
  38. 3
      GME Remit/Utilities/KeyChain.swift
  39. 7
      GME Remit/Utilities/WebLinks/WkWebView/WkWebViewController.swift

4
GME Remit.xcodeproj/project.pbxproj

@ -245,6 +245,7 @@
73210DAF22FBF2BA00715D6C /* ViewModelType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73210DAE22FBF2BA00715D6C /* ViewModelType.swift */; };
73210DB122FBF4B000715D6C /* ObservableType+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73210DB022FBF4B000715D6C /* ObservableType+Ext.swift */; };
73210DB522FC01C200715D6C /* RecipientCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73210DB422FC01C200715D6C /* RecipientCell.swift */; };
73265B4F23BAEC90007BA388 /* KJBank.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73265B4E23BAEC90007BA388 /* KJBank.swift */; };
7327567F23B0456400BF66C5 /* ManageAgreementServiceType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7327567123B0456300BF66C5 /* ManageAgreementServiceType.swift */; };
7327568023B0456400BF66C5 /* ManageAgreementService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7327567223B0456300BF66C5 /* ManageAgreementService.swift */; };
7327568123B0456400BF66C5 /* ManageAgreementInteractorIO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7327567423B0456300BF66C5 /* ManageAgreementInteractorIO.swift */; };
@ -2654,6 +2655,7 @@
73210DAE22FBF2BA00715D6C /* ViewModelType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewModelType.swift; sourceTree = "<group>"; };
73210DB022FBF4B000715D6C /* ObservableType+Ext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ObservableType+Ext.swift"; sourceTree = "<group>"; };
73210DB422FC01C200715D6C /* RecipientCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecipientCell.swift; sourceTree = "<group>"; };
73265B4E23BAEC90007BA388 /* KJBank.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KJBank.swift; sourceTree = "<group>"; };
7327567123B0456300BF66C5 /* ManageAgreementServiceType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ManageAgreementServiceType.swift; sourceTree = "<group>"; };
7327567223B0456300BF66C5 /* ManageAgreementService.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ManageAgreementService.swift; sourceTree = "<group>"; };
7327567423B0456300BF66C5 /* ManageAgreementInteractorIO.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ManageAgreementInteractorIO.swift; sourceTree = "<group>"; };
@ -7045,6 +7047,7 @@
738D7284239F32C7006B4EA7 /* PictureInformation.swift */,
73ABF00E23A06F0500E2C5B9 /* PropertyUtility.swift */,
733CC36223A1D96A0027DDF9 /* KYCSave.swift */,
73265B4E23BAEC90007BA388 /* KJBank.swift */,
);
path = Model;
sourceTree = "<group>";
@ -15942,6 +15945,7 @@
736A8C472277EB2A00337A50 /* BiometricNotificationWireframe.swift in Sources */,
730D7891227A94E1007E517E /* RewardWireframe.swift in Sources */,
7389601322C2F208003FEA90 /* TablePresenterViewInterface.swift in Sources */,
73265B4F23BAEC90007BA388 /* KJBank.swift in Sources */,
D9031146214786EA00AD5BA9 /* ForgotPasswordViewInterface.swift in Sources */,
7301979922535135001954AB /* kycForm1InteractorIO.swift in Sources */,
D946719B21426DFB003924DB /* LoginWireframe.swift in Sources */,

13
GME Remit/APIs/Router/APIRouter.swift

@ -80,6 +80,7 @@ enum APIRouter {
case loadKYCInformation
case saveKYCInformation(model: KYCSave)
case requestPennyTestAtRegister(resend: String)
case pennyTestSubmitAtRegister(accountNumber: String, certNumber: String)
case fetchKFTCParameterForRegister
}
@ -496,6 +497,8 @@ extension APIRouter {
case .fetchKFTCParameterForRegister:
let userID = GMEDB.shared.user.string(.userId) ?? ""
return "\(baseUrlWithoutVersion)/v4/GetKftcParameters/\(userID)"
case .pennyTestSubmitAtRegister:
return "\(baseUrl)/mobile/pennytest/getcertified"
}
}
}
@ -584,6 +587,8 @@ extension APIRouter {
return .post
case .fetchKFTCParameterForRegister:
return .get
case .pennyTestSubmitAtRegister:
return .post
}
}
@ -904,6 +909,14 @@ extension APIRouter {
"branchId": model.primaryInformation?.branchID ?? "",
"refferalCode": model.primaryInformation?.refferalCode ?? ""
]
case .pennyTestSubmitAtRegister(let accountNumber, let certNumber):
let senderID = GMEDB.shared.user.string(.senderId) ?? ""
return [
"AccountNo": accountNumber,
"CertNumber": certNumber,
"CustomerId": senderID
]
default: return nil
}

4
GME Remit/Models/Response/SuccessMessage.swift

@ -14,6 +14,10 @@ class SuccessMessage: Mappable {
var extra: String?
var yearlyLimit: String?
init() {
}
required init?(map: Map) {
}

3
GME Remit/Modules/Home/User Interface/View/HomeViewController.swift

@ -103,9 +103,6 @@ class HomeViewController: UIViewController {
destination = nil
}
// FIXME: Test
self.presenter?.showKyc(step: .first)
}
}
var sections: [Sections] = [.balance, .collection]

2
GME Remit/Modules/RegisterModules/UserAuthentication/NewRegister/Application Logic/Interactor/NewRegisterInteractor.swift

@ -28,7 +28,7 @@ class NewRegisterInteractor {
extension NewRegisterInteractor: NewRegisterInteractorInput {
func requestPennyTest() {
service.requestPennyTest(
isResendRequest: "N",
isResendRequest: .no,
success: {[weak self] in
self?.output?.resultRequestPennyTest(with: $0)
},

11
GME Remit/Modules/RegisterModules/UserAuthentication/NewRegister/Application Logic/Service/NewRegisterService.swift

@ -9,12 +9,17 @@
import Foundation
class NewRegisterService: NewRegisterServiceType {
enum ResendType: String {
case no = "N"
case yes = "Y"
}
func requestPennyTest(
isResendRequest: String,
isResendRequest: ResendType,
success: @escaping (SuccessMessage) -> Void,
failure: @escaping (Error) -> Void
) {
APIRouter.requestPennyTestAtRegister(resend: isResendRequest)
) {
APIRouter.requestPennyTestAtRegister(resend: isResendRequest.rawValue)
.json(success: success, failure: failure)
}
}

2
GME Remit/Modules/RegisterModules/UserAuthentication/NewRegister/Application Logic/Service/NewRegisterServiceType.swift

@ -8,7 +8,7 @@
protocol NewRegisterServiceType: class {
func requestPennyTest(
isResendRequest: String,
isResendRequest: NewRegisterService.ResendType,
success: @escaping (SuccessMessage) -> Void,
failure: @escaping (Error) -> Void
)

2
GME Remit/Modules/RegisterModules/UserAuthentication/NewRegister/User Interface/Presenter/NewRegisterPresenter.swift

@ -31,8 +31,6 @@ class NewRegisterPresenter: ViewModelType {
input.moveStep.drive(onNext: {[weak self] in
switch $0 {
case .third:
//GMEDB.shared.user.string(.pennyTestRequested)
// Check penny test request status. if 0 then request api, else 2 then go next step.
let status = GMEDB.shared.user.string(.pennyTestStatusCode) ?? "0"
if status == "1" {
self?.wireframe?.moveStep(to: $0)

91
GME Remit/Modules/RegisterModules/UserAuthentication/NewRegister/User Interface/Wireframe/NewRegisterWireframe.swift

@ -9,6 +9,7 @@
import UIKit
import RxSwift
import RxCocoa
import LGSideMenuController
class NewRegisterWireframe {
weak var view: UIViewController!
@ -61,7 +62,14 @@ extension NewRegisterWireframe: NewRegisterWireframeInput {
switch step {
case .first: move(step1VC)
case .second: move(step2VC)
case .third: move(step3VC)
case .third:
view.alert(
message: "To verify your bank account, move to the last step, the penny test"
) { [weak self] in
guard let `self` = self else { return }
self.move(self.step3VC)
}
case .finish:
let message = """
Thank you for registering for GME.
@ -74,8 +82,18 @@ Once approved, you will receive SMS.
message: message,
title: "Success",
okTitle: "Ok"
) {[weak self] in
self?.view.navigationController?.popToRootViewController(animated: false)
) {[weak self] in
guard let `self` = self else {return}
if self.view.presentingViewController != nil {
GMEDB.shared.user.set(PennyTestStatusCode.completed.rawValue, .pennyTestStatusCode)
self.view.dismiss(animated: true) {
}
} else {
GMEDB.shared.user.set(PennyTestStatusCode.completed.rawValue, .pennyTestStatusCode)
self.doLogin()
}
}
}
}
@ -86,9 +104,12 @@ Once approved, you will receive SMS.
}
currentVC?.willMove(toParent: nil)
nextVC.view.translatesAutoresizingMaskIntoConstraints = false
currentVC?.removeFromParent()
currentVC?.view.removeFromSuperview()
nextVC.view.translatesAutoresizingMaskIntoConstraints = false
parentVC.addChild(nextVC)
addSubview(subView: nextVC.view, toView: parentVC.containerView)
if currentVC?.view.tag ?? 0 < nextVC.view.tag {
@ -125,6 +146,68 @@ Once approved, you will receive SMS.
subView.bottomAnchor.constraint(equalTo: parentView.bottomAnchor).isActive = true
subView.trailingAnchor.constraint(equalTo: parentView.trailingAnchor).isActive = true
}
private func doLogin() {
let loginService = LoginService()
guard let userID = KeyChain.shared.get(key: .temporaryID),
let password = KeyChain.shared.get(key: .temporaryPW) else {
return
}
view.showProgressHud(backgroundColor: .clear, loadingColor: .white, textColor: .white)
loginService.accessCode(
userId: userID,
password: password,
success: { [weak self] (user) in
guard let `self` = self else { return }
KeyChain.shared.remove(key: .temporaryID)
KeyChain.shared.remove(key: .temporaryPW)
let accessCode = user?.accessCode ?? ""
let accessCodeBase64 = accessCode
Utility.save(user: user, accessCodeBase64: accessCodeBase64, password: password, login: true)
let mainWireFrame = MainWireframe.shared
let tabBarViewController = mainWireFrame?.getMainView()
guard let sidemenuVc = UIStoryboard(name: "SideMenu", bundle: nil).instantiateViewController(
withIdentifier: "SideMenuViewController"
) as? SideMenuViewController else {
return
}
let sideMenuController = LGSideMenuController(
rootViewController: tabBarViewController,
leftViewController: sidemenuVc,
rightViewController: nil
)
sideMenuController.rootViewLayerShadowColor = UIColor(white: 0.9, alpha: 0.6)
sideMenuController.rootViewLayerShadowRadius = 8.0
sideMenuController.leftViewPresentationStyle = .scaleFromBig
sideMenuController.leftViewWidth = UIScreen.main.bounds.width - 70.0
sideMenuController.leftViewBackgroundBlurEffect = UIBlurEffect(style: .regular)
self.view.hideProgressHud()
mainWireFrame?.window?.backgroundColor = sidemenuVc.view.backgroundColor
mainWireFrame?.window?.rootViewController = sideMenuController
},
failure: { (error) in
self.view.hideProgressHud()
self.view.alert(type: .error, message: error.localizedDescription, title: "Warning") {
// if failed login, remove all in keychain, change logout status and then go splash screen
KeyChain.shared.removeAll()
self.view.navigationController?.popToRootViewController(animated: false)
}
}
)
}
}
extension NewRegisterWireframe: NewRegisterDelegate {

10
GME Remit/Modules/RegisterModules/UserAuthentication/NewRegisterStep1/Application Logic/Interactor/NewRegisterStep1Interactor.swift

@ -44,6 +44,16 @@ extension NewRegisterStep1Interactor: NewRegisterStep1InteractorInput {
service.saveInformation(
with: model,
success: {[weak self] in
if model.type == 1 { // primary information
if let bankCode = model.primaryInformation?.bankID,
let bankAccount = model.primaryInformation?.bankAccount,
let bankName = model.primaryInformation?.bankName {
KeyChain.shared.save(data: bankCode, key: .bankCode)
KeyChain.shared.save(data: bankAccount, key: .bankAccount)
KeyChain.shared.save(data: bankName, key: .bankName)
}
}
self?.output?.setSaveResult(with: self?.saveModel, message: $0)
},
failure: {[weak self] in

35
GME Remit/Modules/RegisterModules/UserAuthentication/NewRegisterStep1/Application Logic/Model/KJBank.swift

@ -0,0 +1,35 @@
//
// KJBank.swift
// GME Remit
//
// Created by InKwon James Kim on 2019/12/31.
// Copyright © 2019 Gobal Money Express Co. Ltd. All rights reserved.
//
import ObjectMapper
struct KJBank: Mappable {
var id: String?
var value: String?
init(id: String, value: String) {
self.id = id
self.value = value
}
init?(map: Map) {}
mutating func mapping(map: Map) {
id <- map["id"]
value <- map["text"]
}
}
extension KJBank: TablePresenterProtocol {
var cellTitle: String? {
return value
}
var cellImage: UIImage? {
return BankEnum.getBankCIFromKJBank(kjBankCode: id ?? "")
}
}

2
GME Remit/Modules/RegisterModules/UserAuthentication/NewRegisterStep1/Application Logic/Model/KYCInfromation.swift

@ -10,7 +10,7 @@ import ObjectMapper
struct KYCInformation: Mappable {
var cities: [KeyValue]?
var banks: [KeyValue]?
var banks: [KJBank]?
var idTypes: [KeyValue]?
var branches: [KeyValue]?

3
GME Remit/Modules/RegisterModules/UserAuthentication/NewRegisterStep1/Application Logic/Model/PrimaryInformation.swift

@ -9,6 +9,7 @@
import ObjectMapper
struct PrimaryInformation: Mappable {
var bankName: String?
var bankID: String?
var bankAccount: String?
var passportNumber: String?
@ -22,6 +23,7 @@ struct PrimaryInformation: Mappable {
var refferalCode: String?
init(
bankName: String?,
bankID: String?,
bankAccount: String?,
passportNumber: String?,
@ -34,6 +36,7 @@ struct PrimaryInformation: Mappable {
branchID: String?,
refferalCode: String?
) {
self.bankName = bankName
self.bankID = bankID
self.bankAccount = bankAccount
self.passportNumber = passportNumber

29
GME Remit/Modules/RegisterModules/UserAuthentication/NewRegisterStep1/User Interface/Presenter/NewRegisterStep1Presenter.swift

@ -34,7 +34,7 @@ class NewRegisterStep1Presenter: ViewModelType {
let personalInfoSave: Driver<Void>
let editingPersonalInfo: Driver<Void>
let bankName: Driver<KeyValue?>
let bankName: Driver<KJBank?>
let bankAccount: Driver<String>
let passportNumber: Driver<String>
let passportIssueDate: Driver<String>
@ -65,7 +65,7 @@ class NewRegisterStep1Presenter: ViewModelType {
let model: Driver<KYCInformation>
let cities: Driver<[KeyValue]?>
let banks: Driver<[KeyValue]?>
let banks: Driver<[KJBank]?>
let idTypes: Driver<[KeyValue]?>
let branches: Driver<[KeyValue]?>
@ -116,31 +116,33 @@ class NewRegisterStep1Presenter: ViewModelType {
input.bankAccount,
input.passportNumber,
input.passportIssueDate,
input.passportExpiryDate,
input.anotherIDType,
input.anotherIDNumber
).map { (isValid, bank, account, passportNumber, passportIssue, passportExpiry, idType, idNumber) ->
PrimaryInformation? in
return isValid ? PrimaryInformation(
input.passportExpiryDate
).map { (isValid, bank, account, passportNumber, passportIssue, passportExpiry) ->
PrimaryInformation? in return isValid ? PrimaryInformation(
bankName: bank?.value,
bankID: bank?.id,
bankAccount: account,
passportNumber: passportNumber,
passportIssueDate: passportIssue,
passportExpiryDate: passportExpiry,
anotherIDType: idType?.id ?? "",
anotherIDNumber: idNumber,
anotherIDType: nil,
anotherIDNumber: nil,
anotherIDIssueDate: nil,
anotherIDExpiryDate: nil,
branchID: nil,
refferalCode: nil
) : nil
) : nil
},
input.anotherIDType,
input.anotherIDNumber,
input.anotherIDIssueDate,
input.anotherIDExpiryDate,
input.branch,
input.referralCode
).map { (info, issueDate, expiryDate, branch, referralCode) -> PrimaryInformation? in
).map { (info, idType, idNumber, issueDate, expiryDate, branch, referralCode) -> PrimaryInformation? in
var primaryInfo = info
primaryInfo?.anotherIDType = idType?.id ?? ""
primaryInfo?.anotherIDNumber = idNumber
primaryInfo?.anotherIDIssueDate = issueDate
primaryInfo?.anotherIDExpiryDate = expiryDate
primaryInfo?.branchID = branch?.id
@ -172,6 +174,7 @@ class NewRegisterStep1Presenter: ViewModelType {
.map {$0 && $1 != nil}
input.viewWillAppear.drive(onNext: { [weak self] in
self?.progressLinker.onNext(true)
self?.interactor?.fetchInformation()
}).disposed(by: disposeBag)
@ -292,6 +295,8 @@ class NewRegisterStep1Presenter: ViewModelType {
// MARK: NewRegisterStep1 interactor output interface
extension NewRegisterStep1Presenter: NewRegisterStep1InteractorOutput {
func setModel(with model: KYCInformation) {
progressLinker.onNext(false)
storedPersonalInfo.onNext(model.personalInformation)
storedPrimaryInfo.onNext(model.primaryInformation)
storedPictureInformation.onNext(model.pictures)

14
GME Remit/Modules/RegisterModules/UserAuthentication/NewRegisterStep1/User Interface/View/NewRegisterStep1.storyboard

@ -401,7 +401,7 @@
</constraints>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="252" verticalHuggingPriority="251" text="Another ID (Optional)" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Knm-yY-Ukr">
<rect key="frame" x="30" y="0.0" width="177.5" height="25"/>
<rect key="frame" x="30" y="0.0" width="174.5" height="25"/>
<constraints>
<constraint firstAttribute="height" constant="25" id="WnD-h7-H27"/>
</constraints>
@ -410,7 +410,7 @@
<nil key="highlightedColor"/>
</label>
<button opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="iy7-W8-jRs">
<rect key="frame" x="212.5" y="0.0" width="102.5" height="25"/>
<rect key="frame" x="209.5" y="0.0" width="105.5" height="25"/>
<constraints>
<constraint firstAttribute="height" constant="25" id="08I-N0-npb"/>
</constraints>
@ -634,16 +634,16 @@
<rect key="frame" x="110" y="2" width="203" height="90"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" alignment="top" spacing="11" translatesAutoresizingMaskIntoConstraints="NO" id="5uj-mo-5FF">
<rect key="frame" x="0.0" y="19" width="203" height="52.5"/>
<rect key="frame" x="0.0" y="18.5" width="203" height="53"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Passport" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="cZ9-FO-Ycz">
<rect key="frame" x="0.0" y="0.0" width="60" height="17.5"/>
<rect key="frame" x="0.0" y="0.0" width="59" height="18"/>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Medium" family="San Francisco Display" pointSize="15"/>
<color key="textColor" name="ThemeText"/>
<nil key="highlightedColor"/>
</label>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="right" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="5bW-bG-7tS">
<rect key="frame" x="0.0" y="28.5" width="58" height="24"/>
<rect key="frame" x="0.0" y="29" width="55" height="24"/>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Regular" family="San Francisco Display" pointSize="10"/>
<state key="normal" title="View Sample">
<color key="titleColor" red="0.0" green="0.47843137250000001" blue="1" alpha="1" colorSpace="calibratedRGB"/>
@ -708,7 +708,7 @@
<rect key="frame" x="0.0" y="14.5" width="203" height="61"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Another ID (Optional)" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="OEE-Gl-1fp">
<rect key="frame" x="0.0" y="0.0" width="140.5" height="35"/>
<rect key="frame" x="0.0" y="0.0" width="138" height="35"/>
<constraints>
<constraint firstAttribute="height" constant="35" id="RZl-BX-uz4"/>
</constraints>
@ -717,7 +717,7 @@
<nil key="highlightedColor"/>
</label>
<button opaque="NO" tag="1" contentMode="scaleToFill" contentHorizontalAlignment="right" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="0l3-Xp-kqb">
<rect key="frame" x="0.0" y="37" width="58" height="24"/>
<rect key="frame" x="0.0" y="37" width="55" height="24"/>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Regular" family="San Francisco Display" pointSize="10"/>
<state key="normal" title="View Sample">
<color key="titleColor" red="0.0" green="0.47843137250000001" blue="1" alpha="1" colorSpace="calibratedRGB"/>

59
GME Remit/Modules/RegisterModules/UserAuthentication/NewRegisterStep1/User Interface/View/NewRegisterStep1ViewController.swift

@ -106,19 +106,19 @@ class NewRegisterStep1ViewController: UIViewController {
super.viewWillDisappear(animated)
}
// willMove -> It appears on the parent screen.
override func willMove(toParent parent: UIViewController?) {
print(#function)
if let `parent` = parent as UIViewController? {
print(parent)
if parent != nil {
viewWillAppear(true)
} else {
viewWillDisappear(true)
}
}
// It appears on the parent screen. -> didMove
override func didMove(toParent parent: UIViewController?) {
print(#function)
if let `parent` = parent as UIViewController? {
print(parent)
if parent != nil {
viewDidAppear(true)
} else {
viewDidDisappear(true)
}
}
@ -299,22 +299,37 @@ extension NewRegisterStep1ViewController {
passportImageTrigger
.asDriverOnErrorJustComplete()
.drive(onNext: {[weak self] in
if let imageData = $0,
let url = URL(string: imageData) {
self?.passportImageButton.imageView?.kf.setImage(with: url)
self?.passportImageButton.addBlur()
self?.hideBorder(view: self?.passportImageContainerView)
if let imageData = $0 {
if let dataDecoded = Data(base64Encoded: imageData, options: .ignoreUnknownCharacters) {
self?.passportImageButton.setImage(UIImage(data: dataDecoded), for: .normal)
self?.passportImageButton.addBlur()
self?.hideBorder(view: self?.passportImageContainerView)
} else if let url = URL(string: imageData) {
self?.passportImageButton.imageView?.kf.setImage(with: url)
self?.passportImageButton.addBlur()
self?.hideBorder(view: self?.passportImageContainerView)
}
} else {
self?.passportImageButton.setImage(UIImage(named: "ic_passport_picture"), for: .normal)
}
}).disposed(by: disposeBag)
anotherIDImageTrigger
.asDriverOnErrorJustComplete()
.drive(onNext: {[weak self] in
if let imageData = $0,
let url = URL(string: imageData) {
self?.anotherIDImageButton.imageView?.kf.setImage(with: url)
self?.anotherIDImageButton.addBlur()
self?.hideBorder(view: self?.anotherIDImageContainerView)
if let imageData = $0 {
if let dataDecoded = Data(base64Encoded: imageData, options: .ignoreUnknownCharacters) {
self?.anotherIDImageButton.setImage(UIImage(data: dataDecoded), for: .normal)
self?.anotherIDImageButton.addBlur()
self?.hideBorder(view: self?.anotherIDImageContainerView)
} else if let url = URL(string: imageData) {
self?.anotherIDImageButton.imageView?.kf.setImage(with: url)
self?.anotherIDImageButton.addBlur()
self?.hideBorder(view: self?.anotherIDImageContainerView)
}
} else {
self?.anotherIDImageButton.setImage(UIImage(named: "ic_another_id_picture"), for: .normal)
}
}).disposed(by: disposeBag)
@ -324,6 +339,7 @@ extension NewRegisterStep1ViewController {
self?.idNumberTextField.text = ""
self?.idIssueDateTextField.text = ""
self?.idExpiryDateTextField.text = ""
self?.anotherIDImageTrigger.onNext(nil)
}).disposed(by: disposeBag)
userNameTextField.rx.filterBy(.alphabet).disposed(by: disposeBag)
@ -369,7 +385,10 @@ extension NewRegisterStep1ViewController {
let isValidPictures = Observable.combineLatest(
[
passportImageTrigger.map {$0 != nil},
anotherIDImageTrigger.map {$0 != nil}
Observable.combineLatest(
idTypeTextField.selectedItem.map {$0 != nil},
anotherIDImageTrigger.map {$0 != nil}
).map { $0 ? $1 : true}
]
).map { $0.allSatisfy { $0 } }
@ -420,7 +439,7 @@ extension NewRegisterStep1ViewController {
personalInfoSave: personalSaveButton.rx.tap.asDriverOnErrorJustComplete(),
editingPersonalInfo: editingPersonalInfo,
bankName: bankTextField.selectedItem.map {$0 as? KeyValue}.asDriverOnErrorJustComplete(),
bankName: bankTextField.selectedItem.map {$0 as? KJBank}.asDriverOnErrorJustComplete(),
bankAccount: bankAccountTextField.rx.text.orEmpty.asDriverOnErrorJustComplete(),
passportNumber: passportNumberTextField.rx.text.orEmpty.asDriverOnErrorJustComplete(),
passportIssueDate: passportIssueDateTextField.rx.text.orEmpty.asDriverOnErrorJustComplete(),

3
GME Remit/Modules/RegisterModules/UserAuthentication/NewRegisterStep2/User Interface/Presenter/NewRegisterStep2Presenter.swift

@ -32,6 +32,7 @@ class NewRegisterStep2Presenter: ViewModelType {
func transform(input: Input) -> Output {
input.viewWillAppear.subscribe(onNext: {[weak self] in
self?.progressLinker.onNext(true)
self?.interactor?.fetchOpenBankData()
}).disposed(by: disposeBag)
@ -54,10 +55,12 @@ class NewRegisterStep2Presenter: ViewModelType {
// MARK: NewRegisterStep2 interactor output interface
extension NewRegisterStep2Presenter: NewRegisterStep2InteractorOutput {
func setModel(with model: KFTCModel) {
progressLinker.onNext(false)
self.model.onNext(model)
}
func setError(with error: Error) {
progressLinker.onNext(false)
errorLinker.onNext(error)
}
}

17
GME Remit/Modules/RegisterModules/UserAuthentication/NewRegisterStep2/User Interface/View/NewRegisterStep2ViewController.swift

@ -37,6 +37,23 @@ class NewRegisterStep2ViewController: UIViewController {
super.viewWillDisappear(animated)
}
override func willMove(toParent parent: UIViewController?) {
if parent != nil {
viewWillAppear(true)
} else {
viewWillDisappear(true)
}
}
override func didMove(toParent parent: UIViewController?) {
if parent != nil {
viewDidAppear(true)
} else {
viewDidDisappear(true)
}
}
// MARK: IBActions
}

26
GME Remit/Modules/RegisterModules/UserAuthentication/NewRegisterStep3/Application Logic/Interactor/NewRegisterStep3Interactor.swift

@ -26,5 +26,31 @@ class NewRegisterStep3Interactor {
// MARK: NewRegisterStep3 interactor input interface
extension NewRegisterStep3Interactor: NewRegisterStep3InteractorInput {
func retryRequestPennyTest() {
let pennyTestService = NewRegisterService()
pennyTestService.requestPennyTest(
isResendRequest: .yes,
success: {[weak self] in
self?.output?.resultRequestPennyTest(with: $0)
},
failure: {[weak self] in
self?.output?.setError(with: $0)
}
)
}
func submitPennyTest(certNumber: String) {
let account = KeyChain.shared.get(key: .bankAccount) ?? ""
service.pennyTestSubmitAtRegister(
accountNumber: account,
certNumber: certNumber,
success: {[weak self] in
self?.output?.resultSubmit(with: $0)
},
failure: {[weak self] in
self?.output?.setError(with: $0)
}
)
}
}

6
GME Remit/Modules/RegisterModules/UserAuthentication/NewRegisterStep3/Application Logic/Interactor/NewRegisterStep3InteractorIO.swift

@ -7,9 +7,13 @@
//
protocol NewRegisterStep3InteractorInput: class {
func retryRequestPennyTest()
func submitPennyTest(certNumber: String)
}
protocol NewRegisterStep3InteractorOutput: class {
func resultRequestPennyTest(with message: SuccessMessage)
func setError(with error: Error)
func resultSubmit(with message: SuccessMessage)
}

20
GME Remit/Modules/RegisterModules/UserAuthentication/NewRegisterStep3/Application Logic/Service/NewRegisterStep3Service.swift

@ -9,5 +9,25 @@
import Foundation
class NewRegisterStep3Service: NewRegisterStep3ServiceType {
func pennyTestSubmitAtRegister(
accountNumber account: String,
certNumber number: String,
success: @escaping (SuccessMessage) -> Void,
failure: @escaping (Error) -> Void
) {
// APIRouter.pennyTestSubmitAtRegister(
// accountNumber: account,
// certNumber: number
// ).json(success: success, failure: failure)
// FIXME: Test
let message = SuccessMessage()
// FIXME: -success
success(message)
// FIXME: -failrue
// failure(NSError(domain: "error", code: 0, message: "ERROR!"))
}
}

7
GME Remit/Modules/RegisterModules/UserAuthentication/NewRegisterStep3/Application Logic/Service/NewRegisterStep3ServiceType.swift

@ -7,5 +7,10 @@
//
protocol NewRegisterStep3ServiceType: class {
func pennyTestSubmitAtRegister(
accountNumber account: String,
certNumber number: String,
success: @escaping (SuccessMessage) -> Void,
failure: @escaping (Error) -> Void
)
}

38
GME Remit/Modules/RegisterModules/UserAuthentication/NewRegisterStep3/User Interface/Presenter/NewRegisterStep3Presenter.swift

@ -13,27 +13,61 @@ class NewRegisterStep3Presenter: ViewModelType {
var interactor: NewRegisterStep3InteractorInput?
var wireframe: NewRegisterStep3WireframeInput?
struct Input {}
struct Input {
let resendTrigger: Observable<Void>
let certNumber: Observable<String>
let submitTrigger: Observable<Void>
}
struct Output {
let isError: Driver<Error>
let isProgress: Driver<Bool>
let resendMessage: Driver<String>
let submitMessage: Driver<String>
}
private let disposeBag = DisposeBag()
private let progressLinker = PublishSubject<Bool>()
private let errorLinker = PublishSubject<Error>()
private let resendMessageLinker = PublishSubject<String>()
private let submitMessageLinker = PublishSubject<String>()
func transform(input: Input) -> Output {
input.resendTrigger.subscribe(onNext: {[weak self] in
self?.progressLinker.onNext(true)
self?.interactor?.retryRequestPennyTest()
}).disposed(by: disposeBag)
input.submitTrigger.withLatestFrom(input.certNumber) { $1 }
.subscribe(onNext: {[weak self] in
self?.progressLinker.onNext(true)
self?.interactor?.submitPennyTest(certNumber: $0)
}).disposed(by: disposeBag)
return Output(
isError: errorLinker.asDriverOnErrorJustComplete(),
isProgress: progressLinker.asDriverOnErrorJustComplete()
isProgress: progressLinker.asDriverOnErrorJustComplete(),
resendMessage: resendMessageLinker.asDriverOnErrorJustComplete(),
submitMessage: submitMessageLinker.asDriverOnErrorJustComplete()
)
}
}
// MARK: NewRegisterStep3 interactor output interface
extension NewRegisterStep3Presenter: NewRegisterStep3InteractorOutput {
func resultRequestPennyTest(with message: SuccessMessage) {
progressLinker.onNext(false)
resendMessageLinker.onNext(message.message ?? "")
}
func setError(with error: Error) {
progressLinker.onNext(false)
errorLinker.onNext(error)
}
func resultSubmit(with message: SuccessMessage) {
progressLinker.onNext(false)
submitMessageLinker.onNext(message.message ?? "")
}
}

48
GME Remit/Modules/RegisterModules/UserAuthentication/NewRegisterStep3/User Interface/View/NewRegisterStep3.storyboard

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="15702" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="HSb-ou-7T5">
<device id="retina6_5" orientation="portrait" appearance="dark"/>
<device id="retina6_5" orientation="portrait" appearance="light"/>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15704"/>
@ -28,29 +28,44 @@
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="21" translatesAutoresizingMaskIntoConstraints="NO" id="mYY-6S-tFg">
<rect key="frame" x="10" y="54" width="394" height="798"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" alignment="center" translatesAutoresizingMaskIntoConstraints="NO" id="brK-q5-jZ9">
<rect key="frame" x="0.0" y="0.0" width="394" height="75"/>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="5" translatesAutoresizingMaskIntoConstraints="NO" id="brK-q5-jZ9">
<rect key="frame" x="0.0" y="0.0" width="394" height="80"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" spacing="10" translatesAutoresizingMaskIntoConstraints="NO" id="jMj-MF-tek">
<rect key="frame" x="128" y="0.0" width="138.33333333333337" height="50"/>
<stackView opaque="NO" contentMode="scaleToFill" spacing="9" translatesAutoresizingMaskIntoConstraints="NO" id="jMj-MF-tek">
<rect key="frame" x="0.0" y="0.0" width="394" height="50"/>
<subviews>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="sh" translatesAutoresizingMaskIntoConstraints="NO" id="hqn-fe-Jau">
<rect key="frame" x="0.0" y="0.0" width="50" height="50"/>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="249" verticalHuggingPriority="251" text="" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="bWn-kr-6PT">
<rect key="frame" x="0.0" y="0.0" width="141.33333333333334" height="50"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="ic_koreaBank" translatesAutoresizingMaskIntoConstraints="NO" id="hqn-fe-Jau">
<rect key="frame" x="150.33333333333334" y="0.0" width="50" height="50"/>
<constraints>
<constraint firstAttribute="width" constant="50" id="n0s-Nn-Uyg"/>
<constraint firstAttribute="height" constant="50" id="wF2-wI-0Ay"/>
</constraints>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="253" text="Shin han" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="olI-P7-Pht">
<rect key="frame" x="59.999999999999993" y="0.0" width="78.333333333333314" height="50"/>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="254" verticalHuggingPriority="253" text="N/A" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" minimumScaleFactor="0.80000000000000004" preferredMaxLayoutWidth="250" translatesAutoresizingMaskIntoConstraints="NO" id="olI-P7-Pht">
<rect key="frame" x="209.33333333333334" y="0.0" width="34.333333333333343" height="50"/>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Medium" family="San Francisco Display" pointSize="20"/>
<color key="textColor" name="ThemeText"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="249" verticalHuggingPriority="251" text="" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="adG-Ry-fFc">
<rect key="frame" x="252.66666666666669" y="0.0" width="141.33333333333331" height="50"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<constraints>
<constraint firstItem="bWn-kr-6PT" firstAttribute="width" secondItem="adG-Ry-fFc" secondAttribute="width" id="FxR-Xm-5Go"/>
</constraints>
</stackView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="252" verticalHuggingPriority="254" text="110223458044" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" translatesAutoresizingMaskIntoConstraints="NO" id="0at-QE-L9N">
<rect key="frame" x="130.33333333333337" y="50" width="133.66666666666663" height="25"/>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="252" verticalHuggingPriority="254" text="N/A" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" translatesAutoresizingMaskIntoConstraints="NO" id="0at-QE-L9N">
<rect key="frame" x="0.0" y="55" width="394" height="25"/>
<constraints>
<constraint firstAttribute="height" constant="25" id="PF8-6w-AMC"/>
</constraints>
@ -61,7 +76,7 @@
</subviews>
</stackView>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="X6V-DC-MAf">
<rect key="frame" x="0.0" y="96" width="394" height="55"/>
<rect key="frame" x="0.0" y="101" width="394" height="55"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="254" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="3" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" translatesAutoresizingMaskIntoConstraints="NO" id="Lfa-ho-fpD">
<rect key="frame" x="20" y="0.0" width="354" height="55"/>
@ -85,7 +100,7 @@ enter the 4 digit number display after GME.</string>
</constraints>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="abK-iI-6ao">
<rect key="frame" x="0.0" y="172" width="394" height="75"/>
<rect key="frame" x="0.0" y="177" width="394" height="75"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="5" translatesAutoresizingMaskIntoConstraints="NO" id="pLp-eL-Nn2">
<rect key="frame" x="20" y="0.0" width="354" height="75"/>
@ -146,7 +161,7 @@ enter the 4 digit number display after GME.</string>
</constraints>
</view>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="gnV-ZM-b6s">
<rect key="frame" x="0.0" y="268" width="394" height="50"/>
<rect key="frame" x="0.0" y="273" width="394" height="50"/>
<color key="backgroundColor" name="ThemeRed"/>
<constraints>
<constraint firstAttribute="height" constant="50" id="r7i-qB-8Jy"/>
@ -157,7 +172,7 @@ enter the 4 digit number display after GME.</string>
</state>
</button>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="YpU-Qn-Xp2">
<rect key="frame" x="0.0" y="339" width="394" height="459"/>
<rect key="frame" x="0.0" y="344" width="394" height="454"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
@ -181,6 +196,7 @@ enter the 4 digit number display after GME.</string>
<outlet property="codeTextField" destination="ymm-Zi-y9T" id="QTs-sP-eZj"/>
<outlet property="depositLabel" destination="XbJ-eo-D2f" id="gLk-1n-SLy"/>
<outlet property="resendButton" destination="IXD-9h-aLl" id="bu3-uA-OhK"/>
<outlet property="sampleButton" destination="gZW-Sw-FTJ" id="kh4-e0-e1n"/>
<outlet property="submitButton" destination="gnV-ZM-b6s" id="dP3-ty-W7D"/>
</connections>
</viewController>
@ -190,7 +206,7 @@ enter the 4 digit number display after GME.</string>
</scene>
</scenes>
<resources>
<image name="sh" width="100" height="66"/>
<image name="ic_koreaBank" width="48" height="46"/>
<namedColor name="ThemeMainBackground">
<color red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</namedColor>

98
GME Remit/Modules/RegisterModules/UserAuthentication/NewRegisterStep3/User Interface/View/NewRegisterStep3ViewController.swift

@ -9,6 +9,8 @@
import UIKit
import RxSwift
import RxCocoa
import PMAlertController
import LGSideMenuController
class NewRegisterStep3ViewController: UIViewController {
@ -20,15 +22,17 @@ class NewRegisterStep3ViewController: UIViewController {
// MARK: Computed Properties
// MARK: IBOutlets
@IBOutlet weak var bankImageView: UIImageView!
@IBOutlet weak var bankNameLabel: UILabel!
@IBOutlet weak var bankAccountLabel: UILabel!
@IBOutlet private weak var bankImageView: UIImageView!
@IBOutlet private weak var bankNameLabel: UILabel!
@IBOutlet private weak var bankAccountLabel: UILabel!
@IBOutlet weak var depositLabel: UILabel!
@IBOutlet weak var codeTextField: UITextField!
@IBOutlet private weak var depositLabel: UILabel!
@IBOutlet private weak var codeTextField: UITextField!
@IBOutlet private weak var sampleButton: UIButton!
@IBOutlet private weak var resendButton: UIButton!
@IBOutlet private weak var submitButton: UIButton!
@IBOutlet weak var resendButton: UIButton!
@IBOutlet weak var submitButton: UIButton!
// MARK: VC's Life cycle
override func viewDidLoad() {
super.viewDidLoad()
@ -37,10 +41,40 @@ class NewRegisterStep3ViewController: UIViewController {
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
guard
let bankName = KeyChain.shared.get(key: .bankName),
let bankCode = KeyChain.shared.get(key: .bankCode),
let bankAccount = KeyChain.shared.get(key: .bankAccount) else { return }
bankAccountLabel.text = bankAccount
bankImageView.image = BankEnum.getBankCIFromKJBank(kjBankCode: bankCode)
bankNameLabel.text = bankName
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
codeTextField.becomeFirstResponder()
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
view.endEditing(true)
}
override func willMove(toParent parent: UIViewController?) {
if parent != nil {
viewWillAppear(true)
} else {
viewWillDisappear(true)
}
}
override func didMove(toParent parent: UIViewController?) {
if parent != nil {
viewDidAppear(true)
} else {
viewDidDisappear(true)
}
}
// MARK: IBActions
@ -61,24 +95,56 @@ extension NewRegisterStep3ViewController {
}
private func setUIBinding() {
submitButton.rx.tap.bind {[weak self] in
guard let `self` = self else {return}
self.delegate?.newRegister(self, currentStep: .third, nextStep: .finish)
}.disposed(by: disposeBag)
sampleButton.rx.tap.bind {[weak self] in
self?.showSample()
}.disposed(by: disposeBag)
codeTextField.rx.text.orEmpty
.map {$0.count == 4}
.asDriverOnErrorJustComplete()
.map {[weak self] in
self?.submitButton.backgroundColor = $0 ? .themeRed : .lightGray
return $0
}
.drive(submitButton.rx.isEnabled)
.disposed(by: disposeBag)
}
private func setBinding() {
let input = NewRegisterStep3Presenter.Input()
let input = NewRegisterStep3Presenter.Input(
resendTrigger: resendButton.rx.tap.mapToVoid(),
certNumber: codeTextField.rx.text.orEmpty.asObservable(),
submitTrigger: submitButton.rx.tap.mapToVoid()
)
let output = presenter.transform(input: input)
output.isError
.drive(
onNext: { self.alert(type: .error, message: $0.localizedDescription) }
.drive(
onNext: { self.alert(type: .error, message: $0.localizedDescription) }
).disposed(by: disposeBag)
output.isProgress
.drive(
onNext: { $0 ? self.showProgressHud() : self.hideProgressHud() }
.drive(
onNext: { $0 ? self.showProgressHud() : self.hideProgressHud() }
).disposed(by: disposeBag)
output.resendMessage.drive(onNext: {[weak self] in
self?.alert(message: $0)
}).disposed(by: disposeBag)
output.submitMessage.drive(onNext: {[weak self] _ in
guard let `self` = self else {return}
self.delegate?.newRegister(self, currentStep: .third, nextStep: .finish)
}).disposed(by: disposeBag)
}
private func showSample() {
let image = #imageLiteral(resourceName: "penny3")
// show alert
let alertVC = PMAlertController(title: "", description: "", image: image, style: .alert)
alertVC.alertView.layer.cornerRadius = 5
let action = PMAlertAction(title: "ok_text".localized(), style: .cancel)
alertVC.addAction(action)
self.present(alertVC, animated: true, completion: nil)
}
}

8
GME Remit/Modules/SideMenu/SideMenu.storyboard

@ -186,10 +186,6 @@
</constraints>
</view>
</subviews>
<constraints>
<constraint firstAttribute="height" relation="lessThanOrEqual" constant="60" id="KEM-tf-W0G"/>
<constraint firstAttribute="height" relation="greaterThanOrEqual" constant="45" id="jZe-By-nry"/>
</constraints>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="10" translatesAutoresizingMaskIntoConstraints="NO" id="rsv-Ul-7Hc">
<rect key="frame" x="0.0" y="50" width="259" height="45"/>
@ -416,6 +412,10 @@
</constraints>
</view>
</subviews>
<constraints>
<constraint firstAttribute="height" relation="greaterThanOrEqual" constant="45" id="cne-GG-teW"/>
<constraint firstAttribute="height" relation="lessThanOrEqual" constant="60" id="zlW-MU-Ygn"/>
</constraints>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="10" translatesAutoresizingMaskIntoConstraints="NO" id="4oZ-AQ-PlP" userLabel="SettingStack View">
<rect key="frame" x="0.0" y="250" width="259" height="45"/>

21
GME Remit/Supported Files/Assets.xcassets/bankCI/deutsche.imageset/Contents.json

@ -0,0 +1,21 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "deutsche.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

BIN
GME Remit/Supported Files/Assets.xcassets/bankCI/deutsche.imageset/deutsche.png

After

Width: 100  |  Height: 66  |  Size: 4.5 KiB

21
GME Remit/Supported Files/Assets.xcassets/bankCI/epost.imageset/Contents.json

@ -0,0 +1,21 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "epost.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

BIN
GME Remit/Supported Files/Assets.xcassets/bankCI/epost.imageset/epost.png

After

Width: 100  |  Height: 66  |  Size: 4.2 KiB

21
GME Remit/Supported Files/Assets.xcassets/bankCI/hsbc.imageset/Contents.json

@ -0,0 +1,21 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "hsbc.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

BIN
GME Remit/Supported Files/Assets.xcassets/bankCI/hsbc.imageset/hsbc.png

After

Width: 100  |  Height: 66  |  Size: 3.4 KiB

21
GME Remit/Supported Files/Assets.xcassets/bankCI/kfcc.imageset/Contents.json

@ -0,0 +1,21 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "kfcc.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

BIN
GME Remit/Supported Files/Assets.xcassets/bankCI/kfcc.imageset/kfcc.png

After

Width: 100  |  Height: 66  |  Size: 5.2 KiB

21
GME Remit/Supported Files/Assets.xcassets/bankCI/shinhyup.imageset/Contents.json

@ -0,0 +1,21 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "shinhyup.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

BIN
GME Remit/Supported Files/Assets.xcassets/bankCI/shinhyup.imageset/shinhyup.png

After

Width: 100  |  Height: 66  |  Size: 5.7 KiB

61
GME Remit/Utilities/BankEnum.swift

@ -71,4 +71,65 @@ extension BankEnum {
return #imageLiteral(resourceName: "wsb")
}
}
static func getBankCIFromKJBank(kjBankCode code: String) -> UIImage {
switch code {
case "20":
return BankEnum.bs.ciImage
case "18":
return BankEnum.ct.ciImage
case "11":
return #imageLiteral(resourceName: "shinhyup")
case "5":
return BankEnum.dgb.ciImage
case "6":
return #imageLiteral(resourceName: "deutsche")
case "19":
return #imageLiteral(resourceName: "hsbc")
case "3":
return BankEnum.ibk.ciImage
case "17":
return BankEnum.jj.ciImage
case "15":
return BankEnum.jb.ciImage
case "28":
return BankEnum.kbank.ciImage
case "29":
return BankEnum.kakao.ciImage
case "13":
return BankEnum.keb.ciImage
case "26":
return BankEnum.keb.ciImage
case "2":
return BankEnum.kb.ciImage
case "24":
return BankEnum.kb.ciImage
case "7":
return BankEnum.kdb.ciImage
case "8":
return #imageLiteral(resourceName: "kfcc")
case "14":
return #imageLiteral(resourceName: "epost")
case "1":
return BankEnum.kj.ciImage
case "25":
return BankEnum.kn.ciImage
case "4":
return BankEnum.nh.ciImage
case "23":
return BankEnum.nh.ciImage
case "10":
return BankEnum.sh.ciImage
case "16":
return BankEnum.sc.ciImage
case "9":
return BankEnum.slc.ciImage
case "27":
return BankEnum.wsb.ciImage
case "21":
return BankEnum.wr.ciImage
default:
return #imageLiteral(resourceName: "ic_koreaBank")
}
}
}

3
GME Remit/Utilities/KeyChain.swift

@ -18,6 +18,9 @@ final class KeyChain {
case login
case temporaryID
case temporaryPW
case bankCode
case bankAccount
case bankName
}
static let shared = KeyChain()

7
GME Remit/Utilities/WebLinks/WkWebView/WkWebViewController.swift

@ -125,12 +125,7 @@ extension WkWebViewController: WKScriptMessageHandler {
return
}
let kycMessage =
"""
Auto-Debit account register is complete.
To verify your bank account, move to the last step, the penny test
"""
let kycMessage = "Auto-Debit account register is complete."
alert(type: .success, message: kycMessage) {
self.dismiss(animated: true) {
delegate.newRegister(self, currentStep: .second, nextStep: .third)

Loading…
Cancel
Save