mirror of
https://github.com/imcarlost/Friendlists.git
synced 2026-04-10 02:46:54 -04:00
Merge pull request #13 from hakodeveloper/fix-userlist-fragments
Fix Userlist Hierarchy
This commit is contained in:
@@ -0,0 +1,105 @@
|
|||||||
|
package com.hako.userlist.feature
|
||||||
|
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import android.view.View
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import androidx.fragment.app.Fragment
|
||||||
|
import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
|
import com.hako.base.domain.network.RequestStatus
|
||||||
|
import com.hako.base.extensions.gone
|
||||||
|
import com.hako.base.extensions.observeNonNull
|
||||||
|
import com.hako.base.extensions.visible
|
||||||
|
import com.hako.base.navigation.NavigationRouter
|
||||||
|
import com.hako.base.navigation.ShowFabButton
|
||||||
|
import com.hako.userlist.model.User
|
||||||
|
import com.hako.userlist.viewmodel.UserlistViewmodel
|
||||||
|
import com.hako.userlist.widget.UserlistAdapter
|
||||||
|
import com.hako.userlist.R
|
||||||
|
import com.hako.userlist.navigation.UserlistNavigation
|
||||||
|
import kotlinx.android.synthetic.main.fragment_userlist.*
|
||||||
|
import org.koin.android.ext.android.inject
|
||||||
|
import org.koin.androidx.viewmodel.ext.android.viewModel
|
||||||
|
import timber.log.Timber
|
||||||
|
|
||||||
|
abstract class BaseUserlistFragment : Fragment(), ShowFabButton {
|
||||||
|
|
||||||
|
val viewModel: UserlistViewmodel by viewModel()
|
||||||
|
private val listAdapter by lazy { UserlistAdapter() }
|
||||||
|
private val navigation: NavigationRouter by inject()
|
||||||
|
|
||||||
|
override fun onCreateView(
|
||||||
|
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
|
||||||
|
): View = inflater.inflate(R.layout.fragment_userlist, container, false)
|
||||||
|
|
||||||
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
|
super.onViewCreated(view, savedInstanceState)
|
||||||
|
setRecycler()
|
||||||
|
setObservers()
|
||||||
|
doRequest()
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract fun doRequest()
|
||||||
|
|
||||||
|
override fun fabButtonPressed(): () -> Unit = {
|
||||||
|
navigation.sendNavigation(UserlistNavigation.ClickedOnFab)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun setObservers() {
|
||||||
|
viewModel.userList.observeNonNull(this) {
|
||||||
|
it.either(::handleFetchError, ::handleFetchSuccess)
|
||||||
|
}
|
||||||
|
|
||||||
|
viewModel.requestStatus.observeNonNull(this) {
|
||||||
|
when (it) {
|
||||||
|
RequestStatus.Ready -> {
|
||||||
|
fragment_userlist_error_overlay.gone()
|
||||||
|
fragment_userlist_loading_overlay.gone()
|
||||||
|
fragment_userlist_empty_overlay.gone()
|
||||||
|
}
|
||||||
|
RequestStatus.Loading -> {
|
||||||
|
fragment_userlist_error_overlay.gone()
|
||||||
|
fragment_userlist_loading_overlay.visible()
|
||||||
|
fragment_userlist_empty_overlay.gone()
|
||||||
|
}
|
||||||
|
RequestStatus.Errored -> {
|
||||||
|
fragment_userlist_error_overlay.visible()
|
||||||
|
fragment_userlist_loading_overlay.gone()
|
||||||
|
fragment_userlist_empty_overlay.gone()
|
||||||
|
}
|
||||||
|
RequestStatus.Empty -> {
|
||||||
|
fragment_userlist_error_overlay.gone()
|
||||||
|
fragment_userlist_loading_overlay.gone()
|
||||||
|
fragment_userlist_empty_overlay.visible()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
viewModel.emptyMessage.observeNonNull(this) {
|
||||||
|
fragment_userlist_empty_overlay.setLabel(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun handleFetchError(throwable: Throwable) {
|
||||||
|
Timber.e(throwable)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun handleFetchSuccess(users: List<User>) {
|
||||||
|
listAdapter.addAll(users)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun setRecycler() {
|
||||||
|
fragment_userlist_recycler_container.apply {
|
||||||
|
layoutManager = LinearLayoutManager(context)
|
||||||
|
adapter = listAdapter.apply {
|
||||||
|
onItemClick = {
|
||||||
|
navigation.sendNavigation(UserlistNavigation.ClickedOnUser(it.id, it.realName))
|
||||||
|
}
|
||||||
|
|
||||||
|
onFavoriteClick = {
|
||||||
|
viewModel.updateUserFavoriteStatus(it.id, !it.isFavorite)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,9 +1,7 @@
|
|||||||
package com.hako.userlist.feature
|
package com.hako.userlist.feature
|
||||||
|
|
||||||
class FavoriteUserlistFragment : UserlistFragment() {
|
class FavoriteUserlistFragment : BaseUserlistFragment() {
|
||||||
override fun doRequest() {
|
override fun doRequest() = viewModel.fetchFavoriteUsers()
|
||||||
viewModel.fetchFavoriteUsers()
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun shouldShowFabButton() = false
|
override fun shouldShowFabButton() = false
|
||||||
}
|
}
|
||||||
@@ -1,109 +1,7 @@
|
|||||||
package com.hako.userlist.feature
|
package com.hako.userlist.feature
|
||||||
|
|
||||||
import android.os.Bundle
|
class UserlistFragment : BaseUserlistFragment() {
|
||||||
import android.view.LayoutInflater
|
override fun doRequest() = viewModel.fetchUsers()
|
||||||
import android.view.View
|
|
||||||
import android.view.ViewGroup
|
|
||||||
import androidx.fragment.app.Fragment
|
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager
|
|
||||||
import com.hako.base.domain.network.RequestStatus
|
|
||||||
import com.hako.base.extensions.gone
|
|
||||||
import com.hako.base.extensions.observeNonNull
|
|
||||||
import com.hako.base.extensions.visible
|
|
||||||
import com.hako.base.navigation.NavigationRouter
|
|
||||||
import com.hako.base.navigation.ShowFabButton
|
|
||||||
import com.hako.userlist.model.User
|
|
||||||
import com.hako.userlist.viewmodel.UserlistViewmodel
|
|
||||||
import com.hako.userlist.widget.UserlistAdapter
|
|
||||||
import com.hako.userlist.R
|
|
||||||
import com.hako.userlist.navigation.UserlistNavigation
|
|
||||||
import kotlinx.android.synthetic.main.fragment_userlist.*
|
|
||||||
import org.koin.android.ext.android.inject
|
|
||||||
import org.koin.androidx.viewmodel.ext.android.viewModel
|
|
||||||
import timber.log.Timber
|
|
||||||
|
|
||||||
open class UserlistFragment : Fragment(), ShowFabButton {
|
|
||||||
|
|
||||||
val viewModel: UserlistViewmodel by viewModel()
|
|
||||||
private val listAdapter by lazy { UserlistAdapter() }
|
|
||||||
private val navigation: NavigationRouter by inject()
|
|
||||||
|
|
||||||
override fun onCreateView(
|
|
||||||
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
|
|
||||||
): View = inflater.inflate(R.layout.fragment_userlist, container, false)
|
|
||||||
|
|
||||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
|
||||||
super.onViewCreated(view, savedInstanceState)
|
|
||||||
setRecycler()
|
|
||||||
setObservers()
|
|
||||||
doRequest()
|
|
||||||
}
|
|
||||||
|
|
||||||
open fun doRequest() {
|
|
||||||
viewModel.fetchUsers()
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun shouldShowFabButton() = true
|
override fun shouldShowFabButton() = true
|
||||||
|
|
||||||
override fun fabButtonPressed(): () -> Unit = {
|
|
||||||
navigation.sendNavigation(UserlistNavigation.ClickedOnFab)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun setObservers() {
|
|
||||||
viewModel.userList.observeNonNull(this) {
|
|
||||||
it.either(::handleFetchError, ::handleFetchSuccess)
|
|
||||||
}
|
|
||||||
|
|
||||||
viewModel.requestStatus.observeNonNull(this) {
|
|
||||||
when (it) {
|
|
||||||
RequestStatus.Ready -> {
|
|
||||||
fragment_userlist_error_overlay.gone()
|
|
||||||
fragment_userlist_loading_overlay.gone()
|
|
||||||
fragment_userlist_empty_overlay.gone()
|
|
||||||
}
|
|
||||||
RequestStatus.Loading -> {
|
|
||||||
fragment_userlist_error_overlay.gone()
|
|
||||||
fragment_userlist_loading_overlay.visible()
|
|
||||||
fragment_userlist_empty_overlay.gone()
|
|
||||||
}
|
|
||||||
RequestStatus.Errored -> {
|
|
||||||
fragment_userlist_error_overlay.visible()
|
|
||||||
fragment_userlist_loading_overlay.gone()
|
|
||||||
fragment_userlist_empty_overlay.gone()
|
|
||||||
}
|
|
||||||
RequestStatus.Empty -> {
|
|
||||||
fragment_userlist_error_overlay.gone()
|
|
||||||
fragment_userlist_loading_overlay.gone()
|
|
||||||
fragment_userlist_empty_overlay.visible()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
viewModel.emptyMessage.observeNonNull(this) {
|
|
||||||
fragment_userlist_empty_overlay.setLabel(it)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun handleFetchError(throwable: Throwable) {
|
|
||||||
Timber.e(throwable)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun handleFetchSuccess(users: List<User>) {
|
|
||||||
listAdapter.addAll(users)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun setRecycler() {
|
|
||||||
fragment_userlist_recycler_container.apply {
|
|
||||||
layoutManager = LinearLayoutManager(context)
|
|
||||||
adapter = listAdapter.apply {
|
|
||||||
onItemClick = {
|
|
||||||
navigation.sendNavigation(UserlistNavigation.ClickedOnUser(it.id, it.realName))
|
|
||||||
}
|
|
||||||
|
|
||||||
onFavoriteClick = {
|
|
||||||
viewModel.updateUserFavoriteStatus(it.id, !it.isFavorite)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user