Merge branch 'master' into feature/group-item-decorator
This commit is contained in:
commit
2b191c97ef
|
|
@ -0,0 +1,3 @@
|
|||
package ru.touchin.roboswag.pagination
|
||||
|
||||
object ErrorItem
|
||||
|
|
@ -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()
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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>() {
|
||||
|
|
|
|||
|
|
@ -1,3 +1,3 @@
|
|||
package ru.touchin.mvi_test.core_ui.pagination
|
||||
package ru.touchin.roboswag.pagination
|
||||
|
||||
object ProgressItem
|
||||
|
|
|
|||
Loading…
Reference in New Issue