From 12edda72d478fcd9fc884dc0246de7633f6d0a9c Mon Sep 17 00:00:00 2001 From: Amrit Date: Wed, 24 Jun 2020 20:04:51 +0545 Subject: [PATCH] kyc changed --- .DS_Store | Bin 10244 -> 10244 bytes .../Presenter/NewRegisterPresenter.swift | 96 +- .../View/NewRegister.storyboard | 6 +- .../View/NewRegisterViewController.swift | 7 +- .../Wireframe/NewRegisterWireframe.swift | 25 +- .../NewRegisterStep1Interactor.swift | 2 +- .../View/NewRegisterStep1.storyboard | 2 + .../View/NewRegisterStep1ViewController.swift | 1723 +++++++++-------- .../View/NewRegisterStep2.storyboard | 6 +- .../View/NewRegisterStep3.storyboard | 6 +- 10 files changed, 946 insertions(+), 927 deletions(-) diff --git a/.DS_Store b/.DS_Store index e4b15fa53b9d9052133e9d8681b487c81521b363..51ed2a1f5b55ffe7b7c76eca5581ff8aa319da39 100644 GIT binary patch delta 22 dcmZn(XbIS0E5Xb%H*vCq!~w<&n;9jU`2kso2Mz!L delta 22 dcmZn(XbIS0E5Xcs@7QDqi35xRn;9jU`2k%62J-*_ diff --git a/GME Remit/Modules/RegisterModules/UserAuthentication/NewRegister/User Interface/Presenter/NewRegisterPresenter.swift b/GME Remit/Modules/RegisterModules/UserAuthentication/NewRegister/User Interface/Presenter/NewRegisterPresenter.swift index 75f9a050..c3ba5f32 100644 --- a/GME Remit/Modules/RegisterModules/UserAuthentication/NewRegister/User Interface/Presenter/NewRegisterPresenter.swift +++ b/GME Remit/Modules/RegisterModules/UserAuthentication/NewRegister/User Interface/Presenter/NewRegisterPresenter.swift @@ -10,56 +10,58 @@ import RxSwift import RxCocoa class NewRegisterPresenter: ViewModelType { - var interactor: NewRegisterInteractorInput? - var wireframe: NewRegisterWireframeInput? - - struct Input { - let moveStep: Driver - } - - struct Output { - let isError: Driver - let isProgress: Driver - } - - private let disposeBag = DisposeBag() - - private let progressLinker = PublishSubject() - private let errorLinker = PublishSubject() - - func transform(input: Input) -> Output { - input.moveStep.drive(onNext: {[weak self] in - switch $0 { - case .third: - let status = GMEDB.shared.user.string(.pennyTestStatusCode) ?? "0" - if status == "1" { - self?.wireframe?.moveStep(to: $0) - } else { - self?.progressLinker.onNext(true) - self?.interactor?.requestPennyTest() - } - - default: - self?.wireframe?.moveStep(to: $0) - } - }).disposed(by: disposeBag) + var interactor: NewRegisterInteractorInput? + var wireframe: NewRegisterWireframeInput? + + struct Input { + let moveStep: Driver + } + + struct Output { + let isError: Driver + let isProgress: Driver + } - return Output( - isError: errorLinker.asDriverOnErrorJustComplete(), - isProgress: progressLinker.asDriverOnErrorJustComplete() - ) - } + private let disposeBag = DisposeBag() + + private let progressLinker = PublishSubject() + private let errorLinker = PublishSubject() + + func transform(input: Input) -> Output { + input.moveStep.drive(onNext: {[weak self] in + switch $0 { + case .third: + let status = GMEDB.shared.user.string(.pennyTestStatusCode) ?? "0" + if status == "1" { + self?.wireframe?.moveStep(to: $0) + } else { + self?.progressLinker.onNext(true) + self?.interactor?.requestPennyTest() + } + + case .upload: + break + default: + self?.wireframe?.moveStep(to: $0) + } + }).disposed(by: disposeBag) + + return Output( + isError: errorLinker.asDriverOnErrorJustComplete(), + isProgress: progressLinker.asDriverOnErrorJustComplete() + ) + } } // MARK: NewRegister interactor output interface extension NewRegisterPresenter: NewRegisterInteractorOutput { - func resultRequestPennyTest(with message: SuccessMessage) { - progressLinker.onNext(false) - wireframe?.moveStep(to: .third) - } - - func setError(with error: Error) { - progressLinker.onNext(false) - errorLinker.onNext(error) - } + func resultRequestPennyTest(with message: SuccessMessage) { + progressLinker.onNext(false) + wireframe?.moveStep(to: .third) + } + + func setError(with error: Error) { + progressLinker.onNext(false) + errorLinker.onNext(error) + } } diff --git a/GME Remit/Modules/RegisterModules/UserAuthentication/NewRegister/User Interface/View/NewRegister.storyboard b/GME Remit/Modules/RegisterModules/UserAuthentication/NewRegister/User Interface/View/NewRegister.storyboard index 349d4c18..878b7f73 100644 --- a/GME Remit/Modules/RegisterModules/UserAuthentication/NewRegister/User Interface/View/NewRegister.storyboard +++ b/GME Remit/Modules/RegisterModules/UserAuthentication/NewRegister/User Interface/View/NewRegister.storyboard @@ -1,9 +1,9 @@ - + - + @@ -215,6 +215,7 @@ Penny Test + @@ -235,5 +236,4 @@ Penny Test - diff --git a/GME Remit/Modules/RegisterModules/UserAuthentication/NewRegister/User Interface/View/NewRegisterViewController.swift b/GME Remit/Modules/RegisterModules/UserAuthentication/NewRegister/User Interface/View/NewRegisterViewController.swift index f2428ae6..b25580b4 100644 --- a/GME Remit/Modules/RegisterModules/UserAuthentication/NewRegister/User Interface/View/NewRegisterViewController.swift +++ b/GME Remit/Modules/RegisterModules/UserAuthentication/NewRegister/User Interface/View/NewRegisterViewController.swift @@ -15,6 +15,9 @@ protocol NewRegisterDelegate: class { _ viewController: UIViewController, currentStep: NewRegisterViewController.Step, nextStep: NewRegisterViewController.Step) + + //In Case when only two process are implemented (Personal Information and Document Upload) + func changeTopProgress() } class NewRegisterViewController: UIViewController { @@ -23,6 +26,8 @@ class NewRegisterViewController: UIViewController { case second case third case finish + //In case of only 2 process implemented + case upload } // MARK: Properties @@ -160,7 +165,7 @@ extension NewRegisterViewController { func setMultilanguages() { step1TitleLabel.text = "step1_sub_title_text".localized() - step2TitleLabel.text = "step2_sub_title_text".localized() + step2TitleLabel.text = "Documents"//"step2_sub_title_text".localized() step3TitleLabel.text = "step3_sub_title_text".localized() } } diff --git a/GME Remit/Modules/RegisterModules/UserAuthentication/NewRegister/User Interface/Wireframe/NewRegisterWireframe.swift b/GME Remit/Modules/RegisterModules/UserAuthentication/NewRegister/User Interface/Wireframe/NewRegisterWireframe.swift index fe6314b8..ede422dd 100644 --- a/GME Remit/Modules/RegisterModules/UserAuthentication/NewRegister/User Interface/Wireframe/NewRegisterWireframe.swift +++ b/GME Remit/Modules/RegisterModules/UserAuthentication/NewRegister/User Interface/Wireframe/NewRegisterWireframe.swift @@ -70,7 +70,8 @@ extension NewRegisterWireframe: NewRegisterWireframeInput { guard let `self` = self else { return } self.move(self.step3VC) } - + case .upload: + break case .finish: view.alertWithOk( type: .success, @@ -206,12 +207,18 @@ extension NewRegisterWireframe: NewRegisterWireframeInput { } extension NewRegisterWireframe: NewRegisterDelegate { - func newRegister( - _ viewController: UIViewController, - currentStep: NewRegisterViewController.Step, - nextStep: NewRegisterViewController.Step - ) { - stepper?.onNext(nextStep) - } - + func newRegister( + _ viewController: UIViewController, + currentStep: NewRegisterViewController.Step, + nextStep: NewRegisterViewController.Step + ) { +// stepper?.onNext(nextStep) + stepper?.onNext(.finish) + } + + func changeTopProgress(){ + print("Change Status") + stepper?.onNext(.upload) + } + } diff --git a/GME Remit/Modules/RegisterModules/UserAuthentication/NewRegisterStep1/Application Logic/Interactor/NewRegisterStep1Interactor.swift b/GME Remit/Modules/RegisterModules/UserAuthentication/NewRegisterStep1/Application Logic/Interactor/NewRegisterStep1Interactor.swift index 600aa585..a792ca5e 100644 --- a/GME Remit/Modules/RegisterModules/UserAuthentication/NewRegisterStep1/Application Logic/Interactor/NewRegisterStep1Interactor.swift +++ b/GME Remit/Modules/RegisterModules/UserAuthentication/NewRegisterStep1/Application Logic/Interactor/NewRegisterStep1Interactor.swift @@ -48,13 +48,13 @@ extension NewRegisterStep1Interactor: NewRegisterStep1InteractorInput { storedModel?.primaryInformation?.bankAccount != saveModel?.primaryInformation?.bankAccount { GMEDB.shared.user.set("0", .pennyTestStatusCode) } - service.saveInformation( with: model, success: {[weak self] in self?.output?.setSaveResult(with: self?.saveModel, message: $0) }, failure: {[weak self] in +// self?.output?.setSaveResult(with: self?.saveModel, message: $0.localizedDescription) self?.output?.setError(with: $0) } ) diff --git a/GME Remit/Modules/RegisterModules/UserAuthentication/NewRegisterStep1/User Interface/View/NewRegisterStep1.storyboard b/GME Remit/Modules/RegisterModules/UserAuthentication/NewRegisterStep1/User Interface/View/NewRegisterStep1.storyboard index 4419a26c..1162cdb7 100644 --- a/GME Remit/Modules/RegisterModules/UserAuthentication/NewRegisterStep1/User Interface/View/NewRegisterStep1.storyboard +++ b/GME Remit/Modules/RegisterModules/UserAuthentication/NewRegisterStep1/User Interface/View/NewRegisterStep1.storyboard @@ -882,9 +882,11 @@ + + diff --git a/GME Remit/Modules/RegisterModules/UserAuthentication/NewRegisterStep1/User Interface/View/NewRegisterStep1ViewController.swift b/GME Remit/Modules/RegisterModules/UserAuthentication/NewRegisterStep1/User Interface/View/NewRegisterStep1ViewController.swift index 3e5042cf..03576df7 100644 --- a/GME Remit/Modules/RegisterModules/UserAuthentication/NewRegisterStep1/User Interface/View/NewRegisterStep1ViewController.swift +++ b/GME Remit/Modules/RegisterModules/UserAuthentication/NewRegisterStep1/User Interface/View/NewRegisterStep1ViewController.swift @@ -14,906 +14,909 @@ import PMAlertController import Kingfisher class NewRegisterStep1ViewController: UIViewController { - private enum PhotoType: Int { - case passport - case anotherID - } - - // MARK: Properties - var presenter: NewRegisterStep1Presenter! - weak var delegate: NewRegisterDelegate? - - private let disposeBag = DisposeBag() - private let sendLocation = PublishSubject() - private let locationManager = CLLocationManager() - private var photoType = PhotoType.passport - - private var multiMediaManager: MultiMediaManager? - private var imageCropper: ImageCroper? - - private let passportImageTrigger = BehaviorSubject(value: nil) - private let anotherIDImageTrigger = BehaviorSubject(value: nil) - - private let passportImageBase64 = BehaviorSubject(value: nil) - private let anotherIDImageBase64 = BehaviorSubject(value: nil) - - private let genders = [ - KeyValue(id: "M", value: "male_text".localized()), - KeyValue(id: "F", value: "female_text".localized()) - ] - - private var isForeigner = true - - // MARK: Computed Properties - - // MARK: IBOutlets - @IBOutlet private weak var scrollView: UIScrollView! - - @IBOutlet private weak var personalInformationLabel: UILabel! - @IBOutlet private weak var userNameTextField: ValidationTextField! - @IBOutlet private weak var genderTextField: ValidationTextField! - @IBOutlet private weak var dobTextField: ValidationTextField! - @IBOutlet private weak var emailTextField: ValidationTextField! - @IBOutlet private weak var occupationTextField: ValidationTextField! - - @IBOutlet private weak var cityTextField: ValidationTextField! - @IBOutlet private weak var addressTextField: ValidationTextField! - - @IBOutlet private weak var gpsButton: UIButton! - - @IBOutlet private weak var primaryInformationContainerView: UIStackView! - @IBOutlet private weak var uploadPicturesContainerView: UIStackView! - - @IBOutlet private weak var personalSaveButton: UIButton! - @IBOutlet private weak var bankSaveButton: UIButton! - @IBOutlet private weak var picturesSaveButton: UIButton! - - @IBOutlet private weak var bankInformationLabel: UILabel! - @IBOutlet private weak var bankTextField: ValidationTextField! - @IBOutlet private weak var bankAccountTextField: ValidationTextField! - - @IBOutlet private weak var passportInformationLabel: UILabel! - @IBOutlet private weak var passportNumberTextField: ValidationTextField! - @IBOutlet private weak var passportIssueDateTextField: ValidationTextField! - @IBOutlet private weak var passportExpiryDateTextField: ValidationTextField! - - @IBOutlet private weak var anotherIDLabel: UILabel! - @IBOutlet private weak var idTypeTextField: ValidationTextField! - @IBOutlet private weak var idNumberTextField: ValidationTextField! - @IBOutlet private weak var idIssueDateTextField: ValidationTextField! - @IBOutlet private weak var idExpiryDateTextField: ValidationTextField! - - @IBOutlet private weak var additionalInformationLabel: UILabel! - @IBOutlet private weak var branchTextField: ValidationTextField! - @IBOutlet private weak var referralTextField: ValidationTextField! - - @IBOutlet private weak var passportImageContainerView: UIView! - @IBOutlet private weak var anotherIDImageContainerView: UIView! - @IBOutlet private weak var passportImageButton: UIButton! - @IBOutlet private weak var anotherIDImageButton: UIButton! - - @IBOutlet private weak var uploadPicturesLabel: UILabel! - @IBOutlet private weak var passportSampleButton: UIButton! - @IBOutlet private weak var anotherIDSampleButton: UIButton! - @IBOutlet private weak var anotherIDClearButton: UIButton! - - @IBOutlet private weak var personalInformationGroupImageView: UIImageView! - @IBOutlet private weak var bankInformationGroupImageView: UIImageView! - @IBOutlet private weak var passportInformationGroupImageView: UIImageView! - @IBOutlet private weak var anotherIDInformationGroupImageView: UIImageView! - @IBOutlet private weak var additionalInformationGroupImageView: UIImageView! - @IBOutlet private weak var picturesInformationGroupImageView: UIImageView! - - @IBOutlet private weak var passportImageLabel: UILabel! - @IBOutlet private weak var anotherIDImageLabel: UILabel! - - @IBOutlet private weak var passportContainerView: UIStackView! - @IBOutlet private weak var anotherIDContainerView: UIStackView! - // MARK: VC's Life cycle - override func viewDidLoad() { - super.viewDidLoad() - setup() - } - - override func viewWillAppear(_ animated: Bool) { - super.viewWillAppear(animated) - } - - override func viewWillDisappear(_ animated: Bool) { - super.viewWillDisappear(animated) - } - - override func willMove(toParent parent: UIViewController?) { - if parent != nil { - viewWillAppear(true) - } else { - viewWillDisappear(true) + private enum PhotoType: Int { + case passport + case anotherID } - } - - override func didMove(toParent parent: UIViewController?) { - if parent != nil { - viewDidAppear(true) - } else { - viewDidDisappear(true) + + // MARK: Properties + var presenter: NewRegisterStep1Presenter! + weak var delegate: NewRegisterDelegate? + + private let disposeBag = DisposeBag() + private let sendLocation = PublishSubject() + private let locationManager = CLLocationManager() + private var photoType = PhotoType.passport + + private var multiMediaManager: MultiMediaManager? + private var imageCropper: ImageCroper? + + private let passportImageTrigger = BehaviorSubject(value: nil) + private let anotherIDImageTrigger = BehaviorSubject(value: nil) + + private let passportImageBase64 = BehaviorSubject(value: nil) + private let anotherIDImageBase64 = BehaviorSubject(value: nil) + + private let genders = [ + KeyValue(id: "M", value: "male_text".localized()), + KeyValue(id: "F", value: "female_text".localized()) + ] + + private var isForeigner = true + + // MARK: Computed Properties + + // MARK: IBOutlets + @IBOutlet private weak var scrollView: UIScrollView! + + @IBOutlet weak var primaryInformationCHildStack: UIStackView! + @IBOutlet weak var personalInformationStack: UIStackView! + @IBOutlet private weak var personalInformationLabel: UILabel! + @IBOutlet private weak var userNameTextField: ValidationTextField! + @IBOutlet private weak var genderTextField: ValidationTextField! + @IBOutlet private weak var dobTextField: ValidationTextField! + @IBOutlet private weak var emailTextField: ValidationTextField! + @IBOutlet private weak var occupationTextField: ValidationTextField! + + @IBOutlet private weak var cityTextField: ValidationTextField! + @IBOutlet private weak var addressTextField: ValidationTextField! + + @IBOutlet private weak var gpsButton: UIButton! + + @IBOutlet private weak var primaryInformationContainerView: UIStackView! + @IBOutlet private weak var uploadPicturesContainerView: UIStackView! + + @IBOutlet private weak var personalSaveButton: UIButton! + @IBOutlet private weak var bankSaveButton: UIButton! + @IBOutlet private weak var picturesSaveButton: UIButton! + + @IBOutlet private weak var bankInformationLabel: UILabel! + @IBOutlet private weak var bankTextField: ValidationTextField! + @IBOutlet private weak var bankAccountTextField: ValidationTextField! + + @IBOutlet private weak var passportInformationLabel: UILabel! + @IBOutlet private weak var passportNumberTextField: ValidationTextField! + @IBOutlet private weak var passportIssueDateTextField: ValidationTextField! + @IBOutlet private weak var passportExpiryDateTextField: ValidationTextField! + + @IBOutlet private weak var anotherIDLabel: UILabel! + @IBOutlet private weak var idTypeTextField: ValidationTextField! + @IBOutlet private weak var idNumberTextField: ValidationTextField! + @IBOutlet private weak var idIssueDateTextField: ValidationTextField! + @IBOutlet private weak var idExpiryDateTextField: ValidationTextField! + + @IBOutlet private weak var additionalInformationLabel: UILabel! + @IBOutlet private weak var branchTextField: ValidationTextField! + @IBOutlet private weak var referralTextField: ValidationTextField! + + @IBOutlet private weak var passportImageContainerView: UIView! + @IBOutlet private weak var anotherIDImageContainerView: UIView! + @IBOutlet private weak var passportImageButton: UIButton! + @IBOutlet private weak var anotherIDImageButton: UIButton! + + @IBOutlet private weak var uploadPicturesLabel: UILabel! + @IBOutlet private weak var passportSampleButton: UIButton! + @IBOutlet private weak var anotherIDSampleButton: UIButton! + @IBOutlet private weak var anotherIDClearButton: UIButton! + + @IBOutlet private weak var personalInformationGroupImageView: UIImageView! + @IBOutlet private weak var bankInformationGroupImageView: UIImageView! + @IBOutlet private weak var passportInformationGroupImageView: UIImageView! + @IBOutlet private weak var anotherIDInformationGroupImageView: UIImageView! + @IBOutlet private weak var additionalInformationGroupImageView: UIImageView! + @IBOutlet private weak var picturesInformationGroupImageView: UIImageView! + + @IBOutlet private weak var passportImageLabel: UILabel! + @IBOutlet private weak var anotherIDImageLabel: UILabel! + + @IBOutlet private weak var passportContainerView: UIStackView! + @IBOutlet private weak var anotherIDContainerView: UIStackView! + // MARK: VC's Life cycle + override func viewDidLoad() { + super.viewDidLoad() + setup() } - } - - // MARK: IBActions - @IBAction func touchGPSButton(_ sender: UIButton) { - locationManager.requestAlwaysAuthorization() - locationManager.requestWhenInUseAuthorization() - - if CLLocationManager.locationServicesEnabled() { - locationManager.delegate = self - locationManager.desiredAccuracy = kCLLocationAccuracyBest - locationManager.startUpdatingLocation() - showProgressHud() + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) } - } - @IBAction private func touchSample(_ sender: UIButton) { - guard let type = PhotoType(rawValue: sender.tag) else {return} - showSample(type: type) - } - - private func showSample(type: PhotoType) { - let image: UIImage? - switch type { - case .passport: - image = #imageLiteral(resourceName: "samplePassport") - case .anotherID: - image = #imageLiteral(resourceName: "sampleFront") + + override func viewWillDisappear(_ animated: Bool) { + super.viewWillDisappear(animated) } - // 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) - alertVC.modalPresentationStyle = .overFullScreen - self.present(alertVC, animated: true, completion: nil) - } -} - -// MARK: Other Functions -extension NewRegisterStep1ViewController { - - private func setup() { - multiMediaManager = MultiMediaManager(presenter: self) - multiMediaManager?.delegate = self - - imageCropper = ImageCroper(presentingViewController: self) - imageCropper?.delegate = self - - setUI() - setBinding() - setUIBinding() - } - - private func setUI() { - setMultiLanguages() - - personalInformationGroupImageView.setRenderingMode(with: .themeText) - bankInformationGroupImageView.setRenderingMode(with: .themeText) - passportInformationGroupImageView.setRenderingMode(with: .themeText) - anotherIDInformationGroupImageView.setRenderingMode(with: .themeText) - additionalInformationGroupImageView.setRenderingMode(with: .themeText) - picturesInformationGroupImageView.setRenderingMode(with: .themeText) - - bankTextField.useAsDropDown(items: nil) - idTypeTextField.useAsDropDown(items: nil) - branchTextField.useAsDropDown(items: nil) - - dobTextField.useAsDropDown(items: nil) - passportIssueDateTextField.useAsDropDown(items: nil) - passportExpiryDateTextField.useAsDropDown(items: nil) - idIssueDateTextField.useAsDropDown(items: nil) - idExpiryDateTextField.useAsDropDown(items: nil) - - personalSaveButton.layer.cornerRadius = 5 - bankSaveButton.layer.cornerRadius = 5 - picturesSaveButton.layer.cornerRadius = 5 - - passportImageButton.layer.cornerRadius = 5 - passportImageButton.layer.borderWidth = 1 - passportImageButton.layer.borderColor = UIColor.themeText.cgColor - - anotherIDImageButton.layer.cornerRadius = 5 - anotherIDImageButton.layer.borderWidth = 1 - anotherIDImageButton.layer.borderColor = UIColor.themeText.cgColor - - primaryInformationContainerView.isHidden = true - uploadPicturesContainerView.isHidden = true - - idIssueDateTextField.isHidden = true - idExpiryDateTextField.isHidden = true - - let genderConfigure = TablePresenterConfiguration(presenterTitle: "gender_placeholder_text".localized()) - - genderTextField.useAsDropDown( - with: genderConfigure, - items: genders - ) - - userNameTextField.validCondition = {!$0.isEmpty && $0.count > 1} - genderTextField.validCondition = {!$0.isEmpty} - dobTextField.validCondition = {!$0.isEmpty} - emailTextField.validCondition = {$0.isEmail()} - cityTextField.validCondition = {!$0.isEmpty} - addressTextField.validCondition = {!$0.isEmpty && $0.count < 50} - occupationTextField.validCondition = {!$0.isEmpty} - - bankTextField.validCondition = {!$0.isEmpty} - bankAccountTextField.validCondition = {!$0.isEmpty && $0.count > 9} - - branchTextField.validCondition = {!$0.isEmpty} - - referralTextField.validCondition = nil - - idNumberTextField.delegate = self - - setDatePicker(textField: dobTextField, useMaximum: true) - setDatePicker(textField: passportIssueDateTextField, useMaximum: true) - setDatePicker(textField: passportExpiryDateTextField, useMaximum: false, useMinimum: true) - setDatePicker(textField: idIssueDateTextField, useMaximum: true) - setDatePicker(textField: idExpiryDateTextField, useMaximum: false, useMinimum: true) - } - - private func setUIBinding() { - idTypeTextField.selectedItem.map {$0 as? KeyValue} - .asDriverOnErrorJustComplete() - .drive(onNext: { [weak self] in - self?.idIssueDateTextField.isHidden = true - self?.idExpiryDateTextField.isHidden = true - - self?.idNumberTextField.validCondition = nil - self?.idIssueDateTextField.validCondition = nil - self?.idExpiryDateTextField.validCondition = nil - self?.anotherIDImageContainerView.isHidden = true - - guard let idType = $0 else { - return - } - - switch idType.id ?? "8008"{ - case "8008": - self?.anotherIDImageLabel.text = "national_id_text".localized() - self?.idNumberTextField.errorMessage = "national_id_number_error_text".localized() - case "11012": - self?.anotherIDImageLabel.text = "driving_id_text".localized() - self?.idNumberTextField.errorMessage = "driving_id_number_error_text".localized() - case "1302": - self?.anotherIDImageLabel.text = "alien_id_text".localized() - self?.idNumberTextField.errorMessage = "alien_id_number_error_text".localized() - default: - self?.anotherIDImageLabel.text = "id_type_text".localized() - self?.idNumberTextField.errorMessage = "another_id_number_error_text".localized() - } - - self?.anotherIDImageContainerView.isHidden = false - - self?.idNumberTextField.validCondition = { !$0.isEmpty && $0.count == 14 } - - idType.dependent?.forEach { - switch $0 { - case "docIssueDate" : - self?.idIssueDateTextField.isHidden = false - self?.idIssueDateTextField.validCondition = { !$0.isEmpty } - case "docExpiryDate": - self?.idExpiryDateTextField.isHidden = false - self?.idExpiryDateTextField.validCondition = { !$0.isEmpty } - default : - self?.idIssueDateTextField.isHidden = true - self?.idExpiryDateTextField.isHidden = true - self?.idNumberTextField.validCondition = nil - self?.idIssueDateTextField.validCondition = nil - self?.idExpiryDateTextField.validCondition = nil - } - } - }).disposed(by: disposeBag) - - passportImageButton.rx.tap.bind {[weak self] in - self?.photoType = .passport - self?.multiMediaManager?.openPicker(mode: UIImagePickerController.CameraCaptureMode.photo) - }.disposed(by: disposeBag) - - anotherIDImageButton.rx.tap.bind {[weak self] in - self?.photoType = .anotherID - self?.multiMediaManager?.openPicker(mode: UIImagePickerController.CameraCaptureMode.photo) - }.disposed(by: disposeBag) - - passportImageTrigger - .asDriverOnErrorJustComplete() - .drive(onNext: {[weak self] in - if let imageData = $0 { - if let dataDecoded = Data(base64Encoded: imageData, options: .ignoreUnknownCharacters) { - DispatchQueue.main.async { - self?.passportImageButton.setImage(UIImage(data: dataDecoded), for: .normal) - self?.passportImageButton.addBlur() - self?.hideBorder(view: self?.passportImageContainerView) - self?.passportImageBase64.onNext(imageData) - } - } else if let url = URL(string: imageData) { - DispatchQueue.main.async { - self?.showProgressHud() - self?.passportImageButton.kf.setImage(with: url, for: .normal) { result in - self?.hideProgressHud() - switch result { - case .success(let value): - self?.passportImageBase64.onNext(value.image.toBase64()) - case .failure(let error): - print("Job failed: \(error.localizedDescription)") - } - } - self?.passportImageButton.addBlur() - self?.hideBorder(view: self?.passportImageContainerView) - } - } + + override func willMove(toParent parent: UIViewController?) { + if parent != nil { + viewWillAppear(true) } else { - self?.passportImageBase64.onNext(nil) - self?.passportImageButton.setImage(UIImage(named: "ic_passport_picture"), for: .normal) - } - - }).disposed(by: disposeBag) - - anotherIDImageTrigger - .asDriverOnErrorJustComplete() - .drive(onNext: {[weak self] in - if let imageData = $0 { - if let dataDecoded = Data(base64Encoded: imageData, options: .ignoreUnknownCharacters) { - DispatchQueue.main.async { - self?.anotherIDImageButton.setImage(UIImage(data: dataDecoded), for: .normal) - self?.anotherIDImageButton.addBlur() - self?.hideBorder(view: self?.anotherIDImageContainerView) - self?.anotherIDImageBase64.onNext(imageData) - } - } else if let url = URL(string: imageData) { - DispatchQueue.main.async { - self?.showProgressHud() - self?.anotherIDImageButton.kf.setImage(with: url, for: .normal) { result in - self?.hideProgressHud() - switch result { - case .success(let value): - self?.anotherIDImageBase64.onNext(value.image.toBase64()) - case .failure(let error): - print("Job failed: \(error.localizedDescription)") - } - } - self?.anotherIDImageButton.addBlur() - self?.hideBorder(view: self?.anotherIDImageContainerView) - } + viewWillDisappear(true) } - } else { - self?.anotherIDImageBase64.onNext(nil) - self?.anotherIDImageButton.setImage(UIImage(named: "ic_another_id_picture"), for: .normal) - } - }).disposed(by: disposeBag) - - anotherIDClearButton.rx.tap.asDriver() - .drive(onNext: {[weak self] in - self?.idTypeTextField.didSelect(item: nil) - self?.idNumberTextField.text = "" - self?.idNumberTextField.sendActions(for: .editingChanged) - - self?.idIssueDateTextField.text = "" - self?.idIssueDateTextField.sendActions(for: .editingChanged) - - self?.idExpiryDateTextField.text = "" - self?.idExpiryDateTextField.sendActions(for: .editingChanged) - - self?.anotherIDImageTrigger.onNext(nil) - }).disposed(by: disposeBag) - - userNameTextField.rx.filterBy(.alphabet, isUppercase: true).disposed(by: disposeBag) - emailTextField.rx.filterBy(.alphabetNumbericSpecial).disposed(by: disposeBag) - addressTextField.rx.filterBy(.alphabet, isUppercase: true).disposed(by: disposeBag) - bankAccountTextField.rx.filterBy(.numberic).disposed(by: disposeBag) - passportNumberTextField.rx.filterBy(.alphabetNumberic, isUppercase: true).disposed(by: disposeBag) - idNumberTextField.rx.filterBy("[0-9-]").disposed(by: disposeBag) - referralTextField.rx.filterBy(.alphabetNumberic, isUppercase: true).disposed(by: disposeBag) - - } - - private func setBinding() { - let viewWillAppear = rx.sentMessage(#selector(UIViewController.viewWillAppear(_:))).mapToVoid() - .asDriverOnErrorJustComplete() - - let isValidPersonalInfo = Observable.combineLatest( - [ - userNameTextField.valid, - genderTextField.valid, - dobTextField.valid, - emailTextField.valid, - cityTextField.valid, - addressTextField.valid, - occupationTextField.valid - ] - ).map { $0.allSatisfy { $0 } } - .distinctUntilChanged() - - let isValidPrimaryInfo = Observable.combineLatest( - [ - bankTextField.valid, - bankAccountTextField.valid, - passportNumberTextField.valid, - passportIssueDateTextField.valid, - passportExpiryDateTextField.valid, - idTypeTextField.valid, - idNumberTextField.valid, - idIssueDateTextField.valid, - idExpiryDateTextField.valid, - branchTextField.valid, - referralTextField.valid - ] - ).map { $0.allSatisfy { $0 } } - .distinctUntilChanged() - - let isValidPictures = Observable.combineLatest( - [ - passportImageBase64.map {[weak self] in - self?.isForeigner ?? true ? $0 != nil : true - }, - Observable.combineLatest( - idTypeTextField.selectedItem.map {$0 != nil}, - anotherIDImageBase64.map {$0 != nil} - ).map { $0 ? $1 : true} - ] - ).map { $0.allSatisfy { $0 } } - .distinctUntilChanged() - - let editingPersonalInfo = Observable.combineLatest( - userNameTextField.rx.controlEvent(.editingChanged), - genderTextField.rx.controlEvent(.editingChanged), - dobTextField.rx.controlEvent(.editingChanged), - emailTextField.rx.controlEvent(.editingChanged), - cityTextField.rx.controlEvent(.editingChanged), - addressTextField.rx.controlEvent(.editingChanged), - occupationTextField.rx.controlEvent(.editingChanged) - ).mapToVoid().asDriverOnErrorJustComplete() - - let editingPrimaryInfo = Observable.combineLatest( - Observable.combineLatest( - bankTextField.rx.controlEvent(.editingChanged), - bankAccountTextField.rx.controlEvent(.editingChanged), - passportNumberTextField.rx.controlEvent(.editingChanged), - passportIssueDateTextField.rx.controlEvent(.editingChanged), - passportExpiryDateTextField.rx.controlEvent(.editingChanged) - ), - Observable.combineLatest( - idTypeTextField.rx.controlEvent(.editingChanged), - idNumberTextField.rx.controlEvent(.editingChanged), - idIssueDateTextField.rx.controlEvent(.editingChanged), - idExpiryDateTextField.rx.controlEvent(.editingChanged), - branchTextField.rx.controlEvent(.editingChanged), - referralTextField.rx.controlEvent(.editingChanged) - ) - ).mapToVoid().asDriverOnErrorJustComplete() - - let editingPictureInfo = Observable.combineLatest( - passportImageBase64, - anotherIDImageBase64 - ).mapToVoid().asDriverOnErrorJustComplete() - - let input = NewRegisterStep1Presenter.Input( - viewWillAppear: viewWillAppear, - sendLocation: sendLocation.asDriverOnErrorJustComplete(), - - name: userNameTextField.rx.text.orEmpty.asDriverOnErrorJustComplete(), - gender: genderTextField.selectedItem.map {$0 as? KeyValue}.asDriverOnErrorJustComplete(), - dob: dobTextField.rx.text.orEmpty.asDriverOnErrorJustComplete(), - email: emailTextField.rx.text.orEmpty.asDriverOnErrorJustComplete(), - city: cityTextField.selectedItem.map {$0 as? KeyValue}.asDriverOnErrorJustComplete(), - address: addressTextField.rx.text.orEmpty.asDriverOnErrorJustComplete(), - occupation: occupationTextField.selectedItem.map {$0 as? KeyValue}.asDriverOnErrorJustComplete(), - - isValidPersonalInfo: isValidPersonalInfo.asDriverOnErrorJustComplete(), - personalInfoSave: personalSaveButton.rx.tap.asDriverOnErrorJustComplete(), - editingPersonalInfo: editingPersonalInfo, - - 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(), - passportExpiryDate: passportExpiryDateTextField.rx.text.orEmpty.asDriverOnErrorJustComplete(), - anotherIDType: idTypeTextField.selectedItem.map {$0 as? KeyValue}.asDriverOnErrorJustComplete(), - anotherIDNumber: idNumberTextField.rx.text.orEmpty.asDriverOnErrorJustComplete(), - anotherIDIssueDate: idIssueDateTextField.rx.text.orEmpty.asDriverOnErrorJustComplete(), - anotherIDExpiryDate: idExpiryDateTextField.rx.text.orEmpty.asDriverOnErrorJustComplete(), - branch: branchTextField.selectedItem.map {$0 as? KeyValue}.asDriverOnErrorJustComplete(), - referralCode: referralTextField.rx.text.orEmpty.asDriverOnErrorJustComplete(), - - isValidPrimaryInfo: isValidPrimaryInfo.asDriverOnErrorJustComplete(), - primaryInfoSave: bankSaveButton.rx.tap.asDriverOnErrorJustComplete(), - editingPrimaryInfo: editingPrimaryInfo, - - passportImage: passportImageBase64.asDriverOnErrorJustComplete(), - anotherIDImage: anotherIDImageBase64.asDriverOnErrorJustComplete(), - isValidPictures: isValidPictures.asDriverOnErrorJustComplete(), - editingPictureInfo: editingPictureInfo, - submit: picturesSaveButton.rx.tap.asDriverOnErrorJustComplete() - ) - let output = presenter.transform(input: input) - - output.isError - .drive( - onNext: { self.alert(type: .error, message: $0.localizedDescription) } - ).disposed(by: disposeBag) - - output.isProgress - .drive( - onNext: { $0 ? self.showProgressHud() : self.hideProgressHud() } - ).disposed(by: disposeBag) - - output.gpsAddress.drive(onNext: {[weak self] in - self?.addressTextField.text = $0 - self?.addressTextField.sendActions(for: .editingChanged) - }).disposed(by: disposeBag) - - output.cities.drive(onNext: {[weak self] in - let configure = TablePresenterConfiguration(presenterTitle: "select_city_text".localized()) - self?.cityTextField.useAsDropDown(with: configure, items: $0) - }).disposed(by: disposeBag) - - output.banks.drive(onNext: {[weak self] in - let configure = TablePresenterConfiguration(presenterTitle: "select_bank_text".localized()) - self?.bankTextField.useAsDropDown(with: configure, items: $0) - }).disposed(by: disposeBag) - - output.idTypes.drive(onNext: {[weak self] in - let configure = TablePresenterConfiguration(presenterTitle: "select_id_type_text".localized()) - self?.idTypeTextField.useAsDropDown(with: configure, items: $0) - }).disposed(by: disposeBag) - - output.branches.drive(onNext: {[weak self] in - let configure = TablePresenterConfiguration(presenterTitle: "select_branch_text".localized()) - self?.branchTextField.useAsDropDown(with: configure, items: $0) - }).disposed(by: disposeBag) - - output.occupations.drive(onNext: {[weak self] in - let configure = TablePresenterConfiguration(presenterTitle: "occupation_placeholder_text".localized()) - self?.occupationTextField.useAsDropDown(with: configure, items: $0) - }).disposed(by: disposeBag) - - output.model.drive(onNext: {[weak self] model in - guard let personalInformation = model.personalInformation else { return } - - let isForeigner = (personalInformation.nativeCountry ?? "").lowercased() == "kr" ? false : true - - if isForeigner { - self?.passportNumberTextField.validCondition = {!$0.isEmpty && $0.count > 3} - self?.passportIssueDateTextField.validCondition = {!$0.isEmpty} - self?.passportExpiryDateTextField.validCondition = {!$0.isEmpty} - - self?.idTypeTextField.validCondition = nil - self?.idNumberTextField.validCondition = nil - self?.idIssueDateTextField.validCondition = nil - self?.idExpiryDateTextField.validCondition = nil - self?.anotherIDClearButton.isHidden = false - - } else { - self?.passportContainerView.isHidden = true - self?.anotherIDContainerView.isHidden = false - - self?.passportNumberTextField.validCondition = nil - self?.passportIssueDateTextField.validCondition = nil - self?.passportExpiryDateTextField.validCondition = nil - - self?.idTypeTextField.validCondition = {!$0.isEmpty} - self?.idNumberTextField.validCondition = { !$0.isEmpty && $0.count == 14 } - - self?.anotherIDLabel.text = "id_type_text".localized() - self?.anotherIDClearButton.isHidden = true - - self?.passportImageContainerView.isHidden = true - self?.anotherIDImageLabel.text = "id_type_text".localized() - } - - self?.isForeigner = isForeigner - - self?.userNameTextField.text = personalInformation.fullName - self?.userNameTextField.sendActions(for: .editingChanged) - self?.dobTextField.text = personalInformation.dob - self?.dobTextField.sendActions(for: .editingChanged) - self?.emailTextField.text = personalInformation.email - self?.emailTextField.sendActions(for: .editingChanged) - self?.addressTextField.text = personalInformation.address - self?.addressTextField.sendActions(for: .editingChanged) - - self?.genderTextField.didSelect( - item: self?.genders.first {$0.id == personalInformation.gender} - ) - - self?.cityTextField.didSelect( - item: model.cities?.first {$0.value == personalInformation.city} - ) - - self?.occupationTextField.didSelect( - item: model.occupations?.first {$0.id == personalInformation.occupation} - ) - - guard let primaryInformation = model.primaryInformation else { return } - - self?.bankAccountTextField.text = primaryInformation.bankAccount - self?.bankAccountTextField.sendActions(for: .editingChanged) - self?.passportNumberTextField.text = primaryInformation.passportNumber - self?.passportNumberTextField.sendActions(for: .editingChanged) - self?.passportIssueDateTextField.text = primaryInformation.passportIssueDate - self?.passportIssueDateTextField.sendActions(for: .editingChanged) - self?.passportExpiryDateTextField.text = primaryInformation.passportExpiryDate - self?.passportExpiryDateTextField.sendActions(for: .editingChanged) - self?.idNumberTextField.text = primaryInformation.anotherIDNumber - self?.idNumberTextField.sendActions(for: .editingChanged) - self?.idIssueDateTextField.text = primaryInformation.anotherIDIssueDate - self?.idIssueDateTextField.sendActions(for: .editingChanged) - self?.idExpiryDateTextField.text = primaryInformation.anotherIDExpiryDate - self?.idExpiryDateTextField.sendActions(for: .editingChanged) - self?.referralTextField.text = primaryInformation.refferalCode - self?.referralTextField.sendActions(for: .editingChanged) - - self?.bankTextField.didSelect( - item: model.banks?.first {$0.id == primaryInformation.bankID} - ) - - self?.idTypeTextField.didSelect( - item: model.idTypes?.first {$0.id == primaryInformation.anotherIDType} - ) - - let branchID = primaryInformation.branchID != "" ? primaryInformation.branchID : "2080" - - self?.branchTextField.didSelect( - item: model.branches?.first {$0.id == branchID} - ) - - guard let pictureInformation = model.pictures else { return } - self?.passportImageTrigger.onNext(pictureInformation.passportPicture) - self?.anotherIDImageTrigger.onNext(pictureInformation.anotherIDPicture) - - }).disposed(by: disposeBag) - - output.isSetPersonalInformation - .distinctUntilChanged() - .drive(onNext: {[weak self] isHidden in - self?.personalSaveButton.animateHidden(isHidden: isHidden, duration: 0.2) { -// self?.primaryInformationContainerView.animateHidden(isHidden: !isHidden, duration: 0.2) - self?.primaryInformationContainerView.isHidden = !isHidden - } - }).disposed(by: disposeBag) - - output.isSetPrimaryInformation - .distinctUntilChanged() - .drive(onNext: {[weak self] isHidden in - self?.bankSaveButton.animateHidden(isHidden: isHidden, duration: 0.2) { -// self?.uploadPicturesContainerView.animateHidden(isHidden: !isHidden, duration: 0.2) - self?.uploadPicturesContainerView.isHidden = !isHidden + } + + override func didMove(toParent parent: UIViewController?) { + if parent != nil { + viewDidAppear(true) + } else { + viewDidDisappear(true) } - }).disposed(by: disposeBag) + } - output.storedSuccess - .drive(onNext: {[weak self] in - guard let `self` = self else {return} + // MARK: IBActions + @IBAction func touchGPSButton(_ sender: UIButton) { + locationManager.requestAlwaysAuthorization() + locationManager.requestWhenInUseAuthorization() - self.alert(type: .success, message: $0) { - self.delegate?.newRegister(self, currentStep: .first, nextStep: .second) - } - }).disposed(by: disposeBag) - - isValidPersonalInfo - .distinctUntilChanged() - .asDriverOnErrorJustComplete().drive(onNext: {[weak self] isEnable in - DispatchQueue.main.async { - self?.personalSaveButton.isEnabled = isEnable - self?.personalSaveButton.backgroundColor = isEnable ? .themeRed : .lightGray - } - }).disposed(by: disposeBag) - - isValidPrimaryInfo - .distinctUntilChanged() - .asDriverOnErrorJustComplete().drive(onNext: {[weak self] isEnable in - DispatchQueue.main.async { - self?.bankSaveButton.isEnabled = isEnable - self?.bankSaveButton.backgroundColor = isEnable ? .themeRed : .lightGray + if CLLocationManager.locationServicesEnabled() { + locationManager.delegate = self + locationManager.desiredAccuracy = kCLLocationAccuracyBest + locationManager.startUpdatingLocation() + showProgressHud() } - }).disposed(by: disposeBag) - - isValidPictures - .distinctUntilChanged() - .asDriverOnErrorJustComplete().drive(onNext: {[weak self] isEnable in - DispatchQueue.main.async { - self?.picturesSaveButton.isEnabled = isEnable - self?.picturesSaveButton.backgroundColor = isEnable ? .themeRed : .lightGray - } - }).disposed(by: disposeBag) - } - - private func setDatePicker(textField: UITextField, useMaximum: Bool = false, useMinimum: Bool = false) { - let datePicker = UIDatePicker() - datePicker.datePickerMode = .date - - if useMaximum { - datePicker.maximumDate = Date() + } + @IBAction private func touchSample(_ sender: UIButton) { + guard let type = PhotoType(rawValue: sender.tag) else {return} + showSample(type: type) } - if useMinimum { - datePicker.minimumDate = Date() + private func showSample(type: PhotoType) { + let image: UIImage? + switch type { + case .passport: + image = #imageLiteral(resourceName: "samplePassport") + case .anotherID: + image = #imageLiteral(resourceName: "sampleFront") + } + // 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) + alertVC.modalPresentationStyle = .overFullScreen + self.present(alertVC, animated: true, completion: nil) } +} - textField.inputView = datePicker - - datePicker.rx.controlEvent(.valueChanged).withLatestFrom(datePicker.rx.date) {$1} - .asDriverOnErrorJustComplete() - .drive(onNext: { - let dateFormatter = DateFormatter() - dateFormatter.dateFormat = "yyyy-MM-dd" - textField.text = dateFormatter.string(from: $0) - textField.sendActions(for: .editingChanged) - }).disposed(by: disposeBag) - } - - private func setMultiLanguages() { - personalInformationLabel.text = "personal_information_text".localized() - userNameTextField.placeholder = "fullname_placeholder_text".localized() - userNameTextField.errorMessage = "kyc_first_name_error".localized() - - genderTextField.placeholder = "gender_text".localized() - - dobTextField.placeholder = "dob_text".localized() - - emailTextField.placeholder = "email_text".localized() - emailTextField.errorMessage = "email_error_text".localized() - - cityTextField.placeholder = "city_text".localized() - - addressTextField.placeholder = "address_text".localized() - addressTextField.errorMessage = "address_error_text".localized() - - occupationTextField.placeholder = "occupation_text".localized() - - personalSaveButton.setTitle("save_and_continue_text".localized(), for: .normal) - - bankInformationLabel.text = "korea_bank_infornation_text".localized() - - bankTextField.placeholder = "korea_bank_placeholder_text".localized() - - bankAccountTextField.placeholder = "account_text".localized() - bankAccountTextField.errorMessage = "invalid_account_error_text".localized() - - passportInformationLabel.text = "passport_information_text".localized() - passportNumberTextField.placeholder = "passport_number_text".localized() - passportNumberTextField.errorMessage = "passport_error_text".localized() - - passportIssueDateTextField.placeholder = "passport_issue_date_text".localized() - - passportExpiryDateTextField.placeholder = "passport_expiry_date_text".localized() - - anotherIDLabel.text = "another_id_information_text".localized() - - idTypeTextField.placeholder = "id_type_text".localized() - idNumberTextField.placeholder = "id_number_text".localized() - idIssueDateTextField.placeholder = "another_id_issue_date_text".localized() - idExpiryDateTextField.placeholder = "another_id_expiry_date_text".localized() - - idNumberTextField.errorMessage = "another_id_number_error_text".localized() - - anotherIDClearButton.setTitle("clear_text".localized(), for: .normal) - - additionalInformationLabel.text = "additional_information_text".localized() - branchTextField.placeholder = "branch_text".localized() - referralTextField.placeholder = "referral_code_text".localized() +// MARK: Other Functions +extension NewRegisterStep1ViewController { - bankSaveButton.setTitle("save_and_continue_text".localized(), for: .normal) + private func setup() { + multiMediaManager = MultiMediaManager(presenter: self) + multiMediaManager?.delegate = self + + imageCropper = ImageCroper(presentingViewController: self) + imageCropper?.delegate = self + + setUI() + setBinding() + setUIBinding() + } - uploadPicturesLabel.text = "upload_pictures_text".localized() - passportImageLabel.text = "passport_text".localized() - anotherIDImageLabel.text = "another_id_information_text".localized() + private func setUI() { + setMultiLanguages() + + personalInformationGroupImageView.setRenderingMode(with: .themeText) + bankInformationGroupImageView.setRenderingMode(with: .themeText) + passportInformationGroupImageView.setRenderingMode(with: .themeText) + anotherIDInformationGroupImageView.setRenderingMode(with: .themeText) + additionalInformationGroupImageView.setRenderingMode(with: .themeText) + picturesInformationGroupImageView.setRenderingMode(with: .themeText) + + bankTextField.useAsDropDown(items: nil) + idTypeTextField.useAsDropDown(items: nil) + branchTextField.useAsDropDown(items: nil) + + dobTextField.useAsDropDown(items: nil) + passportIssueDateTextField.useAsDropDown(items: nil) + passportExpiryDateTextField.useAsDropDown(items: nil) + idIssueDateTextField.useAsDropDown(items: nil) + idExpiryDateTextField.useAsDropDown(items: nil) + + personalSaveButton.layer.cornerRadius = 5 + bankSaveButton.layer.cornerRadius = 5 + picturesSaveButton.layer.cornerRadius = 5 + + passportImageButton.layer.cornerRadius = 5 + passportImageButton.layer.borderWidth = 1 + passportImageButton.layer.borderColor = UIColor.themeText.cgColor + + anotherIDImageButton.layer.cornerRadius = 5 + anotherIDImageButton.layer.borderWidth = 1 + anotherIDImageButton.layer.borderColor = UIColor.themeText.cgColor + + primaryInformationContainerView.isHidden = true + uploadPicturesContainerView.isHidden = true + + idIssueDateTextField.isHidden = true + idExpiryDateTextField.isHidden = true + + let genderConfigure = TablePresenterConfiguration(presenterTitle: "gender_placeholder_text".localized()) + + genderTextField.useAsDropDown( + with: genderConfigure, + items: genders + ) + + userNameTextField.validCondition = {!$0.isEmpty && $0.count > 1} + genderTextField.validCondition = {!$0.isEmpty} + dobTextField.validCondition = {!$0.isEmpty} + emailTextField.validCondition = {$0.isEmail()} + cityTextField.validCondition = {!$0.isEmpty} + addressTextField.validCondition = {!$0.isEmpty && $0.count < 50} + occupationTextField.validCondition = {!$0.isEmpty} + + bankTextField.validCondition = {!$0.isEmpty} + bankAccountTextField.validCondition = {!$0.isEmpty && $0.count > 9} + + branchTextField.validCondition = {!$0.isEmpty} + + referralTextField.validCondition = nil + + idNumberTextField.delegate = self + + setDatePicker(textField: dobTextField, useMaximum: true) + setDatePicker(textField: passportIssueDateTextField, useMaximum: true) + setDatePicker(textField: passportExpiryDateTextField, useMaximum: false, useMinimum: true) + setDatePicker(textField: idIssueDateTextField, useMaximum: true) + setDatePicker(textField: idExpiryDateTextField, useMaximum: false, useMinimum: true) + } - passportSampleButton.setTitle("view_sample_text".localized(), for: .normal) + private func setUIBinding() { + idTypeTextField.selectedItem.map {$0 as? KeyValue} + .asDriverOnErrorJustComplete() + .drive(onNext: { [weak self] in + self?.idIssueDateTextField.isHidden = true + self?.idExpiryDateTextField.isHidden = true + + self?.idNumberTextField.validCondition = nil + self?.idIssueDateTextField.validCondition = nil + self?.idExpiryDateTextField.validCondition = nil + self?.anotherIDImageContainerView.isHidden = true + + guard let idType = $0 else { + return + } + + switch idType.id ?? "8008"{ + case "8008": + self?.anotherIDImageLabel.text = "national_id_text".localized() + self?.idNumberTextField.errorMessage = "national_id_number_error_text".localized() + case "11012": + self?.anotherIDImageLabel.text = "driving_id_text".localized() + self?.idNumberTextField.errorMessage = "driving_id_number_error_text".localized() + case "1302": + self?.anotherIDImageLabel.text = "alien_id_text".localized() + self?.idNumberTextField.errorMessage = "alien_id_number_error_text".localized() + default: + self?.anotherIDImageLabel.text = "id_type_text".localized() + self?.idNumberTextField.errorMessage = "another_id_number_error_text".localized() + } + + self?.anotherIDImageContainerView.isHidden = false + + self?.idNumberTextField.validCondition = { !$0.isEmpty && $0.count == 14 } + + idType.dependent?.forEach { + switch $0 { + case "docIssueDate" : + self?.idIssueDateTextField.isHidden = false + self?.idIssueDateTextField.validCondition = { !$0.isEmpty } + case "docExpiryDate": + self?.idExpiryDateTextField.isHidden = false + self?.idExpiryDateTextField.validCondition = { !$0.isEmpty } + default : + self?.idIssueDateTextField.isHidden = true + self?.idExpiryDateTextField.isHidden = true + self?.idNumberTextField.validCondition = nil + self?.idIssueDateTextField.validCondition = nil + self?.idExpiryDateTextField.validCondition = nil + } + } + }).disposed(by: disposeBag) + + passportImageButton.rx.tap.bind {[weak self] in + self?.photoType = .passport + self?.multiMediaManager?.openPicker(mode: UIImagePickerController.CameraCaptureMode.photo) + }.disposed(by: disposeBag) + + anotherIDImageButton.rx.tap.bind {[weak self] in + self?.photoType = .anotherID + self?.multiMediaManager?.openPicker(mode: UIImagePickerController.CameraCaptureMode.photo) + }.disposed(by: disposeBag) + + passportImageTrigger + .asDriverOnErrorJustComplete() + .drive(onNext: {[weak self] in + if let imageData = $0 { + if let dataDecoded = Data(base64Encoded: imageData, options: .ignoreUnknownCharacters) { + DispatchQueue.main.async { + self?.passportImageButton.setImage(UIImage(data: dataDecoded), for: .normal) + self?.passportImageButton.addBlur() + self?.hideBorder(view: self?.passportImageContainerView) + self?.passportImageBase64.onNext(imageData) + } + } else if let url = URL(string: imageData) { + DispatchQueue.main.async { + self?.showProgressHud() + self?.passportImageButton.kf.setImage(with: url, for: .normal) { result in + self?.hideProgressHud() + switch result { + case .success(let value): + self?.passportImageBase64.onNext(value.image.toBase64()) + case .failure(let error): + print("Job failed: \(error.localizedDescription)") + } + } + self?.passportImageButton.addBlur() + self?.hideBorder(view: self?.passportImageContainerView) + } + } + } else { + self?.passportImageBase64.onNext(nil) + self?.passportImageButton.setImage(UIImage(named: "ic_passport_picture"), for: .normal) + } + + }).disposed(by: disposeBag) + + anotherIDImageTrigger + .asDriverOnErrorJustComplete() + .drive(onNext: {[weak self] in + if let imageData = $0 { + if let dataDecoded = Data(base64Encoded: imageData, options: .ignoreUnknownCharacters) { + DispatchQueue.main.async { + self?.anotherIDImageButton.setImage(UIImage(data: dataDecoded), for: .normal) + self?.anotherIDImageButton.addBlur() + self?.hideBorder(view: self?.anotherIDImageContainerView) + self?.anotherIDImageBase64.onNext(imageData) + } + } else if let url = URL(string: imageData) { + DispatchQueue.main.async { + self?.showProgressHud() + self?.anotherIDImageButton.kf.setImage(with: url, for: .normal) { result in + self?.hideProgressHud() + switch result { + case .success(let value): + self?.anotherIDImageBase64.onNext(value.image.toBase64()) + case .failure(let error): + print("Job failed: \(error.localizedDescription)") + } + } + self?.anotherIDImageButton.addBlur() + self?.hideBorder(view: self?.anotherIDImageContainerView) + } + } + } else { + self?.anotherIDImageBase64.onNext(nil) + self?.anotherIDImageButton.setImage(UIImage(named: "ic_another_id_picture"), for: .normal) + } + }).disposed(by: disposeBag) + + anotherIDClearButton.rx.tap.asDriver() + .drive(onNext: {[weak self] in + self?.idTypeTextField.didSelect(item: nil) + self?.idNumberTextField.text = "" + self?.idNumberTextField.sendActions(for: .editingChanged) + + self?.idIssueDateTextField.text = "" + self?.idIssueDateTextField.sendActions(for: .editingChanged) + + self?.idExpiryDateTextField.text = "" + self?.idExpiryDateTextField.sendActions(for: .editingChanged) + + self?.anotherIDImageTrigger.onNext(nil) + }).disposed(by: disposeBag) + + userNameTextField.rx.filterBy(.alphabet, isUppercase: true).disposed(by: disposeBag) + emailTextField.rx.filterBy(.alphabetNumbericSpecial).disposed(by: disposeBag) + addressTextField.rx.filterBy(.alphabet, isUppercase: true).disposed(by: disposeBag) + bankAccountTextField.rx.filterBy(.numberic).disposed(by: disposeBag) + passportNumberTextField.rx.filterBy(.alphabetNumberic, isUppercase: true).disposed(by: disposeBag) + idNumberTextField.rx.filterBy("[0-9-]").disposed(by: disposeBag) + referralTextField.rx.filterBy(.alphabetNumberic, isUppercase: true).disposed(by: disposeBag) + + } - anotherIDSampleButton.setTitle("view_sample_text".localized(), for: .normal) + private func setBinding() { + let viewWillAppear = rx.sentMessage(#selector(UIViewController.viewWillAppear(_:))).mapToVoid() + .asDriverOnErrorJustComplete() + + let isValidPersonalInfo = Observable.combineLatest( + [ + userNameTextField.valid, + genderTextField.valid, + dobTextField.valid, + emailTextField.valid, + cityTextField.valid, + addressTextField.valid, + occupationTextField.valid + ] + ).map { $0.allSatisfy { $0 } } + .distinctUntilChanged() + + let isValidPrimaryInfo = Observable.combineLatest( + [ + bankTextField.valid, + bankAccountTextField.valid, + passportNumberTextField.valid, + passportIssueDateTextField.valid, + passportExpiryDateTextField.valid, + idTypeTextField.valid, + idNumberTextField.valid, + idIssueDateTextField.valid, + idExpiryDateTextField.valid, + branchTextField.valid, + referralTextField.valid + ] + ).map { $0.allSatisfy { $0 } } + .distinctUntilChanged() + + let isValidPictures = Observable.combineLatest( + [ + passportImageBase64.map {[weak self] in + self?.isForeigner ?? true ? $0 != nil : true + }, + Observable.combineLatest( + idTypeTextField.selectedItem.map {$0 != nil}, + anotherIDImageBase64.map {$0 != nil} + ).map { $0 ? $1 : true} + ] + ).map { $0.allSatisfy { $0 } } + .distinctUntilChanged() + + let editingPersonalInfo = Observable.combineLatest( + userNameTextField.rx.controlEvent(.editingChanged), + genderTextField.rx.controlEvent(.editingChanged), + dobTextField.rx.controlEvent(.editingChanged), + emailTextField.rx.controlEvent(.editingChanged), + cityTextField.rx.controlEvent(.editingChanged), + addressTextField.rx.controlEvent(.editingChanged), + occupationTextField.rx.controlEvent(.editingChanged) + ).mapToVoid().asDriverOnErrorJustComplete() + + let editingPrimaryInfo = Observable.combineLatest( + Observable.combineLatest( + bankTextField.rx.controlEvent(.editingChanged), + bankAccountTextField.rx.controlEvent(.editingChanged), + passportNumberTextField.rx.controlEvent(.editingChanged), + passportIssueDateTextField.rx.controlEvent(.editingChanged), + passportExpiryDateTextField.rx.controlEvent(.editingChanged) + ), + Observable.combineLatest( + idTypeTextField.rx.controlEvent(.editingChanged), + idNumberTextField.rx.controlEvent(.editingChanged), + idIssueDateTextField.rx.controlEvent(.editingChanged), + idExpiryDateTextField.rx.controlEvent(.editingChanged), + branchTextField.rx.controlEvent(.editingChanged), + referralTextField.rx.controlEvent(.editingChanged) + ) + ).mapToVoid().asDriverOnErrorJustComplete() + + let editingPictureInfo = Observable.combineLatest( + passportImageBase64, + anotherIDImageBase64 + ).mapToVoid().asDriverOnErrorJustComplete() + + let input = NewRegisterStep1Presenter.Input( + viewWillAppear: viewWillAppear, + sendLocation: sendLocation.asDriverOnErrorJustComplete(), + + name: userNameTextField.rx.text.orEmpty.asDriverOnErrorJustComplete(), + gender: genderTextField.selectedItem.map {$0 as? KeyValue}.asDriverOnErrorJustComplete(), + dob: dobTextField.rx.text.orEmpty.asDriverOnErrorJustComplete(), + email: emailTextField.rx.text.orEmpty.asDriverOnErrorJustComplete(), + city: cityTextField.selectedItem.map {$0 as? KeyValue}.asDriverOnErrorJustComplete(), + address: addressTextField.rx.text.orEmpty.asDriverOnErrorJustComplete(), + occupation: occupationTextField.selectedItem.map {$0 as? KeyValue}.asDriverOnErrorJustComplete(), + + isValidPersonalInfo: isValidPersonalInfo.asDriverOnErrorJustComplete(), + personalInfoSave: personalSaveButton.rx.tap.asDriverOnErrorJustComplete(), + editingPersonalInfo: editingPersonalInfo, + + 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(), + passportExpiryDate: passportExpiryDateTextField.rx.text.orEmpty.asDriverOnErrorJustComplete(), + anotherIDType: idTypeTextField.selectedItem.map {$0 as? KeyValue}.asDriverOnErrorJustComplete(), + anotherIDNumber: idNumberTextField.rx.text.orEmpty.asDriverOnErrorJustComplete(), + anotherIDIssueDate: idIssueDateTextField.rx.text.orEmpty.asDriverOnErrorJustComplete(), + anotherIDExpiryDate: idExpiryDateTextField.rx.text.orEmpty.asDriverOnErrorJustComplete(), + branch: branchTextField.selectedItem.map {$0 as? KeyValue}.asDriverOnErrorJustComplete(), + referralCode: referralTextField.rx.text.orEmpty.asDriverOnErrorJustComplete(), + + isValidPrimaryInfo: isValidPrimaryInfo.asDriverOnErrorJustComplete(), + primaryInfoSave: bankSaveButton.rx.tap.asDriverOnErrorJustComplete(), + editingPrimaryInfo: editingPrimaryInfo, + + passportImage: passportImageBase64.asDriverOnErrorJustComplete(), + anotherIDImage: anotherIDImageBase64.asDriverOnErrorJustComplete(), + isValidPictures: isValidPictures.asDriverOnErrorJustComplete(), + editingPictureInfo: editingPictureInfo, + submit: picturesSaveButton.rx.tap.asDriverOnErrorJustComplete() + ) + let output = presenter.transform(input: input) + + output.isError + .drive( + onNext: { self.alert(type: .error, message: $0.localizedDescription) } + ).disposed(by: disposeBag) + + output.isProgress + .drive( + onNext: { $0 ? self.showProgressHud() : self.hideProgressHud() } + ).disposed(by: disposeBag) + + output.gpsAddress.drive(onNext: {[weak self] in + self?.addressTextField.text = $0 + self?.addressTextField.sendActions(for: .editingChanged) + }).disposed(by: disposeBag) + + output.cities.drive(onNext: {[weak self] in + let configure = TablePresenterConfiguration(presenterTitle: "select_city_text".localized()) + self?.cityTextField.useAsDropDown(with: configure, items: $0) + }).disposed(by: disposeBag) + + output.banks.drive(onNext: {[weak self] in + let configure = TablePresenterConfiguration(presenterTitle: "select_bank_text".localized()) + self?.bankTextField.useAsDropDown(with: configure, items: $0) + }).disposed(by: disposeBag) + + output.idTypes.drive(onNext: {[weak self] in + let configure = TablePresenterConfiguration(presenterTitle: "select_id_type_text".localized()) + self?.idTypeTextField.useAsDropDown(with: configure, items: $0) + }).disposed(by: disposeBag) + + output.branches.drive(onNext: {[weak self] in + let configure = TablePresenterConfiguration(presenterTitle: "select_branch_text".localized()) + self?.branchTextField.useAsDropDown(with: configure, items: $0) + }).disposed(by: disposeBag) + + output.occupations.drive(onNext: {[weak self] in + let configure = TablePresenterConfiguration(presenterTitle: "occupation_placeholder_text".localized()) + self?.occupationTextField.useAsDropDown(with: configure, items: $0) + }).disposed(by: disposeBag) + + output.model.drive(onNext: {[weak self] model in + guard let personalInformation = model.personalInformation else { return } + + let isForeigner = (personalInformation.nativeCountry ?? "").lowercased() == "kr" ? false : true + + if isForeigner { + self?.passportNumberTextField.validCondition = {!$0.isEmpty && $0.count > 3} + self?.passportIssueDateTextField.validCondition = {!$0.isEmpty} + self?.passportExpiryDateTextField.validCondition = {!$0.isEmpty} + + self?.idTypeTextField.validCondition = nil + self?.idNumberTextField.validCondition = nil + self?.idIssueDateTextField.validCondition = nil + self?.idExpiryDateTextField.validCondition = nil + self?.anotherIDClearButton.isHidden = false + + } else { + self?.passportContainerView.isHidden = true + self?.anotherIDContainerView.isHidden = false + + self?.passportNumberTextField.validCondition = nil + self?.passportIssueDateTextField.validCondition = nil + self?.passportExpiryDateTextField.validCondition = nil + + self?.idTypeTextField.validCondition = {!$0.isEmpty} + self?.idNumberTextField.validCondition = { !$0.isEmpty && $0.count == 14 } + + self?.anotherIDLabel.text = "id_type_text".localized() + self?.anotherIDClearButton.isHidden = true + + self?.passportImageContainerView.isHidden = true + self?.anotherIDImageLabel.text = "id_type_text".localized() + } + + self?.isForeigner = isForeigner + + self?.userNameTextField.text = personalInformation.fullName + self?.userNameTextField.sendActions(for: .editingChanged) + self?.dobTextField.text = personalInformation.dob + self?.dobTextField.sendActions(for: .editingChanged) + self?.emailTextField.text = personalInformation.email + self?.emailTextField.sendActions(for: .editingChanged) + self?.addressTextField.text = personalInformation.address + self?.addressTextField.sendActions(for: .editingChanged) + + self?.genderTextField.didSelect( + item: self?.genders.first {$0.id == personalInformation.gender} + ) + + self?.cityTextField.didSelect( + item: model.cities?.first {$0.value == personalInformation.city} + ) + + self?.occupationTextField.didSelect( + item: model.occupations?.first {$0.id == personalInformation.occupation} + ) + + guard let primaryInformation = model.primaryInformation else { return } + + self?.bankAccountTextField.text = primaryInformation.bankAccount + self?.bankAccountTextField.sendActions(for: .editingChanged) + self?.passportNumberTextField.text = primaryInformation.passportNumber + self?.passportNumberTextField.sendActions(for: .editingChanged) + self?.passportIssueDateTextField.text = primaryInformation.passportIssueDate + self?.passportIssueDateTextField.sendActions(for: .editingChanged) + self?.passportExpiryDateTextField.text = primaryInformation.passportExpiryDate + self?.passportExpiryDateTextField.sendActions(for: .editingChanged) + self?.idNumberTextField.text = primaryInformation.anotherIDNumber + self?.idNumberTextField.sendActions(for: .editingChanged) + self?.idIssueDateTextField.text = primaryInformation.anotherIDIssueDate + self?.idIssueDateTextField.sendActions(for: .editingChanged) + self?.idExpiryDateTextField.text = primaryInformation.anotherIDExpiryDate + self?.idExpiryDateTextField.sendActions(for: .editingChanged) + self?.referralTextField.text = primaryInformation.refferalCode + self?.referralTextField.sendActions(for: .editingChanged) + + self?.bankTextField.didSelect( + item: model.banks?.first {$0.id == primaryInformation.bankID} + ) + + self?.idTypeTextField.didSelect( + item: model.idTypes?.first {$0.id == primaryInformation.anotherIDType} + ) + + let branchID = primaryInformation.branchID != "" ? primaryInformation.branchID : "2080" + + self?.branchTextField.didSelect( + item: model.branches?.first {$0.id == branchID} + ) + + guard let pictureInformation = model.pictures else { return } + self?.passportImageTrigger.onNext(pictureInformation.passportPicture) + self?.anotherIDImageTrigger.onNext(pictureInformation.anotherIDPicture) + + }).disposed(by: disposeBag) + + output.isSetPersonalInformation + .distinctUntilChanged() + .drive(onNext: {[weak self] isHidden in + self?.personalSaveButton.animateHidden(isHidden: isHidden, duration: 0.2) { + self?.primaryInformationContainerView.isHidden = !isHidden + } + }).disposed(by: disposeBag) + + output.isSetPrimaryInformation + .distinctUntilChanged() + .drive(onNext: {[weak self] isHidden in + self?.bankSaveButton.animateHidden(isHidden: isHidden, duration: 0.2) { + self?.primaryInformationCHildStack.isHidden = isHidden + self?.personalInformationStack.isHidden = isHidden + self?.uploadPicturesContainerView.isHidden = !isHidden + self?.delegate?.changeTopProgress() + } + }).disposed(by: disposeBag) + + output.storedSuccess + .drive(onNext: {[weak self] in + guard let `self` = self else {return} + + self.alert(type: .success, message: $0) { + self.delegate?.newRegister(self, currentStep: .first, nextStep: .second) + } + }).disposed(by: disposeBag) + + isValidPersonalInfo + .distinctUntilChanged() + .asDriverOnErrorJustComplete().drive(onNext: {[weak self] isEnable in + DispatchQueue.main.async { + self?.personalSaveButton.isEnabled = isEnable + self?.personalSaveButton.backgroundColor = isEnable ? .themeRed : .lightGray + } + }).disposed(by: disposeBag) + + isValidPrimaryInfo + .distinctUntilChanged() + .asDriverOnErrorJustComplete().drive(onNext: {[weak self] isEnable in + DispatchQueue.main.async { + self?.bankSaveButton.isEnabled = isEnable + self?.bankSaveButton.backgroundColor = isEnable ? .themeRed : .lightGray + } + }).disposed(by: disposeBag) + + isValidPictures + .distinctUntilChanged() + .asDriverOnErrorJustComplete().drive(onNext: {[weak self] isEnable in + DispatchQueue.main.async { + self?.picturesSaveButton.isEnabled = isEnable + self?.picturesSaveButton.backgroundColor = isEnable ? .themeRed : .lightGray + } + }).disposed(by: disposeBag) + } - picturesSaveButton.setTitle("save_and_next_text".localized(), for: .normal) + private func setDatePicker(textField: UITextField, useMaximum: Bool = false, useMinimum: Bool = false) { + let datePicker = UIDatePicker() + datePicker.datePickerMode = .date + + if useMaximum { + datePicker.maximumDate = Date() + } + + if useMinimum { + datePicker.minimumDate = Date() + } + + textField.inputView = datePicker + + datePicker.rx.controlEvent(.valueChanged).withLatestFrom(datePicker.rx.date) {$1} + .asDriverOnErrorJustComplete() + .drive(onNext: { + let dateFormatter = DateFormatter() + dateFormatter.dateFormat = "yyyy-MM-dd" + textField.text = dateFormatter.string(from: $0) + textField.sendActions(for: .editingChanged) + }).disposed(by: disposeBag) + } - } + private func setMultiLanguages() { + personalInformationLabel.text = "personal_information_text".localized() + userNameTextField.placeholder = "fullname_placeholder_text".localized() + userNameTextField.errorMessage = "kyc_first_name_error".localized() + + genderTextField.placeholder = "gender_text".localized() + + dobTextField.placeholder = "dob_text".localized() + + emailTextField.placeholder = "email_text".localized() + emailTextField.errorMessage = "email_error_text".localized() + + cityTextField.placeholder = "city_text".localized() + + addressTextField.placeholder = "address_text".localized() + addressTextField.errorMessage = "address_error_text".localized() + + occupationTextField.placeholder = "occupation_text".localized() + + personalSaveButton.setTitle("save_and_continue_text".localized(), for: .normal) + + bankInformationLabel.text = "korea_bank_infornation_text".localized() + + bankTextField.placeholder = "korea_bank_placeholder_text".localized() + + bankAccountTextField.placeholder = "account_text".localized() + bankAccountTextField.errorMessage = "invalid_account_error_text".localized() + + passportInformationLabel.text = "passport_information_text".localized() + passportNumberTextField.placeholder = "passport_number_text".localized() + passportNumberTextField.errorMessage = "passport_error_text".localized() + + passportIssueDateTextField.placeholder = "passport_issue_date_text".localized() + + passportExpiryDateTextField.placeholder = "passport_expiry_date_text".localized() + + anotherIDLabel.text = "another_id_information_text".localized() + + idTypeTextField.placeholder = "id_type_text".localized() + idNumberTextField.placeholder = "id_number_text".localized() + idIssueDateTextField.placeholder = "another_id_issue_date_text".localized() + idExpiryDateTextField.placeholder = "another_id_expiry_date_text".localized() + + idNumberTextField.errorMessage = "another_id_number_error_text".localized() + + anotherIDClearButton.setTitle("clear_text".localized(), for: .normal) + + additionalInformationLabel.text = "additional_information_text".localized() + branchTextField.placeholder = "branch_text".localized() + referralTextField.placeholder = "referral_code_text".localized() + + bankSaveButton.setTitle("save_and_continue_text".localized(), for: .normal) + + uploadPicturesLabel.text = "upload_pictures_text".localized() + passportImageLabel.text = "passport_text".localized() + anotherIDImageLabel.text = "another_id_information_text".localized() + + passportSampleButton.setTitle("view_sample_text".localized(), for: .normal) + + anotherIDSampleButton.setTitle("view_sample_text".localized(), for: .normal) + + picturesSaveButton.setTitle("save_and_next_text".localized(), for: .normal) + + } } // MARK: CLLocationManagerDelegate extension NewRegisterStep1ViewController: CLLocationManagerDelegate { - func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { - hideProgressHud() - guard let location = manager.location else { return } - sendLocation.onNext(location) - locationManager.stopUpdatingLocation() - } - - func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) { - hideProgressHud() - - locationManager.stopUpdatingLocation() - let alert = UIAlertController( - title: "settings_text".localized(), - message: "Allow location from settings", - preferredStyle: .alert - ) - - self.present(alert, animated: true, completion: nil) - alert.addAction(UIAlertAction(title: "Move setting", style: .default, handler: { action in - switch action.style { - case .default: - UIApplication - .shared - .open( - NSURL(string: UIApplication.openSettingsURLString)! as URL, - options: [:], - completionHandler: nil - ) - case .cancel: print("cancel") - case .destructive: print("destructive") - @unknown default: break - - } - })) - } + func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { + hideProgressHud() + guard let location = manager.location else { return } + sendLocation.onNext(location) + locationManager.stopUpdatingLocation() + } + + func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) { + hideProgressHud() + + locationManager.stopUpdatingLocation() + let alert = UIAlertController( + title: "settings_text".localized(), + message: "Allow location from settings", + preferredStyle: .alert + ) + + self.present(alert, animated: true, completion: nil) + alert.addAction(UIAlertAction(title: "Move setting", style: .default, handler: { action in + switch action.style { + case .default: + UIApplication + .shared + .open( + NSURL(string: UIApplication.openSettingsURLString)! as URL, + options: [:], + completionHandler: nil + ) + case .cancel: print("cancel") + case .destructive: print("destructive") + @unknown default: break + + } + })) + } } // MARK: MultimediaPresenterProtocol extension NewRegisterStep1ViewController: MultimediaPresenterProtocol { - func presenting() -> UIViewController { - return self - } + func presenting() -> UIViewController { + return self + } } // MARK: MultiMediaManagerDelegate extension NewRegisterStep1ViewController: MultiMediaManagerDelegate { - func didFinishPickingWithImage(image: UIImage) { - self.imageCropper?.cropImage(image: image) - } - - func didFinishPickingWithError(error: String) { - self.alert(type: .error, message: error) - } - - func hideBorder(view: UIView?) { - view?.layer.borderWidth = 0 - view?.layer.addShadow(with: .clear) - } + func didFinishPickingWithImage(image: UIImage) { + self.imageCropper?.cropImage(image: image) + } + + func didFinishPickingWithError(error: String) { + self.alert(type: .error, message: error) + } + + func hideBorder(view: UIView?) { + view?.layer.borderWidth = 0 + view?.layer.addShadow(with: .clear) + } } // MARK: ImageCropperDelegate extension NewRegisterStep1ViewController: ImageCropperDelegate { - func didCropWith(image: UIImage) { - switch photoType { - case .passport: - passportImageTrigger.onNext(image.toBase64()) - case .anotherID: - anotherIDImageTrigger.onNext(image.toBase64()) + func didCropWith(image: UIImage) { + switch photoType { + case .passport: + passportImageTrigger.onNext(image.toBase64()) + case .anotherID: + anotherIDImageTrigger.onNext(image.toBase64()) + } + } + + func didFailedCropWith(error: Error) { + self.alert(type: .error, message: error.localizedDescription) } - } - - func didFailedCropWith(error: Error) { - self.alert(type: .error, message: error.localizedDescription) - } } extension NewRegisterStep1ViewController: UITextFieldDelegate { - func textField( - _ textField: UITextField, - shouldChangeCharactersIn range: NSRange, - replacementString string: String - ) -> Bool { - if textField == idNumberTextField { - let text = textField.text! - if (range.length > 0) { - if text.count < 7 { - let newText = text.replacingOccurrences(of: "-", with: "") - textField.text = newText - } - } else { - var splited = text.replacingOccurrences(of: "-", with: "") - if splited.count >= 6 { - splited.insert("-", at: splited.index(splited.startIndex, offsetBy: 6)) - textField.text = splited + func textField( + _ textField: UITextField, + shouldChangeCharactersIn range: NSRange, + replacementString string: String + ) -> Bool { + if textField == idNumberTextField { + let text = textField.text! + if (range.length > 0) { + if text.count < 7 { + let newText = text.replacingOccurrences(of: "-", with: "") + textField.text = newText + } + } else { + var splited = text.replacingOccurrences(of: "-", with: "") + if splited.count >= 6 { + splited.insert("-", at: splited.index(splited.startIndex, offsetBy: 6)) + textField.text = splited + } + } } - } + + return true } - - return true - } } diff --git a/GME Remit/Modules/RegisterModules/UserAuthentication/NewRegisterStep2/User Interface/View/NewRegisterStep2.storyboard b/GME Remit/Modules/RegisterModules/UserAuthentication/NewRegisterStep2/User Interface/View/NewRegisterStep2.storyboard index 17566e99..b523dbfb 100644 --- a/GME Remit/Modules/RegisterModules/UserAuthentication/NewRegisterStep2/User Interface/View/NewRegisterStep2.storyboard +++ b/GME Remit/Modules/RegisterModules/UserAuthentication/NewRegisterStep2/User Interface/View/NewRegisterStep2.storyboard @@ -1,9 +1,9 @@ - + - + @@ -123,6 +123,7 @@ + @@ -135,5 +136,4 @@ - diff --git a/GME Remit/Modules/RegisterModules/UserAuthentication/NewRegisterStep3/User Interface/View/NewRegisterStep3.storyboard b/GME Remit/Modules/RegisterModules/UserAuthentication/NewRegisterStep3/User Interface/View/NewRegisterStep3.storyboard index 49a2f322..0fe7ae7b 100644 --- a/GME Remit/Modules/RegisterModules/UserAuthentication/NewRegisterStep3/User Interface/View/NewRegisterStep3.storyboard +++ b/GME Remit/Modules/RegisterModules/UserAuthentication/NewRegisterStep3/User Interface/View/NewRegisterStep3.storyboard @@ -1,9 +1,9 @@ - + - + @@ -206,6 +206,7 @@ enter the 4 digit number display after GME. + @@ -218,5 +219,4 @@ enter the 4 digit number display after GME. -