Skip to content

Commit

Permalink
update errored backing view model to rx2 (#1926)
Browse files Browse the repository at this point in the history
Co-authored-by: Isabel Martin <arkariang@gmail.com>
  • Loading branch information
mtgriego and Arkariang committed Jan 10, 2024
1 parent 8045fef commit 62ce953
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 37 deletions.
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
package com.kickstarter.ui.viewholders

import com.jakewharton.rxbinding.view.RxView
import com.kickstarter.R
import com.kickstarter.databinding.ItemErroredBackingBinding
import com.kickstarter.libs.RelativeDateTimeOptions
import com.kickstarter.libs.rx.transformers.Transformers.observeForUI
import com.kickstarter.libs.rx.transformers.Transformers.observeForUIV2
import com.kickstarter.libs.utils.DateTimeUtils
import com.kickstarter.libs.utils.extensions.addToDisposable
import com.kickstarter.models.ErroredBacking
import com.kickstarter.viewmodels.ErroredBackingViewHolderViewModel
import io.reactivex.disposables.CompositeDisposable
import org.joda.time.DateTime

class ErroredBackingViewHolder(private val binding: ItemErroredBackingBinding, val delegate: Delegate?) : KSViewHolder(binding.root) {
Expand All @@ -17,28 +18,28 @@ class ErroredBackingViewHolder(private val binding: ItemErroredBackingBinding, v
}

private val ksString = requireNotNull(environment().ksString())
private var viewModel = ErroredBackingViewHolderViewModel.ViewModel(environment())
private var viewModel = ErroredBackingViewHolderViewModel.ViewModel()
private val disposables = CompositeDisposable()

init {

this.viewModel.outputs.notifyDelegateToStartFixPaymentMethod()
.compose(bindToLifecycle())
.compose(observeForUI())
.compose(observeForUIV2())
.subscribe { delegate?.managePledgeClicked(it) }
.addToDisposable(disposables)

this.viewModel.outputs.projectFinalCollectionDate()
.compose(bindToLifecycle())
.compose(observeForUI())
.compose(observeForUIV2())
.subscribe { setProjectFinaCollectionDateText(it) }
.addToDisposable(disposables)

this.viewModel.outputs.projectName()
.compose(bindToLifecycle())
.compose(observeForUI())
.compose(observeForUIV2())
.subscribe { binding.erroredBackingProjectTitle.text = it }
.addToDisposable(disposables)

RxView.clicks(binding.erroredBackingManageButton)
.compose(bindToLifecycle())
.subscribe { this.viewModel.inputs.manageButtonClicked() }
binding.erroredBackingManageButton.setOnClickListener {
this.viewModel.inputs.manageButtonClicked()
}
}

private fun setProjectFinaCollectionDateText(finalCollectionDate: DateTime) {
Expand All @@ -61,4 +62,10 @@ class ErroredBackingViewHolder(private val binding: ItemErroredBackingBinding, v

this.viewModel.inputs.configureWith(erroredBacking)
}

override fun destroy() {
disposables.clear()
viewModel.clear()
super.destroy()
}
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
package com.kickstarter.viewmodels

import androidx.annotation.NonNull
import com.kickstarter.libs.ActivityViewModel
import com.kickstarter.libs.Environment
import com.kickstarter.libs.rx.transformers.Transformers.takeWhen
import com.kickstarter.libs.rx.transformers.Transformers.takeWhenV2
import com.kickstarter.libs.utils.extensions.addToDisposable
import com.kickstarter.models.ErroredBacking
import com.kickstarter.ui.viewholders.ErroredBackingViewHolder
import io.reactivex.Observable
import io.reactivex.disposables.CompositeDisposable
import io.reactivex.subjects.BehaviorSubject
import io.reactivex.subjects.PublishSubject
import org.joda.time.DateTime
import rx.Observable
import rx.subjects.BehaviorSubject
import rx.subjects.PublishSubject

interface ErroredBackingViewHolderViewModel {
interface Inputs {
Expand All @@ -31,10 +30,10 @@ interface ErroredBackingViewHolderViewModel {
fun notifyDelegateToStartFixPaymentMethod(): Observable<String>
}

class ViewModel(@NonNull environment: Environment) : ActivityViewModel<ErroredBackingViewHolder>(environment), Inputs, Outputs {
class ViewModel : Inputs, Outputs {

private val erroredBacking = PublishSubject.create<ErroredBacking>()
private val manageButtonClicked = PublishSubject.create<Void>()
private val manageButtonClicked = PublishSubject.create<Unit>()

private val notifyDelegateToStartFixPaymentMethod = PublishSubject.create<String>()
private val projectFinalCollectionDate = BehaviorSubject.create<DateTime>()
Expand All @@ -43,40 +42,46 @@ interface ErroredBackingViewHolderViewModel {
val inputs: Inputs = this
val outputs: Outputs = this

private val disposables = CompositeDisposable()

init {

val project = this.erroredBacking
.map { it.project() }

project
.map { it.name() }
.compose(bindToLifecycle())
.subscribe { this.projectName.onNext(it) }
.addToDisposable(disposables)

project
.map { it.finalCollectionDate() }
.compose(bindToLifecycle())
.subscribe { this.projectFinalCollectionDate.onNext(it) }
.addToDisposable(disposables)

project
.map { it.slug() }
.compose<String>(takeWhen(this.manageButtonClicked))
.compose(bindToLifecycle())
.compose<String>(takeWhenV2(this.manageButtonClicked))
.subscribe { this.notifyDelegateToStartFixPaymentMethod.onNext(it) }
.addToDisposable(disposables)
}

override fun configureWith(erroredBacking: ErroredBacking) {
this.erroredBacking.onNext(erroredBacking)
}

override fun manageButtonClicked() {
this.manageButtonClicked.onNext(null)
this.manageButtonClicked.onNext(Unit)
}

override fun notifyDelegateToStartFixPaymentMethod(): Observable<String> = this.notifyDelegateToStartFixPaymentMethod

override fun projectFinalCollectionDate(): Observable<DateTime> = this.projectFinalCollectionDate

override fun projectName(): Observable<String> = this.projectName

fun clear() {
disposables.clear()
}
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
package com.kickstarter.viewmodels

import com.kickstarter.KSRobolectricTestCase
import com.kickstarter.libs.Environment
import com.kickstarter.libs.utils.extensions.addToDisposable
import com.kickstarter.mock.factories.ErroredBackingFactory
import io.reactivex.disposables.CompositeDisposable
import io.reactivex.subscribers.TestSubscriber
import org.joda.time.DateTime
import org.junit.After
import org.junit.Test
import rx.observers.TestSubscriber

class ErroredBackingViewHolderViewModelTest : KSRobolectricTestCase() {

Expand All @@ -14,18 +16,23 @@ class ErroredBackingViewHolderViewModelTest : KSRobolectricTestCase() {
private val projectFinalCollectionDate = TestSubscriber.create<DateTime>()
private val projectName = TestSubscriber.create<String>()
private val notifyDelegateToStartFixPaymentMethod = TestSubscriber.create<String>()
private val disposables = CompositeDisposable()

private fun setUpEnvironment(environment: Environment) {
this.vm = ErroredBackingViewHolderViewModel.ViewModel(environment)
private fun setUpEnvironment() {
this.vm = ErroredBackingViewHolderViewModel.ViewModel()

this.vm.outputs.projectFinalCollectionDate().subscribe(this.projectFinalCollectionDate)
this.vm.outputs.projectName().subscribe(this.projectName)
this.vm.outputs.notifyDelegateToStartFixPaymentMethod().subscribe(this.notifyDelegateToStartFixPaymentMethod)
this.vm.outputs.projectFinalCollectionDate()
.subscribe { this.projectFinalCollectionDate.onNext(it) }.addToDisposable(disposables)
this.vm.outputs.projectName().subscribe { this.projectName.onNext(it) }
.addToDisposable(disposables)
this.vm.outputs.notifyDelegateToStartFixPaymentMethod()
.subscribe { this.notifyDelegateToStartFixPaymentMethod.onNext(it) }
.addToDisposable(disposables)
}

@Test
fun testProjectFinalCollectionDate() {
setUpEnvironment(environment())
setUpEnvironment()

this.vm.inputs.configureWith(ErroredBackingFactory.erroredBacking())

Expand All @@ -34,7 +41,7 @@ class ErroredBackingViewHolderViewModelTest : KSRobolectricTestCase() {

@Test
fun testProjectName() {
setUpEnvironment(environment())
setUpEnvironment()

this.vm.inputs.configureWith(ErroredBackingFactory.erroredBacking())

Expand All @@ -43,11 +50,16 @@ class ErroredBackingViewHolderViewModelTest : KSRobolectricTestCase() {

@Test
fun testNotifyDelegateToStartFixPaymentMethod() {
setUpEnvironment(environment())
setUpEnvironment()

this.vm.inputs.configureWith(ErroredBackingFactory.erroredBacking())

this.vm.inputs.manageButtonClicked()
this.notifyDelegateToStartFixPaymentMethod.assertValue("slug")
}

@After
fun clear() {
disposables.clear()
}
}

0 comments on commit 62ce953

Please sign in to comment.