navigating to browse the topic on NiaTopicTag click

pull/429/head
yveskalume 3 years ago
parent 8c06c1ee34
commit 855cbf83ed

@ -518,37 +518,18 @@ fun NiaCatalog() {
item { Text("Tags", Modifier.padding(top = 16.dp)) }
item {
FlowRow(mainAxisSpacing = 16.dp) {
var expandedTopicId by remember { mutableStateOf<String?>(null) }
var firstFollowed by remember { mutableStateOf(false) }
NiaTopicTag(
expanded = expandedTopicId == "Topic 1",
followed = firstFollowed,
onDropMenuToggle = { show ->
expandedTopicId = if (show) "Topic 1" else null
},
onFollowClick = { firstFollowed = true },
onUnfollowClick = { firstFollowed = false },
onBrowseClick = {},
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) }
NiaTopicTag(
expanded = expandedTopicId == "Topic 2",
followed = secondFollowed,
onDropMenuToggle = { show ->
expandedTopicId = if (show) "Topic 2" else null
},
onFollowClick = { secondFollowed = true },
onUnfollowClick = { secondFollowed = false },
onBrowseClick = {},
text = { Text(text = "Topic 2".uppercase()) },
followText = { Text(text = "Follow") },
unFollowText = { Text(text = "Unfollow") },
browseText = { Text(text = "Browse topic") }
)
}
}

@ -18,28 +18,18 @@ package com.google.samples.apps.nowinandroid.core.designsystem.component
import androidx.compose.foundation.layout.Box
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.material3.contentColorFor
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.stringResource
import com.google.samples.apps.nowinandroid.core.designsystem.R
@Composable
fun NiaTopicTag(
expanded: Boolean = false,
followed: Boolean,
onDropMenuToggle: (show: Boolean) -> Unit = {},
onFollowClick: () -> Unit,
onUnfollowClick: () -> Unit,
onBrowseClick: () -> Unit,
modifier: Modifier = Modifier,
enabled: Boolean = true,
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) {
@ -49,7 +39,7 @@ fun NiaTopicTag(
MaterialTheme.colorScheme.surfaceVariant
}
NiaTextButton(
onClick = { onDropMenuToggle(true) },
onClick = onBrowseClick,
enabled = enabled,
small = true,
colors = NiaButtonDefaults.textButtonColors(
@ -65,28 +55,5 @@ fun NiaTopicTag(
),
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

@ -43,8 +43,6 @@ import com.google.samples.apps.nowinandroid.core.model.data.previewNewsResources
fun LazyGridScope.newsFeed(
feedState: NewsFeedUiState,
onNewsResourcesCheckedChanged: (String, Boolean) -> Unit,
onFollowTopic: (String) -> Unit,
onUnfollowTopic: (String) -> Unit,
onBrowseTopic: (String) -> Unit,
) {
when (feedState) {
@ -68,8 +66,6 @@ fun LazyGridScope.newsFeed(
)
},
onBrowseTopic = onBrowseTopic,
onFollowTopic = onFollowTopic,
onUnfollowTopic = onUnfollowTopic
)
}
}
@ -105,8 +101,6 @@ fun NewsFeedLoadingPreview() {
feedState = NewsFeedUiState.Loading,
onNewsResourcesCheckedChanged = { _, _ -> },
onBrowseTopic = {},
onFollowTopic = {},
onUnfollowTopic = {}
)
}
}
@ -129,8 +123,6 @@ fun NewsFeedContentPreview() {
),
onNewsResourcesCheckedChanged = { _, _ -> },
onBrowseTopic = {},
onFollowTopic = {},
onUnfollowTopic = {}
)
}
}

@ -83,8 +83,6 @@ fun NewsResourceCardExpanded(
isBookmarked: Boolean,
onToggleBookmark: () -> Unit,
onClick: () -> Unit,
onFollowTopic: (String) -> Unit,
onUnfollowTopic: (String) -> Unit,
onBrowseTopic: (String) -> Unit,
modifier: Modifier = Modifier
) {
@ -129,8 +127,6 @@ fun NewsResourceCardExpanded(
NewsResourceTopics(
topics = newsResource.topics,
onBrowseClick = onBrowseTopic,
onFollowClick = onFollowTopic,
onUnfollowClick = onUnfollowTopic
)
}
}
@ -275,28 +271,16 @@ fun NewsResourceShortDescription(
@Composable
fun NewsResourceTopics(
topics: List<Topic>,
onFollowClick: (String) -> Unit,
onUnfollowClick: (String) -> Unit,
onBrowseClick: (String) -> Unit,
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(
modifier = modifier.horizontalScroll(rememberScrollState()), // causes narrow chips
horizontalArrangement = Arrangement.spacedBy(4.dp),
) {
for (topic in topics) {
NiaTopicTag(
expanded = expandedTopicId == topic.id,
followed = true, // ToDo: Check if topic is followed
onDropMenuToggle = { show ->
expandedTopicId = if (show) topic.id else null
},
onFollowClick = { onFollowClick(topic.id) },
onUnfollowClick = { onUnfollowClick(topic.id) },
onBrowseClick = { onBrowseClick(topic.id) },
text = { Text(text = topic.name.uppercase(Locale.getDefault())) }
)
@ -335,8 +319,6 @@ fun ExpandedNewsResourcePreview() {
onToggleBookmark = {},
onClick = {},
onBrowseTopic = {},
onFollowTopic = {},
onUnfollowTopic = {}
)
}
}

@ -40,8 +40,6 @@ fun <T> LazyListScope.newsResourceCardItems(
newsResourceMapper: (item: T) -> NewsResource,
isBookmarkedMapper: (item: T) -> Boolean,
onToggleBookmark: (item: T) -> Unit,
onFollowTopic: (String) -> Unit,
onUnfollowTopic: (String) -> Unit,
onBrowseTopic: (String) -> Unit,
onItemClick: ((item: T) -> Unit)? = null,
itemModifier: Modifier = Modifier,
@ -59,8 +57,6 @@ fun <T> LazyListScope.newsResourceCardItems(
isBookmarked = isBookmarkedMapper(item),
onToggleBookmark = { onToggleBookmark(item) },
onBrowseTopic = onBrowseTopic,
onFollowTopic = onFollowTopic,
onUnfollowTopic = onUnfollowTopic,
onClick = {
when (onItemClick) {
null -> ContextCompat.startActivity(context, launchResourceIntent, null)

@ -59,8 +59,6 @@ class AuthorScreenTest {
onFollowClick = { },
onBookmarkChanged = { _, _ -> },
onBrowseTopic = { },
onFollowTopic = { },
onUnfollowTopic = { },
)
}
@ -80,8 +78,6 @@ class AuthorScreenTest {
onFollowClick = { },
onBookmarkChanged = { _, _ -> },
onBrowseTopic = { },
onFollowTopic = { },
onUnfollowTopic = { },
)
}
@ -113,8 +109,6 @@ class AuthorScreenTest {
onFollowClick = { },
onBookmarkChanged = { _, _ -> },
onBrowseTopic = { },
onFollowTopic = { },
onUnfollowTopic = { },
)
}
@ -142,8 +136,6 @@ class AuthorScreenTest {
onFollowClick = { },
onBookmarkChanged = { _, _ -> },
onBrowseTopic = { },
onFollowTopic = { },
onUnfollowTopic = { },
)
}

@ -82,12 +82,6 @@ internal fun AuthorRoute(
onFollowClick = viewModel::followAuthorToggle,
onBookmarkChanged = viewModel::bookmarkNews,
onBrowseTopic = navigateToTopic,
onFollowTopic = { topicId ->
viewModel.followTopic(topicId, true)
},
onUnfollowTopic = { topicId ->
viewModel.followTopic(topicId, false)
},
)
}
@ -99,8 +93,6 @@ internal fun AuthorScreen(
onBackClick: () -> Unit,
onFollowClick: (Boolean) -> Unit,
onBookmarkChanged: (String, Boolean) -> Unit,
onFollowTopic: (String) -> Unit,
onUnfollowTopic: (String) -> Unit,
onBrowseTopic: (String) -> Unit,
modifier: Modifier = Modifier,
) {
@ -139,8 +131,6 @@ internal fun AuthorScreen(
news = newsUiState,
onBookmarkChanged = onBookmarkChanged,
onBrowseTopic = onBrowseTopic,
onFollowTopic = onFollowTopic,
onUnfollowTopic = onUnfollowTopic
)
}
}
@ -154,8 +144,6 @@ private fun LazyListScope.authorBody(
author: Author,
news: NewsUiState,
onBookmarkChanged: (String, Boolean) -> Unit,
onFollowTopic: (String) -> Unit,
onUnfollowTopic: (String) -> Unit,
onBrowseTopic: (String) -> Unit,
) {
item {
@ -166,8 +154,6 @@ private fun LazyListScope.authorBody(
news = news,
onBookmarkChanged = onBookmarkChanged,
onBrowseTopic = onBrowseTopic,
onFollowTopic = onFollowTopic,
onUnfollowTopic = onUnfollowTopic
)
}
@ -200,8 +186,6 @@ private fun AuthorHeader(author: Author) {
private fun LazyListScope.authorCards(
news: NewsUiState,
onBookmarkChanged: (String, Boolean) -> Unit,
onFollowTopic: (String) -> Unit,
onUnfollowTopic: (String) -> Unit,
onBrowseTopic: (String) -> Unit,
) {
when (news) {
@ -212,8 +196,6 @@ private fun LazyListScope.authorCards(
isBookmarkedMapper = { it.isSaved },
onToggleBookmark = { onBookmarkChanged(it.newsResource.id, !it.isSaved) },
onBrowseTopic = onBrowseTopic,
onFollowTopic = onFollowTopic,
onUnfollowTopic = onUnfollowTopic,
itemModifier = Modifier.padding(24.dp)
)
}
@ -282,8 +264,6 @@ fun AuthorScreenPopulated() {
onFollowClick = {},
onBookmarkChanged = { _, _ -> },
onBrowseTopic = { },
onFollowTopic = { },
onUnfollowTopic = { },
)
}
}
@ -301,8 +281,6 @@ fun AuthorScreenLoading() {
onFollowClick = {},
onBookmarkChanged = { _, _ -> },
onBrowseTopic = { },
onFollowTopic = { },
onUnfollowTopic = { },
)
}
}

@ -80,12 +80,6 @@ class AuthorViewModel @Inject constructor(
userDataRepository.updateNewsResourceBookmark(newsResourceId, bookmarked)
}
}
fun followTopic(followedTopicId: String, followed: Boolean) {
viewModelScope.launch {
userDataRepository.toggleFollowedTopicId(followedTopicId, followed)
}
}
}
private fun authorUiStateStream(

@ -54,8 +54,6 @@ class BookmarksScreenTest {
feedState = NewsFeedUiState.Loading,
removeFromBookmarks = { },
onBrowseTopic = { },
onFollowTopic = { },
onUnfollowTopic = { },
)
}
@ -78,8 +76,6 @@ class BookmarksScreenTest {
),
removeFromBookmarks = { },
onBrowseTopic = { },
onFollowTopic = { },
onUnfollowTopic = { },
)
}
@ -123,8 +119,6 @@ class BookmarksScreenTest {
removeFromBookmarksCalled = true
},
onBrowseTopic = { },
onFollowTopic = { },
onUnfollowTopic = { },
)
}

@ -55,10 +55,4 @@ class BookmarksViewModel @Inject constructor(
userDataRepository.updateNewsResourceBookmark(newsResourceId, false)
}
}
fun followTopic(followedTopicId: String, followed: Boolean) {
viewModelScope.launch {
userDataRepository.toggleFollowedTopicId(followedTopicId, followed)
}
}
}

@ -61,8 +61,6 @@ class ForYouScreenTest {
saveFollowedTopics = {},
onNewsResourcesCheckedChanged = { _, _ -> },
onBrowseTopic = { },
onFollowTopic = { },
onUnfollowTopic = { },
)
}
}
@ -87,8 +85,6 @@ class ForYouScreenTest {
saveFollowedTopics = {},
onNewsResourcesCheckedChanged = { _, _ -> },
onBrowseTopic = { },
onFollowTopic = { },
onUnfollowTopic = { },
)
}
}
@ -119,8 +115,6 @@ class ForYouScreenTest {
saveFollowedTopics = {},
onNewsResourcesCheckedChanged = { _, _ -> },
onBrowseTopic = { },
onFollowTopic = { },
onUnfollowTopic = { },
)
}
}
@ -174,8 +168,6 @@ class ForYouScreenTest {
saveFollowedTopics = {},
onNewsResourcesCheckedChanged = { _, _ -> },
onBrowseTopic = { },
onFollowTopic = { },
onUnfollowTopic = { },
)
}
}
@ -229,8 +221,6 @@ class ForYouScreenTest {
saveFollowedTopics = {},
onNewsResourcesCheckedChanged = { _, _ -> },
onBrowseTopic = { },
onFollowTopic = { },
onUnfollowTopic = { },
)
}
}
@ -279,8 +269,6 @@ class ForYouScreenTest {
saveFollowedTopics = {},
onNewsResourcesCheckedChanged = { _, _ -> },
onBrowseTopic = { },
onFollowTopic = { },
onUnfollowTopic = { },
)
}
}
@ -305,8 +293,6 @@ class ForYouScreenTest {
saveFollowedTopics = {},
onNewsResourcesCheckedChanged = { _, _ -> },
onBrowseTopic = { },
onFollowTopic = { },
onUnfollowTopic = { },
)
}
}
@ -334,8 +320,6 @@ class ForYouScreenTest {
saveFollowedTopics = {},
onNewsResourcesCheckedChanged = { _, _ -> },
onBrowseTopic = { },
onFollowTopic = { },
onUnfollowTopic = { },
)
}

@ -108,12 +108,6 @@ internal fun ForYouRoute(
saveFollowedTopics = viewModel::dismissOnboarding,
onNewsResourcesCheckedChanged = viewModel::updateNewsResourceSaved,
onBrowseTopic = navigateToTopic,
onFollowTopic = { topicId ->
viewModel.followTopic(topicId, true)
},
onUnfollowTopic = { topicId ->
viewModel.followTopic(topicId, false)
},
modifier = modifier
)
}
@ -127,8 +121,6 @@ internal fun ForYouScreen(
onAuthorCheckedChanged: (String, Boolean) -> Unit,
saveFollowedTopics: () -> Unit,
onNewsResourcesCheckedChanged: (String, Boolean) -> Unit,
onFollowTopic: (String) -> Unit,
onUnfollowTopic: (String) -> Unit,
onBrowseTopic: (String) -> Unit,
modifier: Modifier = Modifier,
) {
@ -190,8 +182,6 @@ internal fun ForYouScreen(
feedState = feedState,
onNewsResourcesCheckedChanged = onNewsResourcesCheckedChanged,
onBrowseTopic = onBrowseTopic,
onFollowTopic = onFollowTopic,
onUnfollowTopic = onUnfollowTopic
)
item(span = { GridItemSpan(maxLineSpan) }) {
@ -421,8 +411,6 @@ fun ForYouScreenPopulatedFeed() {
saveFollowedTopics = {},
onNewsResourcesCheckedChanged = { _, _ -> },
onBrowseTopic = {},
onFollowTopic = {},
onUnfollowTopic = {}
)
}
}
@ -446,8 +434,6 @@ fun ForYouScreenOfflinePopulatedFeed() {
saveFollowedTopics = {},
onNewsResourcesCheckedChanged = { _, _ -> },
onBrowseTopic = {},
onFollowTopic = {},
onUnfollowTopic = {}
)
}
}
@ -474,8 +460,6 @@ fun ForYouScreenTopicSelection() {
saveFollowedTopics = {},
onNewsResourcesCheckedChanged = { _, _ -> },
onBrowseTopic = {},
onFollowTopic = {},
onUnfollowTopic = {}
)
}
}
@ -495,8 +479,6 @@ fun ForYouScreenLoading() {
saveFollowedTopics = {},
onNewsResourcesCheckedChanged = { _, _ -> },
onBrowseTopic = {},
onFollowTopic = {},
onUnfollowTopic = {}
)
}
}
@ -520,8 +502,6 @@ fun ForYouScreenPopulatedAndLoading() {
saveFollowedTopics = {},
onNewsResourcesCheckedChanged = { _, _ -> },
onBrowseTopic = {},
onFollowTopic = {},
onUnfollowTopic = {}
)
}
}

@ -129,12 +129,6 @@ class ForYouViewModel @Inject constructor(
userDataRepository.setShouldHideOnboarding(true)
}
}
fun followTopic(followedTopicId: String, followed: Boolean) {
viewModelScope.launch {
userDataRepository.toggleFollowedTopicId(followedTopicId, followed)
}
}
}
private fun Flow<List<SaveableNewsResource>>.mapToFeedState(): Flow<NewsFeedUiState> =

@ -63,8 +63,6 @@ class TopicScreenTest {
onFollowClick = { },
onBookmarkChanged = { _, _ -> },
onBrowseTopic = { },
onFollowTopic = { },
onUnfollowTopic = { },
)
}
@ -84,8 +82,6 @@ class TopicScreenTest {
onFollowClick = { },
onBookmarkChanged = { _, _ -> },
onBrowseTopic = { },
onFollowTopic = { },
onUnfollowTopic = { },
)
}
@ -117,8 +113,6 @@ class TopicScreenTest {
onFollowClick = { },
onBookmarkChanged = { _, _ -> },
onBrowseTopic = { },
onFollowTopic = { },
onUnfollowTopic = { },
)
}
@ -146,8 +140,6 @@ class TopicScreenTest {
onFollowClick = { },
onBookmarkChanged = { _, _ -> },
onBrowseTopic = { },
onFollowTopic = { },
onUnfollowTopic = { },
)
}

@ -81,12 +81,6 @@ internal fun TopicRoute(
onFollowClick = viewModel::followTopicToggle,
onBookmarkChanged = viewModel::bookmarkNews,
onBrowseTopic = navigateToTopic,
onFollowTopic = { topicId ->
viewModel.followTopic(topicId, true)
},
onUnfollowTopic = { topicId ->
viewModel.followTopic(topicId, false)
},
)
}
@ -99,8 +93,6 @@ internal fun TopicScreen(
onFollowClick: (Boolean) -> Unit,
onBookmarkChanged: (String, Boolean) -> Unit,
onBrowseTopic: (String) -> Unit,
onFollowTopic: (String) -> Unit,
onUnfollowTopic: (String) -> Unit,
modifier: Modifier = Modifier,
) {
val state = rememberLazyListState()
@ -136,8 +128,6 @@ internal fun TopicScreen(
imageUrl = topicUiState.followableTopic.topic.imageUrl,
onBookmarkChanged = onBookmarkChanged,
onBrowseTopic = onBrowseTopic,
onFollowTopic = onFollowTopic,
onUnfollowTopic = onUnfollowTopic,
)
}
}
@ -154,8 +144,6 @@ private fun LazyListScope.TopicBody(
imageUrl: String,
onBookmarkChanged: (String, Boolean) -> Unit,
onBrowseTopic: (String) -> Unit,
onFollowTopic: (String) -> Unit,
onUnfollowTopic: (String) -> Unit,
) {
// TODO: Show icon if available
item {
@ -166,8 +154,6 @@ private fun LazyListScope.TopicBody(
news = news,
onBookmarkChanged = onBookmarkChanged,
onBrowseTopic = onBrowseTopic,
onFollowTopic = onFollowTopic,
onUnfollowTopic = onUnfollowTopic,
)
}
@ -199,8 +185,6 @@ private fun LazyListScope.TopicCards(
news: NewsUiState,
onBookmarkChanged: (String, Boolean) -> Unit,
onBrowseTopic: (String) -> Unit,
onFollowTopic: (String) -> Unit,
onUnfollowTopic: (String) -> Unit,
) {
when (news) {
is NewsUiState.Success -> {
@ -210,8 +194,6 @@ private fun LazyListScope.TopicCards(
isBookmarkedMapper = { it.isSaved },
onToggleBookmark = { onBookmarkChanged(it.newsResource.id, !it.isSaved) },
onBrowseTopic = onBrowseTopic,
onFollowTopic = onFollowTopic,
onUnfollowTopic = onUnfollowTopic,
itemModifier = Modifier.padding(24.dp)
)
}
@ -236,8 +218,6 @@ private fun TopicBodyPreview() {
imageUrl = "",
onBookmarkChanged = { _, _ -> },
onBrowseTopic = { },
onFollowTopic = { },
onUnfollowTopic = { },
)
}
}
@ -299,8 +279,6 @@ fun TopicScreenPopulated() {
onFollowClick = {},
onBookmarkChanged = { _, _ -> },
onBrowseTopic = { },
onFollowTopic = { },
onUnfollowTopic = { },
)
}
}
@ -318,8 +296,6 @@ fun TopicScreenLoading() {
onFollowClick = {},
onBookmarkChanged = { _, _ -> },
onBrowseTopic = { },
onFollowTopic = { },
onUnfollowTopic = { },
)
}
}

@ -79,12 +79,6 @@ class TopicViewModel @Inject constructor(
}
}
fun followTopic(followedTopicId: String, followed: Boolean) {
viewModelScope.launch {
userDataRepository.toggleFollowedTopicId(followedTopicId, followed)
}
}
fun bookmarkNews(newsResourceId: String, bookmarked: Boolean) {
viewModelScope.launch {
userDataRepository.updateNewsResourceBookmark(newsResourceId, bookmarked)

Loading…
Cancel
Save