mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-03 16:10:20 +00:00
Room List Filters Empty State View (#2522)
This commit is contained in:
@@ -118,6 +118,10 @@ struct HomeScreenViewState: BindableState {
|
||||
var shouldHideRoomList: Bool {
|
||||
bindings.isSearchFieldFocused && bindings.searchQuery.isEmpty
|
||||
}
|
||||
|
||||
var shouldShowEmptyFilterState: Bool {
|
||||
shouldShowFilters && bindings.filtersState.isFiltering && visibleRooms.isEmpty
|
||||
}
|
||||
}
|
||||
|
||||
struct HomeScreenViewStateBindings {
|
||||
|
||||
@@ -0,0 +1,71 @@
|
||||
//
|
||||
// Copyright 2024 New Vector Ltd
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
|
||||
struct RoomListFiltersEmptyStateView: View {
|
||||
let state: RoomListFiltersState
|
||||
|
||||
private var emptyStateTitle: String {
|
||||
if state.activeFilters.count == 1 {
|
||||
switch state.activeFilters[0] {
|
||||
case .unreads:
|
||||
return L10n.screenRoomlistFilterUnreadsEmptyStateTitle
|
||||
case .people:
|
||||
return L10n.screenRoomlistFilterPeopleEmptyStateTitle
|
||||
case .rooms:
|
||||
return L10n.screenRoomlistFilterRoomsEmptyStateTitle
|
||||
case .favourites:
|
||||
return L10n.screenRoomlistFilterFavouritesEmptyStateTitle
|
||||
}
|
||||
}
|
||||
return L10n.screenRoomlistFilterMixedEmptyStateTitle
|
||||
}
|
||||
|
||||
private var emptyStateSubtitle: String {
|
||||
if state.activeFilters.first == .favourites {
|
||||
return L10n.screenRoomlistFilterFavouritesEmptyStateSubtitle
|
||||
}
|
||||
return L10n.screenRoomlistFilterMixedEmptyStateSubtitle
|
||||
}
|
||||
|
||||
var body: some View {
|
||||
VStack(spacing: 24) {
|
||||
Text(emptyStateTitle)
|
||||
.multilineTextAlignment(.center)
|
||||
.font(.compound.headingSMSemibold)
|
||||
.foregroundColor(.compound.textPrimary)
|
||||
|
||||
Text(emptyStateSubtitle)
|
||||
.multilineTextAlignment(.center)
|
||||
.font(.compound.bodyMD)
|
||||
.foregroundColor(.compound.textSecondary)
|
||||
}
|
||||
.padding(.horizontal, 60)
|
||||
}
|
||||
}
|
||||
|
||||
struct RoomListFiltersEmptyStateView_Previews: PreviewProvider, TestablePreview {
|
||||
static var previews: some View {
|
||||
VStack(spacing: 24) {
|
||||
ForEach(RoomListFilter.allCases) { filter in
|
||||
RoomListFiltersEmptyStateView(state: .init(activeFilters: [filter]))
|
||||
}
|
||||
RoomListFiltersEmptyStateView(state: .init(activeFilters: [.people, .favourites]))
|
||||
}
|
||||
.previewLayout(.sizeThatFits)
|
||||
}
|
||||
}
|
||||
@@ -20,6 +20,7 @@ struct HomeScreenContent: View {
|
||||
@Environment(\.verticalSizeClass) private var verticalSizeClass
|
||||
|
||||
@ObservedObject var context: HomeScreenViewModel.Context
|
||||
@State private var topSectionFrame: CGRect = .zero
|
||||
let scrollViewAdapter: ScrollViewAdapter
|
||||
|
||||
var body: some View {
|
||||
@@ -56,9 +57,15 @@ struct HomeScreenContent: View {
|
||||
// Showing empty views in pinned headers makes the room list spasm when reaching the top
|
||||
LazyVStack(spacing: 0, pinnedViews: [.sectionHeaders]) {
|
||||
Section {
|
||||
HomeScreenRoomList(context: context)
|
||||
if context.viewState.shouldShowEmptyFilterState {
|
||||
RoomListFiltersEmptyStateView(state: context.filtersState)
|
||||
.frame(height: geometry.size.height - topSectionFrame.height)
|
||||
} else {
|
||||
HomeScreenRoomList(context: context)
|
||||
}
|
||||
} header: {
|
||||
topSection
|
||||
.readFrame($topSectionFrame)
|
||||
}
|
||||
}
|
||||
.searchable(text: $context.searchQuery)
|
||||
|
||||
Reference in New Issue
Block a user