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:
null 2026-07-09 00:50:29 -05:00
parent 42fba641f1
commit 2c3c2df8c4
3 changed files with 18 additions and 25 deletions

View File

@ -19,6 +19,21 @@ object CloserCopy {
/** Reused verbatim across the paywall and the subscription screen. */
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 {
const val headline = "Go deeper together"
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 thankYouTitle = "You're all set"
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 {
const val upgradeHeadline = "Unlock Premium"
const val premiumTitle = "You're Premium"
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

View File

@ -244,7 +244,7 @@ private fun BenefitsCard(modifier: Modifier = Modifier) {
horizontalArrangement = Arrangement.spacedBy(8.dp),
verticalArrangement = Arrangement.spacedBy(8.dp)
) {
CloserCopy.Paywall.benefits.forEach { benefit ->
CloserCopy.premiumBenefits.forEach { benefit ->
BenefitPill(benefit)
}
}

View File

@ -234,7 +234,7 @@ private fun PremiumContent(
style = MaterialTheme.typography.labelLarge.copy(fontWeight = FontWeight.SemiBold),
color = MaterialTheme.colorScheme.onSurfaceVariant
)
CloserCopy.Subscription.benefits.forEach { benefit ->
CloserCopy.premiumBenefits.forEach { benefit ->
Row(
horizontalArrangement = Arrangement.spacedBy(10.dp),
verticalAlignment = Alignment.CenterVertically
@ -335,7 +335,7 @@ private fun FreeContent(
modifier = Modifier.padding(20.dp),
verticalArrangement = Arrangement.spacedBy(12.dp)
) {
CloserCopy.Subscription.benefits.forEach { benefit ->
CloserCopy.premiumBenefits.forEach { benefit ->
Row(
horizontalArrangement = Arrangement.spacedBy(10.dp),
verticalAlignment = Alignment.CenterVertically