This commit is contained in:
Jorge Martín
2026-05-15 14:57:39 +02:00
committed by Benoit Marty
parent ab4b11b9f0
commit bf1462f9b1
18 changed files with 59 additions and 21 deletions
@@ -10,6 +10,7 @@ package io.element.android.features.home.impl.components
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.RowScope
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
@@ -160,7 +161,7 @@ fun HomeTopBar(
}
@Composable
private fun RoomListMenuItems(
private fun RowScope.RoomListMenuItems(
onToggleSearch: () -> Unit,
onMenuActionClick: (RoomListMenuAction) -> Unit,
canReportBug: Boolean,
@@ -48,6 +48,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.ui.model.getAvatarData
import io.element.android.libraries.ui.strings.CommonStrings
import kotlinx.collections.immutable.ImmutableList
@OptIn(ExperimentalMaterial3Api::class)
@Composable
@@ -93,7 +94,7 @@ fun SpaceFiltersView(
SpaceFiltersBottomSheetContent(
filters = state.visibleFilters,
searchQuery = state.searchQuery,
onFilterSelected = { filter ->
onSelectFilter = { filter ->
state.eventSink(SpaceFiltersEvent.Selecting.SelectFilter(filter))
}
)
@@ -105,9 +106,9 @@ fun SpaceFiltersView(
@Composable
private fun SpaceFiltersBottomSheetContent(
filters: List<SpaceServiceFilter>,
filters: ImmutableList<SpaceServiceFilter>,
searchQuery: TextFieldState,
onFilterSelected: (SpaceServiceFilter) -> Unit,
onSelectFilter: (SpaceServiceFilter) -> Unit,
modifier: Modifier = Modifier
) {
Column(
@@ -133,7 +134,7 @@ private fun SpaceFiltersBottomSheetContent(
items(filters) { filter ->
SpaceFilterItem(
filter = filter,
onClick = { onFilterSelected(filter) }
onClick = { onSelectFilter(filter) }
)
}
}
@@ -147,7 +147,7 @@ private fun DoneButton(
}
@Composable
private fun Buttons(
private fun ColumnScope.Buttons(
onRetry: () -> Unit,
onCancel: () -> Unit,
) {
@@ -14,6 +14,7 @@ import io.element.android.compound.theme.ElementTheme
import io.element.android.features.location.api.Location
import io.element.android.libraries.designsystem.components.PinVariant
import io.element.android.libraries.designsystem.components.rememberLocationPinBitmap
import kotlinx.collections.immutable.ImmutableList
import kotlinx.serialization.json.JsonPrimitive
import org.maplibre.compose.expressions.dsl.and
import org.maplibre.compose.expressions.dsl.asString
@@ -66,7 +67,7 @@ data class LocationMarkerData(
*/
@Composable
fun LocationPinMarkers(
markers: List<LocationMarkerData>,
markers: ImmutableList<LocationMarkerData>,
onMarkerClick: ((LocationMarkerData) -> Unit)? = null,
onClusterClick: ((Position) -> Unit)? = null,
) {
@@ -26,6 +26,7 @@ import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberUpdatedState
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
@@ -180,6 +181,7 @@ private fun StartLiveLocationActionView(
onActionSuccess: () -> Unit,
modifier: Modifier = Modifier,
) {
val updatedOnActionSuccess by rememberUpdatedState(onActionSuccess)
Box(modifier = modifier) {
val asyncIndicatorState = rememberAsyncIndicatorState()
AsyncIndicatorHost(state = asyncIndicatorState)
@@ -202,7 +204,7 @@ private fun StartLiveLocationActionView(
}
}
is AsyncAction.Success -> {
LaunchedEffect(action) { onActionSuccess() }
LaunchedEffect(action) { updatedOnActionSuccess() }
}
else -> Unit
}
@@ -50,6 +50,7 @@ import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.theme.components.Text
import io.element.android.libraries.designsystem.theme.components.TopAppBar
import io.element.android.libraries.ui.strings.CommonStrings
import kotlinx.collections.immutable.toImmutableList
import kotlinx.coroutines.launch
import org.maplibre.compose.camera.CameraMoveReason
import org.maplibre.compose.camera.CameraPosition
@@ -172,7 +173,7 @@ fun ShowLocationView(
trackUserLocation = state.isTrackMyLocation
)
val markers = remember(state.locationShares) {
state.locationShares.map { it.toMarkerData() }
state.locationShares.map { it.toMarkerData() }.toImmutableList()
}
LocationPinMarkers(markers)
},
@@ -125,7 +125,7 @@ private fun Content(errorScreenType: QrCodeErrorScreenType) {
}
@Composable
private fun Buttons(
private fun ColumnScope.Buttons(
onRetry: () -> Unit,
onCancel: () -> Unit,
) {
@@ -17,6 +17,7 @@ import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.RowScope
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.consumeWindowInsets
@@ -412,7 +413,7 @@ fun MessagesView(
}
@Composable
internal fun MessagesMenuActions(
internal fun RowScope.MessagesMenuActions(
displayThreads: Boolean,
roomCallState: RoomCallState,
onJoinCallClick: (isAudioCall: Boolean) -> Unit,
@@ -28,6 +28,7 @@ import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberUpdatedState
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
@@ -157,6 +158,7 @@ private fun ScrollHelper(
listState: LazyListState,
onPaginate: () -> Unit,
) {
val updatedOnPaginate by rememberUpdatedState(onPaginate)
val lastVisibleItemIndex by remember {
derivedStateOf { listState.firstVisibleItemIndex + listState.layoutInfo.visibleItemsInfo.size - 1 }
}
@@ -168,7 +170,7 @@ private fun ScrollHelper(
}
LaunchedEffect(needsPagination, lastVisibleItemIndex) {
if (needsPagination) {
onPaginate()
updatedOnPaginate()
delay(400L)
}
}
@@ -9,7 +9,9 @@
package io.element.android.features.messages.impl.timeline.model.event
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.produceState
import androidx.compose.runtime.rememberUpdatedState
import io.element.android.features.location.api.Location
import io.element.android.libraries.designsystem.components.PinVariant
import io.element.android.libraries.designsystem.components.avatar.AvatarData
@@ -103,8 +105,9 @@ private fun rememberIsLiveLocationActive(
mode: TimelineItemLocationContent.Mode.Live,
currentTimeMillis: () -> Long,
): Boolean {
val updatedCurrentTimeMillis by rememberUpdatedState(currentTimeMillis)
fun TimelineItemLocationContent.Mode.Live.isActive(): Boolean {
return isActive && endTimestamp > currentTimeMillis()
return isActive && endTimestamp > updatedCurrentTimeMillis()
}
return produceState(
initialValue = mode.isActive(),
@@ -112,7 +115,7 @@ private fun rememberIsLiveLocationActive(
key2 = mode.isActive,
) {
if (mode.isActive) {
val remainingMillis = mode.endTimestamp - currentTimeMillis()
val remainingMillis = mode.endTimestamp - updatedCurrentTimeMillis()
delay(remainingMillis)
}
value = false
@@ -19,6 +19,7 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberUpdatedState
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
@@ -343,6 +344,7 @@ private fun LiveLocationUpdatesSection(
onOpenAppPermissionsClick: () -> Unit,
modifier: Modifier = Modifier,
) {
val updatedOnValueSaved by rememberUpdatedState(onValueSaved)
PreferenceCategory(
modifier = modifier,
showTopDivider = true,
@@ -382,7 +384,7 @@ private fun LiveLocationUpdatesSection(
value = sliderValue.toFloat(),
onValueChange = { sliderValue = it.roundToInt() },
onValueChangeFinish = {
onValueSaved(sliderValue)
updatedOnValueSaved(sliderValue)
},
valueRange = valueRange,
colors = SliderDefaults.colors(