Implement scroll to top in friends and conversations screens

This commit is contained in:
2025-03-29 22:31:48 +03:00
parent f1892670da
commit 5b5e8f8446
7 changed files with 71 additions and 8 deletions
@@ -12,13 +12,15 @@ object Friends
fun NavGraphBuilder.friendsScreen(
onError: (BaseError) -> Unit,
onPhotoClicked: (url: String) -> Unit,
onMessageClicked: (userId: Int) -> Unit
onMessageClicked: (userId: Int) -> Unit,
onScrolledToTop: () -> Unit
) {
composable<Friends> {
FriendsRoute(
onError = onError,
onPhotoClicked = onPhotoClicked,
onMessageClicked = onMessageClicked
onMessageClicked = onMessageClicked,
onScrolledToTop = onScrolledToTop
)
}
}
@@ -29,12 +29,14 @@ import dev.chrisbanes.haze.hazeSource
import dev.meloda.fast.friends.FriendsViewModel
import dev.meloda.fast.friends.FriendsViewModelImpl
import dev.meloda.fast.friends.OnlineFriendsViewModelImpl
import dev.meloda.fast.friends.navigation.Friends
import dev.meloda.fast.model.BaseError
import dev.meloda.fast.ui.R
import dev.meloda.fast.ui.components.ErrorView
import dev.meloda.fast.ui.components.FullScreenLoader
import dev.meloda.fast.ui.components.NoItemsView
import dev.meloda.fast.ui.theme.LocalHazeState
import dev.meloda.fast.ui.theme.LocalScrollToTop
import dev.meloda.fast.ui.theme.LocalThemeConfig
import dev.meloda.fast.ui.util.ImmutableList
import kotlinx.coroutines.flow.collectLatest
@@ -51,7 +53,8 @@ fun FriendsScreen(
onSessionExpiredLogOutButtonClicked: () -> Unit = {},
onPhotoClicked: (url: String) -> Unit = {},
onMessageClicked: (userId: Int) -> Unit = {},
setCanScrollBackward: (Boolean) -> Unit = {}
setCanScrollBackward: (Boolean) -> Unit = {},
onScrolledToTop: () -> Unit = {}
) {
val context: Context = LocalContext.current
val viewModel: FriendsViewModel =
@@ -93,6 +96,17 @@ fun FriendsScreen(
initialFirstVisibleItemScrollOffset = screenState.scrollOffset
)
val scrollToTop = LocalScrollToTop.current[Friends] ?: false
LaunchedEffect(scrollToTop) {
if (scrollToTop) {
if (listState.firstVisibleItemIndex > 14) {
listState.scrollToItem(14)
}
listState.animateScrollToItem(0)
onScrolledToTop()
}
}
LaunchedEffect(listState) {
snapshotFlow { listState.firstVisibleItemIndex }
.debounce(250L)
@@ -58,6 +58,7 @@ fun FriendsRoute(
onError: (BaseError) -> Unit,
onPhotoClicked: (url: String) -> Unit,
onMessageClicked: (userId: Int) -> Unit,
onScrolledToTop: () -> Unit
) {
val scope = rememberCoroutineScope()
val currentTheme = LocalThemeConfig.current
@@ -236,7 +237,8 @@ fun FriendsRoute(
onSessionExpiredLogOutButtonClicked = { onError(BaseError.SessionExpired) },
onPhotoClicked = onPhotoClicked,
onMessageClicked = onMessageClicked,
setCanScrollBackward = { canScrollBackward = it }
setCanScrollBackward = { canScrollBackward = it },
onScrolledToTop = onScrolledToTop
)
}
}