in JetNews/app/src/main/java/com/example/jetnews/ui/home/HomeRoute.kt [85:169]
fun HomeRoute(
uiState: HomeUiState,
isExpandedScreen: Boolean,
onToggleFavorite: (String) -> Unit,
onSelectPost: (String) -> Unit,
onRefreshPosts: () -> Unit,
onErrorDismiss: (Long) -> Unit,
onInteractWithFeed: () -> Unit,
onInteractWithArticleDetails: (String) -> Unit,
onSearchInputChanged: (String) -> Unit,
openDrawer: () -> Unit,
scaffoldState: ScaffoldState
) {
// Construct the lazy list states for the list and the details outside of deciding which one to
// show. This allows the associated state to survive beyond that decision, and therefore
// we get to preserve the scroll throughout any changes to the content.
val homeListLazyListState = rememberLazyListState()
val articleDetailLazyListStates = when (uiState) {
is HomeUiState.HasPosts -> uiState.postsFeed.allPosts
is HomeUiState.NoPosts -> emptyList()
}.associate { post ->
key(post.id) {
post.id to rememberLazyListState()
}
}
val homeScreenType = getHomeScreenType(isExpandedScreen, uiState)
when (homeScreenType) {
HomeScreenType.FeedWithArticleDetails -> {
HomeFeedWithArticleDetailsScreen(
uiState = uiState,
showTopAppBar = !isExpandedScreen,
onToggleFavorite = onToggleFavorite,
onSelectPost = onSelectPost,
onRefreshPosts = onRefreshPosts,
onErrorDismiss = onErrorDismiss,
onInteractWithList = onInteractWithFeed,
onInteractWithDetail = onInteractWithArticleDetails,
openDrawer = openDrawer,
homeListLazyListState = homeListLazyListState,
articleDetailLazyListStates = articleDetailLazyListStates,
scaffoldState = scaffoldState,
onSearchInputChanged = onSearchInputChanged,
)
}
HomeScreenType.Feed -> {
HomeFeedScreen(
uiState = uiState,
showTopAppBar = !isExpandedScreen,
onToggleFavorite = onToggleFavorite,
onSelectPost = onSelectPost,
onRefreshPosts = onRefreshPosts,
onErrorDismiss = onErrorDismiss,
openDrawer = openDrawer,
homeListLazyListState = homeListLazyListState,
scaffoldState = scaffoldState,
onSearchInputChanged = onSearchInputChanged,
)
}
HomeScreenType.ArticleDetails -> {
// Guaranteed by above condition for home screen type
check(uiState is HomeUiState.HasPosts)
ArticleScreen(
post = uiState.selectedPost,
isExpandedScreen = isExpandedScreen,
onBack = onInteractWithFeed,
isFavorite = uiState.favorites.contains(uiState.selectedPost.id),
onToggleFavorite = {
onToggleFavorite(uiState.selectedPost.id)
},
lazyListState = articleDetailLazyListStates.getValue(
uiState.selectedPost.id
)
)
// If we are just showing the detail, have a back press switch to the list.
// This doesn't take anything more than notifying that we "interacted with the list"
// since that is what drives the display of the feed
BackHandler {
onInteractWithFeed()
}
}
}
}