From e64f0af4e49269ea27f6abe17b33830eed01f7d1 Mon Sep 17 00:00:00 2001 From: ganfra Date: Thu, 5 Feb 2026 13:52:41 +0100 Subject: [PATCH] Space filters fix previews --- .../impl/roomlist/RoomListStateProvider.kt | 4 +- .../impl/spacefilters/SpaceFiltersView.kt | 38 +++++++++---------- 2 files changed, 19 insertions(+), 23 deletions(-) diff --git a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListStateProvider.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListStateProvider.kt index 7f83eb7eb0..97600e0247 100644 --- a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListStateProvider.kt +++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListStateProvider.kt @@ -19,7 +19,7 @@ import io.element.android.features.home.impl.model.anInviteSender import io.element.android.features.home.impl.search.RoomListSearchState import io.element.android.features.home.impl.search.aRoomListSearchState import io.element.android.features.home.impl.spacefilters.SpaceFiltersState -import io.element.android.features.home.impl.spacefilters.aDisabledSpaceFiltersState +import io.element.android.features.home.impl.spacefilters.anUnselectedSpaceFiltersState import io.element.android.features.invite.api.acceptdecline.AcceptDeclineInviteState import io.element.android.features.invite.api.acceptdecline.anAcceptDeclineInviteState import io.element.android.features.leaveroom.api.LeaveRoomEvent @@ -54,7 +54,7 @@ internal fun aRoomListState( leaveRoomState: LeaveRoomState = aLeaveRoomState(), searchState: RoomListSearchState = aRoomListSearchState(), filtersState: RoomListFiltersState = aRoomListFiltersState(), - spaceFiltersState: SpaceFiltersState = aDisabledSpaceFiltersState(), + spaceFiltersState: SpaceFiltersState = anUnselectedSpaceFiltersState(), contentState: RoomListContentState = aRoomsContentState(), acceptDeclineInviteState: AcceptDeclineInviteState = anAcceptDeclineInviteState(), hideInvitesAvatars: Boolean = false, diff --git a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/spacefilters/SpaceFiltersView.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/spacefilters/SpaceFiltersView.kt index 3ce03dbdd3..fb77c74203 100644 --- a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/spacefilters/SpaceFiltersView.kt +++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/spacefilters/SpaceFiltersView.kt @@ -23,13 +23,12 @@ import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.foundation.text.input.TextFieldState import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.SheetValue import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue +import androidx.compose.runtime.rememberUpdatedState import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource @@ -56,33 +55,30 @@ fun SpaceFiltersView( state: SpaceFiltersState, modifier: Modifier = Modifier ) { - val sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true) - val isSelecting = state is SpaceFiltersState.Selecting - var showSheet by remember { mutableStateOf(false) } - + val isSelecting by rememberUpdatedState(state is SpaceFiltersState.Selecting) + val sheetState = rememberModalBottomSheetState( + skipPartiallyExpanded = true, + confirmValueChange = { sheetValueTarget -> + // This ensures the hide animation is not cancelled + when (sheetValueTarget) { + SheetValue.Expanded -> isSelecting + else -> true + } + } + ) LaunchedEffect(isSelecting) { - if (isSelecting) { - showSheet = true - } else { + if (!isSelecting) { sheetState.hide() } } - - // This is necessary because the animation can get cancelled - // then the sheetState is hidden but the showSheet is still true. - LaunchedEffect(sheetState.isVisible, sheetState.isAnimationRunning) { - if (!sheetState.isVisible && !sheetState.isAnimationRunning) { - showSheet = false - } - } - if (showSheet) { + if (sheetState.isVisible || isSelecting) { ModalBottomSheet( modifier = modifier .systemBarsPadding() .navigationBarsPadding(), sheetState = sheetState, onDismissRequest = { - if (isSelecting) { + if (state is SpaceFiltersState.Selecting) { state.eventSink(SpaceFiltersEvent.Selecting.Cancel) } } @@ -92,7 +88,7 @@ fun SpaceFiltersView( .fillMaxWidth() .fillMaxHeight(0.9f) ) { - if (isSelecting) { + if (state is SpaceFiltersState.Selecting) { SpaceFiltersBottomSheetContent( filters = state.visibleFilters, searchQuery = state.searchQuery,