navigating to browse the topic on NiaTopicTag click

pull/444/head
yveskalume 3 years ago
parent a70761f24b
commit e9e67db483

@ -522,33 +522,15 @@ fun NiaCatalog() {
var firstFollowed by remember { mutableStateOf(false) } var firstFollowed by remember { mutableStateOf(false) }
NiaTopicTag( NiaTopicTag(
expanded = expandedTopicId == "Topic 1",
followed = firstFollowed, followed = firstFollowed,
onDropMenuToggle = { show ->
expandedTopicId = if (show) "Topic 1" else null
},
onFollowClick = { firstFollowed = true },
onUnfollowClick = { firstFollowed = false },
onBrowseClick = {}, onBrowseClick = {},
text = { Text(text = "Topic 1".uppercase()) }, text = { Text(text = "Topic 1".uppercase()) },
followText = { Text(text = "Follow") },
unFollowText = { Text(text = "Unfollow") },
browseText = { Text(text = "Browse topic") }
) )
var secondFollowed by remember { mutableStateOf(true) } var secondFollowed by remember { mutableStateOf(true) }
NiaTopicTag( NiaTopicTag(
expanded = expandedTopicId == "Topic 2",
followed = secondFollowed, followed = secondFollowed,
onDropMenuToggle = { show ->
expandedTopicId = if (show) "Topic 2" else null
},
onFollowClick = { secondFollowed = true },
onUnfollowClick = { secondFollowed = false },
onBrowseClick = {}, onBrowseClick = {},
text = { Text(text = "Topic 2".uppercase()) }, text = { Text(text = "Topic 2".uppercase()) },
followText = { Text(text = "Follow") },
unFollowText = { Text(text = "Unfollow") },
browseText = { Text(text = "Browse topic") }
) )
} }
} }

@ -48,8 +48,16 @@ fun NiaNavHost(
startDestination = startDestination, startDestination = startDestination,
modifier = modifier, modifier = modifier,
) { ) {
forYouScreen() forYouScreen(
bookmarksScreen() onBrowseTopic = { topicId ->
navController.navigateToTopic(topicId)
}
)
bookmarksScreen(
onBrowseTopic = { topicId ->
navController.navigateToTopic(topicId)
}
)
interestsGraph( interestsGraph(
navigateToTopic = { topicId -> navigateToTopic = { topicId ->
navController.navigateToTopic(topicId) navController.navigateToTopic(topicId)
@ -58,8 +66,18 @@ fun NiaNavHost(
navController.navigateToAuthor(authorId) navController.navigateToAuthor(authorId)
}, },
nestedGraphs = { nestedGraphs = {
topicScreen(onBackClick) topicScreen(
authorScreen(onBackClick) onBackClick = onBackClick,
onBrowseTopic = { topicId ->
navController.navigateToTopic(topicId)
}
)
authorScreen(
onBackClick = onBackClick,
onBrowseTopic = { topicId ->
navController.navigateToTopic(topicId)
}
)
} }
) )
} }

@ -18,28 +18,18 @@ package com.google.samples.apps.nowinandroid.core.designsystem.component
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.material3.contentColorFor import androidx.compose.material3.contentColorFor
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.stringResource
import com.google.samples.apps.nowinandroid.core.designsystem.R
@Composable @Composable
fun NiaTopicTag( fun NiaTopicTag(
expanded: Boolean = false,
followed: Boolean, followed: Boolean,
onDropMenuToggle: (show: Boolean) -> Unit = {},
onFollowClick: () -> Unit,
onUnfollowClick: () -> Unit,
onBrowseClick: () -> Unit, onBrowseClick: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
enabled: Boolean = true, enabled: Boolean = true,
text: @Composable () -> Unit, text: @Composable () -> Unit,
followText: @Composable () -> Unit = { Text(stringResource(R.string.follow)) },
unFollowText: @Composable () -> Unit = { Text(stringResource(R.string.unfollow)) },
browseText: @Composable () -> Unit = { Text(stringResource(R.string.browse_topic)) }
) { ) {
Box(modifier = modifier) { Box(modifier = modifier) {
@ -49,7 +39,7 @@ fun NiaTopicTag(
MaterialTheme.colorScheme.surfaceVariant MaterialTheme.colorScheme.surfaceVariant
} }
NiaTextButton( NiaTextButton(
onClick = { onDropMenuToggle(true) }, onClick = onBrowseClick,
enabled = enabled, enabled = enabled,
small = true, small = true,
colors = NiaButtonDefaults.textButtonColors( colors = NiaButtonDefaults.textButtonColors(
@ -65,28 +55,5 @@ fun NiaTopicTag(
), ),
text = text text = text
) )
NiaDropdownMenu(
expanded = expanded,
onDismissRequest = { onDropMenuToggle(false) },
items = if (followed) listOf(UNFOLLOW, BROWSE) else listOf(FOLLOW, BROWSE),
onItemClick = { item ->
when (item) {
FOLLOW -> onFollowClick()
UNFOLLOW -> onUnfollowClick()
BROWSE -> onBrowseClick()
}
},
itemText = { item ->
when (item) {
FOLLOW -> followText()
UNFOLLOW -> unFollowText()
BROWSE -> browseText()
}
}
)
} }
} }
private const val FOLLOW = 1
private const val UNFOLLOW = 2
private const val BROWSE = 3

@ -42,7 +42,8 @@ import com.google.samples.apps.nowinandroid.core.model.data.previewNewsResources
*/ */
fun LazyGridScope.newsFeed( fun LazyGridScope.newsFeed(
feedState: NewsFeedUiState, feedState: NewsFeedUiState,
onNewsResourcesCheckedChanged: (String, Boolean) -> Unit onNewsResourcesCheckedChanged: (String, Boolean) -> Unit,
onBrowseTopic: (String) -> Unit,
) { ) {
when (feedState) { when (feedState) {
NewsFeedUiState.Loading -> Unit NewsFeedUiState.Loading -> Unit
@ -58,6 +59,7 @@ fun LazyGridScope.newsFeed(
newsResource = saveableNewsResource.newsResource, newsResource = saveableNewsResource.newsResource,
isBookmarked = saveableNewsResource.isSaved, isBookmarked = saveableNewsResource.isSaved,
onClick = { ContextCompat.startActivity(context, launchResourceIntent, null) }, onClick = { ContextCompat.startActivity(context, launchResourceIntent, null) },
onBrowseTopic = onBrowseTopic,
onToggleBookmark = { onToggleBookmark = {
onNewsResourcesCheckedChanged( onNewsResourcesCheckedChanged(
saveableNewsResource.newsResource.id, saveableNewsResource.newsResource.id,
@ -97,7 +99,8 @@ fun NewsFeedLoadingPreview() {
LazyVerticalGrid(columns = GridCells.Adaptive(300.dp)) { LazyVerticalGrid(columns = GridCells.Adaptive(300.dp)) {
newsFeed( newsFeed(
feedState = NewsFeedUiState.Loading, feedState = NewsFeedUiState.Loading,
onNewsResourcesCheckedChanged = { _, _ -> } onNewsResourcesCheckedChanged = { _, _ -> },
onBrowseTopic = {}
) )
} }
} }
@ -118,7 +121,8 @@ fun NewsFeedContentPreview() {
) )
} }
), ),
onNewsResourcesCheckedChanged = { _, _ -> } onNewsResourcesCheckedChanged = { _, _ -> },
onBrowseTopic = {}
) )
} }
} }

@ -82,6 +82,7 @@ fun NewsResourceCardExpanded(
newsResource: NewsResource, newsResource: NewsResource,
isBookmarked: Boolean, isBookmarked: Boolean,
onToggleBookmark: () -> Unit, onToggleBookmark: () -> Unit,
onBrowseTopic: (String) -> Unit,
onClick: () -> Unit, onClick: () -> Unit,
modifier: Modifier = Modifier modifier: Modifier = Modifier
) { ) {
@ -123,7 +124,7 @@ fun NewsResourceCardExpanded(
Spacer(modifier = Modifier.height(12.dp)) Spacer(modifier = Modifier.height(12.dp))
NewsResourceShortDescription(newsResource.content) NewsResourceShortDescription(newsResource.content)
Spacer(modifier = Modifier.height(12.dp)) Spacer(modifier = Modifier.height(12.dp))
NewsResourceTopics(newsResource.topics) NewsResourceTopics(topics = newsResource.topics, onBrowseTopic = onBrowseTopic)
} }
} }
} }
@ -267,26 +268,17 @@ fun NewsResourceShortDescription(
@Composable @Composable
fun NewsResourceTopics( fun NewsResourceTopics(
topics: List<Topic>, topics: List<Topic>,
onBrowseTopic: (String) -> Unit,
modifier: Modifier = Modifier modifier: Modifier = Modifier
) { ) {
// Store the ID of the Topic which has its "following" menu expanded, if any.
// To avoid UI confusion, only one topic can have an expanded menu at a time.
var expandedTopicId by remember { mutableStateOf<String?>(null) }
Row( Row(
modifier = modifier.horizontalScroll(rememberScrollState()), // causes narrow chips modifier = modifier.horizontalScroll(rememberScrollState()), // causes narrow chips
horizontalArrangement = Arrangement.spacedBy(4.dp), horizontalArrangement = Arrangement.spacedBy(4.dp),
) { ) {
for (topic in topics) { for (topic in topics) {
NiaTopicTag( NiaTopicTag(
expanded = expandedTopicId == topic.id,
followed = true, // ToDo: Check if topic is followed followed = true, // ToDo: Check if topic is followed
onDropMenuToggle = { show -> onBrowseClick = { onBrowseTopic(topic.id) }, // ToDo
expandedTopicId = if (show) topic.id else null
},
onFollowClick = { }, // ToDo
onUnfollowClick = { }, // ToDo
onBrowseClick = { }, // ToDo
text = { Text(text = topic.name.uppercase(Locale.getDefault())) } text = { Text(text = topic.name.uppercase(Locale.getDefault())) }
) )
} }
@ -322,6 +314,7 @@ fun ExpandedNewsResourcePreview() {
newsResource = previewNewsResources[0], newsResource = previewNewsResources[0],
isBookmarked = true, isBookmarked = true,
onToggleBookmark = {}, onToggleBookmark = {},
onBrowseTopic = {},
onClick = {} onClick = {}
) )
} }

@ -41,6 +41,7 @@ fun <T> LazyListScope.newsResourceCardItems(
isBookmarkedMapper: (item: T) -> Boolean, isBookmarkedMapper: (item: T) -> Boolean,
onToggleBookmark: (item: T) -> Unit, onToggleBookmark: (item: T) -> Unit,
onItemClick: ((item: T) -> Unit)? = null, onItemClick: ((item: T) -> Unit)? = null,
onBrowseTopic: (String) -> Unit,
itemModifier: Modifier = Modifier, itemModifier: Modifier = Modifier,
) = items( ) = items(
items = items, items = items,
@ -55,6 +56,7 @@ fun <T> LazyListScope.newsResourceCardItems(
newsResource = newsResource, newsResource = newsResource,
isBookmarked = isBookmarkedMapper(item), isBookmarked = isBookmarkedMapper(item),
onToggleBookmark = { onToggleBookmark(item) }, onToggleBookmark = { onToggleBookmark(item) },
onBrowseTopic = onBrowseTopic,
onClick = { onClick = {
when (onItemClick) { when (onItemClick) {
null -> ContextCompat.startActivity(context, launchResourceIntent, null) null -> ContextCompat.startActivity(context, launchResourceIntent, null)

@ -58,6 +58,7 @@ class AuthorScreenTest {
onBackClick = { }, onBackClick = { },
onFollowClick = { }, onFollowClick = { },
onBookmarkChanged = { _, _ -> }, onBookmarkChanged = { _, _ -> },
onBrowseTopic = {}
) )
} }
@ -76,6 +77,7 @@ class AuthorScreenTest {
onBackClick = { }, onBackClick = { },
onFollowClick = { }, onFollowClick = { },
onBookmarkChanged = { _, _ -> }, onBookmarkChanged = { _, _ -> },
onBrowseTopic = {}
) )
} }
@ -106,6 +108,7 @@ class AuthorScreenTest {
onBackClick = { }, onBackClick = { },
onFollowClick = { }, onFollowClick = { },
onBookmarkChanged = { _, _ -> }, onBookmarkChanged = { _, _ -> },
onBrowseTopic = {}
) )
} }
@ -132,6 +135,7 @@ class AuthorScreenTest {
onBackClick = { }, onBackClick = { },
onFollowClick = { }, onFollowClick = { },
onBookmarkChanged = { _, _ -> }, onBookmarkChanged = { _, _ -> },
onBrowseTopic = {}
) )
} }

@ -66,6 +66,7 @@ import com.google.samples.apps.nowinandroid.core.ui.newsResourceCardItems
@Composable @Composable
internal fun AuthorRoute( internal fun AuthorRoute(
onBackClick: () -> Unit, onBackClick: () -> Unit,
onBrowseTopic: (String) -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
viewModel: AuthorViewModel = hiltViewModel(), viewModel: AuthorViewModel = hiltViewModel(),
) { ) {
@ -79,6 +80,7 @@ internal fun AuthorRoute(
onBackClick = onBackClick, onBackClick = onBackClick,
onFollowClick = viewModel::followAuthorToggle, onFollowClick = viewModel::followAuthorToggle,
onBookmarkChanged = viewModel::bookmarkNews, onBookmarkChanged = viewModel::bookmarkNews,
onBrowseTopic = onBrowseTopic
) )
} }
@ -90,6 +92,7 @@ internal fun AuthorScreen(
onBackClick: () -> Unit, onBackClick: () -> Unit,
onFollowClick: (Boolean) -> Unit, onFollowClick: (Boolean) -> Unit,
onBookmarkChanged: (String, Boolean) -> Unit, onBookmarkChanged: (String, Boolean) -> Unit,
onBrowseTopic: (String) -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
) { ) {
val scrollableState = rememberLazyListState() val scrollableState = rememberLazyListState()
@ -126,6 +129,7 @@ internal fun AuthorScreen(
author = authorUiState.followableAuthor.author, author = authorUiState.followableAuthor.author,
news = newsUiState, news = newsUiState,
onBookmarkChanged = onBookmarkChanged, onBookmarkChanged = onBookmarkChanged,
onBrowseTopic = onBrowseTopic
) )
} }
} }
@ -138,13 +142,14 @@ internal fun AuthorScreen(
private fun LazyListScope.authorBody( private fun LazyListScope.authorBody(
author: Author, author: Author,
news: NewsUiState, news: NewsUiState,
onBookmarkChanged: (String, Boolean) -> Unit onBookmarkChanged: (String, Boolean) -> Unit,
onBrowseTopic: (String) -> Unit,
) { ) {
item { item {
AuthorHeader(author) AuthorHeader(author)
} }
authorCards(news, onBookmarkChanged) authorCards(news, onBookmarkChanged, onBrowseTopic)
} }
@Composable @Composable
@ -175,7 +180,8 @@ private fun AuthorHeader(author: Author) {
private fun LazyListScope.authorCards( private fun LazyListScope.authorCards(
news: NewsUiState, news: NewsUiState,
onBookmarkChanged: (String, Boolean) -> Unit onBookmarkChanged: (String, Boolean) -> Unit,
onBrowseTopic: (String) -> Unit,
) { ) {
when (news) { when (news) {
is NewsUiState.Success -> { is NewsUiState.Success -> {
@ -184,7 +190,8 @@ private fun LazyListScope.authorCards(
newsResourceMapper = { it.newsResource }, newsResourceMapper = { it.newsResource },
isBookmarkedMapper = { it.isSaved }, isBookmarkedMapper = { it.isSaved },
onToggleBookmark = { onBookmarkChanged(it.newsResource.id, !it.isSaved) }, onToggleBookmark = { onBookmarkChanged(it.newsResource.id, !it.isSaved) },
itemModifier = Modifier.padding(24.dp) itemModifier = Modifier.padding(24.dp),
onBrowseTopic = onBrowseTopic
) )
} }
is NewsUiState.Loading -> item { is NewsUiState.Loading -> item {
@ -251,6 +258,7 @@ fun AuthorScreenPopulated() {
onBackClick = {}, onBackClick = {},
onFollowClick = {}, onFollowClick = {},
onBookmarkChanged = { _, _ -> }, onBookmarkChanged = { _, _ -> },
onBrowseTopic = {}
) )
} }
} }
@ -267,6 +275,7 @@ fun AuthorScreenLoading() {
onBackClick = {}, onBackClick = {},
onFollowClick = {}, onFollowClick = {},
onBookmarkChanged = { _, _ -> }, onBookmarkChanged = { _, _ -> },
onBrowseTopic = {}
) )
} }
} }

@ -41,7 +41,8 @@ fun NavController.navigateToAuthor(authorId: String) {
} }
fun NavGraphBuilder.authorScreen( fun NavGraphBuilder.authorScreen(
onBackClick: () -> Unit onBackClick: () -> Unit,
onBrowseTopic: (String) -> Unit,
) { ) {
composable( composable(
route = "author_route/{$authorIdArg}", route = "author_route/{$authorIdArg}",
@ -49,6 +50,6 @@ fun NavGraphBuilder.authorScreen(
navArgument(authorIdArg) { type = NavType.StringType } navArgument(authorIdArg) { type = NavType.StringType }
) )
) { ) {
AuthorRoute(onBackClick = onBackClick) AuthorRoute(onBackClick = onBackClick, onBrowseTopic = onBrowseTopic)
} }
} }

@ -52,7 +52,8 @@ class BookmarksScreenTest {
composeTestRule.setContent { composeTestRule.setContent {
BookmarksScreen( BookmarksScreen(
feedState = NewsFeedUiState.Loading, feedState = NewsFeedUiState.Loading,
removeFromBookmarks = { } removeFromBookmarks = { },
onBrowseTopic = {}
) )
} }
@ -73,7 +74,8 @@ class BookmarksScreenTest {
previewNewsResources.take(2) previewNewsResources.take(2)
.map { SaveableNewsResource(it, true) } .map { SaveableNewsResource(it, true) }
), ),
removeFromBookmarks = { } removeFromBookmarks = { },
onBrowseTopic = {}
) )
} }
@ -115,7 +117,8 @@ class BookmarksScreenTest {
removeFromBookmarks = { newsResourceId -> removeFromBookmarks = { newsResourceId ->
assertEquals(previewNewsResources[0].id, newsResourceId) assertEquals(previewNewsResources[0].id, newsResourceId)
removeFromBookmarksCalled = true removeFromBookmarksCalled = true
} },
onBrowseTopic = {}
) )
} }

@ -64,12 +64,14 @@ import com.google.samples.apps.nowinandroid.core.ui.newsFeed
@Composable @Composable
internal fun BookmarksRoute( internal fun BookmarksRoute(
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onBrowseTopic: (String) -> Unit,
viewModel: BookmarksViewModel = hiltViewModel() viewModel: BookmarksViewModel = hiltViewModel()
) { ) {
val feedState by viewModel.feedUiState.collectAsStateWithLifecycle() val feedState by viewModel.feedUiState.collectAsStateWithLifecycle()
BookmarksScreen( BookmarksScreen(
feedState = feedState, feedState = feedState,
removeFromBookmarks = viewModel::removeFromSavedResources, removeFromBookmarks = viewModel::removeFromSavedResources,
onBrowseTopic = onBrowseTopic,
modifier = modifier modifier = modifier
) )
} }
@ -109,6 +111,7 @@ private fun LoadingState(modifier: Modifier = Modifier) {
private fun BookmarksGrid( private fun BookmarksGrid(
feedState: NewsFeedUiState, feedState: NewsFeedUiState,
removeFromBookmarks: (String) -> Unit, removeFromBookmarks: (String) -> Unit,
onBrowseTopic: (String) -> Unit,
modifier: Modifier = Modifier modifier: Modifier = Modifier
) { ) {
val scrollableState = rememberLazyGridState() val scrollableState = rememberLazyGridState()

@ -28,8 +28,8 @@ fun NavController.navigateToBookmarks(navOptions: NavOptions? = null) {
this.navigate(bookmarksRoute, navOptions) this.navigate(bookmarksRoute, navOptions)
} }
fun NavGraphBuilder.bookmarksScreen() { fun NavGraphBuilder.bookmarksScreen(onBrowseTopic: (String) -> Unit) {
composable(route = bookmarksRoute) { composable(route = bookmarksRoute) {
BookmarksRoute() BookmarksRoute(onBrowseTopic = onBrowseTopic)
} }
} }

@ -59,7 +59,8 @@ class ForYouScreenTest {
onTopicCheckedChanged = { _, _ -> }, onTopicCheckedChanged = { _, _ -> },
onAuthorCheckedChanged = { _, _ -> }, onAuthorCheckedChanged = { _, _ -> },
saveFollowedTopics = {}, saveFollowedTopics = {},
onNewsResourcesCheckedChanged = { _, _ -> } onNewsResourcesCheckedChanged = { _, _ -> },
onBrowseTopic = {}
) )
} }
} }
@ -82,7 +83,8 @@ class ForYouScreenTest {
onTopicCheckedChanged = { _, _ -> }, onTopicCheckedChanged = { _, _ -> },
onAuthorCheckedChanged = { _, _ -> }, onAuthorCheckedChanged = { _, _ -> },
saveFollowedTopics = {}, saveFollowedTopics = {},
onNewsResourcesCheckedChanged = { _, _ -> } onNewsResourcesCheckedChanged = { _, _ -> },
onBrowseTopic = {}
) )
} }
} }
@ -111,7 +113,8 @@ class ForYouScreenTest {
onTopicCheckedChanged = { _, _ -> }, onTopicCheckedChanged = { _, _ -> },
onAuthorCheckedChanged = { _, _ -> }, onAuthorCheckedChanged = { _, _ -> },
saveFollowedTopics = {}, saveFollowedTopics = {},
onNewsResourcesCheckedChanged = { _, _ -> } onNewsResourcesCheckedChanged = { _, _ -> },
onBrowseTopic = {}
) )
} }
} }
@ -163,7 +166,8 @@ class ForYouScreenTest {
onTopicCheckedChanged = { _, _ -> }, onTopicCheckedChanged = { _, _ -> },
onAuthorCheckedChanged = { _, _ -> }, onAuthorCheckedChanged = { _, _ -> },
saveFollowedTopics = {}, saveFollowedTopics = {},
onNewsResourcesCheckedChanged = { _, _ -> } onNewsResourcesCheckedChanged = { _, _ -> },
onBrowseTopic = {}
) )
} }
} }
@ -215,7 +219,8 @@ class ForYouScreenTest {
onTopicCheckedChanged = { _, _ -> }, onTopicCheckedChanged = { _, _ -> },
onAuthorCheckedChanged = { _, _ -> }, onAuthorCheckedChanged = { _, _ -> },
saveFollowedTopics = {}, saveFollowedTopics = {},
onNewsResourcesCheckedChanged = { _, _ -> } onNewsResourcesCheckedChanged = { _, _ -> },
onBrowseTopic = {}
) )
} }
} }
@ -262,7 +267,8 @@ class ForYouScreenTest {
onTopicCheckedChanged = { _, _ -> }, onTopicCheckedChanged = { _, _ -> },
onAuthorCheckedChanged = { _, _ -> }, onAuthorCheckedChanged = { _, _ -> },
saveFollowedTopics = {}, saveFollowedTopics = {},
onNewsResourcesCheckedChanged = { _, _ -> } onNewsResourcesCheckedChanged = { _, _ -> },
onBrowseTopic = {}
) )
} }
} }
@ -285,7 +291,8 @@ class ForYouScreenTest {
onTopicCheckedChanged = { _, _ -> }, onTopicCheckedChanged = { _, _ -> },
onAuthorCheckedChanged = { _, _ -> }, onAuthorCheckedChanged = { _, _ -> },
saveFollowedTopics = {}, saveFollowedTopics = {},
onNewsResourcesCheckedChanged = { _, _ -> } onNewsResourcesCheckedChanged = { _, _ -> },
onBrowseTopic = {}
) )
} }
} }
@ -311,7 +318,8 @@ class ForYouScreenTest {
onTopicCheckedChanged = { _, _ -> }, onTopicCheckedChanged = { _, _ -> },
onAuthorCheckedChanged = { _, _ -> }, onAuthorCheckedChanged = { _, _ -> },
saveFollowedTopics = {}, saveFollowedTopics = {},
onNewsResourcesCheckedChanged = { _, _ -> } onNewsResourcesCheckedChanged = { _, _ -> },
onBrowseTopic = {}
) )
} }

@ -97,6 +97,7 @@ import com.google.samples.apps.nowinandroid.core.ui.newsFeed
@Composable @Composable
internal fun ForYouRoute( internal fun ForYouRoute(
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onBrowseTopic: (String) -> Unit,
viewModel: ForYouViewModel = hiltViewModel() viewModel: ForYouViewModel = hiltViewModel()
) { ) {
val onboardingUiState by viewModel.onboardingUiState.collectAsStateWithLifecycle() val onboardingUiState by viewModel.onboardingUiState.collectAsStateWithLifecycle()
@ -111,6 +112,7 @@ internal fun ForYouRoute(
onAuthorCheckedChanged = viewModel::updateAuthorSelection, onAuthorCheckedChanged = viewModel::updateAuthorSelection,
saveFollowedTopics = viewModel::dismissOnboarding, saveFollowedTopics = viewModel::dismissOnboarding,
onNewsResourcesCheckedChanged = viewModel::updateNewsResourceSaved, onNewsResourcesCheckedChanged = viewModel::updateNewsResourceSaved,
onBrowseTopic = onBrowseTopic,
modifier = modifier modifier = modifier
) )
} }
@ -124,6 +126,7 @@ internal fun ForYouScreen(
onAuthorCheckedChanged: (String, Boolean) -> Unit, onAuthorCheckedChanged: (String, Boolean) -> Unit,
saveFollowedTopics: () -> Unit, saveFollowedTopics: () -> Unit,
onNewsResourcesCheckedChanged: (String, Boolean) -> Unit, onNewsResourcesCheckedChanged: (String, Boolean) -> Unit,
onBrowseTopic: (String) -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
) { ) {
@ -183,6 +186,7 @@ internal fun ForYouScreen(
newsFeed( newsFeed(
feedState = feedState, feedState = feedState,
onNewsResourcesCheckedChanged = onNewsResourcesCheckedChanged, onNewsResourcesCheckedChanged = onNewsResourcesCheckedChanged,
onBrowseTopic = onBrowseTopic
) )
item(span = { GridItemSpan(maxLineSpan) }) { item(span = { GridItemSpan(maxLineSpan) }) {
@ -417,7 +421,8 @@ fun ForYouScreenPopulatedFeed() {
onTopicCheckedChanged = { _, _ -> }, onTopicCheckedChanged = { _, _ -> },
onAuthorCheckedChanged = { _, _ -> }, onAuthorCheckedChanged = { _, _ -> },
saveFollowedTopics = {}, saveFollowedTopics = {},
onNewsResourcesCheckedChanged = { _, _ -> } onNewsResourcesCheckedChanged = { _, _ -> },
onBrowseTopic = {}
) )
} }
} }
@ -439,7 +444,8 @@ fun ForYouScreenOfflinePopulatedFeed() {
onTopicCheckedChanged = { _, _ -> }, onTopicCheckedChanged = { _, _ -> },
onAuthorCheckedChanged = { _, _ -> }, onAuthorCheckedChanged = { _, _ -> },
saveFollowedTopics = {}, saveFollowedTopics = {},
onNewsResourcesCheckedChanged = { _, _ -> } onNewsResourcesCheckedChanged = { _, _ -> },
onBrowseTopic = {}
) )
} }
} }
@ -464,7 +470,8 @@ fun ForYouScreenTopicSelection() {
onTopicCheckedChanged = { _, _ -> }, onTopicCheckedChanged = { _, _ -> },
onAuthorCheckedChanged = { _, _ -> }, onAuthorCheckedChanged = { _, _ -> },
saveFollowedTopics = {}, saveFollowedTopics = {},
onNewsResourcesCheckedChanged = { _, _ -> } onNewsResourcesCheckedChanged = { _, _ -> },
onBrowseTopic = {}
) )
} }
} }
@ -482,7 +489,8 @@ fun ForYouScreenLoading() {
onTopicCheckedChanged = { _, _ -> }, onTopicCheckedChanged = { _, _ -> },
onAuthorCheckedChanged = { _, _ -> }, onAuthorCheckedChanged = { _, _ -> },
saveFollowedTopics = {}, saveFollowedTopics = {},
onNewsResourcesCheckedChanged = { _, _ -> } onNewsResourcesCheckedChanged = { _, _ -> },
onBrowseTopic = {}
) )
} }
} }
@ -504,7 +512,8 @@ fun ForYouScreenPopulatedAndLoading() {
onTopicCheckedChanged = { _, _ -> }, onTopicCheckedChanged = { _, _ -> },
onAuthorCheckedChanged = { _, _ -> }, onAuthorCheckedChanged = { _, _ -> },
saveFollowedTopics = {}, saveFollowedTopics = {},
onNewsResourcesCheckedChanged = { _, _ -> } onNewsResourcesCheckedChanged = { _, _ -> },
onBrowseTopic = {}
) )
} }
} }

@ -28,8 +28,8 @@ fun NavController.navigateToForYou(navOptions: NavOptions? = null) {
this.navigate(forYouNavigationRoute, navOptions) this.navigate(forYouNavigationRoute, navOptions)
} }
fun NavGraphBuilder.forYouScreen() { fun NavGraphBuilder.forYouScreen(onBrowseTopic: (String) -> Unit) {
composable(route = forYouNavigationRoute) { composable(route = forYouNavigationRoute) {
ForYouRoute() ForYouRoute(onBrowseTopic = onBrowseTopic)
} }
} }

@ -62,6 +62,7 @@ class TopicScreenTest {
onBackClick = { }, onBackClick = { },
onFollowClick = { }, onFollowClick = { },
onBookmarkChanged = { _, _ -> }, onBookmarkChanged = { _, _ -> },
onBrowseTopic = {}
) )
} }
@ -80,6 +81,7 @@ class TopicScreenTest {
onBackClick = { }, onBackClick = { },
onFollowClick = { }, onFollowClick = { },
onBookmarkChanged = { _, _ -> }, onBookmarkChanged = { _, _ -> },
onBrowseTopic = {}
) )
} }
@ -110,6 +112,7 @@ class TopicScreenTest {
onBackClick = { }, onBackClick = { },
onFollowClick = { }, onFollowClick = { },
onBookmarkChanged = { _, _ -> }, onBookmarkChanged = { _, _ -> },
onBrowseTopic = {}
) )
} }
@ -136,6 +139,7 @@ class TopicScreenTest {
onBackClick = { }, onBackClick = { },
onFollowClick = { }, onFollowClick = { },
onBookmarkChanged = { _, _ -> }, onBookmarkChanged = { _, _ -> },
onBrowseTopic = {}
) )
} }

@ -66,6 +66,7 @@ import com.google.samples.apps.nowinandroid.feature.topic.TopicUiState.Loading
@Composable @Composable
internal fun TopicRoute( internal fun TopicRoute(
onBackClick: () -> Unit, onBackClick: () -> Unit,
onBrowseTopic: (String) -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
viewModel: TopicViewModel = hiltViewModel(), viewModel: TopicViewModel = hiltViewModel(),
) { ) {
@ -79,6 +80,7 @@ internal fun TopicRoute(
onBackClick = onBackClick, onBackClick = onBackClick,
onFollowClick = viewModel::followTopicToggle, onFollowClick = viewModel::followTopicToggle,
onBookmarkChanged = viewModel::bookmarkNews, onBookmarkChanged = viewModel::bookmarkNews,
onBrowseTopic = onBrowseTopic
) )
} }
@ -90,6 +92,7 @@ internal fun TopicScreen(
onBackClick: () -> Unit, onBackClick: () -> Unit,
onFollowClick: (Boolean) -> Unit, onFollowClick: (Boolean) -> Unit,
onBookmarkChanged: (String, Boolean) -> Unit, onBookmarkChanged: (String, Boolean) -> Unit,
onBrowseTopic: (String) -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
) { ) {
val state = rememberLazyListState() val state = rememberLazyListState()
@ -124,7 +127,8 @@ internal fun TopicScreen(
description = topicUiState.followableTopic.topic.longDescription, description = topicUiState.followableTopic.topic.longDescription,
news = newsUiState, news = newsUiState,
imageUrl = topicUiState.followableTopic.topic.imageUrl, imageUrl = topicUiState.followableTopic.topic.imageUrl,
onBookmarkChanged = onBookmarkChanged onBookmarkChanged = onBookmarkChanged,
onBrowseTopic = onBrowseTopic
) )
} }
} }
@ -139,14 +143,15 @@ private fun LazyListScope.TopicBody(
description: String, description: String,
news: NewsUiState, news: NewsUiState,
imageUrl: String, imageUrl: String,
onBookmarkChanged: (String, Boolean) -> Unit onBookmarkChanged: (String, Boolean) -> Unit,
onBrowseTopic: (String) -> Unit,
) { ) {
// TODO: Show icon if available // TODO: Show icon if available
item { item {
TopicHeader(name, description, imageUrl) TopicHeader(name, description, imageUrl)
} }
TopicCards(news, onBookmarkChanged) TopicCards(news, onBookmarkChanged, onBrowseTopic)
} }
@Composable @Composable
@ -176,7 +181,8 @@ private fun TopicHeader(name: String, description: String, imageUrl: String) {
private fun LazyListScope.TopicCards( private fun LazyListScope.TopicCards(
news: NewsUiState, news: NewsUiState,
onBookmarkChanged: (String, Boolean) -> Unit onBookmarkChanged: (String, Boolean) -> Unit,
onBrowseTopic: (String) -> Unit,
) { ) {
when (news) { when (news) {
is NewsUiState.Success -> { is NewsUiState.Success -> {
@ -185,6 +191,7 @@ private fun LazyListScope.TopicCards(
newsResourceMapper = { it.newsResource }, newsResourceMapper = { it.newsResource },
isBookmarkedMapper = { it.isSaved }, isBookmarkedMapper = { it.isSaved },
onToggleBookmark = { onBookmarkChanged(it.newsResource.id, !it.isSaved) }, onToggleBookmark = { onBookmarkChanged(it.newsResource.id, !it.isSaved) },
onBrowseTopic = onBrowseTopic,
itemModifier = Modifier.padding(24.dp) itemModifier = Modifier.padding(24.dp)
) )
} }
@ -206,7 +213,8 @@ private fun TopicBodyPreview() {
LazyColumn { LazyColumn {
TopicBody( TopicBody(
"Jetpack Compose", "Lorem ipsum maximum", "Jetpack Compose", "Lorem ipsum maximum",
NewsUiState.Success(emptyList()), "", { _, _ -> } NewsUiState.Success(emptyList()), "", { _, _ -> },
onBrowseTopic = {}
) )
} }
} }
@ -267,6 +275,7 @@ fun TopicScreenPopulated() {
onBackClick = {}, onBackClick = {},
onFollowClick = {}, onFollowClick = {},
onBookmarkChanged = { _, _ -> }, onBookmarkChanged = { _, _ -> },
onBrowseTopic = {}
) )
} }
} }
@ -283,6 +292,7 @@ fun TopicScreenLoading() {
onBackClick = {}, onBackClick = {},
onFollowClick = {}, onFollowClick = {},
onBookmarkChanged = { _, _ -> }, onBookmarkChanged = { _, _ -> },
onBrowseTopic = {}
) )
} }
} }

@ -41,7 +41,8 @@ fun NavController.navigateToTopic(topicId: String) {
} }
fun NavGraphBuilder.topicScreen( fun NavGraphBuilder.topicScreen(
onBackClick: () -> Unit onBackClick: () -> Unit,
onBrowseTopic: (String) -> Unit,
) { ) {
composable( composable(
route = "topic_route/{$topicIdArg}", route = "topic_route/{$topicIdArg}",
@ -49,6 +50,6 @@ fun NavGraphBuilder.topicScreen(
navArgument(topicIdArg) { type = NavType.StringType } navArgument(topicIdArg) { type = NavType.StringType }
) )
) { ) {
TopicRoute(onBackClick = onBackClick) TopicRoute(onBackClick = onBackClick, onBrowseTopic = onBrowseTopic)
} }
} }

Loading…
Cancel
Save