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
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import androidx.paging.cachedIn
import dagger.hilt.android.lifecycle.HiltViewModel
import gq.kirmanak.mealient.data.auth.AuthRepo
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
@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)
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" }
findNavController().navigate(
RecipesFragmentDirections.actionRecipesFragmentToRecipeInfoFragment(
recipeSlug = recipeSummaryEntity.slug,
recipeId = recipeSummaryEntity.remoteId
recipeSlug = recipeSummaryEntity.slug, recipeId = recipeSummaryEntity.remoteId
)
)
}
private fun setupRecipeAdapter() {
logger.v { "setupRecipeAdapter() called" }
val recipesAdapter = recipePagingAdapterFactory.build(
recipeImageLoader = recipeImageLoader,
clickListener = ::navigateToRecipeInfo
recipeImageLoader = recipeImageLoader, clickListener = ::navigateToRecipeInfo
)
with(binding.recipes) {
adapter = recipesAdapter
addOnScrollListener(recipePreloaderFactory.create(recipesAdapter))
}
collectWhenViewResumed(viewModel.pagingData) {
logger.v { "setupRecipeAdapter: received data update" }
recipesAdapter.submitData(lifecycle, it)
}
collectWhenViewResumed(recipesAdapter.onPagesUpdatedFlow) {
logger.v { "setupRecipeAdapter: pages updated" }
binding.refresher.isRefreshing = false
}
collectWhenViewResumed(binding.refresher.refreshRequestFlow(logger)) {
logger.v { "setupRecipeAdapter: received refresh request" }
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() {