diff --git a/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsFeed.kt b/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsFeed.kt index 55d84af2f..2ff2d16ed 100644 --- a/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsFeed.kt +++ b/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsFeed.kt @@ -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 + ) : FollowedTopicsState +} + @Preview @Composable fun NewsFeedLoadingPreview() { diff --git a/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouScreen.kt b/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouScreen.kt index 1420a7e47..09a92cbd1 100644 --- a/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouScreen.kt +++ b/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouScreen.kt @@ -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, ) diff --git a/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel.kt b/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel.kt index 800cba0d3..16bda799b 100644 --- a/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel.kt +++ b/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel.kt @@ -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 = @@ -55,6 +57,15 @@ class ForYouViewModel @Inject constructor( initialValue = false ) + val followedTopicsState: StateFlow = + getFollowableTopics().map( + FollowedTopicsState::Topics + ).stateIn( + scope = viewModelScope, + started = SharingStarted.WhileSubscribed(5_000), + initialValue = FollowedTopicsState.Loading + ) + val feedState: StateFlow = userDataRepository.userData .map { userData ->