Slightly more precise flow transformations in the ForYouViewModel

Change-Id: Ib79ce98ad715f8d5f805f285c678dfcc6370ca13
tj/for-you-flows
Adetunji Dahunsi 2 years ago
parent 912049c3dc
commit 1f12a9e6ea

@ -106,40 +106,33 @@ class ForYouViewModel @Inject constructor(
}
val feedState: StateFlow<NewsFeedUiState> =
combine(
followedInterestsUiState,
snapshotFlow { inProgressTopicSelection },
snapshotFlow { inProgressAuthorSelection }
) { followedInterestsUserState, inProgressTopicSelection, inProgressAuthorSelection ->
when (followedInterestsUserState) {
// If we don't know the current selection state, emit loading.
Unknown -> flowOf<NewsFeedUiState>(NewsFeedUiState.Loading)
followedInterestsUiState.flatMapLatest { interestsState ->
when (interestsState) {
// If the user has followed topics, use those followed topics to populate the feed
is FollowedInterests -> {
newsRepository.getNewsResourcesStream(
filterTopicIds = followedInterestsUserState.topicIds,
filterAuthorIds = followedInterestsUserState.authorIds
).mapToFeedState(savedNewsResourcesState)
}
is FollowedInterests -> newsRepository.getNewsResourcesStream(
filterTopicIds = interestsState.topicIds,
filterAuthorIds = interestsState.authorIds
).mapToFeedState(savedNewsResourcesState)
// If the user hasn't followed interests yet, show a realtime populated feed based
// on the in-progress interests selections, if there are any.
None -> {
if (inProgressTopicSelection.isEmpty() && inProgressAuthorSelection.isEmpty()) {
flowOf<NewsFeedUiState>(NewsFeedUiState.Success(emptyList()))
} else {
newsRepository.getNewsResourcesStream(
None -> combine(
snapshotFlow { inProgressTopicSelection },
snapshotFlow { inProgressAuthorSelection },
::Pair
).flatMapLatest { (inProgressTopicSelection, inProgressAuthorSelection) ->
when {
inProgressTopicSelection.isEmpty() && inProgressAuthorSelection.isEmpty() ->
flowOf<NewsFeedUiState>(NewsFeedUiState.Success(emptyList()))
else -> newsRepository.getNewsResourcesStream(
filterTopicIds = inProgressTopicSelection,
filterAuthorIds = inProgressAuthorSelection
).mapToFeedState(savedNewsResourcesState)
}
}
// If we don't know the current selection state, emit loading.
Unknown -> flowOf<NewsFeedUiState>(NewsFeedUiState.Loading)
}
}
// Flatten the feed flows.
// As the selected topics and topic state changes, this will cancel the old feed
// monitoring and start the new one.
.flatMapLatest { it }
.stateIn(
scope = viewModelScope,
started = SharingStarted.WhileSubscribed(5_000),
@ -147,19 +140,19 @@ class ForYouViewModel @Inject constructor(
)
val interestsSelectionState: StateFlow<ForYouInterestsSelectionUiState> =
combine(
followedInterestsUiState,
topicsRepository.getTopicsStream(),
authorsRepository.getAuthorsStream(),
snapshotFlow { inProgressTopicSelection },
snapshotFlow { inProgressAuthorSelection },
) { followedInterestsUserState, availableTopics, availableAuthors, inProgressTopicSelection,
inProgressAuthorSelection ->
when (followedInterestsUserState) {
Unknown -> ForYouInterestsSelectionUiState.Loading
is FollowedInterests -> ForYouInterestsSelectionUiState.NoInterestsSelection
None -> {
followedInterestsUiState.flatMapLatest { followedInterestsState ->
when (followedInterestsState) {
Unknown ->
flowOf(ForYouInterestsSelectionUiState.Loading)
is FollowedInterests ->
flowOf(ForYouInterestsSelectionUiState.NoInterestsSelection)
None -> combine(
topicsRepository.getTopicsStream(),
authorsRepository.getAuthorsStream(),
snapshotFlow { inProgressTopicSelection },
snapshotFlow { inProgressAuthorSelection },
) { availableTopics, availableAuthors, inProgressTopicSelection,
inProgressAuthorSelection ->
val topics = availableTopics.map { topic ->
FollowableTopic(
topic = topic,

Loading…
Cancel
Save