Space filters (#4977)

* Add support for SpaceFilters on the SpaceServiceProxy level and a screen that renders them

* Add aliases to a couple of space room mocks

* Update translations and related snapshots

* Add a feature flag for space filters

* Add a new room summary provider filter that takes a list of room identifiers next to the normal state filters

This will take the SpaceFilter's descendants and combine it with the normal filters to reduce the rooms shown

* Add a new space filter button to the home screen and link it to the SpaceFiltersScreen and the actual RoomSummaryProvider room list filters

* Bump the RustSDK to v26.01.20-2 for SpaceFilter support.

* Add a cancellation button to the space filters screen

* Make the filter presentation mode liquidy, move the sheet to within the home screen.

* Address PR comments
This commit is contained in:
Stefan Ceriu
2026-01-21 22:19:39 +02:00
committed by GitHub
parent 0d34a28ec2
commit b4b9f6affa
41 changed files with 808 additions and 13 deletions
@@ -19,6 +19,12 @@ class SpaceServiceProxy: SpaceServiceProxyProtocol {
spacesSubject.asCurrentValuePublisher()
}
private var spaceFilterHandle: TaskHandle?
private let spaceFilterSubject = CurrentValueSubject<[SpaceServiceFilter], Never>([])
var spaceFilterPublisher: CurrentValuePublisher<[SpaceServiceFilter], Never> {
spaceFilterSubject.asCurrentValuePublisher()
}
init(spaceService: SpaceServiceProtocol) {
self.spaceService = spaceService
@@ -27,7 +33,11 @@ class SpaceServiceProxy: SpaceServiceProxyProtocol {
private func setupSubscriptions() async {
topLevelSpacesHandle = await spaceService.subscribeToTopLevelJoinedSpaces(listener: SDKListener { [weak self] updates in
self?.handleUpdates(updates)
self?.handleSpaceListUpdates(updates)
})
spaceFilterHandle = await spaceService.subscribeToSpaceFilters(listener: SDKListener { [weak self] updates in
self?.handleSpaceFilterUpdates(updates)
})
}
@@ -87,7 +97,7 @@ class SpaceServiceProxy: SpaceServiceProxyProtocol {
// MARK: - Private
private func handleUpdates(_ updates: [SpaceListUpdate]) {
private func handleSpaceListUpdates(_ updates: [SpaceListUpdate]) {
var spaces = spacesSubject.value
for update in updates {
@@ -119,4 +129,37 @@ class SpaceServiceProxy: SpaceServiceProxyProtocol {
spacesSubject.send(spaces)
}
private func handleSpaceFilterUpdates(_ updates: [SpaceFilterUpdate]) {
var filters = spaceFilterSubject.value
for update in updates {
switch update {
case .append(let spaceFilters):
filters.append(contentsOf: spaceFilters.map(SpaceServiceFilter.init))
case .clear:
filters.removeAll()
case .pushFront(let filter):
filters.insert(SpaceServiceFilter(filter: filter), at: 0)
case .pushBack(let filter):
filters.append(SpaceServiceFilter(filter: filter))
case .popFront:
filters.removeFirst()
case .popBack:
filters.removeLast()
case .insert(let index, let filter):
filters.insert(SpaceServiceFilter(filter: filter), at: Int(index))
case .set(let index, let filter):
filters[Int(index)] = SpaceServiceFilter(filter: filter)
case .remove(let index):
filters.remove(at: Int(index))
case .truncate(let length):
filters.removeSubrange(Int(length)..<filters.count)
case .reset(let spaceFilters):
filters = spaceFilters.map(SpaceServiceFilter.init)
}
}
spaceFilterSubject.send(filters)
}
}