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 8a0cb9a..a2f456e 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.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, 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..d6d686a 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( @@ -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, false) + adapter.update(state.data as List, PaginationAdapter.UpdateState.Common) } is Paginator.State.Refresh<*> -> { - adapter.update(state.data as List, false) + adapter.update(state.data as List, PaginationAdapter.UpdateState.Common) } is Paginator.State.NewPageProgress<*> -> { - adapter.update(state.data as List, true) + adapter.update(state.data as List, PaginationAdapter.UpdateState.Progress) } is Paginator.State.FullData<*> -> { - adapter.update(state.data as List, false) + adapter.update(state.data as List, PaginationAdapter.UpdateState.Common) } } } 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..164cad6 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) { @@ -30,7 +30,7 @@ class Paginator( object Empty : State() object EmptyProgress : State() data class EmptyError(val error: Throwable) : State() - data class Data(val pageCount: Int = 0, val data: List) : State() + data class Data(val pageCount: Int = 0, val data: List, val error: Throwable? = null) : State() data class Refresh(val pageCount: Int, val data: List) : State() data class NewPageProgress(val pageCount: Int, val data: List) : State() data class FullData(val pageCount: Int, val data: List) : State() @@ -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,34 @@ 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( + 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() 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 322cfd1..f9b148c 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.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() { 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