SpaceFiltersView : try to fix the BottomSheet hide animation

This commit is contained in:
ganfra 2026-02-05 10:35:27 +01:00
parent 0f668370b7
commit 5e0e1f8f4f

View file

@ -49,6 +49,7 @@ import io.element.android.libraries.designsystem.theme.components.Text
import io.element.android.libraries.matrix.api.spaces.SpaceServiceFilter import io.element.android.libraries.matrix.api.spaces.SpaceServiceFilter
import io.element.android.libraries.matrix.ui.model.getAvatarData import io.element.android.libraries.matrix.ui.model.getAvatarData
import io.element.android.libraries.ui.strings.CommonStrings import io.element.android.libraries.ui.strings.CommonStrings
import timber.log.Timber
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
@ -57,27 +58,42 @@ fun SpaceFiltersView(
modifier: Modifier = Modifier modifier: Modifier = Modifier
) { ) {
val sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true) val sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true)
val isSelecting = state is SpaceFiltersState.Selecting
var showSheet by remember { mutableStateOf(false) } var showSheet by remember { mutableStateOf(false) }
LaunchedEffect(state) { LaunchedEffect(isSelecting) {
when (state) { if (isSelecting) {
is SpaceFiltersState.Selecting -> showSheet = true showSheet = true
else -> { } else {
sheetState.hide() 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 showSheet = false
} }
} }
} if (showSheet) {
Box(modifier = modifier) {
if (showSheet && state is SpaceFiltersState.Selecting) {
ModalBottomSheet( ModalBottomSheet(
modifier = Modifier modifier = modifier
.systemBarsPadding() .systemBarsPadding()
.navigationBarsPadding(), .navigationBarsPadding(),
sheetState = sheetState, sheetState = sheetState,
onDismissRequest = { state.eventSink(SpaceFiltersEvent.Selecting.Cancel) }, onDismissRequest = {
if (isSelecting) {
state.eventSink(SpaceFiltersEvent.Selecting.Cancel)
}
}
) { ) {
Box(
modifier = Modifier
.fillMaxWidth()
.fillMaxHeight(0.9f)
) {
if (isSelecting) {
SpaceFiltersBottomSheetContent( SpaceFiltersBottomSheetContent(
filters = state.visibleFilters, filters = state.visibleFilters,
searchQuery = state.searchQuery, searchQuery = state.searchQuery,
@ -89,6 +105,7 @@ fun SpaceFiltersView(
} }
} }
} }
}
@Composable @Composable
private fun SpaceFiltersBottomSheetContent( private fun SpaceFiltersBottomSheetContent(
@ -98,10 +115,7 @@ private fun SpaceFiltersBottomSheetContent(
modifier: Modifier = Modifier modifier: Modifier = Modifier
) { ) {
Column( Column(
modifier = modifier modifier = modifier.padding(vertical = 16.dp)
.fillMaxWidth()
.fillMaxHeight(0.9f)
.padding(vertical = 16.dp)
) { ) {
Text( Text(
text = stringResource(R.string.screen_roomlist_your_spaces), text = stringResource(R.string.screen_roomlist_your_spaces),
@ -113,7 +127,9 @@ private fun SpaceFiltersBottomSheetContent(
Spacer(modifier = Modifier.height(12.dp)) Spacer(modifier = Modifier.height(12.dp))
SearchField( SearchField(
state = searchQuery, state = searchQuery,
modifier = Modifier.fillMaxWidth().padding(horizontal = 16.dp), modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 16.dp),
placeholder = stringResource(CommonStrings.action_search), placeholder = stringResource(CommonStrings.action_search),
) )
Spacer(modifier = Modifier.height(16.dp)) Spacer(modifier = Modifier.height(16.dp))