Skip to content

Commit

Permalink
[MBL-1227] Add post campaign messaging for project page (#1967)
Browse files Browse the repository at this point in the history
* add post campaign messaging for project page

* add tests
  • Loading branch information
mtgriego committed Mar 5, 2024
1 parent 5a0448f commit f6c5d30
Show file tree
Hide file tree
Showing 6 changed files with 91 additions and 0 deletions.
2 changes: 2 additions & 0 deletions app/src/main/java/com/kickstarter/models/Project.kt
Original file line number Diff line number Diff line change
Expand Up @@ -240,6 +240,8 @@ class Project private constructor(
fun risks(risks: String?) = apply { this.risks = risks ?: "" }
fun story(story: String?) = apply { this.story = story ?: "" }
fun isFlagged(isFlagged: Boolean?) = apply { this.isFlagged = isFlagged }
fun isInPostCampaignPledgingPhase(isInPostCampaignPledgingPhase: Boolean?) = apply { this.isInPostCampaignPledgingPhase = isInPostCampaignPledgingPhase }
fun postCampaignPledgingEnabled(postCampaignPledgingEnabled: Boolean?) = apply { this.postCampaignPledgingEnabled = postCampaignPledgingEnabled }
fun build() = Project(
availableCardTypes = availableCardTypes,
backersCount = backersCount,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -324,6 +324,8 @@ fun projectTransformer(projectFragment: FullProject?): Project {
val userCanComment = projectFragment?.canComment() ?: false
val isFlagged = projectFragment?.flagging()?.kind()?.let { true } ?: false
val watchesCount = projectFragment?.watchesCount() ?: 0
val isInPostCampaignPledgingPhase = projectFragment?.isInPostCampaignPledgingPhase ?: false
val postCampaignPledgingEnabled = projectFragment?.postCampaignPledgingEnabled() ?: false

return Project.builder()
.availableCardTypes(availableCards.map { it.name })
Expand Down Expand Up @@ -380,6 +382,8 @@ fun projectTransformer(projectFragment: FullProject?): Project {
.story(story)
.isFlagged(isFlagged)
.watchesCount(watchesCount)
.isInPostCampaignPledgingPhase(isInPostCampaignPledgingPhase)
.postCampaignPledgingEnabled(postCampaignPledgingEnabled)
.build()
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -271,6 +271,11 @@ class ProjectOverviewFragment : Fragment(), Configure {
.subscribe { setSuccessfulProjectStateView(it) }
.addToDisposable(disposables)

viewModel.setSuccessfulProjectStillCollectingView()
.observeOn(AndroidSchedulers.mainThread())
.subscribe { setSuccessfulProjectStillCollectingView(it) }
.addToDisposable(disposables)

viewModel.outputs.setSuspendedProjectStateView()
.observeOn(AndroidSchedulers.mainThread())
.subscribe { setSuspendedProjectStateView() }
Expand Down Expand Up @@ -499,6 +504,18 @@ class ProjectOverviewFragment : Fragment(), Configure {
}
}

private fun setSuccessfulProjectStillCollectingView(stateChangedAt: DateTime) {
context?.let { currentContext ->
binding.projectStateHeaderTextView.setText(R.string.project_status_funded)
binding.projectStateSubheadTextView.text =
ksString.format(
currentContext.getString(R.string.project_status_project_was_successfully_funded_on_deadline_but_you_can_still_pledge_for_available_rewards),
"deadline",
DateTimeUtils.mediumDate(stateChangedAt)
)
}
}

private fun setSuspendedProjectStateView() {
binding.projectStateHeaderTextView.setText(R.string.project_status_funding_suspended)
binding.projectStateSubheadTextView.setText(R.string.project_status_funding_project_suspended)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -234,6 +234,7 @@ interface ProjectOverviewViewModel {
private val setCanceledProjectStateView: Observable<Unit>
private val setProjectSocialClickListener: Observable<Unit>
private val setSuccessfulProjectStateView: Observable<DateTime>
private val setSuccessfulProjectStillCollectingView: Observable<DateTime>
private val setSuspendedProjectStateView: Observable<Unit>
private val setUnsuccessfulProjectStateView: Observable<DateTime>
private val startProjectSocialActivity: Observable<Project>
Expand Down Expand Up @@ -405,6 +406,10 @@ interface ProjectOverviewViewModel {
return setSuccessfulProjectStateView
}

fun setSuccessfulProjectStillCollectingView(): Observable<DateTime> {
return setSuccessfulProjectStillCollectingView
}

override fun setSuspendedProjectStateView(): Observable<Unit> {
return setSuspendedProjectStateView
}
Expand Down Expand Up @@ -608,6 +613,12 @@ interface ProjectOverviewViewModel {

setSuccessfulProjectStateView = project
.filter { it.isSuccessful }
.filter { !(it.postCampaignPledgingEnabled() ?: false) || !(it.isInPostCampaignPledgingPhase() ?: false) }
.map { it.stateChangedAt() ?: DateTime() }

setSuccessfulProjectStillCollectingView = project
.filter { it.isSuccessful }
.filter { it.postCampaignPledgingEnabled() ?: false && it.isInPostCampaignPledgingPhase() ?: false }
.map { it.stateChangedAt() ?: DateTime() }

setSuspendedProjectStateView = project
Expand Down
3 changes: 3 additions & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -85,4 +85,7 @@
<string name="match_system">Match System</string>
<string name="light">Light</string>
<string name="dark">Dark</string>
<!-- TODO: Get translations for this and put it in i18n, then remove -->
<string name="project_status_project_was_successfully_funded_on_deadline_but_you_can_still_pledge_for_available_rewards" formatted="false">This project was successfully funded on %{deadline}, but you can still pledge for available rewards.</string>

</resources>
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ class ProjectOverviewViewModelTest : KSRobolectricTestCase() {
private val shouldShowReportProject = TestSubscriber<Boolean>()
private val shouldShowProjectFlagged = TestSubscriber<Boolean>()
private val urlToOpen = TestSubscriber<String>()
private val setSuccessfulProjectStillCollectingView = TestSubscriber<DateTime>()

private val disposables = CompositeDisposable()

Expand Down Expand Up @@ -142,6 +143,7 @@ class ProjectOverviewViewModelTest : KSRobolectricTestCase() {
vm.outputs.startReportProjectView().subscribe { startReportProjectView.onNext(it) }.addToDisposable(disposables)
vm.outputs.shouldShowProjectFlagged().subscribe { shouldShowProjectFlagged.onNext(it) }.addToDisposable(disposables)
vm.outputs.openExternallyWithUrl().subscribe { urlToOpen.onNext(it) }.addToDisposable(disposables)
vm.setSuccessfulProjectStillCollectingView().subscribe { setSuccessfulProjectStillCollectingView.onNext(it) }.addToDisposable(disposables)
vm.inputs.configureWith(projectData)
}

Expand Down Expand Up @@ -443,6 +445,58 @@ class ProjectOverviewViewModelTest : KSRobolectricTestCase() {
projectStateViewGroupBackgroundColorInt.assertValues(R.color.green_alpha_50)
projectStateViewGroupIsGone.assertValues(false)
setSuccessfulProjectStateView.assertValues(stateChangedAt)
setSuccessfulProjectStillCollectingView.assertNoValues()
}

@Test
fun testProjectState_Successful_Post_Campaign_Enabled_andCollecting() {
val stateChangedAt = DateTime.now()
val project = ProjectFactory.project()
.toBuilder()
.state(Project.STATE_SUCCESSFUL)
.isInPostCampaignPledgingPhase(true)
.postCampaignPledgingEnabled(true)
.stateChangedAt(stateChangedAt)
.build()
setUpEnvironment(environment(), project(project))
projectStateViewGroupBackgroundColorInt.assertValues(R.color.green_alpha_50)
projectStateViewGroupIsGone.assertValues(false)
setSuccessfulProjectStillCollectingView.assertValues(stateChangedAt)
setSuccessfulProjectStateView.assertNoValues()
}

@Test
fun testProjectState_Successful_Post_Campaign_Disabled_andCollecting() {
val stateChangedAt = DateTime.now()
val project = ProjectFactory.project()
.toBuilder()
.state(Project.STATE_SUCCESSFUL)
.isInPostCampaignPledgingPhase(true)
.postCampaignPledgingEnabled(false)
.stateChangedAt(stateChangedAt)
.build()
setUpEnvironment(environment(), project(project))
projectStateViewGroupBackgroundColorInt.assertValues(R.color.green_alpha_50)
projectStateViewGroupIsGone.assertValues(false)
setSuccessfulProjectStillCollectingView.assertNoValues()
setSuccessfulProjectStateView.assertValues(stateChangedAt)
}

@Test
fun testProjectState_Successful_Post_Campaign_Enabled_and_Not_Collecting() {
val stateChangedAt = DateTime.now()
val project = ProjectFactory.project()
.toBuilder()
.state(Project.STATE_SUCCESSFUL)
.isInPostCampaignPledgingPhase(false)
.postCampaignPledgingEnabled(true)
.stateChangedAt(stateChangedAt)
.build()
setUpEnvironment(environment(), project(project))
projectStateViewGroupBackgroundColorInt.assertValues(R.color.green_alpha_50)
projectStateViewGroupIsGone.assertValues(false)
setSuccessfulProjectStillCollectingView.assertNoValues()
setSuccessfulProjectStateView.assertValues(stateChangedAt)
}

@Test
Expand Down

0 comments on commit f6c5d30

Please sign in to comment.