From c5b0a2bbcb13e4708dff9e641aefde759fe5b29f Mon Sep 17 00:00:00 2001 From: Grigory Date: Wed, 3 May 2017 13:02:01 +0300 Subject: [PATCH 1/2] pin change added --- LeadKitAdditions.podspec | 2 +- .../PassCode/Model/PassCodeHolder.swift | 87 +++++++++++++++++-- .../Model/PassCodeHolderProtocol.swift | 9 +- .../View/BasePassCodeViewController.swift | 5 +- .../ViewModel/BasePassCodeViewModel.swift | 30 ++++--- 5 files changed, 109 insertions(+), 24 deletions(-) diff --git a/LeadKitAdditions.podspec b/LeadKitAdditions.podspec index 3921526..53cb57b 100644 --- a/LeadKitAdditions.podspec +++ b/LeadKitAdditions.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "LeadKitAdditions" - s.version = "0.0.9" + s.version = "0.0.12" s.summary = "iOS framework with a bunch of tools for rapid development" s.homepage = "https://github.com/NikAshanin/LeadKitAdditions" s.license = "Apache License, Version 2.0" diff --git a/LeadKitAdditions/LeadKitAdditions/Controllers/PassCode/Model/PassCodeHolder.swift b/LeadKitAdditions/LeadKitAdditions/Controllers/PassCode/Model/PassCodeHolder.swift index 47ba14a..3fe8f0e 100644 --- a/LeadKitAdditions/LeadKitAdditions/Controllers/PassCode/Model/PassCodeHolder.swift +++ b/LeadKitAdditions/LeadKitAdditions/Controllers/PassCode/Model/PassCodeHolder.swift @@ -33,6 +33,9 @@ extension PassCodeHolderProtocol { return self as? PassCodeHolderEnter } + public var passCodeHolderChange: PassCodeHolderChange? { + return self as? PassCodeHolderChange + } } public class PassCodeHolderCreate: PassCodeHolderProtocol { @@ -42,11 +45,11 @@ public class PassCodeHolderCreate: PassCodeHolderProtocol { private var firstPassCode: String? private var secondPassCode: String? - public var enterStep: PassCodeEnterStep { + public var enterStep: PassCodeControllerState { if firstPassCode == nil { - return .first + return .enter } else { - return .second + return .repeatEnter } } @@ -64,10 +67,12 @@ public class PassCodeHolderCreate: PassCodeHolderProtocol { public func add(passCode: String) { switch enterStep { - case .first: + case .enter: firstPassCode = passCode - case .second: + case .repeatEnter: secondPassCode = passCode + default: + break } } @@ -89,7 +94,7 @@ public class PassCodeHolderCreate: PassCodeHolderProtocol { public class PassCodeHolderEnter: PassCodeHolderProtocol { public let type: PassCodeControllerType = .enter - public let enterStep: PassCodeEnterStep = .first + public let enterStep: PassCodeControllerState = .enter public var shouldValidate: Bool { return passCode != nil @@ -114,3 +119,73 @@ public class PassCodeHolderEnter: PassCodeHolderProtocol { } } + +public class PassCodeHolderChange: PassCodeHolderProtocol { + + public let type: PassCodeControllerType = .change + + private var oldPassCode: String? + private var newFirstPassCode: String? + private var newSecondPassCode: String? + + public var enterStep: PassCodeControllerState { + guard oldPassCode != nil else { + return .oldEnter + } + + if newFirstPassCode == nil { + return .newEnter + } else { + return .repeatEnter + } + } + + public var shouldValidate: Bool { + if enterStep == .newEnter { + return oldPassCode != nil + } else { + return newFirstPassCode != nil && newSecondPassCode != nil + } + } + + public var passCode: String? { + switch (oldPassCode, newFirstPassCode, newSecondPassCode) { + case (let oldPassCode?, nil, nil): + return oldPassCode + case (_, let newFirstPassCode?, nil): + return nil + case (_, let newFirstPassCode?, let newSecondPassCode?) where newFirstPassCode == newSecondPassCode: + return newFirstPassCode + default: + return nil + } + } + + public func add(passCode: String) { + if oldPassCode == nil { + oldPassCode = passCode + } else if newFirstPassCode == nil { + newFirstPassCode = passCode + } else if newSecondPassCode == nil { + newSecondPassCode = passCode + } + } + + public func validate() -> PassCodeValidationResult { + if let passCode = passCode { + return .valid(passCode) + } else { + return .inValid(enterStep == .newEnter ? nil : .codesNotMatch) + } + } + + public func reset() { + if enterStep == .newEnter { + oldPassCode = nil + } else { + newFirstPassCode = nil + newSecondPassCode = nil + } + } + +} diff --git a/LeadKitAdditions/LeadKitAdditions/Controllers/PassCode/Model/PassCodeHolderProtocol.swift b/LeadKitAdditions/LeadKitAdditions/Controllers/PassCode/Model/PassCodeHolderProtocol.swift index 8296679..e281642 100644 --- a/LeadKitAdditions/LeadKitAdditions/Controllers/PassCode/Model/PassCodeHolderProtocol.swift +++ b/LeadKitAdditions/LeadKitAdditions/Controllers/PassCode/Model/PassCodeHolderProtocol.swift @@ -20,15 +20,10 @@ // THE SOFTWARE. // -public enum PassCodeEnterStep { - case first - case second -} - public protocol PassCodeHolderProtocol { var type: PassCodeControllerType { get } - var enterStep: PassCodeEnterStep { get } + var enterStep: PassCodeControllerState { get } func add(passCode: String) func reset() @@ -50,6 +45,8 @@ public class PassCodeHolderBuilder { return PassCodeHolderCreate() case .enter: return PassCodeHolderEnter() + case .change: + return PassCodeHolderChange() } } diff --git a/LeadKitAdditions/LeadKitAdditions/Controllers/PassCode/View/BasePassCodeViewController.swift b/LeadKitAdditions/LeadKitAdditions/Controllers/PassCode/View/BasePassCodeViewController.swift index d74bedf..6ffdbc7 100644 --- a/LeadKitAdditions/LeadKitAdditions/Controllers/PassCode/View/BasePassCodeViewController.swift +++ b/LeadKitAdditions/LeadKitAdditions/Controllers/PassCode/View/BasePassCodeViewController.swift @@ -33,11 +33,14 @@ public enum PinImageType { public enum PassCodeControllerType { case create case enter + case change } public enum PassCodeControllerState { case enter case repeatEnter + case oldEnter + case newEnter } open class BasePassCodeViewController: UIViewController { @@ -136,7 +139,7 @@ open class BasePassCodeViewController: UIViewController { } fileprivate func showTouchIdIfNeeded(with description: String) { - guard viewModel.isTouchIdEnabled else { + guard viewModel.isTouchIdEnabled && viewModel.controllerType == .enter else { return } diff --git a/LeadKitAdditions/LeadKitAdditions/Controllers/PassCode/ViewModel/BasePassCodeViewModel.swift b/LeadKitAdditions/LeadKitAdditions/Controllers/PassCode/ViewModel/BasePassCodeViewModel.swift index f5701fa..5582931 100644 --- a/LeadKitAdditions/LeadKitAdditions/Controllers/PassCode/ViewModel/BasePassCodeViewModel.swift +++ b/LeadKitAdditions/LeadKitAdditions/Controllers/PassCode/ViewModel/BasePassCodeViewModel.swift @@ -80,10 +80,25 @@ open class BasePassCodeViewModel: BaseViewModel { validationResultHolder.asDriver() .drive(onNext: { [weak self] validationResult in - if validationResult?.isValid ?? false, let passCode = validationResult?.passCode { - self?.authSucceed(.passCode(passCode)) + guard let sSelf = self else { + return + } + + if sSelf.passCodeHolder.type == .change { + if validationResult?.isValid ?? false, + sSelf.passCodeHolder.enterStep == .repeatEnter, + let passCode = validationResult?.passCode { + + sSelf.authSucceed(.passCode(passCode)) + } else { + sSelf.passCodeControllerStateHolder.value = sSelf.passCodeHolder.enterStep + } } else { - self?.passCodeControllerStateHolder.value = .enter + if validationResult?.isValid ?? false, let passCode = validationResult?.passCode { + sSelf.authSucceed(.passCode(passCode)) + } else { + sSelf.passCodeControllerStateHolder.value = sSelf.passCodeHolder.enterStep + } } }) .addDisposableTo(disposeBag) @@ -127,12 +142,7 @@ extension BasePassCodeViewModel { validateIfNeeded() if shouldUpdateControllerState { - switch passCodeHolder.enterStep { - case .first: - passCodeControllerStateHolder.value = .enter - case .second: - passCodeControllerStateHolder.value = .repeatEnter - } + passCodeControllerStateHolder.value = passCodeHolder.enterStep } } @@ -149,7 +159,7 @@ extension BasePassCodeViewModel { var validationResult = passCodeHolder.validate() - if passCodeHolder.type == .enter { + if passCodeHolder.type == .enter || (passCodeHolder.type == .change && passCodeHolder.enterStep == .newEnter) { attemptsNumber += 1 if let passCode = validationResult.passCode, !isEnteredPassCodeValid(passCode) { From c230f1e8840b5ee67cd5a6a14fe6d6e323bb6422 Mon Sep 17 00:00:00 2001 From: Grigory Date: Wed, 3 May 2017 13:07:24 +0300 Subject: [PATCH 2/2] fix --- .../Controllers/PassCode/Model/PassCodeHolder.swift | 4 ++-- .../PassCode/View/BasePassCodeViewController.swift | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/LeadKitAdditions/LeadKitAdditions/Controllers/PassCode/Model/PassCodeHolder.swift b/LeadKitAdditions/LeadKitAdditions/Controllers/PassCode/Model/PassCodeHolder.swift index 3fe8f0e..4a118a5 100644 --- a/LeadKitAdditions/LeadKitAdditions/Controllers/PassCode/Model/PassCodeHolder.swift +++ b/LeadKitAdditions/LeadKitAdditions/Controllers/PassCode/Model/PassCodeHolder.swift @@ -152,7 +152,7 @@ public class PassCodeHolderChange: PassCodeHolderProtocol { switch (oldPassCode, newFirstPassCode, newSecondPassCode) { case (let oldPassCode?, nil, nil): return oldPassCode - case (_, let newFirstPassCode?, nil): + case (_, _?, nil): return nil case (_, let newFirstPassCode?, let newSecondPassCode?) where newFirstPassCode == newSecondPassCode: return newFirstPassCode @@ -187,5 +187,5 @@ public class PassCodeHolderChange: PassCodeHolderProtocol { newSecondPassCode = nil } } - + } diff --git a/LeadKitAdditions/LeadKitAdditions/Controllers/PassCode/View/BasePassCodeViewController.swift b/LeadKitAdditions/LeadKitAdditions/Controllers/PassCode/View/BasePassCodeViewController.swift index 6ffdbc7..c6ec92e 100644 --- a/LeadKitAdditions/LeadKitAdditions/Controllers/PassCode/View/BasePassCodeViewController.swift +++ b/LeadKitAdditions/LeadKitAdditions/Controllers/PassCode/View/BasePassCodeViewController.swift @@ -244,12 +244,12 @@ extension BasePassCodeViewController: ConfigurableController { extension BasePassCodeViewController: UITextFieldDelegate { - func textField(_ textField: UITextField, - shouldChangeCharactersIn range: NSRange, - replacementString string: String) -> Bool { + public func textField(_ textField: UITextField, + shouldChangeCharactersIn range: NSRange, + replacementString string: String) -> Bool { let invalid = CharacterSet(charactersIn: "0123456789").inverted return string.rangeOfCharacter(from: invalid, options: [], range: string.startIndex..