|
|
|
@ -19,33 +19,34 @@ package com.google.samples.apps.nowinandroid.feature.interests
|
|
|
|
|
import androidx.lifecycle.SavedStateHandle
|
|
|
|
|
import androidx.lifecycle.ViewModel
|
|
|
|
|
import androidx.lifecycle.viewModelScope
|
|
|
|
|
import androidx.navigation.toRoute
|
|
|
|
|
import com.google.samples.apps.nowinandroid.core.data.repository.UserDataRepository
|
|
|
|
|
import com.google.samples.apps.nowinandroid.core.domain.GetFollowableTopicsUseCase
|
|
|
|
|
import com.google.samples.apps.nowinandroid.core.domain.TopicSortField
|
|
|
|
|
import com.google.samples.apps.nowinandroid.core.model.data.FollowableTopic
|
|
|
|
|
import com.google.samples.apps.nowinandroid.feature.interests.navigation.InterestsDestination
|
|
|
|
|
import com.google.samples.apps.nowinandroid.feature.interests.navigation.TOPIC_ID_ARG
|
|
|
|
|
import dagger.hilt.android.lifecycle.HiltViewModel
|
|
|
|
|
import kotlinx.coroutines.flow.SharingStarted
|
|
|
|
|
import kotlinx.coroutines.flow.StateFlow
|
|
|
|
|
import kotlinx.coroutines.flow.combine
|
|
|
|
|
import kotlinx.coroutines.flow.map
|
|
|
|
|
import kotlinx.coroutines.flow.stateIn
|
|
|
|
|
import kotlinx.coroutines.launch
|
|
|
|
|
import javax.inject.Inject
|
|
|
|
|
|
|
|
|
|
@HiltViewModel
|
|
|
|
|
class InterestsViewModel @Inject constructor(
|
|
|
|
|
private val savedStateHandle: SavedStateHandle,
|
|
|
|
|
savedStateHandle: SavedStateHandle,
|
|
|
|
|
val userDataRepository: UserDataRepository,
|
|
|
|
|
getFollowableTopics: GetFollowableTopicsUseCase,
|
|
|
|
|
) : ViewModel() {
|
|
|
|
|
|
|
|
|
|
val selectedTopicId: StateFlow<String?> = savedStateHandle.getStateFlow(TOPIC_ID_ARG, null)
|
|
|
|
|
private val interestsDestination : InterestsDestination = savedStateHandle.toRoute()
|
|
|
|
|
|
|
|
|
|
val uiState: StateFlow<InterestsUiState> = combine(
|
|
|
|
|
selectedTopicId,
|
|
|
|
|
getFollowableTopics(sortBy = TopicSortField.NAME),
|
|
|
|
|
InterestsUiState::Interests,
|
|
|
|
|
).stateIn(
|
|
|
|
|
val uiState: StateFlow<InterestsUiState> =
|
|
|
|
|
getFollowableTopics(sortBy = TopicSortField.NAME).map { topics ->
|
|
|
|
|
InterestsUiState.Interests(interestsDestination.topicId, topics)
|
|
|
|
|
}.stateIn(
|
|
|
|
|
scope = viewModelScope,
|
|
|
|
|
started = SharingStarted.WhileSubscribed(5_000),
|
|
|
|
|
initialValue = InterestsUiState.Loading,
|
|
|
|
@ -56,10 +57,6 @@ class InterestsViewModel @Inject constructor(
|
|
|
|
|
userDataRepository.setTopicIdFollowed(followedTopicId, followed)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fun onTopicClick(topicId: String?) {
|
|
|
|
|
savedStateHandle[TOPIC_ID_ARG] = topicId
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sealed interface InterestsUiState {
|
|
|
|
|