diff --git a/app/src/main/kotlin/com/wire/android/ui/home/HomeScreen.kt b/app/src/main/kotlin/com/wire/android/ui/home/HomeScreen.kt index 74dcec0ba5..282fac94e2 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/HomeScreen.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/HomeScreen.kt @@ -305,7 +305,7 @@ fun HomeContent( } }, collapsingEnabled = !searchBarState.isSearchActive, - contentLazyListState = homeStateHolder.currentLazyListState, + contentLazyListState = homeStateHolder.lazyListStateFor(currentNavigationItem), content = { /** * This "if" is a workaround, otherwise it can crash because of the SubcomposeLayout's nature. diff --git a/app/src/main/kotlin/com/wire/android/ui/home/HomeStateHolder.kt b/app/src/main/kotlin/com/wire/android/ui/home/HomeStateHolder.kt index 459a3127f5..034c10e925 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/HomeStateHolder.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/HomeStateHolder.kt @@ -24,6 +24,8 @@ import androidx.compose.material3.DrawerState import androidx.compose.material3.DrawerValue import androidx.compose.material3.rememberDrawerState import androidx.compose.runtime.Composable +import androidx.compose.runtime.State +import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope @@ -42,12 +44,15 @@ class HomeStateHolder( val coroutineScope: CoroutineScope, val navController: NavHostController, val drawerState: DrawerState, - val currentNavigationItem: HomeDestination, val searchBarState: SearchBarState, val navigator: Navigator, - lazyListStates: Map, + private val currentNavigationItemState: State, + private val lazyListStates: Map, ) { - val currentLazyListState = lazyListStates[currentNavigationItem] ?: error("No LazyListState found for $currentNavigationItem") + val currentNavigationItem + get() = currentNavigationItemState.value + fun lazyListStateFor(destination: HomeDestination): LazyListState = + lazyListStates[destination] ?: error("No LazyListState found for $destination") fun closeDrawer() { coroutineScope.launch { @@ -73,23 +78,22 @@ fun rememberHomeScreenState( ): HomeStateHolder { val searchBarState = rememberSearchbarState() val navBackStackEntry by navController.currentBackStackEntryAsState() - val currentRoute = navBackStackEntry?.destination?.route - val currentNavigationItem = currentRoute?.let { HomeDestination.fromRoute(it) } ?: HomeDestination.Conversations + val currentNavigationItemState = remember { + derivedStateOf { + navBackStackEntry?.destination?.route?.let { HomeDestination.fromRoute(it) } ?: HomeDestination.Conversations + } + } val lazyListStates = HomeDestination.values().associateWith { rememberLazyListState() } - val homeState = remember( - currentNavigationItem - ) { + return remember { HomeStateHolder( - coroutineScope, - navController, - drawerState, - currentNavigationItem, - searchBarState, - navigator, - lazyListStates + coroutineScope = coroutineScope, + navController = navController, + drawerState = drawerState, + searchBarState = searchBarState, + navigator = navigator, + currentNavigationItemState = currentNavigationItemState, + lazyListStates = lazyListStates ) } - - return homeState } diff --git a/app/src/main/kotlin/com/wire/android/ui/home/archive/ArchiveScreen.kt b/app/src/main/kotlin/com/wire/android/ui/home/archive/ArchiveScreen.kt index 52b0c0f2bc..597f2d2639 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/archive/ArchiveScreen.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/archive/ArchiveScreen.kt @@ -20,6 +20,7 @@ package com.wire.android.ui.home.archive import androidx.compose.foundation.text.input.TextFieldState import androidx.compose.runtime.Composable +import com.wire.android.navigation.HomeDestination import com.wire.android.navigation.HomeNavGraph import com.wire.android.navigation.WireDestination import com.wire.android.navigation.rememberNavigator @@ -42,7 +43,7 @@ fun ArchiveScreen(homeStateHolder: HomeStateHolder) { navigator = navigator, searchBarState = searchBarState, conversationsSource = ConversationsSource.ARCHIVE, - lazyListState = currentLazyListState, + lazyListState = lazyListStateFor(HomeDestination.Archive), emptyListContent = { ArchiveEmptyContent() } ) } diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversationslist/all/AllConversationsScreen.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversationslist/all/AllConversationsScreen.kt index a1b757e968..f354558d5c 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversationslist/all/AllConversationsScreen.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversationslist/all/AllConversationsScreen.kt @@ -20,6 +20,7 @@ package com.wire.android.ui.home.conversationslist.all import androidx.compose.foundation.text.input.TextFieldState import androidx.compose.runtime.Composable +import com.wire.android.navigation.HomeDestination import com.wire.android.navigation.HomeNavGraph import com.wire.android.navigation.WireDestination import com.wire.android.navigation.rememberNavigator @@ -42,7 +43,7 @@ fun AllConversationsScreen(homeStateHolder: HomeStateHolder) { navigator = navigator, searchBarState = searchBarState, conversationsSource = ConversationsSource.MAIN, - lazyListState = currentLazyListState, + lazyListState = lazyListStateFor(HomeDestination.Conversations), emptyListContent = { AllConversationsEmptyContent() } ) } diff --git a/app/src/main/kotlin/com/wire/android/ui/home/settings/SettingsScreen.kt b/app/src/main/kotlin/com/wire/android/ui/home/settings/SettingsScreen.kt index 3617c3028d..4d6892641d 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/settings/SettingsScreen.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/settings/SettingsScreen.kt @@ -33,6 +33,7 @@ import com.wire.android.R import com.wire.android.appLogger import com.wire.android.model.Clickable import com.wire.android.navigation.BackStackMode +import com.wire.android.navigation.HomeDestination import com.wire.android.navigation.HomeNavGraph import com.wire.android.navigation.NavigationCommand import com.wire.android.navigation.WireDestination @@ -62,7 +63,7 @@ fun SettingsScreen( val context = LocalContext.current SettingsScreenContent( - lazyListState = homeStateHolder.currentLazyListState, + lazyListState = homeStateHolder.lazyListStateFor(HomeDestination.Settings), settingsState = viewModel.state, onItemClicked = remember { { diff --git a/app/src/main/kotlin/com/wire/android/ui/home/whatsnew/WhatsNewScreen.kt b/app/src/main/kotlin/com/wire/android/ui/home/whatsnew/WhatsNewScreen.kt index 049e302126..de06e11106 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/whatsnew/WhatsNewScreen.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/whatsnew/WhatsNewScreen.kt @@ -33,6 +33,7 @@ import androidx.hilt.navigation.compose.hiltViewModel import com.wire.android.BuildConfig import com.wire.android.R import com.wire.android.model.Clickable +import com.wire.android.navigation.HomeDestination import com.wire.android.navigation.HomeNavGraph import com.wire.android.navigation.NavigationCommand import com.wire.android.navigation.WireDestination @@ -51,7 +52,7 @@ fun WhatsNewScreen( val context = LocalContext.current WhatsNewScreenContent( state = whatsNewViewModel.state, - lazyListState = homeStateHolder.currentLazyListState, + lazyListState = homeStateHolder.lazyListStateFor(HomeDestination.WhatsNew), onItemClicked = remember { { it.direction.handleNavigation(