fix(copy): reconcile divergent premium benefit lists + drop inaccurate claim
The paywall and subscription screens showed two different premium benefit lists (centralizing
into CloserCopy surfaced the drift). Unified to a single CloserCopy.premiumBenefits used by both.
Also an accuracy fix: dropped "Exportable memories" — it directly contradicts the app's own
privacy copy ("Closer does not currently offer a data export", strings.xml privacy_no_export_body),
i.e. a benefit the app explicitly does not provide. Remaining items are all verified real features
(QuestionComposer, Connection Challenges, Desire Sync, Memory Lane, date planning, answer history).
compileDebugKotlin clean; single source of truth for both surfaces going forward.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
42fba641f1
commit
2c3c2df8c4
|
|
@ -19,6 +19,21 @@ object CloserCopy {
|
||||||
/** Reused verbatim across the paywall and the subscription screen. */
|
/** Reused verbatim across the paywall and the subscription screen. */
|
||||||
const val whatsIncluded = "What's included"
|
const val whatsIncluded = "What's included"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The single premium benefits list — shown identically on the paywall and the subscription screen.
|
||||||
|
* Reconciled 2026-07-09 from two divergent lists; dropped "Exportable memories" because it
|
||||||
|
* contradicted the app's own "no data export" privacy statement (strings.xml `privacy_no_export_body`).
|
||||||
|
*/
|
||||||
|
val premiumBenefits = listOf(
|
||||||
|
"Unlimited questions every day",
|
||||||
|
"Every premium question pack",
|
||||||
|
"Connection Challenges and Desire Sync",
|
||||||
|
"Memory Lane time capsules",
|
||||||
|
"Date planning and bucket list",
|
||||||
|
"Custom questions and private notes",
|
||||||
|
"Full answer history and growth",
|
||||||
|
)
|
||||||
|
|
||||||
object Paywall {
|
object Paywall {
|
||||||
const val headline = "Go deeper together"
|
const val headline = "Go deeper together"
|
||||||
const val subhead = "Unlock everything Closer has built for couples."
|
const val subhead = "Unlock everything Closer has built for couples."
|
||||||
|
|
@ -26,34 +41,12 @@ object CloserCopy {
|
||||||
const val coupleShared = "One subscription covers you both — treat your partner."
|
const val coupleShared = "One subscription covers you both — treat your partner."
|
||||||
const val thankYouTitle = "You're all set"
|
const val thankYouTitle = "You're all set"
|
||||||
const val thankYouBody = "Thank you for supporting Closer."
|
const val thankYouBody = "Thank you for supporting Closer."
|
||||||
|
|
||||||
val benefits = listOf(
|
|
||||||
"Unlimited questions every day",
|
|
||||||
"Every premium question pack",
|
|
||||||
"Date planning and bucket list",
|
|
||||||
"Full answer history and growth",
|
|
||||||
"Custom questions and private notes",
|
|
||||||
"Exportable memories",
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
object Subscription {
|
object Subscription {
|
||||||
const val upgradeHeadline = "Unlock Premium"
|
const val upgradeHeadline = "Unlock Premium"
|
||||||
const val premiumTitle = "You're Premium"
|
const val premiumTitle = "You're Premium"
|
||||||
const val coupleShared = "One subscription for both partners — no double billing."
|
const val coupleShared = "One subscription for both partners — no double billing."
|
||||||
|
|
||||||
// NOTE (copy drift surfaced by centralizing): this benefit list diverges from
|
|
||||||
// [Paywall.benefits] — it swaps "Custom questions and private notes" + "Exportable
|
|
||||||
// memories" for "Connection Challenges and Desire Sync" + "Memory Lane time capsules",
|
|
||||||
// and reorders. Left verbatim on purpose; unify the two lists if that's a copy decision.
|
|
||||||
val benefits = listOf(
|
|
||||||
"Unlimited questions every day",
|
|
||||||
"Every premium question pack",
|
|
||||||
"Full answer history and growth",
|
|
||||||
"Date planning and bucket list",
|
|
||||||
"Connection Challenges and Desire Sync",
|
|
||||||
"Memory Lane time capsules",
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 18+ gate copy (O-AGE-001). Consolidated from SignUp + CreateProfile, where the min-age
|
/** 18+ gate copy (O-AGE-001). Consolidated from SignUp + CreateProfile, where the min-age
|
||||||
|
|
|
||||||
|
|
@ -244,7 +244,7 @@ private fun BenefitsCard(modifier: Modifier = Modifier) {
|
||||||
horizontalArrangement = Arrangement.spacedBy(8.dp),
|
horizontalArrangement = Arrangement.spacedBy(8.dp),
|
||||||
verticalArrangement = Arrangement.spacedBy(8.dp)
|
verticalArrangement = Arrangement.spacedBy(8.dp)
|
||||||
) {
|
) {
|
||||||
CloserCopy.Paywall.benefits.forEach { benefit ->
|
CloserCopy.premiumBenefits.forEach { benefit ->
|
||||||
BenefitPill(benefit)
|
BenefitPill(benefit)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -234,7 +234,7 @@ private fun PremiumContent(
|
||||||
style = MaterialTheme.typography.labelLarge.copy(fontWeight = FontWeight.SemiBold),
|
style = MaterialTheme.typography.labelLarge.copy(fontWeight = FontWeight.SemiBold),
|
||||||
color = MaterialTheme.colorScheme.onSurfaceVariant
|
color = MaterialTheme.colorScheme.onSurfaceVariant
|
||||||
)
|
)
|
||||||
CloserCopy.Subscription.benefits.forEach { benefit ->
|
CloserCopy.premiumBenefits.forEach { benefit ->
|
||||||
Row(
|
Row(
|
||||||
horizontalArrangement = Arrangement.spacedBy(10.dp),
|
horizontalArrangement = Arrangement.spacedBy(10.dp),
|
||||||
verticalAlignment = Alignment.CenterVertically
|
verticalAlignment = Alignment.CenterVertically
|
||||||
|
|
@ -335,7 +335,7 @@ private fun FreeContent(
|
||||||
modifier = Modifier.padding(20.dp),
|
modifier = Modifier.padding(20.dp),
|
||||||
verticalArrangement = Arrangement.spacedBy(12.dp)
|
verticalArrangement = Arrangement.spacedBy(12.dp)
|
||||||
) {
|
) {
|
||||||
CloserCopy.Subscription.benefits.forEach { benefit ->
|
CloserCopy.premiumBenefits.forEach { benefit ->
|
||||||
Row(
|
Row(
|
||||||
horizontalArrangement = Arrangement.spacedBy(10.dp),
|
horizontalArrangement = Arrangement.spacedBy(10.dp),
|
||||||
verticalAlignment = Alignment.CenterVertically
|
verticalAlignment = Alignment.CenterVertically
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue