@@ -57,6 +57,7 @@ import com.nextcloud.talk.chat.data.model.ChatMessage
5757import com.nextcloud.talk.chat.viewmodels.ChatViewModel
5858import com.nextcloud.talk.data.user.model.User
5959import kotlinx.coroutines.delay
60+ import kotlinx.coroutines.flow.collectLatest
6061import kotlinx.coroutines.flow.distinctUntilChanged
6162import kotlinx.coroutines.flow.map
6263import kotlinx.coroutines.launch
@@ -94,6 +95,12 @@ fun GetNewChatView(
9495 }
9596 }
9697
98+ val isNearNewest by remember(listState) {
99+ derivedStateOf {
100+ listState.firstVisibleItemIndex <= 2
101+ }
102+ }
103+
97104 // Show floating scroll-to-newest button when not at newest
98105 val showScrollToNewest by remember { derivedStateOf { ! isAtNewest } }
99106
@@ -174,16 +181,22 @@ fun GetNewChatView(
174181
175182 var stickyDateHeader by remember { mutableStateOf(false ) }
176183
177- LaunchedEffect (listState) {
178- snapshotFlow { listState.isScrollInProgress }
179- .collect { scrolling ->
180- if (scrolling) {
181- stickyDateHeader = true
182- } else {
183- delay(1200 )
184- stickyDateHeader = false
184+ LaunchedEffect (listState, isNearNewest) {
185+ // Only listen to scroll if user is away from newest messages. This ensures the stickyHeader is not shown on
186+ // every new received message when being at the bottom of the list (because this triggers a scroll).
187+ if (! isNearNewest) {
188+ snapshotFlow { listState.isScrollInProgress }
189+ .collectLatest { scrolling ->
190+ if (scrolling) {
191+ stickyDateHeader = true
192+ } else {
193+ delay(1200 )
194+ stickyDateHeader = false
195+ }
185196 }
186- }
197+ } else {
198+ stickyDateHeader = false
199+ }
187200 }
188201
189202 val stickyDateHeaderAlpha by animateFloatAsState(
0 commit comments