Fixes #2470 - Allow verifiying a session through entering the recovery key

This commit is contained in:
Stefan Ceriu
2024-02-19 10:10:25 +02:00
committed by Stefan Ceriu
parent 46f0cf45bd
commit 023e10edf2
17 changed files with 73 additions and 32 deletions
@@ -75,7 +75,7 @@ class HomeScreenViewModel: HomeScreenViewModelType, HomeScreenViewModelProtocol
case (.unverifiedLastSession, .incomplete):
state.requiresExtraAccountSetup = true
if state.securityBannerMode != .dismissed {
state.securityBannerMode = .recoveryKeyConfirmation
state.securityBannerMode = .sessionVerification
}
case (.verified, .disabled):
state.requiresExtraAccountSetup = true
@@ -18,11 +18,13 @@ import Combine
import SwiftUI
enum SessionVerificationScreenCoordinatorAction {
case recoveryKey
case done
}
struct SessionVerificationScreenCoordinatorParameters {
let sessionVerificationControllerProxy: SessionVerificationControllerProxyProtocol
let recoveryState: SecureBackupRecoveryState
}
final class SessionVerificationScreenCoordinator: CoordinatorProtocol {
@@ -36,7 +38,8 @@ final class SessionVerificationScreenCoordinator: CoordinatorProtocol {
}
init(parameters: SessionVerificationScreenCoordinatorParameters) {
viewModel = SessionVerificationScreenViewModel(sessionVerificationControllerProxy: parameters.sessionVerificationControllerProxy)
viewModel = SessionVerificationScreenViewModel(sessionVerificationControllerProxy: parameters.sessionVerificationControllerProxy,
recoveryState: parameters.recoveryState)
}
// MARK: - Public
@@ -47,6 +50,8 @@ final class SessionVerificationScreenCoordinator: CoordinatorProtocol {
guard let self else { return }
switch action {
case .recoveryKey:
actionsSubject.send(.recoveryKey)
case .finished:
actionsSubject.send(.done)
}
@@ -17,10 +17,13 @@
import Foundation
enum SessionVerificationScreenViewModelAction {
case recoveryKey
case finished
}
struct SessionVerificationScreenViewState: BindableState {
let showRecoveryOption: Bool
var verificationState: SessionVerificationScreenStateMachine.State = .initial
var title: String? {
@@ -83,6 +86,7 @@ struct SessionVerificationScreenViewState: BindableState {
}
enum SessionVerificationScreenViewAction {
case recoveryKey
case requestVerification
case startSasVerification
case restart
@@ -31,12 +31,13 @@ class SessionVerificationScreenViewModel: SessionVerificationViewModelType, Sess
}
init(sessionVerificationControllerProxy: SessionVerificationControllerProxyProtocol,
initialState: SessionVerificationScreenViewState = SessionVerificationScreenViewState()) {
recoveryState: SecureBackupRecoveryState,
verificationState: SessionVerificationScreenStateMachine.State = .initial) {
self.sessionVerificationControllerProxy = sessionVerificationControllerProxy
stateMachine = SessionVerificationScreenStateMachine()
super.init(initialViewState: initialState)
super.init(initialViewState: .init(showRecoveryOption: recoveryState == .incomplete, verificationState: verificationState))
setupStateMachine()
@@ -70,6 +71,8 @@ class SessionVerificationScreenViewModel: SessionVerificationViewModelType, Sess
override func process(viewAction: SessionVerificationScreenViewAction) {
switch viewAction {
case .recoveryKey:
actionsSubject.send(.recoveryKey)
case .requestVerification:
stateMachine.processEvent(.requestVerification)
case .startSasVerification:
@@ -128,12 +128,21 @@ struct SessionVerificationScreen: View {
private var actionButtons: some View {
switch context.viewState.verificationState {
case .initial:
Button(L10n.actionStartVerification) {
context.send(viewAction: .requestVerification)
VStack(spacing: 32) {
Button(L10n.actionStartVerification) {
context.send(viewAction: .requestVerification)
}
.buttonStyle(.compound(.primary))
.accessibilityIdentifier(A11yIdentifiers.sessionVerificationScreen.requestVerification)
if context.viewState.showRecoveryOption {
Button(L10n.screenSessionVerificationEnterRecoveryKey) {
context.send(viewAction: .recoveryKey)
}
.buttonStyle(.compound(.plain))
.accessibilityIdentifier(A11yIdentifiers.sessionVerificationScreen.enterRecoveryKey)
}
}
.buttonStyle(.compound(.primary))
.accessibilityIdentifier(A11yIdentifiers.sessionVerificationScreen.requestVerification)
case .cancelled:
Button(L10n.actionRetry) {
context.send(viewAction: .restart)
@@ -235,7 +244,8 @@ struct SessionVerification_Previews: PreviewProvider, TestablePreview {
static func sessionVerificationScreen(state: SessionVerificationScreenStateMachine.State) -> some View {
let viewModel = SessionVerificationScreenViewModel(sessionVerificationControllerProxy: SessionVerificationControllerProxyMock.configureMock(),
initialState: SessionVerificationScreenViewState(verificationState: state))
recoveryState: .incomplete,
verificationState: state)
return SessionVerificationScreen(context: viewModel.context)
}
@@ -55,7 +55,7 @@ class SettingsScreenViewModel: SettingsScreenViewModelType, SettingsScreenViewMo
state.securitySectionMode = .sessionVerification
case (.unverifiedLastSession, .incomplete):
state.showSecuritySectionBadge = true
state.securitySectionMode = .secureBackup
state.securitySectionMode = .sessionVerification
case (.verified, .disabled):
state.showSecuritySectionBadge = true
state.securitySectionMode = .secureBackup