Merge pull request #11 from GrigoryUlanov/pinDigetsFix

pin change added
This commit is contained in:
Nikolai Ashanin 2017-05-03 13:16:51 +03:00 committed by GitHub
commit f156dbe5f8
5 changed files with 109 additions and 24 deletions

View File

@ -1,6 +1,6 @@
Pod::Spec.new do |s|
s.name = "LeadKitAdditions"
s.version = "0.0.11"
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"

View File

@ -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 (_, _?, 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
}
}
}

View File

@ -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()
}
}

View File

@ -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
}

View File

@ -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) {