From af202f3466a4d9b4afce1f843ad94f18718ff80e Mon Sep 17 00:00:00 2001 From: Stefan Ceriu Date: Thu, 10 Sep 2026 17:22:53 +0300 Subject: [PATCH] Add a joined only option to the room list search filter The search filter now takes a joinedOnly flag, which appends the SDK's joined filter so that invited and knocked rooms are excluded. It defaults to false, leaving the existing callers unchanged. --- ElementX/Sources/Mocks/RoomSummaryProviderMock.swift | 4 ++-- .../Room/RoomSummary/RoomSummaryProvider.swift | 12 ++++++------ .../RoomSummary/RoomSummaryProviderProtocol.swift | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/ElementX/Sources/Mocks/RoomSummaryProviderMock.swift b/ElementX/Sources/Mocks/RoomSummaryProviderMock.swift index 4791555bc..fd41cae10 100644 --- a/ElementX/Sources/Mocks/RoomSummaryProviderMock.swift +++ b/ElementX/Sources/Mocks/RoomSummaryProviderMock.swift @@ -43,8 +43,8 @@ extension RoomSummaryProviderMock { setFilterClosure = { [initialRooms, roomListSubject] filter in switch filter { - case let .search(query): - var rooms = initialRooms + case let .search(query, joinedOnly): + var rooms = joinedOnly ? initialRooms.filter { $0.joinRequestType == nil } : initialRooms if !query.isEmpty { rooms = rooms.filter { $0.name.localizedCaseInsensitiveContains(query) } diff --git a/ElementX/Sources/Services/Room/RoomSummary/RoomSummaryProvider.swift b/ElementX/Sources/Services/Room/RoomSummary/RoomSummaryProvider.swift index 646b6b198..ef591d986 100644 --- a/ElementX/Sources/Services/Room/RoomSummary/RoomSummaryProvider.swift +++ b/ElementX/Sources/Services/Room/RoomSummary/RoomSummaryProvider.swift @@ -153,12 +153,8 @@ class RoomSummaryProvider: RoomSummaryProviderProtocol { switch filter { case .excludeAll: _ = listUpdatesSubscriptionResult?.controller().setFilter(kind: .none) - case let .search(query): - let filters = if appSettings.fuzzyRoomListSearchEnabled { - [.fuzzyMatchRoomName(pattern: query)] + baseFilter - } else { - [.normalizedMatchRoomName(pattern: query)] + baseFilter - } + case let .search(query, joinedOnly): + let filters = nameFilter(for: query) + baseFilter + (joinedOnly ? [.joined] : []) _ = listUpdatesSubscriptionResult?.controller().setFilter(kind: .all(filters: filters)) case .rooms(let roomIDs, let filters): var rustFilters = filters.map(\.rustFilter) + baseFilter @@ -183,6 +179,10 @@ class RoomSummaryProvider: RoomSummaryProviderProtocol { // MARK: - Private + private func nameFilter(for query: String) -> [RoomListEntriesDynamicFilterKind] { + appSettings.fuzzyRoomListSearchEnabled ? [.fuzzyMatchRoomName(pattern: query)] : [.normalizedMatchRoomName(pattern: query)] + } + private func setupVisibleRangeObservers() { // Unthrottled to add another page half way through the last one visibleItemRangePublisher diff --git a/ElementX/Sources/Services/Room/RoomSummary/RoomSummaryProviderProtocol.swift b/ElementX/Sources/Services/Room/RoomSummary/RoomSummaryProviderProtocol.swift index 659f9adb5..5729af7cf 100644 --- a/ElementX/Sources/Services/Room/RoomSummary/RoomSummaryProviderProtocol.swift +++ b/ElementX/Sources/Services/Room/RoomSummary/RoomSummaryProviderProtocol.swift @@ -36,8 +36,8 @@ enum RoomSummaryProviderState { enum RoomSummaryProviderFilter: Equatable { /// Filters out everything case excludeAll - /// Includes only the items that satisfy the predicate logic - case search(query: String) + /// Includes only the items that satisfy the predicate logic, optionally restricted to joined rooms + case search(query: String, joinedOnly: Bool = false) /// Includes only what satisfies the filters used case all(filters: Set) /// Include only rooms from the given that satisfy the given filters