Properly handle Loading state: button were still active... Also finish the work on the controller
This commit is contained in:
parent
ecf3fee709
commit
f4108ae0eb
@ -52,6 +52,7 @@ class ReviewTermsActivity : SimpleFragmentActivity() {
|
||||
|
||||
reviewTermsViewModel.observeViewEvents {
|
||||
when (it) {
|
||||
is ReviewTermsViewEvents.Loading -> Unit
|
||||
is ReviewTermsViewEvents.Failure -> {
|
||||
AlertDialog.Builder(this)
|
||||
.setMessage(errorFormatter.toHumanReadable(it.throwable))
|
||||
|
@ -58,8 +58,8 @@ class ReviewTermsFragment @Inject constructor(
|
||||
|
||||
reviewTermsViewModel.observeViewEvents {
|
||||
when (it) {
|
||||
is ReviewTermsViewEvents.Loading -> showLoading(it.message)
|
||||
is ReviewTermsViewEvents.Failure -> {
|
||||
reviewTermsWaitOverlay.isVisible = false
|
||||
// Dialog is displayed by the Activity
|
||||
}
|
||||
ReviewTermsViewEvents.Success -> {
|
||||
@ -83,29 +83,22 @@ class ReviewTermsFragment @Inject constructor(
|
||||
}
|
||||
|
||||
override fun invalidate() = withState(reviewTermsViewModel) { state ->
|
||||
termsController.setData(state)
|
||||
|
||||
when (state.termsList) {
|
||||
is Loading -> {
|
||||
reviewTermsBottomBar.isVisible = false
|
||||
reviewTermsWaitOverlay.isVisible = true
|
||||
}
|
||||
is Success -> {
|
||||
updateState(state.termsList.invoke())
|
||||
reviewTermsWaitOverlay.isVisible = false
|
||||
reviewTermsBottomBar.isVisible = true
|
||||
reviewTermsAccept.isEnabled = state.termsList.invoke().all { it.accepted }
|
||||
}
|
||||
else -> {
|
||||
reviewTermsWaitOverlay.isVisible = false
|
||||
}
|
||||
}
|
||||
|
||||
if (!reviewTermsWaitOverlay.isVisible) {
|
||||
reviewTermsWaitOverlay.isVisible = state.acceptingTerms is Loading
|
||||
else -> Unit
|
||||
}
|
||||
}
|
||||
|
||||
private fun updateState(terms: List<Term>) {
|
||||
termsController.setData(terms)
|
||||
override fun retry() {
|
||||
reviewTermsViewModel.handle(ReviewTermsAction.LoadTerms(getString(R.string.resources_language)))
|
||||
}
|
||||
|
||||
override fun setChecked(term: Term, isChecked: Boolean) {
|
||||
|
@ -19,6 +19,7 @@ package im.vector.riotx.features.terms
|
||||
import im.vector.riotx.core.platform.VectorViewEvents
|
||||
|
||||
sealed class ReviewTermsViewEvents : VectorViewEvents {
|
||||
data class Loading(val message: CharSequence? = null) : ReviewTermsViewEvents()
|
||||
data class Failure(val throwable: Throwable, val finish: Boolean) : ReviewTermsViewEvents()
|
||||
object Success : ReviewTermsViewEvents()
|
||||
}
|
||||
|
@ -88,11 +88,7 @@ class ReviewTermsViewModel @AssistedInject constructor(
|
||||
return@withState
|
||||
}
|
||||
|
||||
setState {
|
||||
copy(
|
||||
acceptingTerms = Loading()
|
||||
)
|
||||
}
|
||||
_viewEvents.post(ReviewTermsViewEvents.Loading())
|
||||
|
||||
val agreedUrls = acceptedTerms.map { it.url }
|
||||
|
||||
@ -110,11 +106,6 @@ class ReviewTermsViewModel @AssistedInject constructor(
|
||||
_viewEvents.post(ReviewTermsViewEvents.Success)
|
||||
} catch (failure: Throwable) {
|
||||
Timber.e(failure, "Failed to agree to terms")
|
||||
setState {
|
||||
copy(
|
||||
acceptingTerms = Uninitialized
|
||||
)
|
||||
}
|
||||
_viewEvents.post(ReviewTermsViewEvents.Failure(failure, false))
|
||||
}
|
||||
}
|
||||
|
@ -21,6 +21,5 @@ import com.airbnb.mvrx.MvRxState
|
||||
import com.airbnb.mvrx.Uninitialized
|
||||
|
||||
data class ReviewTermsViewState(
|
||||
val termsList: Async<List<Term>> = Uninitialized,
|
||||
val acceptingTerms: Async<Unit> = Uninitialized
|
||||
val termsList: Async<List<Term>> = Uninitialized
|
||||
) : MvRxState
|
||||
|
@ -17,39 +17,65 @@ package im.vector.riotx.features.terms
|
||||
|
||||
import android.view.View
|
||||
import com.airbnb.epoxy.TypedEpoxyController
|
||||
import com.airbnb.mvrx.Fail
|
||||
import com.airbnb.mvrx.Incomplete
|
||||
import com.airbnb.mvrx.Success
|
||||
import im.vector.riotx.R
|
||||
import im.vector.riotx.core.epoxy.errorWithRetryItem
|
||||
import im.vector.riotx.core.epoxy.loadingItem
|
||||
import im.vector.riotx.core.error.ErrorFormatter
|
||||
import im.vector.riotx.features.discovery.settingsSectionTitleItem
|
||||
import javax.inject.Inject
|
||||
|
||||
class TermsController @Inject constructor() : TypedEpoxyController<List<Term>>() {
|
||||
class TermsController @Inject constructor(
|
||||
private val errorFormatter: ErrorFormatter
|
||||
) : TypedEpoxyController<ReviewTermsViewState>() {
|
||||
|
||||
var description: String? = null
|
||||
var listener: Listener? = null
|
||||
|
||||
override fun buildModels(data: List<Term>?) {
|
||||
data?.let {
|
||||
settingsSectionTitleItem {
|
||||
id("header")
|
||||
titleResId(R.string.widget_integration_review_terms)
|
||||
}
|
||||
it.forEach { term ->
|
||||
termItem {
|
||||
id(term.url)
|
||||
name(term.name)
|
||||
description(description)
|
||||
checked(term.accepted)
|
||||
override fun buildModels(data: ReviewTermsViewState?) {
|
||||
data ?: return
|
||||
|
||||
clickListener(View.OnClickListener { listener?.review(term) })
|
||||
checkChangeListener { _, isChecked ->
|
||||
listener?.setChecked(term, isChecked)
|
||||
}
|
||||
when (data.termsList) {
|
||||
is Incomplete -> {
|
||||
loadingItem {
|
||||
id("loading")
|
||||
}
|
||||
}
|
||||
is Fail -> {
|
||||
errorWithRetryItem {
|
||||
id("errorRetry")
|
||||
text(errorFormatter.toHumanReadable(data.termsList.error))
|
||||
listener { listener?.retry() }
|
||||
}
|
||||
}
|
||||
is Success -> buildTerms(data.termsList.invoke())
|
||||
}
|
||||
}
|
||||
|
||||
private fun buildTerms(termsList: List<Term>) {
|
||||
settingsSectionTitleItem {
|
||||
id("header")
|
||||
titleResId(R.string.widget_integration_review_terms)
|
||||
}
|
||||
termsList.forEach { term ->
|
||||
termItem {
|
||||
id(term.url)
|
||||
name(term.name)
|
||||
description(description)
|
||||
checked(term.accepted)
|
||||
|
||||
clickListener(View.OnClickListener { listener?.review(term) })
|
||||
checkChangeListener { _, isChecked ->
|
||||
listener?.setChecked(term, isChecked)
|
||||
}
|
||||
}
|
||||
}
|
||||
// TODO error mgmt
|
||||
}
|
||||
|
||||
interface Listener {
|
||||
fun retry()
|
||||
fun setChecked(term: Term, isChecked: Boolean)
|
||||
fun review(term: Term)
|
||||
}
|
||||
|
@ -43,21 +43,4 @@
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/reviewTermsWaitOverlay"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:clickable="true"
|
||||
android:focusable="true"
|
||||
android:visibility="gone"
|
||||
tools:visibility="visible">
|
||||
|
||||
<ProgressBar
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:visibility="visible" />
|
||||
|
||||
</FrameLayout>
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
Loading…
x
Reference in New Issue
Block a user