mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-04 19:44:05 +00:00
Fix #2652 - Room list looping and fighting scrolling after filtering
- also fixes filtering empty state vertical centering
This commit is contained in:
@@ -121,6 +121,18 @@ struct HomeScreenViewState: BindableState {
|
|||||||
var shouldShowEmptyFilterState: Bool {
|
var shouldShowEmptyFilterState: Bool {
|
||||||
!bindings.isSearchFieldFocused && bindings.filtersState.isFiltering && visibleRooms.isEmpty
|
!bindings.isSearchFieldFocused && bindings.filtersState.isFiltering && visibleRooms.isEmpty
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var shouldShowFilters: Bool {
|
||||||
|
!bindings.isSearchFieldFocused
|
||||||
|
}
|
||||||
|
|
||||||
|
var shouldShowRecoveryKeyConfirmationBanner: Bool {
|
||||||
|
securityBannerMode == .recoveryKeyConfirmation
|
||||||
|
}
|
||||||
|
|
||||||
|
var shouldShowInvitesButton: Bool {
|
||||||
|
!ServiceLocator.shared.settings.roomListInvitesEnabled && hasPendingInvitations && !bindings.isSearchFieldFocused
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct HomeScreenViewStateBindings {
|
struct HomeScreenViewStateBindings {
|
||||||
|
|||||||
@@ -14,6 +14,7 @@
|
|||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
//
|
//
|
||||||
|
|
||||||
|
import Compound
|
||||||
import SwiftUI
|
import SwiftUI
|
||||||
|
|
||||||
struct HomeScreenContent: View {
|
struct HomeScreenContent: View {
|
||||||
@@ -54,10 +55,7 @@ struct HomeScreenContent: View {
|
|||||||
case .rooms:
|
case .rooms:
|
||||||
LazyVStack(spacing: 0) {
|
LazyVStack(spacing: 0) {
|
||||||
Section {
|
Section {
|
||||||
if context.viewState.shouldShowEmptyFilterState {
|
if !context.viewState.shouldShowEmptyFilterState {
|
||||||
RoomListFiltersEmptyStateView(state: context.filtersState)
|
|
||||||
.frame(height: geometry.size.height)
|
|
||||||
} else {
|
|
||||||
HomeScreenRoomList(context: context)
|
HomeScreenRoomList(context: context)
|
||||||
}
|
}
|
||||||
} header: {
|
} header: {
|
||||||
@@ -88,12 +86,19 @@ struct HomeScreenContent: View {
|
|||||||
.onChange(of: context.viewState.visibleRooms) { _ in
|
.onChange(of: context.viewState.visibleRooms) { _ in
|
||||||
updateVisibleRange()
|
updateVisibleRange()
|
||||||
}
|
}
|
||||||
.background(
|
.background {
|
||||||
Button("", action: {
|
Button("") {
|
||||||
context.send(viewAction: .globalSearch)
|
context.send(viewAction: .globalSearch)
|
||||||
})
|
}
|
||||||
.keyboardShortcut(KeyEquivalent("k"), modifiers: [.command])
|
.keyboardShortcut(KeyEquivalent("k"), modifiers: [.command])
|
||||||
)
|
}
|
||||||
|
.overlay {
|
||||||
|
if context.viewState.shouldShowEmptyFilterState {
|
||||||
|
RoomListFiltersEmptyStateView(state: context.filtersState)
|
||||||
|
.background(.compound.bgCanvasDefault)
|
||||||
|
.frame(maxWidth: .infinity, maxHeight: .infinity)
|
||||||
|
}
|
||||||
|
}
|
||||||
.scrollDismissesKeyboard(.immediately)
|
.scrollDismissesKeyboard(.immediately)
|
||||||
.scrollDisabled(context.viewState.roomListMode == .skeletons)
|
.scrollDisabled(context.viewState.roomListMode == .skeletons)
|
||||||
.scrollBounceBehavior(context.viewState.roomListMode == .empty ? .basedOnSize : .automatic)
|
.scrollBounceBehavior(context.viewState.roomListMode == .empty ? .basedOnSize : .automatic)
|
||||||
@@ -104,24 +109,29 @@ struct HomeScreenContent: View {
|
|||||||
|
|
||||||
@ViewBuilder
|
@ViewBuilder
|
||||||
private var topSection: some View {
|
private var topSection: some View {
|
||||||
VStack(spacing: 0) {
|
// An empty VStack causes glitches within the room list
|
||||||
if !context.isSearchFieldFocused {
|
if context.viewState.shouldShowFilters ||
|
||||||
RoomListFiltersView(state: $context.filtersState)
|
context.viewState.shouldShowRecoveryKeyConfirmationBanner ||
|
||||||
}
|
context.viewState.shouldShowInvitesButton {
|
||||||
|
VStack(spacing: 0) {
|
||||||
if context.viewState.securityBannerMode == .recoveryKeyConfirmation {
|
if context.viewState.shouldShowFilters {
|
||||||
HomeScreenRecoveryKeyConfirmationBanner(context: context)
|
RoomListFiltersView(state: $context.filtersState)
|
||||||
}
|
}
|
||||||
|
|
||||||
if context.viewState.hasPendingInvitations, !context.isSearchFieldFocused, !ServiceLocator.shared.settings.roomListInvitesEnabled {
|
if context.viewState.shouldShowRecoveryKeyConfirmationBanner {
|
||||||
HomeScreenInvitesButton(title: L10n.actionInvitesList, hasBadge: context.viewState.hasUnreadPendingInvitations) {
|
HomeScreenRecoveryKeyConfirmationBanner(context: context)
|
||||||
context.send(viewAction: .selectInvites)
|
}
|
||||||
|
|
||||||
|
if context.viewState.shouldShowInvitesButton {
|
||||||
|
HomeScreenInvitesButton(title: L10n.actionInvitesList, hasBadge: context.viewState.hasUnreadPendingInvitations) {
|
||||||
|
context.send(viewAction: .selectInvites)
|
||||||
|
}
|
||||||
|
.accessibilityIdentifier(A11yIdentifiers.homeScreen.invites)
|
||||||
|
.frame(maxWidth: .infinity, alignment: .trailing)
|
||||||
}
|
}
|
||||||
.accessibilityIdentifier(A11yIdentifiers.homeScreen.invites)
|
|
||||||
.frame(maxWidth: .infinity, alignment: .trailing)
|
|
||||||
}
|
}
|
||||||
|
.background(Color.compound.bgCanvasDefault)
|
||||||
}
|
}
|
||||||
.background(Color.compound.bgCanvasDefault)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ViewBuilder
|
@ViewBuilder
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
Fix room list looping and fighting scrolling after filtering
|
||||||
Reference in New Issue
Block a user