From 6117ee3a2bb1aa3eb36adcb9a6f1c742c607fd46 Mon Sep 17 00:00:00 2001 From: Skye Elliot Date: Tue, 6 Jan 2026 16:36:19 +0000 Subject: [PATCH] Do not show history visible banner when the user cannot send messages. (#4892) --- .../Screens/RoomScreen/RoomScreenModels.swift | 8 ++++- .../Sources/RoomScreenViewModelTests.swift | 32 +++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/ElementX/Sources/Screens/RoomScreen/RoomScreenModels.swift b/ElementX/Sources/Screens/RoomScreen/RoomScreenModels.swift index ec7cb6f05..a970868f4 100644 --- a/ElementX/Sources/Screens/RoomScreen/RoomScreenModels.swift +++ b/ElementX/Sources/Screens/RoomScreen/RoomScreenModels.swift @@ -84,7 +84,13 @@ struct RoomScreenViewState: BindableState { var historyVisibleDetails: RoomScreenFooterViewDetails? var footerDetails: RoomScreenFooterViewDetails? { - identityViolationDetails ?? historyVisibleDetails + if let identityViolationDetails { + return identityViolationDetails + } + guard canSendMessage else { + return nil + } + return historyVisibleDetails } var bindings = RoomScreenViewStateBindings() diff --git a/UnitTests/Sources/RoomScreenViewModelTests.swift b/UnitTests/Sources/RoomScreenViewModelTests.swift index c6ac582f5..360646e2d 100644 --- a/UnitTests/Sources/RoomScreenViewModelTests.swift +++ b/UnitTests/Sources/RoomScreenViewModelTests.swift @@ -554,6 +554,38 @@ class RoomScreenViewModelTests: XCTestCase { let deferred = deferFailure(viewModel.context.$viewState, timeout: 1) { $0.footerDetails != nil } try await deferred.fulfill() } + + func testHistoryVisibleBannerDoesNotAppearIfCannotSendMessages() async throws { + ServiceLocator.shared.settings.enableKeyShareOnInvite = true + ServiceLocator.shared.settings.acknowledgedHistoryVisibleRooms = Set() + + let powerlevels = RoomPowerLevelsProxyMockConfiguration( + canUserSendMessage: false + ) + + let configuration = JoinedRoomProxyMockConfiguration(id: "$room:example.com", isEncrypted: true, powerLevelsConfiguration: powerlevels) + let roomProxyMock = JoinedRoomProxyMock(configuration) + + let roomInfoProxyMock = RoomInfoProxyMock(configuration) + roomInfoProxyMock.historyVisibility = .shared + + let infoSubject = CurrentValueSubject(roomInfoProxyMock) + roomProxyMock.underlyingInfoPublisher = infoSubject.asCurrentValuePublisher() + + let viewModel = RoomScreenViewModel(userSession: UserSessionMock(.init()), + roomProxy: roomProxyMock, + initialSelectedPinnedEventID: nil, + ongoingCallRoomIDPublisher: .init(.init(nil)), + appSettings: ServiceLocator.shared.settings, + appHooks: AppHooks(), + analyticsService: ServiceLocator.shared.analytics, + userIndicatorController: ServiceLocator.shared.userIndicatorController) + + self.viewModel = viewModel + + let deferred = deferFailure(viewModel.context.$viewState, timeout: 1) { $0.footerDetails != nil } + try await deferred.fulfill() + } func testHistoryVisibleBannerAppearsThenDisappearsOnAcknowledge() async throws { ServiceLocator.shared.settings.enableKeyShareOnInvite = true