From 26c413037acfab640c4a6984dfc9c12accec9951 Mon Sep 17 00:00:00 2001 From: Danil Nikolaev Date: Sat, 14 Dec 2024 01:07:03 +0300 Subject: [PATCH] saving selected friends tab while app is working --- .../meloda/fast/friends/FriendsViewModel.kt | 6 +++ .../fast/friends/model/FriendsScreenState.kt | 2 + .../friends/presentation/FriendsScreen.kt | 41 +++++++++---------- 3 files changed, 27 insertions(+), 22 deletions(-) diff --git a/feature/friends/src/main/kotlin/dev/meloda/fast/friends/FriendsViewModel.kt b/feature/friends/src/main/kotlin/dev/meloda/fast/friends/FriendsViewModel.kt index fee14622..fc9db494 100644 --- a/feature/friends/src/main/kotlin/dev/meloda/fast/friends/FriendsViewModel.kt +++ b/feature/friends/src/main/kotlin/dev/meloda/fast/friends/FriendsViewModel.kt @@ -32,6 +32,8 @@ interface FriendsViewModel { fun onErrorConsumed() + fun onTabSelected(tabIndex: Int) + fun setScrollIndex(index: Int) fun setScrollOffset(offset: Int) fun setScrollIndexOnline(index: Int) @@ -71,6 +73,10 @@ class FriendsViewModelImpl( baseError.setValue { null } } + override fun onTabSelected(tabIndex: Int) { + screenState.setValue { old -> old.copy(selectedTabIndex = tabIndex) } + } + override fun setScrollIndex(index: Int) { screenState.setValue { old -> old.copy(scrollIndex = index) } } diff --git a/feature/friends/src/main/kotlin/dev/meloda/fast/friends/model/FriendsScreenState.kt b/feature/friends/src/main/kotlin/dev/meloda/fast/friends/model/FriendsScreenState.kt index 5f6ff873..59d5ca9a 100644 --- a/feature/friends/src/main/kotlin/dev/meloda/fast/friends/model/FriendsScreenState.kt +++ b/feature/friends/src/main/kotlin/dev/meloda/fast/friends/model/FriendsScreenState.kt @@ -9,6 +9,7 @@ data class FriendsScreenState( val onlineFriends: List, val isPaginating: Boolean, val isPaginationExhausted: Boolean, + val selectedTabIndex: Int, val scrollIndex: Int, val scrollOffset: Int, val scrollIndexOnline: Int, @@ -22,6 +23,7 @@ data class FriendsScreenState( onlineFriends = emptyList(), isPaginating = false, isPaginationExhausted = false, + selectedTabIndex = 0, scrollIndex = 0, scrollOffset = 0, scrollIndexOnline = 0, diff --git a/feature/friends/src/main/kotlin/dev/meloda/fast/friends/presentation/FriendsScreen.kt b/feature/friends/src/main/kotlin/dev/meloda/fast/friends/presentation/FriendsScreen.kt index 67cfa1f6..c6655c4e 100644 --- a/feature/friends/src/main/kotlin/dev/meloda/fast/friends/presentation/FriendsScreen.kt +++ b/feature/friends/src/main/kotlin/dev/meloda/fast/friends/presentation/FriendsScreen.kt @@ -33,10 +33,8 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember -import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.runtime.snapshotFlow import androidx.compose.ui.Alignment @@ -101,6 +99,7 @@ fun FriendsRoute( onPaginationConditionsMet = viewModel::onPaginationConditionsMet, onRefresh = viewModel::onRefresh, onPhotoClicked = onPhotoClicked, + setSelectedTabIndex = viewModel::onTabSelected, setScrollIndex = viewModel::setScrollIndex, setScrollOffset = viewModel::setScrollOffset, setScrollIndexOnline = viewModel::setScrollIndexOnline, @@ -121,10 +120,11 @@ fun FriendsScreen( onPaginationConditionsMet: () -> Unit = {}, onRefresh: () -> Unit = {}, onPhotoClicked: (url: String) -> Unit = {}, - setScrollIndex: (Int) -> Unit, - setScrollOffset: (Int) -> Unit, - setScrollIndexOnline: (Int) -> Unit, - setScrollOffsetOnline: (Int) -> Unit, + setSelectedTabIndex: (Int) -> Unit = {}, + setScrollIndex: (Int) -> Unit = {}, + setScrollOffset: (Int) -> Unit = {}, + setScrollIndexOnline: (Int) -> Unit = {}, + setScrollOffsetOnline: (Int) -> Unit = {}, ) { val currentTheme = LocalThemeConfig.current @@ -208,10 +208,6 @@ fun FriendsScreen( ) ) - var selectedTabIndex by rememberSaveable { - mutableIntStateOf(0) - } - val tabItems = remember { listOf( TabItem( @@ -261,16 +257,16 @@ fun FriendsScreen( modifier = Modifier.fillMaxWidth() ) PrimaryTabRow( - selectedTabIndex = selectedTabIndex, + selectedTabIndex = screenState.selectedTabIndex, modifier = Modifier, containerColor = Color.Transparent ) { tabItems.forEachIndexed { index, item -> Tab( - selected = index == selectedTabIndex, + selected = index == screenState.selectedTabIndex, onClick = { - if (selectedTabIndex != index) { - selectedTabIndex = index + if (screenState.selectedTabIndex != index) { + setSelectedTabIndex(index) } }, text = { @@ -296,18 +292,19 @@ fun FriendsScreen( screenState.isLoading && screenState.friends.isEmpty() -> FullScreenLoader() else -> { - val pagerState = rememberPagerState { tabItems.size } + val pagerState = rememberPagerState( + initialPage = screenState.selectedTabIndex + ) { + tabItems.size + } - LaunchedEffect(selectedTabIndex) { - pagerState.animateScrollToPage(selectedTabIndex) + LaunchedEffect(screenState.selectedTabIndex) { + pagerState.animateScrollToPage(screenState.selectedTabIndex) } LaunchedEffect(pagerState) { - snapshotFlow { - pagerState.currentPage - }.collect { page -> - selectedTabIndex = page - } + snapshotFlow { pagerState.currentPage } + .collect(setSelectedTabIndex) } val pullToRefreshState = rememberPullToRefreshState()