From d8c2e623d1872e7bf54951fb84cc9ddea8ed3a1b Mon Sep 17 00:00:00 2001 From: maxmoney21m Date: Mon, 13 Mar 2023 20:28:30 +0800 Subject: [PATCH] Hoist HomeScreen state --- .../amethyst/ui/navigation/AppNavigation.kt | 16 ++++++++ .../amethyst/ui/screen/loggedIn/HomeScreen.kt | 40 ++++++++----------- 2 files changed, 32 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppNavigation.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppNavigation.kt index 86935b29b..95f475004 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppNavigation.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppNavigation.kt @@ -7,9 +7,15 @@ import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavHostController import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable +import com.google.accompanist.pager.ExperimentalPagerApi +import com.google.accompanist.pager.rememberPagerState import com.vitorpamplona.amethyst.ui.dal.GlobalFeedFilter +import com.vitorpamplona.amethyst.ui.dal.HomeConversationsFeedFilter +import com.vitorpamplona.amethyst.ui.dal.HomeNewThreadFeedFilter import com.vitorpamplona.amethyst.ui.screen.AccountStateViewModel import com.vitorpamplona.amethyst.ui.screen.NostrGlobalFeedViewModel +import com.vitorpamplona.amethyst.ui.screen.NostrHomeFeedViewModel +import com.vitorpamplona.amethyst.ui.screen.NostrHomeRepliesFeedViewModel import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel import com.vitorpamplona.amethyst.ui.screen.loggedIn.ChannelScreen import com.vitorpamplona.amethyst.ui.screen.loggedIn.ChatroomListScreen @@ -21,6 +27,7 @@ import com.vitorpamplona.amethyst.ui.screen.loggedIn.ProfileScreen import com.vitorpamplona.amethyst.ui.screen.loggedIn.SearchScreen import com.vitorpamplona.amethyst.ui.screen.loggedIn.ThreadScreen +@OptIn(ExperimentalPagerApi::class) @Composable fun AppNavigation( navController: NavHostController, @@ -32,7 +39,13 @@ fun AppNavigation( val account = accountState?.account ?: return GlobalFeedFilter.account = account + HomeNewThreadFeedFilter.account = account + HomeConversationsFeedFilter.account = account + val globalFeedViewModel: NostrGlobalFeedViewModel = viewModel() + val homeFeedViewModel: NostrHomeFeedViewModel = viewModel() + val homeRepliesFeedViewModel: NostrHomeRepliesFeedViewModel = viewModel() + val homePagerState = rememberPagerState() NavHost(navController, startDestination = Route.Home.route) { Route.Search.let { route -> @@ -51,6 +64,9 @@ fun AppNavigation( HomeScreen( accountViewModel = accountViewModel, navController = navController, + homeFeedViewModel = homeFeedViewModel, + repliesFeedViewModel = homeRepliesFeedViewModel, + pagerState = homePagerState, scrollToTop = it.arguments?.getBoolean("scrollToTop") ?: false ) }) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/HomeScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/HomeScreen.kt index cfed81664..ddf6af5ac 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/HomeScreen.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/HomeScreen.kt @@ -11,8 +11,6 @@ import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.getValue -import androidx.compose.runtime.livedata.observeAsState import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalLifecycleOwner @@ -20,16 +18,13 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleEventObserver -import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavController import com.google.accompanist.pager.ExperimentalPagerApi import com.google.accompanist.pager.HorizontalPager +import com.google.accompanist.pager.PagerState import com.google.accompanist.pager.pagerTabIndicatorOffset -import com.google.accompanist.pager.rememberPagerState import com.vitorpamplona.amethyst.R import com.vitorpamplona.amethyst.service.NostrHomeDataSource -import com.vitorpamplona.amethyst.ui.dal.HomeConversationsFeedFilter -import com.vitorpamplona.amethyst.ui.dal.HomeNewThreadFeedFilter import com.vitorpamplona.amethyst.ui.navigation.Route import com.vitorpamplona.amethyst.ui.screen.FeedView import com.vitorpamplona.amethyst.ui.screen.NostrHomeFeedViewModel @@ -39,33 +34,30 @@ import kotlinx.coroutines.launch @OptIn(ExperimentalPagerApi::class) @Composable -fun HomeScreen(accountViewModel: AccountViewModel, navController: NavController, scrollToTop: Boolean = false) { - val accountState by accountViewModel.accountLiveData.observeAsState() - val account = accountState?.account ?: return - - HomeNewThreadFeedFilter.account = account - HomeConversationsFeedFilter.account = account - - val feedViewModel: NostrHomeFeedViewModel = viewModel() - val feedViewModelReplies: NostrHomeRepliesFeedViewModel = viewModel() - - val pagerState = rememberPagerState() +fun HomeScreen( + accountViewModel: AccountViewModel, + navController: NavController, + homeFeedViewModel: NostrHomeFeedViewModel, + repliesFeedViewModel: NostrHomeRepliesFeedViewModel, + pagerState: PagerState, + scrollToTop: Boolean = false +) { val coroutineScope = rememberCoroutineScope() LaunchedEffect(accountViewModel) { NostrHomeDataSource.resetFilters() - feedViewModel.refresh() - feedViewModelReplies.refresh() + homeFeedViewModel.refresh() + repliesFeedViewModel.refresh() } val lifeCycleOwner = LocalLifecycleOwner.current DisposableEffect(accountViewModel) { - val observer = LifecycleEventObserver { source, event -> + val observer = LifecycleEventObserver { _, event -> if (event == Lifecycle.Event.ON_RESUME) { NostrHomeDataSource.resetFilters() - feedViewModel.refresh() - feedViewModelReplies.refresh() + homeFeedViewModel.refresh() + repliesFeedViewModel.refresh() } } @@ -107,8 +99,8 @@ fun HomeScreen(accountViewModel: AccountViewModel, navController: NavController, } HorizontalPager(count = 2, state = pagerState) { when (pagerState.currentPage) { - 0 -> FeedView(feedViewModel, accountViewModel, navController, Route.Home.base + "Follows", ScrollStateKeys.HOME_FOLLOWS, scrollToTop) - 1 -> FeedView(feedViewModelReplies, accountViewModel, navController, Route.Home.base + "FollowsReplies", ScrollStateKeys.HOME_REPLIES) + 0 -> FeedView(homeFeedViewModel, accountViewModel, navController, Route.Home.base + "Follows", ScrollStateKeys.HOME_FOLLOWS, scrollToTop) + 1 -> FeedView(repliesFeedViewModel, accountViewModel, navController, Route.Home.base + "FollowsReplies", ScrollStateKeys.HOME_REPLIES, scrollToTop) } } }