mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-03 16:10:20 +00:00
UI POC for room list filters (#2382)
Co-authored-by: Doug <6060466+pixlwave@users.noreply.github.com>
This commit is contained in:
@@ -97,6 +97,7 @@ struct HomeScreenViewState: BindableState {
|
||||
|
||||
var rooms: [HomeScreenRoom] = []
|
||||
var roomListMode: HomeScreenRoomListMode = .skeletons
|
||||
var shouldShowFilters = false
|
||||
|
||||
var hasPendingInvitations = false
|
||||
var hasUnreadPendingInvitations = false
|
||||
@@ -111,6 +112,8 @@ struct HomeScreenViewState: BindableState {
|
||||
return rooms
|
||||
}
|
||||
|
||||
var filtersState = RoomListFiltersState()
|
||||
|
||||
var bindings = HomeScreenViewStateBindings()
|
||||
|
||||
var placeholderRooms: [HomeScreenRoom] {
|
||||
@@ -175,3 +178,88 @@ struct HomeScreenRoom: Identifiable, Equatable {
|
||||
isPlaceholder: true)
|
||||
}
|
||||
}
|
||||
|
||||
enum RoomListFilter: Int, CaseIterable, Identifiable {
|
||||
var id: Int {
|
||||
rawValue
|
||||
}
|
||||
|
||||
case people
|
||||
case rooms
|
||||
case unreads
|
||||
case favourites
|
||||
case lowPriority
|
||||
|
||||
var localizedName: String {
|
||||
switch self {
|
||||
case .people:
|
||||
return L10n.screenRoomlistFilterPeople
|
||||
case .rooms:
|
||||
return L10n.screenRoomlistFilterRooms
|
||||
case .unreads:
|
||||
return L10n.screenRoomlistFilterUnreads
|
||||
case .favourites:
|
||||
return L10n.screenRoomlistFilterFavourites
|
||||
case .lowPriority:
|
||||
return L10n.screenRoomlistFilterLowPriority
|
||||
}
|
||||
}
|
||||
|
||||
var complementaryFilter: RoomListFilter? {
|
||||
switch self {
|
||||
case .people:
|
||||
return .rooms
|
||||
case .rooms:
|
||||
return .people
|
||||
case .unreads:
|
||||
return nil
|
||||
case .favourites:
|
||||
return .lowPriority
|
||||
case .lowPriority:
|
||||
return .favourites
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
final class RoomListFiltersState: ObservableObject {
|
||||
@Published private var enabledFilters: Set<RoomListFilter>
|
||||
|
||||
init(enabledFilters: Set<RoomListFilter> = []) {
|
||||
self.enabledFilters = enabledFilters
|
||||
}
|
||||
|
||||
var sortedEnabledFilters: [RoomListFilter] {
|
||||
enabledFilters.sorted(by: { $0.rawValue < $1.rawValue })
|
||||
}
|
||||
|
||||
var sortedAvailableFilters: [RoomListFilter] {
|
||||
var availableFilters = Set(RoomListFilter.allCases)
|
||||
for filter in enabledFilters {
|
||||
availableFilters.remove(filter)
|
||||
if let complementaryFilter = filter.complementaryFilter {
|
||||
availableFilters.remove(complementaryFilter)
|
||||
}
|
||||
}
|
||||
return availableFilters.sorted(by: { $0.rawValue < $1.rawValue })
|
||||
}
|
||||
|
||||
var isFiltering: Bool {
|
||||
!enabledFilters.isEmpty
|
||||
}
|
||||
|
||||
func set(_ filter: RoomListFilter, isEnabled: Bool) {
|
||||
if isEnabled {
|
||||
enabledFilters.insert(filter)
|
||||
} else {
|
||||
enabledFilters.remove(filter)
|
||||
}
|
||||
}
|
||||
|
||||
func clearFilters() {
|
||||
enabledFilters.removeAll()
|
||||
}
|
||||
|
||||
func isEnabled(_ filter: RoomListFilter) -> Bool {
|
||||
enabledFilters.contains(filter)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user