Request recipes on successful authorization
This commit is contained in:
@@ -1,15 +1,42 @@
|
|||||||
package gq.kirmanak.mealient.ui.recipes
|
package gq.kirmanak.mealient.ui.recipes
|
||||||
|
|
||||||
|
import androidx.lifecycle.LiveData
|
||||||
|
import androidx.lifecycle.MutableLiveData
|
||||||
import androidx.lifecycle.ViewModel
|
import androidx.lifecycle.ViewModel
|
||||||
import androidx.lifecycle.viewModelScope
|
import androidx.lifecycle.viewModelScope
|
||||||
import androidx.paging.cachedIn
|
import androidx.paging.cachedIn
|
||||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||||
|
import gq.kirmanak.mealient.data.auth.AuthRepo
|
||||||
import gq.kirmanak.mealient.data.recipes.RecipeRepo
|
import gq.kirmanak.mealient.data.recipes.RecipeRepo
|
||||||
|
import gq.kirmanak.mealient.logging.Logger
|
||||||
|
import kotlinx.coroutines.flow.launchIn
|
||||||
|
import kotlinx.coroutines.flow.runningReduce
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
@HiltViewModel
|
@HiltViewModel
|
||||||
class RecipeViewModel @Inject constructor(recipeRepo: RecipeRepo) : ViewModel() {
|
class RecipeViewModel @Inject constructor(
|
||||||
|
recipeRepo: RecipeRepo,
|
||||||
|
authRepo: AuthRepo,
|
||||||
|
private val logger: Logger,
|
||||||
|
) : ViewModel() {
|
||||||
|
|
||||||
val pagingData = recipeRepo.createPager().flow.cachedIn(viewModelScope)
|
val pagingData = recipeRepo.createPager().flow.cachedIn(viewModelScope)
|
||||||
|
|
||||||
|
private val _isAuthorized = MutableLiveData<Boolean?>(null)
|
||||||
|
val isAuthorized: LiveData<Boolean?> = _isAuthorized
|
||||||
|
|
||||||
|
init {
|
||||||
|
authRepo.isAuthorizedFlow.runningReduce { wasAuthorized, isAuthorized ->
|
||||||
|
logger.v { "Authorization state changed from $wasAuthorized to $isAuthorized" }
|
||||||
|
if (wasAuthorized != isAuthorized) {
|
||||||
|
_isAuthorized.postValue(isAuthorized)
|
||||||
|
}
|
||||||
|
isAuthorized
|
||||||
|
}.launchIn(viewModelScope)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun onAuthorizationChangeHandled() {
|
||||||
|
logger.v { "onAuthorizationSuccessHandled() called" }
|
||||||
|
_isAuthorized.postValue(null)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -51,34 +51,46 @@ class RecipesFragment : Fragment(R.layout.fragment_recipes) {
|
|||||||
logger.v { "navigateToRecipeInfo() called with: recipeSummaryEntity = $recipeSummaryEntity" }
|
logger.v { "navigateToRecipeInfo() called with: recipeSummaryEntity = $recipeSummaryEntity" }
|
||||||
findNavController().navigate(
|
findNavController().navigate(
|
||||||
RecipesFragmentDirections.actionRecipesFragmentToRecipeInfoFragment(
|
RecipesFragmentDirections.actionRecipesFragmentToRecipeInfoFragment(
|
||||||
recipeSlug = recipeSummaryEntity.slug,
|
recipeSlug = recipeSummaryEntity.slug, recipeId = recipeSummaryEntity.remoteId
|
||||||
recipeId = recipeSummaryEntity.remoteId
|
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun setupRecipeAdapter() {
|
private fun setupRecipeAdapter() {
|
||||||
logger.v { "setupRecipeAdapter() called" }
|
logger.v { "setupRecipeAdapter() called" }
|
||||||
|
|
||||||
val recipesAdapter = recipePagingAdapterFactory.build(
|
val recipesAdapter = recipePagingAdapterFactory.build(
|
||||||
recipeImageLoader = recipeImageLoader,
|
recipeImageLoader = recipeImageLoader, clickListener = ::navigateToRecipeInfo
|
||||||
clickListener = ::navigateToRecipeInfo
|
|
||||||
)
|
)
|
||||||
|
|
||||||
with(binding.recipes) {
|
with(binding.recipes) {
|
||||||
adapter = recipesAdapter
|
adapter = recipesAdapter
|
||||||
addOnScrollListener(recipePreloaderFactory.create(recipesAdapter))
|
addOnScrollListener(recipePreloaderFactory.create(recipesAdapter))
|
||||||
}
|
}
|
||||||
|
|
||||||
collectWhenViewResumed(viewModel.pagingData) {
|
collectWhenViewResumed(viewModel.pagingData) {
|
||||||
logger.v { "setupRecipeAdapter: received data update" }
|
logger.v { "setupRecipeAdapter: received data update" }
|
||||||
recipesAdapter.submitData(lifecycle, it)
|
recipesAdapter.submitData(lifecycle, it)
|
||||||
}
|
}
|
||||||
|
|
||||||
collectWhenViewResumed(recipesAdapter.onPagesUpdatedFlow) {
|
collectWhenViewResumed(recipesAdapter.onPagesUpdatedFlow) {
|
||||||
logger.v { "setupRecipeAdapter: pages updated" }
|
logger.v { "setupRecipeAdapter: pages updated" }
|
||||||
binding.refresher.isRefreshing = false
|
binding.refresher.isRefreshing = false
|
||||||
}
|
}
|
||||||
|
|
||||||
collectWhenViewResumed(binding.refresher.refreshRequestFlow(logger)) {
|
collectWhenViewResumed(binding.refresher.refreshRequestFlow(logger)) {
|
||||||
logger.v { "setupRecipeAdapter: received refresh request" }
|
logger.v { "setupRecipeAdapter: received refresh request" }
|
||||||
recipesAdapter.refresh()
|
recipesAdapter.refresh()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
viewModel.isAuthorized.observe(viewLifecycleOwner) { isAuthorized ->
|
||||||
|
logger.v { "setupRecipeAdapter: isAuthorized changed to $isAuthorized" }
|
||||||
|
if (isAuthorized != null) {
|
||||||
|
if (isAuthorized) recipesAdapter.refresh()
|
||||||
|
// else is ignored to avoid the removal of the non-public recipes
|
||||||
|
viewModel.onAuthorizationChangeHandled()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onDestroyView() {
|
override fun onDestroyView() {
|
||||||
|
|||||||
Reference in New Issue
Block a user