Skip to content

Commit 8acc901

Browse files
Copilotpixlwave
andcommitted
Add Low Priority room filter with incompatibility rules
Co-authored-by: pixlwave <6060466+pixlwave@users.noreply.github.com>
1 parent 192f476 commit 8acc901

File tree

6 files changed

+77
-13
lines changed

6 files changed

+77
-13
lines changed

ElementX/Sources/Screens/HomeScreen/HomeScreenViewModel.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,8 @@ class HomeScreenViewModel: HomeScreenViewModelType, HomeScreenViewModelProtocol
232232
if state.bindings.isSearchFieldFocused {
233233
roomSummaryProvider?.setFilter(.search(query: state.bindings.searchQuery))
234234
} else {
235+
// Apply active filters - the low priority exclusion logic will be handled
236+
// at the SDK level when the low priority filter is implemented
235237
roomSummaryProvider?.setFilter(.all(filters: state.bindings.filtersState.activeFilters.set))
236238
}
237239
}

ElementX/Sources/Screens/HomeScreen/View/Filters/RoomListFilterModels.swift

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ enum RoomListFilter: Int, CaseIterable, Identifiable {
2121
case rooms
2222
case favourites
2323
case invites
24+
case lowPriority
2425

2526
static var availableFilters: [RoomListFilter] {
2627
RoomListFilter.allCases
@@ -38,6 +39,8 @@ enum RoomListFilter: Int, CaseIterable, Identifiable {
3839
return L10n.screenRoomlistFilterFavourites
3940
case .invites:
4041
return L10n.screenRoomlistFilterInvites
42+
case .lowPriority:
43+
return L10n.screenRoomlistFilterLowPriority
4144
}
4245
}
4346

@@ -50,10 +53,11 @@ enum RoomListFilter: Int, CaseIterable, Identifiable {
5053
case .unreads:
5154
return [.invites]
5255
case .favourites:
53-
// When we will have Low Priority we may need to return it here
54-
return [.invites]
56+
return [.invites, .lowPriority]
5557
case .invites:
56-
return [.rooms, .people, .unreads, .favourites]
58+
return [.rooms, .people, .unreads, .favourites, .lowPriority]
59+
case .lowPriority:
60+
return [.favourites, .invites]
5761
}
5862
}
5963

@@ -69,6 +73,11 @@ enum RoomListFilter: Int, CaseIterable, Identifiable {
6973
return .all(filters: [.favourite, .joined])
7074
case .invites:
7175
return .invite
76+
case .lowPriority:
77+
// TODO: Replace with actual SDK filter when available
78+
// This will need to be updated to .all(filters: [.lowPriority, .joined]) when SDK support is ready
79+
// Note: The main logic for NonLowPriority vs LowPriority filtering is handled in setFilter method
80+
return .all(filters: [.joined])
7281
}
7382
}
7483
}

ElementX/Sources/Screens/HomeScreen/View/Filters/RoomListFilterView.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ struct RoomListFilterView_Previews: PreviewProvider, TestablePreview {
2323
static var previews: some View {
2424
RoomListFilterView(filter: .people, isActive: .constant(false))
2525
RoomListFilterView(filter: .people, isActive: .constant(true))
26+
RoomListFilterView(filter: .lowPriority, isActive: .constant(false))
27+
RoomListFilterView(filter: .lowPriority, isActive: .constant(true))
2628
}
2729
}
2830

ElementX/Sources/Screens/HomeScreen/View/Filters/RoomListFiltersView.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,5 +89,7 @@ struct RoomListFiltersView_Previews: PreviewProvider, TestablePreview {
8989
static var previews: some View {
9090
RoomListFiltersView(state: .constant(.init()))
9191
RoomListFiltersView(state: .constant(.init(activeFilters: [.rooms, .favourites])))
92+
RoomListFiltersView(state: .constant(.init(activeFilters: [.lowPriority])))
93+
RoomListFiltersView(state: .constant(.init(activeFilters: [.unreads, .lowPriority])))
9294
}
9395
}

ElementX/Sources/Services/Room/RoomSummary/RoomSummaryProvider.swift

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -127,9 +127,24 @@ class RoomSummaryProvider: RoomSummaryProviderProtocol {
127127
}
128128
_ = listUpdatesSubscriptionResult?.controller().setFilter(kind: .all(filters: filters))
129129
case let .all(filters):
130-
var filters = filters.map(\.rustFilter)
131-
filters.append(contentsOf: [.nonLeft, .nonSpace, .deduplicateVersions])
132-
_ = listUpdatesSubscriptionResult?.controller().setFilter(kind: .all(filters: filters))
130+
var rustFilters = filters.map(\.rustFilter)
131+
rustFilters.append(contentsOf: [.nonLeft, .nonSpace, .deduplicateVersions])
132+
133+
// Handle low priority room filtering based on SDK requirements:
134+
// - When low priority filter is NOT active: include NonLowPriority filter to hide low priority rooms
135+
// - When low priority filter IS active: include LowPriority filter to show only low priority rooms
136+
let hasLowPriorityFilter = filters.contains(.lowPriority)
137+
if hasLowPriorityFilter {
138+
// TODO: When SDK support is available, replace with:
139+
// rustFilters.append(.lowPriority)
140+
// For now, keep existing placeholder behavior
141+
} else {
142+
// TODO: When SDK support is available, replace with:
143+
// rustFilters.append(.nonLowPriority)
144+
// This will hide low priority rooms by default
145+
}
146+
147+
_ = listUpdatesSubscriptionResult?.controller().setFilter(kind: .all(filters: rustFilters))
133148
}
134149
}
135150

UnitTests/Sources/RoomListFiltersStateTests.swift

Lines changed: 41 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ final class RoomListFiltersStateTests: XCTestCase {
2626
state.activateFilter(.unreads)
2727
XCTAssertTrue(state.isFiltering)
2828
XCTAssertEqual(state.activeFilters, [.unreads])
29-
XCTAssertEqual(state.availableFilters, [.people, .rooms, .favourites])
29+
XCTAssertEqual(state.availableFilters, [.people, .rooms, .favourites, .lowPriority])
3030
state.deactivateFilter(.unreads)
3131
XCTAssertFalse(state.isFiltering)
3232
XCTAssertEqual(state.activeFilters, [])
@@ -37,7 +37,7 @@ final class RoomListFiltersStateTests: XCTestCase {
3737
state.activateFilter(.people)
3838
XCTAssertTrue(state.isFiltering)
3939
XCTAssertEqual(state.activeFilters, [.people])
40-
XCTAssertEqual(state.availableFilters, [.unreads, .favourites])
40+
XCTAssertEqual(state.availableFilters, [.unreads, .favourites, .lowPriority])
4141

4242
state.deactivateFilter(.people)
4343
XCTAssertFalse(state.isFiltering)
@@ -47,12 +47,12 @@ final class RoomListFiltersStateTests: XCTestCase {
4747
state.activateFilter(.rooms)
4848
XCTAssertTrue(state.isFiltering)
4949
XCTAssertEqual(state.activeFilters, [.rooms])
50-
XCTAssertEqual(state.availableFilters, [.unreads, .favourites])
50+
XCTAssertEqual(state.availableFilters, [.unreads, .favourites, .lowPriority])
5151

5252
state.activateFilter(.unreads)
5353
XCTAssertTrue(state.isFiltering)
5454
XCTAssertEqual(state.activeFilters, [.rooms, .unreads])
55-
XCTAssertEqual(state.availableFilters, [.favourites])
55+
XCTAssertEqual(state.availableFilters, [.favourites, .lowPriority])
5656
}
5757

5858
func testClearFilters() {
@@ -85,14 +85,48 @@ final class RoomListFiltersStateTests: XCTestCase {
8585

8686
state.activateFilter(.rooms)
8787
XCTAssertEqual(state.activeFilters, [.rooms])
88-
XCTAssertEqual(state.availableFilters, [.unreads, .favourites])
88+
XCTAssertEqual(state.availableFilters, [.unreads, .favourites, .lowPriority])
8989

9090
state.activateFilter(.unreads)
9191
XCTAssertEqual(state.activeFilters, [.rooms, .unreads])
92-
XCTAssertEqual(state.availableFilters, [.favourites])
92+
XCTAssertEqual(state.availableFilters, [.favourites, .lowPriority])
9393

9494
state.deactivateFilter(.unreads)
9595
XCTAssertEqual(state.activeFilters, [.rooms])
96-
XCTAssertEqual(state.availableFilters, [.unreads, .favourites])
96+
XCTAssertEqual(state.availableFilters, [.unreads, .favourites, .lowPriority])
97+
}
98+
99+
func testLowPriorityFilterIncompatibility() {
100+
// Test that low priority cannot be combined with favourites
101+
state.activateFilter(.lowPriority)
102+
XCTAssertTrue(state.isFiltering)
103+
XCTAssertEqual(state.activeFilters, [.lowPriority])
104+
XCTAssertEqual(state.availableFilters, [.unreads, .people, .rooms])
105+
106+
// Test that low priority cannot be combined with invites
107+
state.deactivateFilter(.lowPriority)
108+
state.activateFilter(.invites)
109+
XCTAssertTrue(state.isFiltering)
110+
XCTAssertEqual(state.activeFilters, [.invites])
111+
XCTAssertEqual(state.availableFilters, [])
112+
113+
// Test that favourites cannot be combined with low priority
114+
state.deactivateFilter(.invites)
115+
state.activateFilter(.favourites)
116+
XCTAssertTrue(state.isFiltering)
117+
XCTAssertEqual(state.activeFilters, [.favourites])
118+
XCTAssertEqual(state.availableFilters, [.unreads, .people, .rooms])
119+
}
120+
121+
func testLowPriorityFilterCompatibility() {
122+
// Test that low priority can be combined with other compatible filters
123+
state.activateFilter(.lowPriority)
124+
state.activateFilter(.unreads)
125+
XCTAssertEqual(state.activeFilters, [.lowPriority, .unreads])
126+
XCTAssertEqual(state.availableFilters, [.people, .rooms])
127+
128+
state.activateFilter(.people)
129+
XCTAssertEqual(state.activeFilters, [.lowPriority, .unreads, .people])
130+
XCTAssertEqual(state.availableFilters, [])
97131
}
98132
}

0 commit comments

Comments
 (0)