Add followedTopicsState in ForYouViewModel

Change-Id: I30e243a8cbfa46e3d3f61a5f1feb1b514cfba9c5
caren/test_showing_followed_topics
Caren 2 years ago
parent 7d42831ee9
commit 44ff767430

@ -37,6 +37,7 @@ import androidx.compose.ui.tooling.preview.Devices
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.google.samples.apps.nowinandroid.core.designsystem.theme.NiaTheme
import com.google.samples.apps.nowinandroid.core.domain.model.FollowableTopic
import com.google.samples.apps.nowinandroid.core.domain.model.SaveableNewsResource
import com.google.samples.apps.nowinandroid.core.model.data.previewNewsResources
@ -61,6 +62,7 @@ fun LazyGridScope.newsFeed(
NewsResourceCardExpanded(
newsResource = saveableNewsResource.newsResource,
isBookmarked = saveableNewsResource.isSaved,
// ToDo add list of followed topics
onClick = { launchCustomChromeTab(context, resourceUrl, backgroundColor) },
onToggleBookmark = {
onNewsResourcesCheckedChanged(
@ -104,6 +106,18 @@ sealed interface NewsFeedUiState {
) : NewsFeedUiState
}
/**
* A sealed hierarchy describing the state of the followed topics
*/
sealed interface FollowedTopicsState {
object Loading : FollowedTopicsState
data class Topics(
val topics: List<FollowableTopic>
) : FollowedTopicsState
}
@Preview
@Composable
fun NewsFeedLoadingPreview() {

@ -99,12 +99,14 @@ internal fun ForYouRoute(
) {
val onboardingUiState by viewModel.onboardingUiState.collectAsStateWithLifecycle()
val feedState by viewModel.feedState.collectAsStateWithLifecycle()
val followedTopicsState by viewModel.followedTopicsState.collectAsStateWithLifecycle()
val isSyncing by viewModel.isSyncing.collectAsStateWithLifecycle()
ForYouScreen(
isSyncing = isSyncing,
onboardingUiState = onboardingUiState,
feedState = feedState,
followedTopicsState = followedTopicsState,
onTopicCheckedChanged = viewModel::updateTopicSelection,
saveFollowedTopics = viewModel::dismissOnboarding,
onNewsResourcesCheckedChanged = viewModel::updateNewsResourceSaved,
@ -117,6 +119,7 @@ internal fun ForYouScreen(
isSyncing: Boolean,
onboardingUiState: OnboardingUiState,
feedState: NewsFeedUiState,
followedTopicsState:
onTopicCheckedChanged: (String, Boolean) -> Unit,
saveFollowedTopics: () -> Unit,
onNewsResourcesCheckedChanged: (String, Boolean) -> Unit,
@ -176,6 +179,7 @@ internal fun ForYouScreen(
newsFeed(
feedState = feedState,
// ToDo : add followed topics list
onNewsResourcesCheckedChanged = onNewsResourcesCheckedChanged,
)

@ -22,7 +22,9 @@ import com.google.samples.apps.nowinandroid.core.data.repository.UserDataReposit
import com.google.samples.apps.nowinandroid.core.data.util.SyncStatusMonitor
import com.google.samples.apps.nowinandroid.core.domain.GetFollowableTopicsUseCase
import com.google.samples.apps.nowinandroid.core.domain.GetSaveableNewsResourcesUseCase
import com.google.samples.apps.nowinandroid.core.domain.TopicSortField
import com.google.samples.apps.nowinandroid.core.domain.model.SaveableNewsResource
import com.google.samples.apps.nowinandroid.core.ui.FollowedTopicsState
import com.google.samples.apps.nowinandroid.core.ui.NewsFeedUiState
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject
@ -42,7 +44,7 @@ class ForYouViewModel @Inject constructor(
syncStatusMonitor: SyncStatusMonitor,
private val userDataRepository: UserDataRepository,
private val getSaveableNewsResources: GetSaveableNewsResourcesUseCase,
getFollowableTopics: GetFollowableTopicsUseCase
private val getFollowableTopics: GetFollowableTopicsUseCase
) : ViewModel() {
private val shouldShowOnboarding: Flow<Boolean> =
@ -55,6 +57,15 @@ class ForYouViewModel @Inject constructor(
initialValue = false
)
val followedTopicsState: StateFlow<FollowedTopicsState> =
getFollowableTopics().map(
FollowedTopicsState::Topics
).stateIn(
scope = viewModelScope,
started = SharingStarted.WhileSubscribed(5_000),
initialValue = FollowedTopicsState.Loading
)
val feedState: StateFlow<NewsFeedUiState> =
userDataRepository.userData
.map { userData ->

Loading…
Cancel
Save