Update configuration

This commit is contained in:
Igor Kislyuk 2018-03-22 19:49:53 +03:00
parent 8a01633e03
commit 4861749415
3 changed files with 18 additions and 23 deletions

View File

@ -24,26 +24,22 @@
public struct PassCodeConfiguration {
/// Pass code length
public var passCodeCharactersNumber: UInt = 4
public let passCodeLength: Int
/// Incorrect pass code attempts count
public var maxAttemptsLoginNumber: UInt = 5
public let maxAttemptsNumber: Int
/// Clear input progress when application goes to background
public var shouldResetWhenGoBackground: Bool = true
public let shouldResetWhenGoBackground: Bool
private init() {}
init?(passCodeCharactersNumber: UInt) {
guard passCodeCharactersNumber > 0 else {
assertionFailure("passCodeCharactersNumber must be greater then 0")
return nil
}
self.passCodeCharactersNumber = passCodeCharactersNumber
public init(passCodeLength: Int = 4, maxAttemptsNumber: Int = 5, shouldResetWhenGoBackground: Bool = true) {
self.passCodeLength = passCodeLength
self.maxAttemptsNumber = maxAttemptsNumber
self.shouldResetWhenGoBackground = shouldResetWhenGoBackground
}
/// Returns configuration with default values
public static var defaultConfiguration: PassCodeConfiguration {
return PassCodeConfiguration()
}
}

View File

@ -102,7 +102,7 @@ open class BasePassCodeViewController: UIViewController, ConfigurableController
private func initialDotNumberConfiguration() {
dotStackView.arrangedSubviews.forEach { dotStackView.removeArrangedSubview($0) }
for _ in 0..<viewModel.passCodeConfiguration.passCodeCharactersNumber {
for _ in 0 ..< viewModel.passCodeConfiguration.passCodeLength {
let dotImageView = UIImageView()
dotImageView.translatesAutoresizingMaskIntoConstraints = false
dotImageView.widthAnchor.constraint(equalTo: dotImageView.heightAnchor, multiplier: 1)
@ -132,7 +132,7 @@ open class BasePassCodeViewController: UIViewController, ConfigurableController
private func setStates(for passCodeText: String) {
var statesArray: [PinImageType] = []
for characterIndex in 0..<viewModel.passCodeConfiguration.passCodeCharactersNumber {
for characterIndex in 0..<viewModel.passCodeConfiguration.passCodeLength {
let state: PinImageType = Int(characterIndex) <= passCodeText.characters.count - 1 ? .entered : .clear
statesArray.append(state)
}

View File

@ -39,26 +39,25 @@ open class BasePassCodeViewModel: BaseViewModel {
/// TouchId service, which can answer if user is authorized by finger
public let touchIdService: TouchIDService?
/// Contains configuration for pass code operations
public let passCodeConfiguration: PassCodeConfiguration
fileprivate let validationResultHolder = Variable<PassCodeValidationResult?>(nil)
private let validationResultHolder = Variable<PassCodeValidationResult?>(nil)
var validationResult: Driver<PassCodeValidationResult?> {
return validationResultHolder.asDriver()
}
fileprivate let passCodeControllerStateHolder = Variable<PassCodeControllerState>(.enter)
private let passCodeControllerStateHolder = Variable<PassCodeControllerState>(.enter)
public var passCodeControllerState: Driver<PassCodeControllerState> {
return passCodeControllerStateHolder.asDriver()
}
private let passCodeText = Variable<String?>(nil)
fileprivate var attemptsNumber = 0
private var attemptsNumber = 0
fileprivate lazy var passCodeHolder: PassCodeHolderProtocol = {
return PassCodeHolderBuilder.build(with: self.controllerType)
}()
private lazy var passCodeHolder: PassCodeHolderProtocol = PassCodeHolderBuilder.build(with: self.controllerType)
public init(controllerType: PassCodeControllerType,
passCodeConfiguration: PassCodeConfiguration,
@ -76,7 +75,7 @@ open class BasePassCodeViewModel: BaseViewModel {
.distinctUntilChanged { $0 == $1 }
.drive(onNext: { [weak self] passCode in
if let passCode = passCode,
passCode.characters.count == Int(self?.passCodeConfiguration.passCodeCharactersNumber ?? 0) {
passCode.characters.count == Int(self?.passCodeConfiguration.passCodeLength ?? 0) {
self?.set(passCode: passCode)
}
})
@ -184,8 +183,8 @@ extension BasePassCodeViewModel {
validationResult = .inValid(.wrongCode)
}
if (!validationResult.isValid && attemptsNumber == Int(passCodeConfiguration.maxAttemptsLoginNumber)) ||
attemptsNumber > Int(passCodeConfiguration.maxAttemptsLoginNumber) {
if (!validationResult.isValid && attemptsNumber == Int(passCodeConfiguration.maxAttemptsNumber)) ||
attemptsNumber > Int(passCodeConfiguration.maxAttemptsNumber) {
validationResult = .inValid(.tooManyAttempts)
}
}