Request recipes on successful authorization

This commit is contained in:
Kirill Kamakin
2022-11-04 21:30:52 +01:00
parent e0780e9a9f
commit 714ff7d33f
2 changed files with 44 additions and 5 deletions

View File

@@ -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)
}
} }

View File

@@ -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() {