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,34 +58,50 @@ 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()
showSheet = false
}
} }
} }
Box(modifier = modifier) { // This is necessary because the animation can get cancelled
if (showSheet && state is SpaceFiltersState.Selecting) { // then the sheetState is hidden but the showSheet is still true.
ModalBottomSheet( LaunchedEffect(sheetState.isVisible, sheetState.isAnimationRunning) {
if (!sheetState.isVisible && !sheetState.isAnimationRunning) {
showSheet = false
}
}
if (showSheet) {
ModalBottomSheet(
modifier = modifier
.systemBarsPadding()
.navigationBarsPadding(),
sheetState = sheetState,
onDismissRequest = {
if (isSelecting) {
state.eventSink(SpaceFiltersEvent.Selecting.Cancel)
}
}
) {
Box(
modifier = Modifier modifier = Modifier
.systemBarsPadding() .fillMaxWidth()
.navigationBarsPadding(), .fillMaxHeight(0.9f)
sheetState = sheetState,
onDismissRequest = { state.eventSink(SpaceFiltersEvent.Selecting.Cancel) },
) { ) {
SpaceFiltersBottomSheetContent( if (isSelecting) {
filters = state.visibleFilters, SpaceFiltersBottomSheetContent(
searchQuery = state.searchQuery, filters = state.visibleFilters,
onFilterSelected = { filter -> searchQuery = state.searchQuery,
state.eventSink(SpaceFiltersEvent.Selecting.SelectFilter(filter)) onFilterSelected = { filter ->
} state.eventSink(SpaceFiltersEvent.Selecting.SelectFilter(filter))
) }
)
}
} }
} }
} }
@ -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))