forked from melod1n/fast-messenger
saving selected friends tab while app is working
This commit is contained in:
@@ -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) }
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@ data class FriendsScreenState(
|
||||
val onlineFriends: List<UiFriend>,
|
||||
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,
|
||||
|
||||
+19
-22
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user