Adopt StateStoreViewModelV2 in the authentication screens and some settings screens. (#4083)

* Add some tests for DeferredFulfillment with Observation.

* Use StateStoreViewModelV2 in AuthenticationStartScreen.

* Use StateStoreViewModelV2 in ServerConfirmationScreen.

* Use StateStoreViewModelV2 in ServerSelectionScreen.

* Use StateStoreViewModelV2 in SoftLogoutScreen.

* Use StateStoreViewModelV2 in SettingsScreen.

* Use StateStoreViewModelV2 in DeveloperOptionsScreen.

* Use StateStoreViewModelV2 in AdvancedSettingsScreen.
This commit is contained in:
Doug
2025-05-01 09:35:59 +01:00
committed by GitHub
parent 61a427b8e5
commit d45b232072
20 changed files with 128 additions and 71 deletions
@@ -8,7 +8,7 @@
import Combine
import SwiftUI
typealias ServerConfirmationScreenViewModelType = StateStoreViewModel<ServerConfirmationScreenViewState, ServerConfirmationScreenViewAction>
typealias ServerConfirmationScreenViewModelType = StateStoreViewModelV2<ServerConfirmationScreenViewState, ServerConfirmationScreenViewAction>
class ServerConfirmationScreenViewModel: ServerConfirmationScreenViewModelType, ServerConfirmationScreenViewModelProtocol {
let authenticationService: AuthenticationServiceProtocol
@@ -9,7 +9,7 @@ import Compound
import SwiftUI
struct ServerConfirmationScreen: View {
@ObservedObject var context: ServerConfirmationScreenViewModel.Context
@Bindable var context: ServerConfirmationScreenViewModel.Context
var body: some View {
FullscreenDialog(topPadding: UIConstants.iconTopPaddingToNavigationBar) {
@@ -8,7 +8,7 @@
import Combine
import SwiftUI
typealias ServerSelectionScreenViewModelType = StateStoreViewModel<ServerSelectionScreenViewState, ServerSelectionScreenViewAction>
typealias ServerSelectionScreenViewModelType = StateStoreViewModelV2<ServerSelectionScreenViewState, ServerSelectionScreenViewAction>
class ServerSelectionScreenViewModel: ServerSelectionScreenViewModelType, ServerSelectionScreenViewModelProtocol {
private let authenticationService: AuthenticationServiceProtocol
@@ -8,7 +8,7 @@
import SwiftUI
struct ServerSelectionScreen: View {
@ObservedObject var context: ServerSelectionScreenViewModel.Context
@Bindable var context: ServerSelectionScreenViewModel.Context
var body: some View {
ScrollView {
@@ -107,9 +107,7 @@ struct ServerSelection_Previews: PreviewProvider, TestablePreview {
NavigationStack {
ServerSelectionScreen(context: invalidViewModel.context)
}
.snapshotPreferences(expect: invalidViewModel.context.$viewState.map { state in
state.hasValidationError == true
})
.snapshotPreferences(expect: invalidViewModel.context.observe(\.viewState.hasValidationError))
}
static func makeViewModel(for homeserverAddress: String) -> ServerSelectionScreenViewModel {
@@ -8,7 +8,7 @@
import Combine
import SwiftUI
typealias SoftLogoutScreenViewModelType = StateStoreViewModel<SoftLogoutScreenViewState, SoftLogoutScreenViewAction>
typealias SoftLogoutScreenViewModelType = StateStoreViewModelV2<SoftLogoutScreenViewState, SoftLogoutScreenViewAction>
class SoftLogoutScreenViewModel: SoftLogoutScreenViewModelType, SoftLogoutScreenViewModelProtocol {
private var actionsSubject: PassthroughSubject<SoftLogoutScreenViewModelAction, Never> = .init()
@@ -13,7 +13,7 @@ struct SoftLogoutScreen: View {
/// The focus state of the password text field.
@FocusState private var isPasswordFocused: Bool
@ObservedObject var context: SoftLogoutScreenViewModel.Context
@Bindable var context: SoftLogoutScreenViewModel.Context
var body: some View {
ScrollView {
@@ -8,7 +8,7 @@
import Combine
import SwiftUI
typealias AuthenticationStartScreenViewModelType = StateStoreViewModel<AuthenticationStartScreenViewState, AuthenticationStartScreenViewAction>
typealias AuthenticationStartScreenViewModelType = StateStoreViewModelV2<AuthenticationStartScreenViewState, AuthenticationStartScreenViewAction>
class AuthenticationStartScreenViewModel: AuthenticationStartScreenViewModelType, AuthenticationStartScreenViewModelProtocol {
private var actionsSubject: PassthroughSubject<AuthenticationStartScreenViewModelAction, Never> = .init()
@@ -12,7 +12,7 @@ import SwiftUI
struct AuthenticationStartScreen: View {
@Environment(\.verticalSizeClass) private var verticalSizeClass
@ObservedObject var context: AuthenticationStartScreenViewModel.Context
let context: AuthenticationStartScreenViewModel.Context
var body: some View {
GeometryReader { geometry in
@@ -8,7 +8,7 @@
import Combine
import SwiftUI
typealias AdvancedSettingsScreenViewModelType = StateStoreViewModel<AdvancedSettingsScreenViewState, AdvancedSettingsScreenViewAction>
typealias AdvancedSettingsScreenViewModelType = StateStoreViewModelV2<AdvancedSettingsScreenViewState, AdvancedSettingsScreenViewAction>
class AdvancedSettingsScreenViewModel: AdvancedSettingsScreenViewModelType, AdvancedSettingsScreenViewModelProtocol {
private let analytics: AnalyticsService
@@ -9,7 +9,7 @@ import Compound
import SwiftUI
struct AdvancedSettingsScreen: View {
@ObservedObject var context: AdvancedSettingsScreenViewModel.Context
@Bindable var context: AdvancedSettingsScreenViewModel.Context
var body: some View {
Form {
@@ -8,7 +8,7 @@
import Combine
import SwiftUI
typealias DeveloperOptionsScreenViewModelType = StateStoreViewModel<DeveloperOptionsScreenViewState, DeveloperOptionsScreenViewAction>
typealias DeveloperOptionsScreenViewModelType = StateStoreViewModelV2<DeveloperOptionsScreenViewState, DeveloperOptionsScreenViewAction>
class DeveloperOptionsScreenViewModel: DeveloperOptionsScreenViewModelType, DeveloperOptionsScreenViewModelProtocol {
private var actionsSubject: PassthroughSubject<DeveloperOptionsScreenViewModelAction, Never> = .init()
@@ -8,7 +8,8 @@
import SwiftUI
struct DeveloperOptionsScreen: View {
@ObservedObject var context: DeveloperOptionsScreenViewModel.Context
@Bindable var context: DeveloperOptionsScreenViewModel.Context
@State private var showConfetti = false
@State private var elementCallURLOverrideString: String
@@ -8,7 +8,7 @@
import Combine
import SwiftUI
typealias SettingsScreenViewModelType = StateStoreViewModel<SettingsScreenViewState, SettingsScreenViewAction>
typealias SettingsScreenViewModelType = StateStoreViewModelV2<SettingsScreenViewState, SettingsScreenViewAction>
class SettingsScreenViewModel: SettingsScreenViewModelType, SettingsScreenViewModelProtocol {
private var actionsSubject: PassthroughSubject<SettingsScreenViewModelAction, Never> = .init()
@@ -10,7 +10,7 @@ import SFSafeSymbols
import SwiftUI
struct SettingsScreen: View {
@ObservedObject var context: SettingsScreenViewModel.Context
let context: SettingsScreenViewModel.Context
private var shouldHideManageAccountSection: Bool {
context.viewState.accountProfileURL == nil &&
@@ -241,17 +241,13 @@ struct SettingsScreen_Previews: PreviewProvider, TestablePreview {
NavigationStack {
SettingsScreen(context: viewModel.context)
}
.snapshotPreferences(expect: viewModel.context.$viewState.map { state in
state.accountSessionsListURL != nil
})
.snapshotPreferences(expect: viewModel.context.observe(\.viewState.accountSessionsListURL).map { $0 != nil }.eraseToStream())
.previewDisplayName("Default")
NavigationStack {
SettingsScreen(context: bugReportDisabledViewModel.context)
}
.snapshotPreferences(expect: bugReportDisabledViewModel.context.$viewState.map { state in
state.accountSessionsListURL != nil
})
.snapshotPreferences(expect: bugReportDisabledViewModel.context.observe(\.viewState.accountSessionsListURL).map { $0 != nil }.eraseToStream())
.previewDisplayName("Bug report disabled")
}