From 4a48d2ceef8fc5329658580b94588c9f337d5784 Mon Sep 17 00:00:00 2001 From: Stanisalv Date: Wed, 26 Aug 2020 18:14:30 +0300 Subject: [PATCH 1/3] Paginator error handle mod Paginator error handle mod --- .../touchin/roboswag/pagination/ErrorItem.kt | 3 ++ .../roboswag/pagination/PaginationAdapter.kt | 15 +++++++-- .../roboswag/pagination/PaginationView.kt | 1 - .../touchin/roboswag/pagination/Paginator.kt | 31 +++++++++++++++---- .../pagination/ProgressAdapterDelegate.kt | 1 - .../roboswag/pagination/ProgressItem.kt | 2 +- 6 files changed, 41 insertions(+), 12 deletions(-) create mode 100644 pagination/src/main/java/ru/touchin/roboswag/pagination/ErrorItem.kt 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 From 313481500aa50e30ac896d2d08af6942e4903c4e Mon Sep 17 00:00:00 2001 From: Stanisalv Date: Wed, 26 Aug 2020 20:21:04 +0300 Subject: [PATCH 2/3] return lost commit --- .../touchin/roboswag/pagination/PaginationView.kt | 14 +++++++------- .../ru/touchin/roboswag/pagination/Paginator.kt | 14 +++++++++++--- 2 files changed, 18 insertions(+), 10 deletions(-) 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 b206ce4..e31018f 100644 --- a/pagination/src/main/java/ru/touchin/roboswag/pagination/PaginationView.kt +++ b/pagination/src/main/java/ru/touchin/roboswag/pagination/PaginationView.kt @@ -48,25 +48,25 @@ class PaginationView @JvmOverloads constructor( when (state) { is Paginator.State.Empty -> { - adapter.update(emptyList(), false) + adapter.update(emptyList(), PaginationAdapter.UpdateState.Common) } is Paginator.State.EmptyProgress -> { - adapter.update(emptyList(), false) + adapter.update(emptyList(), PaginationAdapter.UpdateState.Common) } is Paginator.State.EmptyError -> { - adapter.update(emptyList(), false) + 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 a20340e..164cad6 100644 --- a/pagination/src/main/java/ru/touchin/roboswag/pagination/Paginator.kt +++ b/pagination/src/main/java/ru/touchin/roboswag/pagination/Paginator.kt @@ -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() @@ -108,7 +108,11 @@ class Paginator( State.Data(currentState.pageCount, currentState.data) } is ErrorHandleMod.ErrorItem -> { - State.Data(currentState.pageCount, currentState.data + ErrorItem) + State.Data( + pageCount = currentState.pageCount, + data = currentState.data, + error = change.error + ) } } } @@ -119,7 +123,11 @@ class Paginator( State.Data(currentState.pageCount, currentState.data) } is ErrorHandleMod.ErrorItem -> { - State.Data(currentState.pageCount, currentState.data + ErrorItem) + State.Data( + pageCount = currentState.pageCount, + data = currentState.data, + error = change.error + ) } } } From 784fd3d8f3d47a40594a597b9825e763611ba735 Mon Sep 17 00:00:00 2001 From: Stanisalv Date: Thu, 27 Aug 2020 09:57:58 +0300 Subject: [PATCH 3/3] fix when block in PaginationView fix when block in PaginationView --- .../java/ru/touchin/roboswag/pagination/PaginationView.kt | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) 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 e31018f..d6d686a 100644 --- a/pagination/src/main/java/ru/touchin/roboswag/pagination/PaginationView.kt +++ b/pagination/src/main/java/ru/touchin/roboswag/pagination/PaginationView.kt @@ -47,13 +47,7 @@ class PaginationView @JvmOverloads constructor( adapter.fullData = state === Paginator.State.Empty || state is Paginator.State.FullData<*> when (state) { - is Paginator.State.Empty -> { - adapter.update(emptyList(), PaginationAdapter.UpdateState.Common) - } - is Paginator.State.EmptyProgress -> { - adapter.update(emptyList(), PaginationAdapter.UpdateState.Common) - } - is Paginator.State.EmptyError -> { + is Paginator.State.EmptyError, Paginator.State.Empty, Paginator.State.EmptyProgress -> { adapter.update(emptyList(), PaginationAdapter.UpdateState.Common) } is Paginator.State.Data<*> -> {