Browse Source

Timeline: add autoscroll on new messages

feature/bma/flipper
ganfra 2 years ago
parent
commit
f92d1621d4
  1. 61
      features/messages/src/main/java/io/element/android/x/features/messages/MessagesScreen.kt

61
features/messages/src/main/java/io/element/android/x/features/messages/MessagesScreen.kt

@ -224,29 +224,32 @@ fun TimelineItems(
onReachedLoadMore: () -> Unit, onReachedLoadMore: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
) { ) {
LazyColumn( Box(modifier = modifier.fillMaxWidth()) {
modifier = modifier.fillMaxWidth(), LazyColumn(
state = lazyListState, modifier = modifier.fillMaxWidth(),
horizontalAlignment = Alignment.Start, state = lazyListState,
verticalArrangement = Arrangement.Bottom, horizontalAlignment = Alignment.Start,
reverseLayout = true verticalArrangement = Arrangement.Bottom,
) { reverseLayout = true
items( ) {
items = timelineItems, items(
contentType = { timelineItem -> timelineItem.contentType() }, items = timelineItems,
key = { timelineItem -> timelineItem.key() }, contentType = { timelineItem -> timelineItem.contentType() },
) { timelineItem -> key = { timelineItem -> timelineItem.key() },
TimelineItemRow( ) { timelineItem ->
timelineItem = timelineItem, TimelineItemRow(
onClick = onClick, timelineItem = timelineItem,
onLongClick = onLongClick onClick = onClick,
) onLongClick = onLongClick
} )
if (hasMoreToLoad) { }
item { if (hasMoreToLoad) {
MessagesLoadingMoreIndicator(onReachedLoadMore) item {
MessagesLoadingMoreIndicator(onReachedLoadMore)
}
} }
} }
MessagesScrollHelper(lazyListState = lazyListState, timelineItems = timelineItems)
} }
} }
@ -455,6 +458,22 @@ fun MessageEventBubble(
) )
} }
@Composable
internal fun MessagesScrollHelper(
lazyListState: LazyListState,
timelineItems: List<MessagesTimelineItemState>,
) {
val coroutineScope = rememberCoroutineScope()
val firstVisibleItemIndex by remember { derivedStateOf { lazyListState.firstVisibleItemIndex } }
LaunchedEffect(timelineItems, firstVisibleItemIndex) {
if (!lazyListState.isScrollInProgress &&
firstVisibleItemIndex < 2
) coroutineScope.launch {
lazyListState.animateScrollToItem(0)
}
}
}
@Composable @Composable
internal fun MessagesLoadingMoreIndicator(onReachedLoadMore: () -> Unit) { internal fun MessagesLoadingMoreIndicator(onReachedLoadMore: () -> Unit) {
Box( Box(

Loading…
Cancel
Save