Yuito-app-android/app/src/main/java/com/keylesspalace/tusky/components/domainblocks/DomainBlocksFragment.kt

109 lines
4.1 KiB
Kotlin

package com.keylesspalace.tusky.components.domainblocks
import android.os.Bundle
import android.util.Log
import android.view.View
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.lifecycle.lifecycleScope
import androidx.paging.LoadState
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager
import com.google.android.material.snackbar.Snackbar
import com.keylesspalace.tusky.R
import com.keylesspalace.tusky.databinding.FragmentDomainBlocksBinding
import com.keylesspalace.tusky.di.Injectable
import com.keylesspalace.tusky.di.ViewModelFactory
import com.keylesspalace.tusky.util.hide
import com.keylesspalace.tusky.util.show
import com.keylesspalace.tusky.util.viewBinding
import com.keylesspalace.tusky.util.visible
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
import javax.inject.Inject
class DomainBlocksFragment : Fragment(R.layout.fragment_domain_blocks), Injectable {
@Inject
lateinit var viewModelFactory: ViewModelFactory
private val binding by viewBinding(FragmentDomainBlocksBinding::bind)
private val viewModel: DomainBlocksViewModel by viewModels { viewModelFactory }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
val adapter = DomainBlocksAdapter(viewModel::unblock)
binding.recyclerView.setHasFixedSize(true)
binding.recyclerView.addItemDecoration(DividerItemDecoration(view.context, DividerItemDecoration.VERTICAL))
binding.recyclerView.adapter = adapter
binding.recyclerView.layoutManager = LinearLayoutManager(view.context)
viewLifecycleOwner.lifecycleScope.launch {
viewModel.uiEvents.collect { event ->
when (event) {
is DomainBlockEvent.UnblockError -> showUnmuteError(event.domain)
is DomainBlockEvent.BlockError -> showMuteError(event.domain)
is DomainBlockEvent.BlockSuccess -> showUnmuteSuccess(event.domain)
}
}
}
lifecycleScope.launch {
viewModel.pager.collectLatest { pagingData ->
adapter.submitData(pagingData)
}
}
adapter.addLoadStateListener { loadState ->
binding.progressBar.visible(loadState.refresh == LoadState.Loading && adapter.itemCount == 0)
if (loadState.refresh is LoadState.Error) {
binding.recyclerView.hide()
binding.messageView.show()
val errorState = loadState.refresh as LoadState.Error
binding.messageView.setup(errorState.error) { adapter.retry() }
Log.w(TAG, "error loading blocked domains", errorState.error)
} else if (loadState.refresh is LoadState.NotLoading && adapter.itemCount == 0) {
binding.recyclerView.hide()
binding.messageView.show()
binding.messageView.setup(R.drawable.elephant_friend_empty, R.string.message_empty)
} else {
binding.recyclerView.show()
binding.messageView.hide()
}
}
}
private fun showUnmuteError(domain: String) {
showSnackbar(
getString(R.string.error_unblocking_domain, domain),
R.string.action_retry
) { viewModel.unblock(domain) }
}
private fun showMuteError(domain: String) {
showSnackbar(
getString(R.string.error_blocking_domain, domain),
R.string.action_retry
) { viewModel.block(domain) }
}
private fun showUnmuteSuccess(domain: String) {
showSnackbar(
getString(R.string.confirmation_domain_unmuted, domain),
R.string.action_undo
) { viewModel.block(domain) }
}
private fun showSnackbar(message: String, actionText: Int, action: (View) -> Unit) {
Snackbar.make(binding.recyclerView, message, Snackbar.LENGTH_LONG)
.setAction(actionText, action)
.show()
}
companion object {
private const val TAG = "DomainBlocksFragment"
}
}