From 82e666bfe1c57a69510d446ff2b527d0db615270 Mon Sep 17 00:00:00 2001 From: Stefan Ceriu Date: Thu, 10 Sep 2026 17:27:32 +0300 Subject: [PATCH] Only show joined rooms in the search results Rooms the user is invited to, or has knocked on, are handled by the chats list and aren't somewhere search should lead. The search screen now asks the room summary provider for joined rooms only. --- .../SearchScreen/SearchScreenViewModel.swift | 2 +- .../Sources/SearchScreenViewModelTests.swift | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/ElementX/Sources/Screens/SearchScreen/SearchScreenViewModel.swift b/ElementX/Sources/Screens/SearchScreen/SearchScreenViewModel.swift index e6c9852d4..2da0fe720 100644 --- a/ElementX/Sources/Screens/SearchScreen/SearchScreenViewModel.swift +++ b/ElementX/Sources/Screens/SearchScreen/SearchScreenViewModel.swift @@ -183,7 +183,7 @@ class SearchScreenViewModel: SearchScreenViewModelType, SearchScreenViewModelPro switch mode { case .rooms: searchedQueries[mode] = searchQuery - roomSummaryProvider.setFilter(.search(query: searchQuery)) + roomSummaryProvider.setFilter(.search(query: searchQuery, joinedOnly: true)) case .messages: setQueryTask = Task { [weak self] in // Debounce message queries; superseded keystrokes cancel this before it commits. diff --git a/UnitTests/Sources/SearchScreenViewModelTests.swift b/UnitTests/Sources/SearchScreenViewModelTests.swift index 4bee0469f..3b288d7cf 100644 --- a/UnitTests/Sources/SearchScreenViewModelTests.swift +++ b/UnitTests/Sources/SearchScreenViewModelTests.swift @@ -68,6 +68,25 @@ struct SearchScreenViewModelTests { #expect(!searchService.setQueryCalled) } + @Test + func searchingExcludesRoomsThatAreNotJoined() async throws { + let roomSummaryProvider = RoomSummaryProviderMock(.init(state: .loaded(.mockRooms + .mockInvites))) + let clientProxy = ClientProxyMock(.init()) + clientProxy.searchService = searchService + let viewModel = SearchScreenViewModel(roomSummaryProvider: roomSummaryProvider, + clientProxy: clientProxy, + mediaProvider: MediaProviderMock(.init()), + userIndicatorController: userIndicatorController, + appSettings: appSettings) + + let deferred = deferFulfillment(viewModel.context.observe(\.viewState.rooms)) { !$0.isEmpty } + viewModel.context.searchQuery = "room" + try await deferred.fulfill() + + #expect(roomSummaryProvider.setFilterReceivedFilter == .search(query: "room", joinedOnly: true)) + #expect(!viewModel.context.viewState.rooms.contains { $0.title == "First room" }) + } + @Test func messageSearch() async throws { let deferred = deferFulfillment(setQuerySubject) { $0 == "Foundation" }