Merge pull request #11 from GrigoryUlanov/pinDigetsFix
pin change added
This commit is contained in:
commit
f156dbe5f8
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue