Merge branch 'master' into feature/group-item-decorator

This commit is contained in:
Stanisalv 2020-08-27 12:01:18 +03:00
commit 2b191c97ef
6 changed files with 56 additions and 25 deletions

View File

@ -0,0 +1,3 @@
package ru.touchin.roboswag.pagination
object ErrorItem

View File

@ -5,7 +5,6 @@ import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView
import ru.touchin.roboswag.recyclerview_adapters.adapters.AdapterDelegate
import ru.touchin.roboswag.recyclerview_adapters.adapters.DelegationListAdapter
import ru.touchin.mvi_test.core_ui.pagination.ProgressItem
class PaginationAdapter(
private val nextPageCallback: () -> Unit,
@ -27,8 +26,12 @@ class PaginationAdapter(
delegate.forEach(this::addDelegate)
}
fun update(data: List<Any>, isPageProgress: Boolean) {
submitList(data + listOfNotNull(ProgressItem.takeIf { isPageProgress }))
fun update(data: List<Any>, updateState: UpdateState) {
submitList(data + listOfNotNull(when (updateState) {
is UpdateState.Common -> null
is UpdateState.Progress -> ProgressItem
is UpdateState.Error -> ErrorItem
}))
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int, payloads: List<Any>) {
@ -36,4 +39,10 @@ class PaginationAdapter(
if (!fullData && position >= itemCount - 10) nextPageCallback.invoke()
}
sealed class UpdateState {
object Common : UpdateState()
object Progress : UpdateState()
object Error : UpdateState()
}
}

View File

@ -7,7 +7,6 @@ import android.widget.FrameLayout
import androidx.recyclerview.widget.StaggeredGridLayoutManager
import ru.touchin.extensions.setOnRippleClickListener
import ru.touchin.mvi_arch.core_pagination.databinding.ViewPaginationBinding
import ru.touchin.mvi_test.core_ui.pagination.Paginator
// TODO: add an errorview with empty state and error text
class PaginationView @JvmOverloads constructor(
@ -48,26 +47,20 @@ class PaginationView @JvmOverloads constructor(
adapter.fullData = state === Paginator.State.Empty || state is Paginator.State.FullData<*>
when (state) {
is Paginator.State.Empty -> {
adapter.update(emptyList(), false)
}
is Paginator.State.EmptyProgress -> {
adapter.update(emptyList(), false)
}
is Paginator.State.EmptyError -> {
adapter.update(emptyList(), false)
is Paginator.State.EmptyError, Paginator.State.Empty, Paginator.State.EmptyProgress -> {
adapter.update(emptyList(), PaginationAdapter.UpdateState.Common)
}
is Paginator.State.Data<*> -> {
adapter.update(state.data as List<Any>, false)
adapter.update(state.data as List<Any>, PaginationAdapter.UpdateState.Common)
}
is Paginator.State.Refresh<*> -> {
adapter.update(state.data as List<Any>, false)
adapter.update(state.data as List<Any>, PaginationAdapter.UpdateState.Common)
}
is Paginator.State.NewPageProgress<*> -> {
adapter.update(state.data as List<Any>, true)
adapter.update(state.data as List<Any>, PaginationAdapter.UpdateState.Progress)
}
is Paginator.State.FullData<*> -> {
adapter.update(state.data as List<Any>, false)
adapter.update(state.data as List<Any>, PaginationAdapter.UpdateState.Common)
}
}
}

View File

@ -1,4 +1,4 @@
package ru.touchin.mvi_test.core_ui.pagination
package ru.touchin.roboswag.pagination
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flatMapLatest
@ -9,7 +9,7 @@ import ru.touchin.roboswag.mvi_arch.marker.StateChange
import ru.touchin.roboswag.mvi_arch.marker.ViewState
class Paginator<Item>(
private val showError: (Error) -> Unit,
private val errorHandleMod: ErrorHandleMod,
private val loadPage: suspend (Int) -> List<Item>
) : Store<Paginator.Change, Paginator.Effect, Paginator.State>(State.Empty) {
@ -30,7 +30,7 @@ class Paginator<Item>(
object Empty : State()
object EmptyProgress : State()
data class EmptyError(val error: Throwable) : State()
data class Data<T>(val pageCount: Int = 0, val data: List<T>) : State()
data class Data<T>(val pageCount: Int = 0, val data: List<T>, val error: Throwable? = null) : State()
data class Refresh<T>(val pageCount: Int, val data: List<T>) : State()
data class NewPageProgress<T>(val pageCount: Int, val data: List<T>) : State()
data class FullData<T>(val pageCount: Int, val data: List<T>) : State()
@ -41,6 +41,11 @@ class Paginator<Item>(
object RefreshFailed : Error()
}
sealed class ErrorHandleMod {
data class Alert(val showError: (Error) -> Unit) : ErrorHandleMod()
object ErrorItem : ErrorHandleMod()
}
override fun reduce(currentState: State, change: Change): Pair<State, Effect?> = when (change) {
Change.Refresh -> {
when (currentState) {
@ -97,12 +102,34 @@ class Paginator<Item>(
when (currentState) {
is State.EmptyProgress -> State.EmptyError(change.error)
is State.Refresh<*> -> {
showError(Error.RefreshFailed)
State.Data(currentState.pageCount, currentState.data)
when (errorHandleMod) {
is ErrorHandleMod.Alert -> {
errorHandleMod.showError(Error.RefreshFailed)
State.Data(currentState.pageCount, currentState.data)
}
is ErrorHandleMod.ErrorItem -> {
State.Data(
pageCount = currentState.pageCount,
data = currentState.data,
error = change.error
)
}
}
}
is State.NewPageProgress<*> -> {
showError(Error.NewPageFailed)
State.Data(currentState.pageCount, currentState.data)
when (errorHandleMod) {
is ErrorHandleMod.Alert -> {
errorHandleMod.showError(Error.NewPageFailed)
State.Data(currentState.pageCount, currentState.data)
}
is ErrorHandleMod.ErrorItem -> {
State.Data(
pageCount = currentState.pageCount,
data = currentState.data,
error = change.error
)
}
}
}
else -> currentState
}.only()

View File

@ -4,7 +4,6 @@ import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import ru.touchin.roboswag.recyclerview_adapters.adapters.ItemAdapterDelegate
import ru.touchin.mvi_arch.core_pagination.R
import ru.touchin.mvi_test.core_ui.pagination.ProgressItem
import ru.touchin.roboswag.components.utils.UiUtils
class ProgressAdapterDelegate : ItemAdapterDelegate<RecyclerView.ViewHolder, ProgressItem>() {

View File

@ -1,3 +1,3 @@
package ru.touchin.mvi_test.core_ui.pagination
package ru.touchin.roboswag.pagination
object ProgressItem