From f92d1621d407ce14afed9287e5ed63440d7e5f68 Mon Sep 17 00:00:00 2001 From: ganfra Date: Wed, 23 Nov 2022 19:10:57 +0100 Subject: [PATCH] Timeline: add autoscroll on new messages --- .../x/features/messages/MessagesScreen.kt | 61 ++++++++++++------- 1 file changed, 40 insertions(+), 21 deletions(-) diff --git a/features/messages/src/main/java/io/element/android/x/features/messages/MessagesScreen.kt b/features/messages/src/main/java/io/element/android/x/features/messages/MessagesScreen.kt index 1da7dba4e2..60f8808efc 100644 --- a/features/messages/src/main/java/io/element/android/x/features/messages/MessagesScreen.kt +++ b/features/messages/src/main/java/io/element/android/x/features/messages/MessagesScreen.kt @@ -224,29 +224,32 @@ fun TimelineItems( onReachedLoadMore: () -> Unit, modifier: Modifier = Modifier, ) { - LazyColumn( - modifier = modifier.fillMaxWidth(), - state = lazyListState, - horizontalAlignment = Alignment.Start, - verticalArrangement = Arrangement.Bottom, - reverseLayout = true - ) { - items( - items = timelineItems, - contentType = { timelineItem -> timelineItem.contentType() }, - key = { timelineItem -> timelineItem.key() }, - ) { timelineItem -> - TimelineItemRow( - timelineItem = timelineItem, - onClick = onClick, - onLongClick = onLongClick - ) - } - if (hasMoreToLoad) { - item { - MessagesLoadingMoreIndicator(onReachedLoadMore) + Box(modifier = modifier.fillMaxWidth()) { + LazyColumn( + modifier = modifier.fillMaxWidth(), + state = lazyListState, + horizontalAlignment = Alignment.Start, + verticalArrangement = Arrangement.Bottom, + reverseLayout = true + ) { + items( + items = timelineItems, + contentType = { timelineItem -> timelineItem.contentType() }, + key = { timelineItem -> timelineItem.key() }, + ) { timelineItem -> + TimelineItemRow( + timelineItem = timelineItem, + onClick = onClick, + onLongClick = onLongClick + ) + } + if (hasMoreToLoad) { + item { + MessagesLoadingMoreIndicator(onReachedLoadMore) + } } } + MessagesScrollHelper(lazyListState = lazyListState, timelineItems = timelineItems) } } @@ -455,6 +458,22 @@ fun MessageEventBubble( ) } +@Composable +internal fun MessagesScrollHelper( + lazyListState: LazyListState, + timelineItems: List, +) { + val coroutineScope = rememberCoroutineScope() + val firstVisibleItemIndex by remember { derivedStateOf { lazyListState.firstVisibleItemIndex } } + LaunchedEffect(timelineItems, firstVisibleItemIndex) { + if (!lazyListState.isScrollInProgress && + firstVisibleItemIndex < 2 + ) coroutineScope.launch { + lazyListState.animateScrollToItem(0) + } + } +} + @Composable internal fun MessagesLoadingMoreIndicator(onReachedLoadMore: () -> Unit) { Box(