Timeline: add autoscroll on new messages

This commit is contained in:
ganfra
2022-11-23 19:10:57 +01:00
parent b294ad132c
commit 778d2455b0

View File

@@ -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<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
internal fun MessagesLoadingMoreIndicator(onReachedLoadMore: () -> Unit) {
Box(