Ismoil Foziljonov
03/27/2022, 1:10 PMpackage me.ismoil.rickandmorty.ui.screens.characters
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.View
import android.widget.Toast
import androidx.core.view.isVisible
import androidx.fragment.app.viewModels
import androidx.lifecycle.lifecycleScope
import androidx.navigation.fragment.FragmentNavigatorExtras
import androidx.navigation.fragment.findNavController
import androidx.paging.LoadState
import androidx.paging.LoadStateAdapter
import by.kirich1409.viewbindingdelegate.viewBinding
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
import me.ismoil.rickandmorty.R
import me.ismoil.rickandmorty.common.Resource
import me.ismoil.rickandmorty.databinding.FragmentCharacterBinding
import me.ismoil.rickandmorty.databinding.ItemLayoutCharacterBinding
import me.ismoil.rickandmorty.domain.model.Character
import me.ismoil.rickandmorty.utils.PagingLoadStateAdapter
import javax.inject.Inject
@AndroidEntryPoint
class CharacterFragment : Fragment(R.layout.fragment_character) {
private val binding by viewBinding(FragmentCharacterBinding::bind)
private val viewModel: CharacterViewModel by viewModels()
private val navController by lazy(LazyThreadSafetyMode.NONE) { findNavController() }
@Inject lateinit var charactersAdapter: CharactersAdapter
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
setUpRV()
observers()
}
private fun observers() {
lifecycleScope.launch {
viewModel.charactersFlow.collect{ result ->
when (result) {
is Resource.Success -> {
result.data?.collectLatest {
charactersAdapter.submitData(it)
}
}
is Resource.Error -> {
Toast.makeText(context, result.message ?: "", Toast.LENGTH_SHORT).show()
}
}
}
}
}
private fun setUpRV() {
binding.rv.adapter = charactersAdapter.withLoadStateHeaderAndFooter(
header = PagingLoadStateAdapter(this::retry),
footer = PagingLoadStateAdapter(this::retry),
)
binding.rv.apply {
postponeEnterTransition()
viewTreeObserver.addOnPreDrawListener {
startPostponedEnterTransition()
true
}
}
charactersAdapter.setOnClickListener { character ->
openDetailsPage(character)
}
lifecycleScope.launch {
charactersAdapter.loadStateFlow.collectLatest { loadState ->
binding.progressBar.root.isVisible = loadState.refresh is LoadState.Loading
}
}
}
private fun retry() {
charactersAdapter.retry()
}
private fun openDetailsPage(character: Character) {
navController.navigate(CharacterFragmentDirections.actionCharacterFragmentToCharacterDetailsFragment(character))
}
override fun onDestroyView() {
// charactersAdapter = null
super.onDestroyView()
}
}