diff --git a/pagination/src/main/java/ru/touchin/roboswag/pagination/ErrorItem.kt b/pagination/src/main/java/ru/touchin/roboswag/pagination/ErrorItem.kt new file mode 100644 index 0000000..cb5db29 --- /dev/null +++ b/pagination/src/main/java/ru/touchin/roboswag/pagination/ErrorItem.kt @@ -0,0 +1,3 @@ +package ru.touchin.roboswag.pagination + +object ErrorItem diff --git a/pagination/src/main/java/ru/touchin/roboswag/pagination/PaginationAdapter.kt b/pagination/src/main/java/ru/touchin/roboswag/pagination/PaginationAdapter.kt index 13b8d37..202790a 100644 --- a/pagination/src/main/java/ru/touchin/roboswag/pagination/PaginationAdapter.kt +++ b/pagination/src/main/java/ru/touchin/roboswag/pagination/PaginationAdapter.kt @@ -5,7 +5,6 @@ import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.RecyclerView import ru.touchin.adapters.AdapterDelegate import ru.touchin.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, isPageProgress: Boolean) { - submitList(data + listOfNotNull(ProgressItem.takeIf { isPageProgress })) + fun update(data: List, 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) { @@ -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() + } + } diff --git a/pagination/src/main/java/ru/touchin/roboswag/pagination/PaginationView.kt b/pagination/src/main/java/ru/touchin/roboswag/pagination/PaginationView.kt index 7311245..b206ce4 100644 --- a/pagination/src/main/java/ru/touchin/roboswag/pagination/PaginationView.kt +++ b/pagination/src/main/java/ru/touchin/roboswag/pagination/PaginationView.kt @@ -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( diff --git a/pagination/src/main/java/ru/touchin/roboswag/pagination/Paginator.kt b/pagination/src/main/java/ru/touchin/roboswag/pagination/Paginator.kt index 7081d8e..a20340e 100644 --- a/pagination/src/main/java/ru/touchin/roboswag/pagination/Paginator.kt +++ b/pagination/src/main/java/ru/touchin/roboswag/pagination/Paginator.kt @@ -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( - private val showError: (Error) -> Unit, + private val errorHandleMod: ErrorHandleMod, private val loadPage: suspend (Int) -> List ) : Store(State.Empty) { @@ -41,6 +41,11 @@ class Paginator( 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 = when (change) { Change.Refresh -> { when (currentState) { @@ -97,12 +102,26 @@ class Paginator( 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(currentState.pageCount, currentState.data + ErrorItem) + } + } } 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(currentState.pageCount, currentState.data + ErrorItem) + } + } } else -> currentState }.only() diff --git a/pagination/src/main/java/ru/touchin/roboswag/pagination/ProgressAdapterDelegate.kt b/pagination/src/main/java/ru/touchin/roboswag/pagination/ProgressAdapterDelegate.kt index 093ddfe..edc29c2 100644 --- a/pagination/src/main/java/ru/touchin/roboswag/pagination/ProgressAdapterDelegate.kt +++ b/pagination/src/main/java/ru/touchin/roboswag/pagination/ProgressAdapterDelegate.kt @@ -4,7 +4,6 @@ import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import ru.touchin.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() { diff --git a/pagination/src/main/java/ru/touchin/roboswag/pagination/ProgressItem.kt b/pagination/src/main/java/ru/touchin/roboswag/pagination/ProgressItem.kt index 7e46cec..ffcc5fb 100644 --- a/pagination/src/main/java/ru/touchin/roboswag/pagination/ProgressItem.kt +++ b/pagination/src/main/java/ru/touchin/roboswag/pagination/ProgressItem.kt @@ -1,3 +1,3 @@ -package ru.touchin.mvi_test.core_ui.pagination +package ru.touchin.roboswag.pagination object ProgressItem