From d08b0e009011b9672468fc08eccbece471f0000d Mon Sep 17 00:00:00 2001 From: Stefan Ceriu Date: Mon, 28 Sep 2026 18:54:24 +0300 Subject: [PATCH] Start a foreground search backfill request when entering the message search tab --- .../Screens/SearchScreen/SearchScreenViewModel.swift | 6 +++++- UnitTests/Sources/SearchScreenViewModelTests.swift | 12 ++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/ElementX/Sources/Screens/SearchScreen/SearchScreenViewModel.swift b/ElementX/Sources/Screens/SearchScreen/SearchScreenViewModel.swift index a09102e4c..2ba00118f 100644 --- a/ElementX/Sources/Screens/SearchScreen/SearchScreenViewModel.swift +++ b/ElementX/Sources/Screens/SearchScreen/SearchScreenViewModel.swift @@ -102,8 +102,12 @@ class SearchScreenViewModel: SearchScreenViewModelType, SearchScreenViewModelPro // Re-run the search when switching tabs so the newly active tab reflects the current query. let searchModeStream = context.observe(\.viewState.bindings.searchMode).removeDuplicates() searchModeObservationTask = Task { [weak self] in - for await _ in searchModeStream { + for await searchMode in searchModeStream { guard let self else { return } + // Opening the messages tab signals the user actually wants history to be searchable. + if searchMode == .messages { + clientProxy.startSearchBackfill(strategy: .foreground) + } updateFilter(for: state.bindings.searchQuery) } } diff --git a/UnitTests/Sources/SearchScreenViewModelTests.swift b/UnitTests/Sources/SearchScreenViewModelTests.swift index 0113e0320..6cc35922a 100644 --- a/UnitTests/Sources/SearchScreenViewModelTests.swift +++ b/UnitTests/Sources/SearchScreenViewModelTests.swift @@ -21,6 +21,8 @@ struct SearchScreenViewModelTests { let setQuerySubject = PassthroughSubject() /// Fires each time an indicator is submitted. let submitIndicatorSubject = PassthroughSubject() + /// Fires each time a search backfill is started, with whether it used the foreground strategy. + let startSearchBackfillSubject = PassthroughSubject() var context: SearchScreenViewModelType.Context { viewModel.context @@ -42,6 +44,9 @@ struct SearchScreenViewModelTests { let clientProxy = ClientProxyMock(.init()) clientProxy.searchService = searchService + clientProxy.startSearchBackfillStrategyClosure = { [startSearchBackfillSubject] strategy in + startSearchBackfillSubject.send(strategy == .foreground) + } let staticRoomSummaryProvider = RoomSummaryProviderMock() staticRoomSummaryProvider.roomListPublisher = staticRoomListSubject.asCurrentValuePublisher() clientProxy.staticRoomSummaryProvider = staticRoomSummaryProvider @@ -97,6 +102,13 @@ struct SearchScreenViewModelTests { #expect(searchService.setQueryReceivedQuery == "Foundation") } + @Test + func openingMessagesTabStartsSearchBackfill() async throws { + let deferred = deferFulfillment(startSearchBackfillSubject) { $0 } + context.searchMode = .messages + try await deferred.fulfill() + } + @Test func messageSearchFailureShowsErrorIndicator() async throws { searchService.setQueryClosure = { _ in .failure(.sdkError(SearchScreenViewModelTestsError.failed)) }