Fix A11y tests (#5104)

* replace NavigationStack with ElementNavigationStack to allow the content to be rendered without a NavigationStack in a11y tests

* fix a11y tests

* update xcodeproject

* swiftformat fix

* use iOS 26.1 for CI

* use a wrapper to solve the issue for a11y tests

* ElementNavigationStack only uses the trick in DEBUG mode, and added a swiftlint rule to prevent the usage of NavigationStack
This commit is contained in:
Mauro
2026-02-13 16:45:58 +01:00
committed by GitHub
parent b11438e38d
commit 0e40cc7008
83 changed files with 254 additions and 180 deletions
@@ -116,7 +116,7 @@ struct AppLockScreen_Previews: PreviewProvider, TestablePreview {
static let viewModel = AppLockScreenViewModel(appLockService: AppLockServiceMock.mock())
static var previews: some View {
NavigationStack {
ElementNavigationStack {
AppLockScreen(context: viewModel.context)
}
}
@@ -77,12 +77,12 @@ struct AppLockSetupBiometricsScreen_Previews: PreviewProvider, TestablePreview {
static let touchIDViewModel = AppLockSetupBiometricsScreenViewModel(appLockService: AppLockServiceMock.mock(biometryType: .touchID))
static var previews: some View {
NavigationStack {
ElementNavigationStack {
AppLockSetupBiometricsScreen(context: faceIDViewModel.context)
}
.previewDisplayName("Face ID")
NavigationStack {
ElementNavigationStack {
AppLockSetupBiometricsScreen(context: touchIDViewModel.context)
}
.previewDisplayName("Touch ID")
@@ -107,22 +107,22 @@ struct AppLockSetupPINScreen_Previews: PreviewProvider, TestablePreview {
appLockService: failedService)
static var previews: some View {
NavigationStack {
ElementNavigationStack {
AppLockSetupPINScreen(context: createViewModel.context)
}
.previewDisplayName("Create")
NavigationStack {
ElementNavigationStack {
AppLockSetupPINScreen(context: confirmViewModel.context)
}
.previewDisplayName("Confirm")
NavigationStack {
ElementNavigationStack {
AppLockSetupPINScreen(context: unlockViewModel.context)
}
.previewDisplayName("Unlock")
NavigationStack {
ElementNavigationStack {
AppLockSetupPINScreen(context: unlockFailedViewModel.context)
}
.previewDisplayName("Unlock Failed")
@@ -51,17 +51,17 @@ struct AppLockSetupSettingsScreen_Previews: PreviewProvider, TestablePreview {
static let biometricsUnavailableViewModel = AppLockSetupSettingsScreenViewModel(appLockService: AppLockServiceMock.mock(biometryType: .none))
static var previews: some View {
NavigationStack {
ElementNavigationStack {
AppLockSetupSettingsScreen(context: faceIDViewModel.context)
}
.previewDisplayName("Face ID")
NavigationStack {
ElementNavigationStack {
AppLockSetupSettingsScreen(context: touchIDViewModel.context)
}
.previewDisplayName("Touch ID (Mandatory)")
NavigationStack {
ElementNavigationStack {
AppLockSetupSettingsScreen(context: biometricsUnavailableViewModel.context)
}
.previewDisplayName("PIN only")
@@ -135,19 +135,19 @@ struct LoginScreen_Previews: PreviewProvider, TestablePreview {
static let unconfiguredViewModel = makeViewModel(homeserverAddress: "somethingtofailconfiguration")
static var previews: some View {
NavigationStack {
ElementNavigationStack {
LoginScreen(context: viewModel.context)
}
.snapshotPreferences(expect: viewModel.context.observe(\.viewState.homeserver.loginMode).map { $0 == .password })
.previewDisplayName("Initial State")
NavigationStack {
ElementNavigationStack {
LoginScreen(context: credentialsViewModel.context)
}
.snapshotPreferences(expect: credentialsViewModel.context.observe(\.viewState.homeserver.loginMode).map { $0 == .password })
.previewDisplayName("Credentials Entered")
NavigationStack {
ElementNavigationStack {
LoginScreen(context: unconfiguredViewModel.context)
}
.previewDisplayName("Unsupported")
@@ -140,19 +140,19 @@ struct ServerConfirmationScreen_Previews: PreviewProvider, TestablePreview {
static let pickerViewModel = makeViewModel(mode: .picker(["dept1.company.com", "dept2.company.com", "dept3.company.com"]), flow: .login)
static var previews: some View {
NavigationStack {
ElementNavigationStack {
ServerConfirmationScreen(context: loginViewModel.context)
.toolbar(.visible, for: .navigationBar)
}
.previewDisplayName("Login")
NavigationStack {
ElementNavigationStack {
ServerConfirmationScreen(context: registerViewModel.context)
.toolbar(.visible, for: .navigationBar)
}
.previewDisplayName("Register")
NavigationStack {
ElementNavigationStack {
ServerConfirmationScreen(context: pickerViewModel.context)
.toolbar(.visible, for: .navigationBar)
}
@@ -97,15 +97,15 @@ struct ServerSelection_Previews: PreviewProvider, TestablePreview {
static let invalidViewModel = makeViewModel(for: "thisisbad")
static var previews: some View {
NavigationStack {
ElementNavigationStack {
ServerSelectionScreen(context: matrixViewModel.context)
}
NavigationStack {
ElementNavigationStack {
ServerSelectionScreen(context: emptyViewModel.context)
}
NavigationStack {
ElementNavigationStack {
ServerSelectionScreen(context: invalidViewModel.context)
}
.snapshotPreferences(expect: invalidViewModel.context.observe(\.viewState.hasValidationError))
@@ -169,7 +169,7 @@ struct SoftLogoutScreen_Previews: PreviewProvider, TestablePreview {
}
static func screen(for viewModel: SoftLogoutScreenViewModel) -> some View {
NavigationStack {
ElementNavigationStack {
SoftLogoutScreen(context: viewModel.context)
.navigationBarTitleDisplayMode(.inline)
.toolbar {
@@ -61,7 +61,7 @@ struct BlockedUsersScreen_Previews: PreviewProvider, TestablePreview {
userIndicatorController: UserIndicatorControllerMock())
static var previews: some View {
NavigationStack {
ElementNavigationStack {
BlockedUsersScreen(context: viewModel.context)
}
}
@@ -155,7 +155,7 @@ struct BugReportScreen: View {
struct BugReportScreen_Previews: PreviewProvider, TestablePreview {
static var previews: some View {
NavigationStack {
ElementNavigationStack {
let clientProxy = ClientProxyMock(.init(userID: "@mock:client.com", roomSummaryProvider: RoomSummaryProviderMock(.init(state: .loaded(.mockRooms)))))
BugReportScreen(context: BugReportScreenViewModel(bugReportService: BugReportServiceMock(.init()),
clientProxy: clientProxy,
@@ -164,7 +164,7 @@ struct BugReportScreen_Previews: PreviewProvider, TestablePreview {
}
.previewDisplayName("Without Screenshot")
NavigationStack {
ElementNavigationStack {
let clientProxy = ClientProxyMock(.init(userID: "@mock:client.com", roomSummaryProvider: RoomSummaryProviderMock(.init(state: .loaded(.mockRooms)))))
BugReportScreen(context: BugReportScreenViewModel(bugReportService: BugReportServiceMock(.init()),
clientProxy: clientProxy,
@@ -17,7 +17,7 @@ struct CallScreen: View {
@ObservedObject var context: CallScreenViewModel.Context
var body: some View {
NavigationStack {
ElementNavigationStack {
content
.frame(maxWidth: .infinity, maxHeight: .infinity)
.background(Color.compound.bgCanvasDefault.ignoresSafeArea())
@@ -12,7 +12,7 @@ struct ChatsSpaceFiltersScreen: View {
@Bindable var context: ChatsSpaceFiltersScreenViewModel.Context
var body: some View {
NavigationStack {
ElementNavigationStack {
ScrollView {
LazyVStack(spacing: 0) {
ForEach(context.viewState.visibleFilters) { filter in
@@ -213,12 +213,12 @@ struct PollFormScreen_Previews: PreviewProvider, TestablePreview {
createdByAccountOwner: true)
static var previews: some View {
NavigationStack {
ElementNavigationStack {
PollFormScreen(context: viewModel.context)
}
.previewDisplayName("New")
NavigationStack {
ElementNavigationStack {
PollFormScreen(context: editViewModel.context)
}
.previewDisplayName("Edit")
@@ -394,61 +394,61 @@ struct CreateRoom_Previews: PreviewProvider, TestablePreview {
}()
static var previews: some View {
NavigationStack {
ElementNavigationStack {
CreateRoomScreen(context: viewModel.context)
}
.previewDisplayName("Create Room")
NavigationStack {
ElementNavigationStack {
CreateRoomScreen(context: avatarViewModel.context)
}
.previewDisplayName("Create Room with avatar")
.snapshotPreferences(expect: avatarViewModel.context.$viewState.map { $0.avatarImage != nil })
NavigationStack {
ElementNavigationStack {
CreateRoomScreen(context: spaceViewModel.context)
}
.previewDisplayName("Create Space")
NavigationStack {
ElementNavigationStack {
CreateRoomScreen(context: spaceWithAvatarViewModel.context)
}
.previewDisplayName("Create Space with avatar")
.snapshotPreferences(expect: spaceWithAvatarViewModel.context.$viewState.map { $0.avatarImage != nil })
NavigationStack {
ElementNavigationStack {
CreateRoomScreen(context: publicRoomViewModel.context)
}
.previewDisplayName("Create Public Room")
NavigationStack {
ElementNavigationStack {
CreateRoomScreen(context: askToJoinViewModel.context)
}
.previewDisplayName("Create Knockable Room")
NavigationStack {
ElementNavigationStack {
CreateRoomScreen(context: publicRoomInvalidAliasViewModel.context)
}
.snapshotPreferences(expect: publicRoomInvalidAliasViewModel.context.$viewState.map { !$0.aliasErrors.isEmpty })
.previewDisplayName("Create Public Room, invalid alias")
NavigationStack {
ElementNavigationStack {
CreateRoomScreen(context: publicRoomExistingAliasViewModel.context)
}
.snapshotPreferences(expect: publicRoomExistingAliasViewModel.context.$viewState.map { !$0.aliasErrors.isEmpty })
.previewDisplayName("Create Public Room, existing alias")
NavigationStack {
ElementNavigationStack {
CreateRoomScreen(context: selectedSpaceViewModel.context)
}
.previewDisplayName("Create Room with already selected Space")
NavigationStack {
ElementNavigationStack {
CreateRoomScreen(context: selectedSpaceWithListViewModel.context)
}
.previewDisplayName("Create Room with a selected Space from the list")
NavigationStack {
ElementNavigationStack {
CreateRoomScreen(context: selectedSpaceWithAskToJoinViewModel.context)
}
.previewDisplayName("Create Knockable Room with already selected Space")
@@ -21,7 +21,7 @@ struct CreateRoomSpaceSelectionSheet: View {
}
var body: some View {
NavigationStack {
ElementNavigationStack {
List {
Section {
ListRow(label: .plain(title: L10n.screenCreateRoomSpaceSelectionNoSpaceOption),
@@ -82,11 +82,11 @@ struct DeclineAndBlockScreen_Previews: PreviewProvider, TestablePreview {
userIndicatorController: UserIndicatorControllerMock())
static var previews: some View {
NavigationStack {
ElementNavigationStack {
DeclineAndBlockScreen(context: viewModel.context)
}
.previewDisplayName("Default")
NavigationStack {
ElementNavigationStack {
DeclineAndBlockScreen(context: viewModel.context)
.onAppear {
viewModel.context.shouldReport = true
@@ -86,17 +86,17 @@ struct EditRoomAddressScreen_Previews: PreviewProvider, TestablePreview {
}()
static var previews: some View {
NavigationStack {
ElementNavigationStack {
EditRoomAddressScreen(context: noAliasviewModel.context)
}
.previewDisplayName("No alias")
NavigationStack {
ElementNavigationStack {
EditRoomAddressScreen(context: aliasviewModel.context)
}
.previewDisplayName("With alias")
NavigationStack {
ElementNavigationStack {
EditRoomAddressScreen(context: invalidSymbolsViewModel.context)
}
.snapshotPreferences(expect: invalidSymbolsViewModel.context.$viewState.map { state in
@@ -104,7 +104,7 @@ struct EditRoomAddressScreen_Previews: PreviewProvider, TestablePreview {
})
.previewDisplayName("Invalid symbols")
NavigationStack {
ElementNavigationStack {
EditRoomAddressScreen(context: alreadyExistingViewModel.context)
}
.snapshotPreferences(expect: alreadyExistingViewModel.context.$viewState.map { state in
@@ -20,7 +20,7 @@ struct EmojiPickerScreen: View {
private let feedbackGenerator = UIImpactFeedbackGenerator(style: .heavy)
var body: some View {
NavigationStack {
ElementNavigationStack {
ScrollView {
LazyVGrid(columns: [GridItem(.adaptive(minimum: minimumWidth))], spacing: 16) {
ForEach(context.viewState.categories) { category in
@@ -73,7 +73,7 @@ struct EncryptionResetPasswordScreen_Previews: PreviewProvider, TestablePreview
static let passwordPublisher = PassthroughSubject<String, Never>()
static let viewModel = EncryptionResetPasswordScreenViewModel(passwordPublisher: passwordPublisher)
static var previews: some View {
NavigationStack {
ElementNavigationStack {
EncryptionResetPasswordScreen(context: viewModel.context)
}
}
@@ -94,7 +94,7 @@ struct EncryptionResetScreen_Previews: PreviewProvider, TestablePreview {
static let viewModel = EncryptionResetScreenViewModel(clientProxy: ClientProxyMock(.init()),
userIndicatorController: UserIndicatorControllerMock())
static var previews: some View {
NavigationStack {
ElementNavigationStack {
EncryptionResetScreen(context: viewModel.context)
}
}
@@ -210,7 +210,7 @@ struct GlobalSearchScreen_Previews: PreviewProvider, TestablePreview {
mediaProvider: MediaProviderMock(configuration: .init()))
static var previews: some View {
NavigationStack {
ElementNavigationStack {
GlobalSearchScreen(context: viewModel.context)
}
}
@@ -135,7 +135,7 @@ private struct OldBloomModifier: ViewModifier {
struct BloomModifier_Previews: PreviewProvider, TestablePreview {
static var previews: some View {
NavigationStack {
ElementNavigationStack {
mockScreen
.navigationTitle(L10n.screenRoomlistMainSpaceTitle)
.searchable(text: .constant(""), placement: .navigationBarDrawer(displayMode: .always))
@@ -143,7 +143,7 @@ struct BloomModifier_Previews: PreviewProvider, TestablePreview {
}
.previewDisplayName("Chats")
NavigationStack {
ElementNavigationStack {
mockScreen
.navigationTitle(L10n.screenSpaceListTitle)
.toolbarBloom(hasSearchBar: false)
@@ -171,7 +171,7 @@ struct HomeScreen_Previews: PreviewProvider, TestablePreview {
static let loadedViewModel = viewModel(.rooms)
static var previews: some View {
NavigationStack {
ElementNavigationStack {
HomeScreen(context: loadingViewModel.context)
}
.snapshotPreferences(expect: loadedViewModel.context.$viewState.map { state in
@@ -179,7 +179,7 @@ struct HomeScreen_Previews: PreviewProvider, TestablePreview {
})
.previewDisplayName("Loading")
NavigationStack {
ElementNavigationStack {
HomeScreen(context: emptyViewModel.context)
}
.snapshotPreferences(expect: emptyViewModel.context.$viewState.map { state in
@@ -187,7 +187,7 @@ struct HomeScreen_Previews: PreviewProvider, TestablePreview {
})
.previewDisplayName("Empty")
NavigationStack {
ElementNavigationStack {
HomeScreen(context: loadedViewModel.context)
}
.snapshotPreferences(expect: loadedViewModel.context.$viewState.map { state in
@@ -151,13 +151,13 @@ struct InviteUsersScreen_Previews: PreviewProvider, TestablePreview {
static let selectedViewModel = makeViewModel(hasSelection: true)
static var previews: some View {
NavigationStack {
ElementNavigationStack {
InviteUsersScreen(context: viewModel.context)
}
.previewDisplayName("Suggestions")
.snapshotPreferences(expect: viewModel.context.$viewState.map { !$0.usersSection.users.isEmpty })
NavigationStack {
ElementNavigationStack {
InviteUsersScreen(context: searchingViewModel.context)
}
.previewDisplayName("Searching")
@@ -165,7 +165,7 @@ struct InviteUsersScreen_Previews: PreviewProvider, TestablePreview {
$0.usersSection.type == .searchResult && !$0.usersSection.users.isEmpty
})
NavigationStack {
ElementNavigationStack {
InviteUsersScreen(context: selectedViewModel.context)
}
.previewDisplayName("Selected")
@@ -485,7 +485,7 @@ struct JoinRoomScreenPreviewWrapper: Identifiable {
let previewDisplayName = customPreviewName ?? previewDisplayName
let previewDisplayNameSuffix = isSpace ? " Space" : ""
if mode == .forbidden {
NavigationStack {
ElementNavigationStack {
JoinRoomScreen(context: viewModel.context)
}
.snapshotPreferences(expect: viewModel.context.$viewState.map { state in
@@ -496,7 +496,7 @@ struct JoinRoomScreenPreviewWrapper: Identifiable {
}
.previewDisplayName(previewDisplayName + previewDisplayNameSuffix)
} else {
NavigationStack {
ElementNavigationStack {
JoinRoomScreen(context: viewModel.context)
}
.snapshotPreferences(expect: viewModel.context.$viewState.map { state in
@@ -125,14 +125,14 @@ struct KnockRequestsListScreen_Previews: PreviewProvider, TestablePreview {
]))
static var previews: some View {
NavigationStack {
ElementNavigationStack {
KnockRequestsListScreen(context: viewModel.context)
}
.snapshotPreferences(expect: viewModel.context.$viewState.map { state in
state.shouldDisplayRequests == true
})
NavigationStack {
ElementNavigationStack {
KnockRequestsListScreen(context: singleRequestViewModel.context)
}
.snapshotPreferences(expect: singleRequestViewModel.context.$viewState.map { state in
@@ -140,7 +140,7 @@ struct KnockRequestsListScreen_Previews: PreviewProvider, TestablePreview {
})
.previewDisplayName("Single Request")
NavigationStack {
ElementNavigationStack {
KnockRequestsListScreen(context: emptyViewModel.context)
}
.snapshotPreferences(expect: emptyViewModel.context.$viewState.map { state in
@@ -148,7 +148,7 @@ struct KnockRequestsListScreen_Previews: PreviewProvider, TestablePreview {
})
.previewDisplayName("Empty state")
NavigationStack {
ElementNavigationStack {
KnockRequestsListScreen(context: loadingViewModel.context)
}
.snapshotPreferences(expect: loadingViewModel.context.$viewState.map { state in
@@ -70,7 +70,7 @@ struct LabsScreen_Previews: PreviewProvider, TestablePreview {
}()
static var previews: some View {
NavigationStack {
ElementNavigationStack {
LabsScreen(context: viewModel.context)
}
}
@@ -110,30 +110,30 @@ struct LinkNewDeviceScreen_Previews: PreviewProvider, TestablePreview {
static let unknownErrorViewModel = makeViewModel(mode: .error(.unknown))
static var previews: some View {
NavigationStack {
ElementNavigationStack {
LinkNewDeviceScreen(context: viewModel.context)
}
.previewDisplayName("Ready")
.snapshotPreferences(expect: viewModel.context.observe(\.viewState.mode).map { $0 == .readyToLink(isGeneratingCode: false) })
NavigationStack {
ElementNavigationStack {
LinkNewDeviceScreen(context: generatingViewModel.context)
}
.previewDisplayName("Generating")
.snapshotPreferences(expect: generatingViewModel.context.observe(\.viewState.mode).map { $0 == .readyToLink(isGeneratingCode: true) })
NavigationStack {
ElementNavigationStack {
LinkNewDeviceScreen(context: loadingViewModel.context)
}
.previewDisplayName("Loading")
NavigationStack {
ElementNavigationStack {
LinkNewDeviceScreen(context: unsupportedViewModel.context)
}
.previewDisplayName("Unsupported")
.snapshotPreferences(expect: unsupportedViewModel.context.observe(\.viewState.mode).map { $0 == .error(.notSupported) })
NavigationStack {
ElementNavigationStack {
LinkNewDeviceScreen(context: unknownErrorViewModel.context)
}
.previewDisplayName("Unknown error")
@@ -176,17 +176,17 @@ struct StaticLocationScreenViewer_Previews: PreviewProvider, TestablePreview {
userIndicatorController: UserIndicatorControllerMock())
static var previews: some View {
NavigationStack {
ElementNavigationStack {
StaticLocationScreen(context: pickerViewModel.context)
}
.previewDisplayName("Picker")
NavigationStack {
ElementNavigationStack {
StaticLocationScreen(context: viewModel.context)
}
.previewDisplayName("View Only")
NavigationStack {
ElementNavigationStack {
StaticLocationScreen(context: descriptionViewModel.context)
}
.previewDisplayName("View Only (with description)")
@@ -112,7 +112,7 @@ struct ManageAuthorizedSpacesScreen_Previews: PreviewProvider, TestablePreview {
mediaProvider: MediaProviderMock(configuration: .init()))
static var previews: some View {
NavigationStack {
ElementNavigationStack {
ManageAuthorizedSpacesScreen(context: viewModel.context)
}
}
@@ -272,22 +272,22 @@ struct MediaEventsTimelineScreen_Previews: PreviewProvider, TestablePreview {
static let emptyFilesViewModel = makeViewModel(empty: true, screenMode: .files)
static var previews: some View {
NavigationStack {
ElementNavigationStack {
MediaEventsTimelineScreen(context: mediaViewModel.context)
}
.previewDisplayName("Media")
NavigationStack {
ElementNavigationStack {
MediaEventsTimelineScreen(context: filesViewModel.context)
}
.previewDisplayName("Files")
NavigationStack {
ElementNavigationStack {
MediaEventsTimelineScreen(context: emptyMediaViewModel.context)
}
.previewDisplayName("Empty Media")
NavigationStack {
ElementNavigationStack {
MediaEventsTimelineScreen(context: emptyFilesViewModel.context)
}
.previewDisplayName("Empty Files")
@@ -280,7 +280,7 @@ struct MediaUploadPreviewScreen_Previews: PreviewProvider, TestablePreview {
clientProxy: ClientProxyMock(.init()),
userIndicatorController: UserIndicatorControllerMock.default)
static var previews: some View {
NavigationStack {
ElementNavigationStack {
MediaUploadPreviewScreen(context: viewModel.context)
}
@@ -102,7 +102,7 @@ struct MessageForwardingScreen_Previews: PreviewProvider, TestablePreview {
roomSummaryProvider: summaryProvider,
userIndicatorController: UserIndicatorControllerMock())
NavigationStack {
ElementNavigationStack {
MessageForwardingScreen(context: viewModel.context)
}
}
@@ -119,7 +119,7 @@ struct IdentityConfirmationScreen_Previews: PreviewProvider, TestablePreview {
static var loadingViewModel = makeViewModel(recoveryState: .unknown)
static var previews: some View {
NavigationStack {
ElementNavigationStack {
IdentityConfirmationScreen(context: viewModel.context)
}
.previewDisplayName("Actions")
@@ -127,7 +127,7 @@ struct IdentityConfirmationScreen_Previews: PreviewProvider, TestablePreview {
actions?.contains([.interactiveVerification, .recovery]) == true
})
NavigationStack {
ElementNavigationStack {
IdentityConfirmationScreen(context: loadingViewModel.context)
}
.previewDisplayName("Loading")
@@ -58,7 +58,7 @@ struct IdentityConfirmedScreen: View {
struct IdentityConfirmedScreen_Previews: PreviewProvider, TestablePreview {
static let viewModel = IdentityConfirmedScreenViewModel()
static var previews: some View {
NavigationStack {
ElementNavigationStack {
IdentityConfirmedScreen(context: viewModel.context)
}
}
@@ -88,7 +88,7 @@ struct PinnedEventsTimelineScreen_Previews: PreviewProvider, TestablePreview {
}()
static var previews: some View {
NavigationStack {
ElementNavigationStack {
PinnedEventsTimelineScreen(context: viewModel.context, timelineContext: emptyTimelineViewModel.context)
}
.previewDisplayName("Empty")
@@ -171,14 +171,14 @@ struct QRCodeErrorView: View {
struct QRCodeErrorView_Previews: PreviewProvider, TestablePreview {
static var previews: some View {
ForEach(QRCodeLoginState.ErrorState.allCases, id: \.self) { errorState in
NavigationStack {
ElementNavigationStack {
QRCodeErrorView(errorState: errorState, canSignInManually: true) { _ in }
.toolbar(.visible, for: .navigationBar)
}
.previewDisplayName(errorState.previewDisplayName)
}
NavigationStack {
ElementNavigationStack {
QRCodeErrorView(errorState: .linkingNotSupported, canSignInManually: false) { _ in }
.toolbar(.visible, for: .navigationBar)
}
@@ -219,6 +219,7 @@ struct QRCodeLoginScreen: View {
.resizable()
.scaledToFit()
.frame(width: 200, height: 200)
.accessibilityLabel(L10n.a11yQrCode)
SFNumberedListView(items: context.viewState.instructions.linkMobileItems)
}
@@ -350,38 +351,38 @@ struct QRCodeLoginScreen_Previews: PreviewProvider, TestablePreview {
static let errorStateViewModel = QRCodeLoginScreenViewModel.mock(state: .error(.declined))
static var previews: some View {
NavigationStack { QRCodeLoginScreen(context: loginInstructionsStateViewModel.context) }
ElementNavigationStack { QRCodeLoginScreen(context: loginInstructionsStateViewModel.context) }
.previewDisplayName("Login instructions")
NavigationStack { QRCodeLoginScreen(context: linkInstructionsStateViewModel.context) }
ElementNavigationStack { QRCodeLoginScreen(context: linkInstructionsStateViewModel.context) }
.previewDisplayName("Link instructions")
NavigationStack { QRCodeLoginScreen(context: scanningStateViewModel.context) }
ElementNavigationStack { QRCodeLoginScreen(context: scanningStateViewModel.context) }
.previewDisplayName("Scanning")
NavigationStack { QRCodeLoginScreen(context: connectingStateViewModel.context) }
ElementNavigationStack { QRCodeLoginScreen(context: connectingStateViewModel.context) }
.previewDisplayName("Connecting")
NavigationStack { QRCodeLoginScreen(context: invalidStateViewModel.context) }
ElementNavigationStack { QRCodeLoginScreen(context: invalidStateViewModel.context) }
.previewDisplayName("Invalid")
NavigationStack { QRCodeLoginScreen(context: notAllowedStateViewModel.context) }
ElementNavigationStack { QRCodeLoginScreen(context: notAllowedStateViewModel.context) }
.previewDisplayName("Not allowed")
NavigationStack { QRCodeLoginScreen(context: deviceNotSignedInStateViewModel.context) }
ElementNavigationStack { QRCodeLoginScreen(context: deviceNotSignedInStateViewModel.context) }
.previewDisplayName("Device not signed in")
NavigationStack { QRCodeLoginScreen(context: showingStateViewModel.context) }
ElementNavigationStack { QRCodeLoginScreen(context: showingStateViewModel.context) }
.previewDisplayName("Showing")
NavigationStack { QRCodeLoginScreen(context: deviceCodeStateViewModel.context) }
ElementNavigationStack { QRCodeLoginScreen(context: deviceCodeStateViewModel.context) }
.previewDisplayName("Device code")
NavigationStack { QRCodeLoginScreen(context: verificationCodeStateViewModel.context) }
ElementNavigationStack { QRCodeLoginScreen(context: verificationCodeStateViewModel.context) }
.previewDisplayName("Verification code")
NavigationStack { QRCodeLoginScreen(context: confirmCodeStateViewModel.context) }
ElementNavigationStack { QRCodeLoginScreen(context: confirmCodeStateViewModel.context) }
.previewDisplayName("Confirm code")
NavigationStack { QRCodeLoginScreen(context: confirmCodeEnteredStateViewModel.context) }
ElementNavigationStack { QRCodeLoginScreen(context: confirmCodeEnteredStateViewModel.context) }
.previewDisplayName("Confirm code entered")
NavigationStack { QRCodeLoginScreen(context: confirmCodeInvalidStateViewModel.context) }
ElementNavigationStack { QRCodeLoginScreen(context: confirmCodeInvalidStateViewModel.context) }
.previewDisplayName("Confirm code invalid")
NavigationStack { QRCodeLoginScreen(context: errorStateViewModel.context) }
ElementNavigationStack { QRCodeLoginScreen(context: errorStateViewModel.context) }
.previewDisplayName("Error")
}
}
@@ -73,7 +73,7 @@ struct ReportContentScreen_Previews: PreviewProvider, TestablePreview {
clientProxy: ClientProxyMock(.init()))
static var previews: some View {
NavigationStack {
ElementNavigationStack {
ReportContentScreen(context: viewModel.context)
}
}
@@ -65,7 +65,7 @@ struct ReportRoomScreen_Previews: PreviewProvider, TestablePreview {
static let viewModel = ReportRoomScreenViewModel(roomProxy: JoinedRoomProxyMock(.init()),
userIndicatorController: UserIndicatorControllerMock())
static var previews: some View {
NavigationStack {
ElementNavigationStack {
ReportRoomScreen(context: viewModel.context)
}
}
@@ -70,17 +70,17 @@ struct RoomChangePermissionsScreen_Previews: PreviewProvider, TestablePreview {
static let spaceViewModel = makeViewModel(isSpace: true)
static var previews: some View {
NavigationStack {
ElementNavigationStack {
RoomChangePermissionsScreen(context: roomViewModel.context)
}
.previewDisplayName("Room")
NavigationStack {
ElementNavigationStack {
RoomChangePermissionsScreen(context: roomAsUserViewModel.context)
}
.previewDisplayName("Room as User")
NavigationStack {
ElementNavigationStack {
RoomChangePermissionsScreen(context: spaceViewModel.context)
}
.previewDisplayName("Space")
@@ -118,22 +118,22 @@ struct RoomChangeRolesScreen_Previews: PreviewProvider, TestablePreview {
static let moderatorViewModel = makeViewModel(mode: .moderator, ownRole: .administrator)
static var previews: some View {
NavigationStack {
ElementNavigationStack {
RoomChangeRolesScreen(context: ownerViewModel.context)
}
.previewDisplayName("Owners")
NavigationStack {
ElementNavigationStack {
RoomChangeRolesScreen(context: administratorOrOwnerViewModel.context)
}
.previewDisplayName("Administrator or Owners")
NavigationStack {
ElementNavigationStack {
RoomChangeRolesScreen(context: administratorViewModel.context)
}
.previewDisplayName("Administrators")
NavigationStack {
ElementNavigationStack {
RoomChangeRolesScreen(context: moderatorViewModel.context)
}
.previewDisplayName("Moderators")
@@ -175,12 +175,12 @@ struct RoomDetailsEditScreen_Previews: PreviewProvider, TestablePreview {
}()
static var previews: some View {
NavigationStack {
ElementNavigationStack {
RoomDetailsEditScreen(context: readOnlyViewModel.context)
}
.previewDisplayName("Read only")
NavigationStack {
ElementNavigationStack {
RoomDetailsEditScreen(context: editableViewModel.context)
}
.snapshotPreferences(expect: editableViewModel.context.$viewState.map { state in
@@ -13,7 +13,7 @@ struct RoomDirectorySearchScreen: View {
@ObservedObject var context: RoomDirectorySearchScreenViewModel.Context
var body: some View {
NavigationStack {
ElementNavigationStack {
List {
Section {
ForEach(context.viewState.rooms) { room in
@@ -173,7 +173,7 @@ struct RoomMembersListScreen_Previews: PreviewProvider, TestablePreview {
static let emptyBannedViewModel = makeViewModel(withBanned: false, isAdmin: false, initialMode: .members)
static var previews: some View {
NavigationStack {
ElementNavigationStack {
RoomMembersListScreen(context: viewModel.context)
}
.snapshotPreferences(expect: viewModel.context.$viewState.map { state in
@@ -181,7 +181,7 @@ struct RoomMembersListScreen_Previews: PreviewProvider, TestablePreview {
})
.previewDisplayName("Member")
NavigationStack {
ElementNavigationStack {
RoomMembersListScreen(context: invitesViewModel.context)
}
.snapshotPreferences(expect: invitesViewModel.context.$viewState.map { state in
@@ -189,7 +189,7 @@ struct RoomMembersListScreen_Previews: PreviewProvider, TestablePreview {
})
.previewDisplayName("Invites")
NavigationStack {
ElementNavigationStack {
RoomMembersListScreen(context: adminViewModel.context)
}
.snapshotPreferences(expect: adminViewModel.context.$viewState.map { state in
@@ -197,7 +197,7 @@ struct RoomMembersListScreen_Previews: PreviewProvider, TestablePreview {
})
.previewDisplayName("Admin: Members")
NavigationStack {
ElementNavigationStack {
RoomMembersListScreen(context: bannedViewModel.context)
}
.snapshotPreferences(expect: bannedViewModel.context.$viewState.map { state in
@@ -205,7 +205,7 @@ struct RoomMembersListScreen_Previews: PreviewProvider, TestablePreview {
})
.previewDisplayName("Admin: Banned")
NavigationStack {
ElementNavigationStack {
RoomMembersListScreen(context: emptyBannedViewModel.context)
.onAppear { emptyBannedViewModel.context.searchQuery = "Dan" }
}
@@ -145,12 +145,12 @@ struct RoomPollsHistoryScreen_Previews: PreviewProvider, TestablePreview {
}()
static var previews: some View {
NavigationStack {
ElementNavigationStack {
RoomPollsHistoryScreen(context: viewModelEmpty.context)
}
.previewDisplayName("No polls")
NavigationStack {
ElementNavigationStack {
RoomPollsHistoryScreen(context: viewModel.context)
}
.previewDisplayName("polls")
@@ -128,12 +128,12 @@ struct RoomRolesAndPermissionsScreen_Previews: PreviewProvider, TestablePreview
userIndicatorController: UserIndicatorControllerMock(),
analytics: ServiceLocator.shared.analytics)
static var previews: some View {
NavigationStack {
ElementNavigationStack {
RoomRolesAndPermissionsScreen(context: viewModel.context)
}
.previewDisplayName("Admin")
NavigationStack {
ElementNavigationStack {
RoomRolesAndPermissionsScreen(context: creatorViewModel.context)
}
.previewDisplayName("Creator")
@@ -201,14 +201,14 @@ struct RoomScreen_Previews: PreviewProvider, TestablePreview {
static let tombstonedViewModels = makeViewModels(hasSuccessor: true)
static var previews: some View {
NavigationStack {
ElementNavigationStack {
RoomScreen(context: viewModels.room.context,
timelineContext: viewModels.timeline.context,
composerToolbar: ComposerToolbar.mock())
}
.previewDisplayName("Normal")
NavigationStack {
ElementNavigationStack {
RoomScreen(context: readOnlyViewModels.room.context,
timelineContext: readOnlyViewModels.timeline.context,
composerToolbar: ComposerToolbar.mock())
@@ -216,7 +216,7 @@ struct RoomScreen_Previews: PreviewProvider, TestablePreview {
.previewDisplayName("Read-only")
.snapshotPreferences(expect: readOnlyViewModels.room.context.$viewState.map { !$0.canSendMessage })
NavigationStack {
ElementNavigationStack {
RoomScreen(context: tombstonedViewModels.room.context,
timelineContext: tombstonedViewModels.timeline.context,
composerToolbar: ComposerToolbar.mock())
@@ -171,7 +171,7 @@ struct SwipeRightAction_Previews: PreviewProvider, TestablePreview {
@State private var isPresentingSheet = false
var body: some View {
NavigationStack {
ElementNavigationStack {
ScrollView {
VStack(alignment: .leading, spacing: 2) {
Text("This is a message from somebody with a couple of lines of text.")
@@ -98,7 +98,7 @@ struct RoomSelectionScreen_Previews: PreviewProvider, TestablePreview {
let viewModel = RoomSelectionScreenViewModel(userSession: UserSessionMock(.init()),
roomSummaryProvider: summaryProvider)
NavigationStack {
ElementNavigationStack {
RoomSelectionScreen(context: viewModel.context)
}
}
@@ -90,7 +90,7 @@ struct SecureBackupKeyBackupScreen_Previews: PreviewProvider, TestablePreview {
static let setupViewModel = viewModel(keyBackupState: .enabled)
static var previews: some View {
NavigationStack {
ElementNavigationStack {
SecureBackupKeyBackupScreen(context: setupViewModel.context)
}
.previewDisplayName("Set up")
@@ -117,31 +117,31 @@ struct SecureBackupLogoutConfirmationScreen_Previews: PreviewProvider, TestableP
static let offlineViewModel = makeViewModel(mode: .offline)
static var previews: some View {
NavigationStack {
ElementNavigationStack {
SecureBackupLogoutConfirmationScreen(context: viewModel.context)
}
.previewDisplayName("Confirmation")
NavigationStack {
ElementNavigationStack {
SecureBackupLogoutConfirmationScreen(context: waitingViewModel.context)
}
.previewDisplayName("Waiting")
.snapshotPreferences(expect: waitingViewModel.context.observe(\.viewState.mode).map { $0 == .waitingToStart(hasStalled: false) })
NavigationStack {
ElementNavigationStack {
SecureBackupLogoutConfirmationScreen(context: ongoingViewModel.context)
}
.previewDisplayName("Ongoing")
.snapshotPreferences(expect: ongoingViewModel.context.observe(\.viewState.mode).map { $0 == .backupOngoing(progress: 0.5) })
// Uses the same view model as Waiting but with a different expectation.
NavigationStack {
ElementNavigationStack {
SecureBackupLogoutConfirmationScreen(context: waitingViewModel.context)
}
.previewDisplayName("Stalled")
.snapshotPreferences(expect: waitingViewModel.context.observe(\.viewState.mode).map { $0 == .waitingToStart(hasStalled: true) })
NavigationStack {
ElementNavigationStack {
SecureBackupLogoutConfirmationScreen(context: offlineViewModel.context)
}
.previewDisplayName("Offline")
@@ -246,28 +246,28 @@ struct SecureBackupRecoveryKeyScreen_Previews: PreviewProvider, TestablePreview
static let unknownViewModel = viewModel(recoveryState: .unknown)
static var previews: some View {
NavigationStack {
ElementNavigationStack {
SecureBackupRecoveryKeyScreen(context: notSetUpViewModel.context)
}
.previewDisplayName("Not set up")
NavigationStack {
ElementNavigationStack {
SecureBackupRecoveryKeyScreen(context: generatingViewModel.context)
}
.previewDisplayName("Generating")
NavigationStack {
ElementNavigationStack {
SecureBackupRecoveryKeyScreen(context: setupViewModel.context)
}
.snapshotPreferences(expect: setupViewModel.context.observe(\.viewState.recoveryKey).map { $0 != nil })
.previewDisplayName("Set up")
NavigationStack {
ElementNavigationStack {
SecureBackupRecoveryKeyScreen(context: incompleteViewModel.context)
}
.previewDisplayName("Incomplete")
NavigationStack {
ElementNavigationStack {
SecureBackupRecoveryKeyScreen(context: unknownViewModel.context)
}
.previewDisplayName("Unknown")
@@ -123,25 +123,25 @@ struct SecureBackupScreen_Previews: PreviewProvider, TestablePreview {
static let recoveryIncompleteViewModel = viewModel(keyBackupState: .enabled, recoveryState: .incomplete)
static var previews: some View {
NavigationStack {
ElementNavigationStack {
SecureBackupScreen(context: bothSetupViewModel.context)
}
.snapshotPreferences(expect: bothSetupViewModel.context.observe(\.viewState.keyBackupState).map { $0 == .enabled })
.previewDisplayName("Both setup")
NavigationStack {
ElementNavigationStack {
SecureBackupScreen(context: onlyKeyBackupSetUpViewModel.context)
}
.snapshotPreferences(expect: onlyKeyBackupSetUpViewModel.context.observe(\.viewState.keyBackupState).map { $0 == .enabled })
.previewDisplayName("Only key backup setup")
NavigationStack {
ElementNavigationStack {
SecureBackupScreen(context: keyBackupDisabledViewModel.context)
}
.snapshotPreferences(expect: keyBackupDisabledViewModel.context.observe(\.viewState.keyBackupState).map { $0 == .unknown })
.previewDisplayName("Key backup disabled")
NavigationStack {
ElementNavigationStack {
SecureBackupScreen(context: recoveryIncompleteViewModel.context)
}
.snapshotPreferences(expect: recoveryIncompleteViewModel.context.observe(\.viewState.recoveryState).map { $0 == .incomplete })
@@ -359,12 +359,12 @@ struct SecurityAndPrivacyScreen_Previews: PreviewProvider, TestablePreview {
}()
static var previews: some View {
NavigationStack {
ElementNavigationStack {
SecurityAndPrivacyScreen(context: inviteOnlyViewModel.context)
}
.previewDisplayName("Private invite only room")
NavigationStack {
ElementNavigationStack {
SecurityAndPrivacyScreen(context: publicViewModel.context)
}
.snapshotPreferences(expect: publicViewModel.context.$viewState.map { state in
@@ -372,12 +372,12 @@ struct SecurityAndPrivacyScreen_Previews: PreviewProvider, TestablePreview {
})
.previewDisplayName("Public room")
NavigationStack {
ElementNavigationStack {
SecurityAndPrivacyScreen(context: publicNoAddressViewModel.context)
}
.previewDisplayName("Public room without address")
NavigationStack {
ElementNavigationStack {
SecurityAndPrivacyScreen(context: singleSpaceMembersViewModel.context)
}
.snapshotPreferences(expect: singleSpaceMembersViewModel.context.$viewState.map { state in
@@ -385,7 +385,7 @@ struct SecurityAndPrivacyScreen_Previews: PreviewProvider, TestablePreview {
})
.previewDisplayName("Space members")
NavigationStack {
ElementNavigationStack {
SecurityAndPrivacyScreen(context: multipleSpacesMembersViewModel.context)
}
.snapshotPreferences(expect: multipleSpacesMembersViewModel.context.$viewState.map { state in
@@ -393,7 +393,7 @@ struct SecurityAndPrivacyScreen_Previews: PreviewProvider, TestablePreview {
})
.previewDisplayName("Multiple Spaces members")
NavigationStack {
ElementNavigationStack {
SecurityAndPrivacyScreen(context: askToJoinViewModel.context)
}
.snapshotPreferences(expect: askToJoinViewModel.context.$viewState.map { state in
@@ -401,7 +401,7 @@ struct SecurityAndPrivacyScreen_Previews: PreviewProvider, TestablePreview {
})
.previewDisplayName("Ask to join room")
NavigationStack {
ElementNavigationStack {
SecurityAndPrivacyScreen(context: singleAskToJoinSpaceMembersViewModel.context)
}
.snapshotPreferences(expect: singleAskToJoinSpaceMembersViewModel.context.$viewState.map { state in
@@ -409,7 +409,7 @@ struct SecurityAndPrivacyScreen_Previews: PreviewProvider, TestablePreview {
})
.previewDisplayName("Ask to join with single space members room")
NavigationStack {
ElementNavigationStack {
SecurityAndPrivacyScreen(context: multipleAskToJoinSpacesMembersViewModel.context)
}
.snapshotPreferences(expect: multipleAskToJoinSpacesMembersViewModel.context.$viewState.map { state in
@@ -417,7 +417,7 @@ struct SecurityAndPrivacyScreen_Previews: PreviewProvider, TestablePreview {
})
.previewDisplayName("Ask to join with multiple spaces members room")
NavigationStack {
ElementNavigationStack {
SecurityAndPrivacyScreen(context: publicSpaceViewModel.context)
}
.snapshotPreferences(expect: publicSpaceViewModel.context.$viewState.map { state in
@@ -107,7 +107,7 @@ struct AdvancedSettingsScreen_Previews: PreviewProvider, TestablePreview {
clientProxy: ClientProxyMock(.init()),
userIndicatorController: UserIndicatorControllerMock())
static var previews: some View {
NavigationStack {
ElementNavigationStack {
AdvancedSettingsScreen(context: viewModel.context)
}
}
@@ -96,7 +96,7 @@ struct DeactivateAccountScreen_Previews: PreviewProvider, TestablePreview {
static let viewModel = DeactivateAccountScreenViewModel(clientProxy: ClientProxyMock(.init()),
userIndicatorController: UserIndicatorControllerMock())
static var previews: some View {
NavigationStack {
ElementNavigationStack {
DeactivateAccountScreen(context: viewModel.context)
}
}
@@ -215,7 +215,7 @@ struct DeveloperOptionsScreen_Previews: PreviewProvider {
appHooks: AppHooks(),
clientProxy: ClientProxyMock(.init()))
static var previews: some View {
NavigationStack {
ElementNavigationStack {
DeveloperOptionsScreen(context: viewModel.context)
}
}
@@ -267,13 +267,13 @@ struct SettingsScreen_Previews: PreviewProvider, TestablePreview {
static let bugReportDisabledViewModel = makeViewModel(isBugReportServiceEnabled: false)
static var previews: some View {
NavigationStack {
ElementNavigationStack {
SettingsScreen(context: viewModel.context)
}
.snapshotPreferences(expect: viewModel.context.observe(\.viewState.accountSessionsListURL).map { $0 != nil })
.previewDisplayName("Default")
NavigationStack {
ElementNavigationStack {
SettingsScreen(context: bugReportDisabledViewModel.context)
}
.snapshotPreferences(expect: bugReportDisabledViewModel.context.observe(\.viewState.accountSessionsListURL).map { $0 != nil })
@@ -131,7 +131,7 @@ struct UserDetailsEditScreen_Previews: PreviewProvider, TestablePreview {
userIndicatorController: UserIndicatorControllerMock.default)
static var previews: some View {
NavigationStack {
ElementNavigationStack {
UserDetailsEditScreen(context: viewModel.context)
}
}
@@ -164,7 +164,7 @@ struct SpaceAddRoomsScreen_Previews: PreviewProvider, TestablePreview {
static let selectedViewModel = makeViewModel(searchQuery: "Foundation", hasSelection: true)
static var previews: some View {
NavigationStack {
ElementNavigationStack {
SpaceAddRoomsScreen(context: viewModel.context)
}
.previewDisplayName("Suggested")
@@ -172,12 +172,12 @@ struct SpaceAddRoomsScreen_Previews: PreviewProvider, TestablePreview {
$0.type == .suggestions && !$0.rooms.isEmpty
})
NavigationStack {
ElementNavigationStack {
SpaceAddRoomsScreen(context: searchingViewModel.context)
}
.previewDisplayName("Searching")
NavigationStack {
ElementNavigationStack {
SpaceAddRoomsScreen(context: selectedViewModel.context)
}
.previewDisplayName("Selected")
@@ -194,16 +194,16 @@ struct SpaceScreen_Previews: PreviewProvider, TestablePreview {
static let newSpaceViewModel = makeViewModel(isNewSpace: true)
static var previews: some View {
NavigationStack {
ElementNavigationStack {
SpaceScreen(context: viewModel.context)
}
NavigationStack {
ElementNavigationStack {
SpaceScreen(context: managingViewModel.context)
}
.previewDisplayName("Managing")
NavigationStack {
ElementNavigationStack {
SpaceScreen(context: newSpaceViewModel.context)
}
.previewDisplayName("New Space")
@@ -146,12 +146,12 @@ struct SpaceSettingsScreen_Previews: PreviewProvider, TestablePreview {
appSettings: ServiceLocator.shared.settings)
static var previews: some View {
NavigationStack {
ElementNavigationStack {
SpaceSettingsScreen(context: ownerViewModel.context)
}
.previewDisplayName("Owner")
NavigationStack {
ElementNavigationStack {
SpaceSettingsScreen(context: userViewModel.context)
}
.previewDisplayName("User")
@@ -139,11 +139,11 @@ struct SpacesScreen_Previews: PreviewProvider, TestablePreview {
static let emptyViewModel = makeViewModel(isEmpty: true)
static var previews: some View {
NavigationStack {
ElementNavigationStack {
SpacesScreen(context: viewModel.context)
}
NavigationStack {
ElementNavigationStack {
SpacesScreen(context: emptyViewModel.context)
}
.previewDisplayName("Empty")
@@ -168,7 +168,7 @@ struct StartChatScreen_Previews: PreviewProvider, TestablePreview {
}()
static var previews: some View {
NavigationStack {
ElementNavigationStack {
StartChatScreen(context: viewModel.context)
}
}
@@ -84,7 +84,7 @@ struct LongPressWithFeedback_Previews: PreviewProvider, TestablePreview {
@State private var isPresentingSheet = false
var body: some View {
NavigationStack {
ElementNavigationStack {
ScrollView {
VStack(alignment: .leading, spacing: 8) {
mockBubble("This is a message from somebody with a couple of lines of text.")
@@ -14,7 +14,7 @@ struct TimelineItemDebugView: View {
let info: TimelineItemDebugInfo
var body: some View {
NavigationStack {
ElementNavigationStack {
ScrollView {
VStack(spacing: 8) {
TimelineItemInfoDisclosureGroup(title: "Model", text: info.model)
@@ -102,7 +102,7 @@ struct HighlightedTimelineItemTimeline_Previews: PreviewProvider {
timelineControllerFactory: TimelineControllerFactoryMock(.init()))
static var previews: some View {
NavigationStack {
ElementNavigationStack {
RoomScreen(context: roomViewModel.context,
timelineContext: timelineViewModel.context,
composerToolbar: ComposerToolbar.mock())
@@ -156,7 +156,7 @@ struct TimelineView_Previews: PreviewProvider { // Not testable as this preview
timelineControllerFactory: TimelineControllerFactoryMock(.init()))
static var previews: some View {
NavigationStack {
ElementNavigationStack {
RoomScreen(context: roomViewModel.context,
timelineContext: timelineViewModel.context,
composerToolbar: ComposerToolbar.mock())