diff --git a/app/src/main/java/gq/kirmanak/mealient/ui/recipes/RecipeViewModel.kt b/app/src/main/java/gq/kirmanak/mealient/ui/recipes/RecipeViewModel.kt index b621488..998af6d 100644 --- a/app/src/main/java/gq/kirmanak/mealient/ui/recipes/RecipeViewModel.kt +++ b/app/src/main/java/gq/kirmanak/mealient/ui/recipes/RecipeViewModel.kt @@ -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(null) + val isAuthorized: LiveData = _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) + } } \ No newline at end of file diff --git a/app/src/main/java/gq/kirmanak/mealient/ui/recipes/RecipesFragment.kt b/app/src/main/java/gq/kirmanak/mealient/ui/recipes/RecipesFragment.kt index d775212..38e19d2 100644 --- a/app/src/main/java/gq/kirmanak/mealient/ui/recipes/RecipesFragment.kt +++ b/app/src/main/java/gq/kirmanak/mealient/ui/recipes/RecipesFragment.kt @@ -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() {