Add attempt index

This commit is contained in:
Igor Kislyuk 2018-03-23 20:00:46 +03:00
parent 8bba538e4a
commit 9baa92a303
3 changed files with 45 additions and 28 deletions

View File

@ -21,8 +21,22 @@
// //
/// Describes error, which may occur during pass code entering /// Describes error, which may occur during pass code entering
/// - codesNotMatch: Different codes
/// - wrongCode: Value is remaining attemps
/// - tooManyAttempts: Attempts limit reached
public enum PassCodeError: Error { public enum PassCodeError: Error {
case codesNotMatch case codesNotMatch
case wrongCode case wrongCode(Int)
case tooManyAttempts case tooManyAttempts
} }
public extension PassCodeError {
var isTooManyAttempts: Bool {
switch self {
case .tooManyAttempts:
return true
default:
return false
}
}
}

View File

@ -226,8 +226,8 @@ open class BasePassCodeViewController: UIViewController, ConfigurableController
if validationResult.isValid { if validationResult.isValid {
self?.hideError() self?.hideError()
} else if let pasCodeError = validationResult.error { } else if let passCodeError = validationResult.error {
self?.showError(for: pasCodeError) self?.showError(for: passCodeError)
} }
}) })
.disposed(by: disposeBag) .disposed(by: disposeBag)

View File

@ -77,29 +77,8 @@ open class BasePassCodeViewModel: BaseViewModel {
}) })
.disposed(by: disposeBag) .disposed(by: disposeBag)
validationResultHolder.asDriver() validationResultHolder.asObservable()
.drive(onNext: { [weak self] validationResult in .bind(to: validationResultBinder)
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 {
if validationResult?.isValid ?? false, let passCode = validationResult?.passCode {
sSelf.authSucceed(.passCode(passCode))
} else {
sSelf.passCodeControllerStateHolder.value = sSelf.passCodeHolder.enterStep
}
}
})
.disposed(by: disposeBag) .disposed(by: disposeBag)
} }
@ -163,6 +142,29 @@ open class BasePassCodeViewModel: BaseViewModel {
} }
private extension BasePassCodeViewModel {
var validationResultBinder: Binder<PassCodeValidationResult?> {
return Binder(self) { model, validationResult in
let isValid = validationResult?.isValid ?? false
let passCode = validationResult?.passCode
if model.passCodeHolder.type == .change {
if isValid, model.passCodeHolder.enterStep == .repeatEnter, let passCode = passCode {
model.authSucceed(.passCode(passCode))
} else {
model.passCodeControllerStateHolder.value = model.passCodeHolder.enterStep
}
} else {
if isValid, let passCode = passCode {
model.authSucceed(.passCode(passCode))
} else {
model.passCodeControllerStateHolder.value = model.passCodeHolder.enterStep
}
}
}
}
}
extension BasePassCodeViewModel { extension BasePassCodeViewModel {
private func set(passCode: String) { private func set(passCode: String) {
@ -177,7 +179,7 @@ extension BasePassCodeViewModel {
private var shouldUpdateControllerState: Bool { private var shouldUpdateControllerState: Bool {
return !passCodeHolder.shouldValidate || return !passCodeHolder.shouldValidate ||
!(validationResultHolder.value?.isValid ?? true) || !(validationResultHolder.value?.isValid ?? true) ||
validationResultHolder.value?.error == .tooManyAttempts validationResultHolder.value?.error?.isTooManyAttempts ?? false
} }
private func validateIfNeeded() { private func validateIfNeeded() {
@ -191,7 +193,8 @@ extension BasePassCodeViewModel {
attemptsNumber += 1 attemptsNumber += 1
if let passCode = validationResult.passCode, !isEnteredPassCodeValid(passCode) { if let passCode = validationResult.passCode, !isEnteredPassCodeValid(passCode) {
validationResult = .invalid(.wrongCode) assert(passCodeConfiguration.maxAttemptsNumber > attemptsNumber)
validationResult = .invalid(.wrongCode(passCodeConfiguration.maxAttemptsNumber - attemptsNumber))
} }
if (!validationResult.isValid && attemptsNumber == Int(passCodeConfiguration.maxAttemptsNumber)) || if (!validationResult.isValid && attemptsNumber == Int(passCodeConfiguration.maxAttemptsNumber)) ||