ui: update text about badges (#7544)

* ui: update text about badges

* update

* update

* update

* update

* update

* update

* update kotlin

---------

Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
This commit is contained in:
Evgeny
2026-09-19 14:16:39 +01:00
committed by GitHub
co-authored by Evgeny @ SimpleX Chat
parent faedb0328e
commit 0183a36058
10 changed files with 28 additions and 25 deletions
@@ -14,7 +14,7 @@ struct BadgesHowItWorksView: View {
var body: some View {
VStack(alignment: .leading) {
Text("How private badges work")
Text("How badges protect your privacy")
.font(.largeTitle)
.bold()
.foregroundColor(theme.colors.primary)
@@ -22,9 +22,10 @@ struct BadgesHowItWorksView: View {
.padding(.bottom, 16)
ScrollView {
VStack(alignment: .leading, spacing: 12) {
Text("A badge is not an account. It is a signed credential stored on your device. It does not identify you, and no one keeps a record of who holds which badge.")
Text("Your contacts see the badge and its expiry date, and nothing else. The badge carries no identifier, so it cannot be used to find out who you are or to match you across chats.")
Text("Payment and badge are kept apart. Paying is one step; the badge is issued in another, under a key that exists only for that badge. Whoever handles the payment cannot see where the badge ends up.")
Text("A badge is an anonymous credential stored in your profile on your device. This credential is never sent to anyone.")
Text("To prove to a contact or a server that you have a badge, the app generates a new proof that reveals only the badge type and the expiry date, rounded to a week.")
Text("Nobody can link two different proofs to each other or to the purchase.")
ExternalLink("Read more in our blog.", destination: URL(string: "https://simplex.chat/blog/20260919-simplex-supporter-badges.html")!)
}
.lineLimit(nil)
.fixedSize(horizontal: false, vertical: true)
@@ -80,7 +80,7 @@ struct BadgesRedeemCodeView: View {
.multilineTextAlignment(.center)
.fixedSize(horizontal: false, vertical: true)
Text("Paste the code from your receipt.")
Text("Paste the code you received.")
.font(.body)
.multilineTextAlignment(.center)
.fixedSize(horizontal: false, vertical: true)
@@ -29,7 +29,7 @@ struct BadgesSupportSimplexView: View {
.multilineTextAlignment(.center)
.fixedSize(horizontal: false, vertical: true)
Text("SimpleX doesn't sell ads or data. It's funded by its users and by investors who share the mission. You can support the project and show a badge on your profile.")
Text("Get a badge to send larger files (2-5GB) that stay available longer (7-21 days), and to show it on your profile.")
.font(.body)
.multilineTextAlignment(.center)
.fixedSize(horizontal: false, vertical: true)
@@ -110,7 +110,7 @@ struct BadgesSupportSimplexView: View {
Button { howItWorksActive = true } label: {
HStack(spacing: 4) {
Image(systemName: "info.circle")
Text("How private badges work").fontWeight(.medium)
Text("How badges protect your privacy").fontWeight(.medium)
}
.font(.body)
}
@@ -48,7 +48,7 @@ struct BadgesYourBadgeView: View {
.modifier(ThemedBackground())
} label: {
settingsRow("info.circle", color: theme.colors.secondary) {
Text("How private badges work")
Text("How badges protect your privacy")
}
}
}
@@ -162,7 +162,7 @@ struct BadgesYourLevelView: View {
} label: {
HStack(spacing: 4) {
Image(systemName: "info.circle")
Text("How private badges work").fontWeight(.medium)
Text("How badges protect your privacy").fontWeight(.medium)
}
.font(.body)
}
@@ -13,7 +13,7 @@ struct SupportSimpleXBanner: View {
@EnvironmentObject var theme: AppTheme
@Environment(\.colorScheme) var colorScheme: ColorScheme
var title: LocalizedStringKey = "Support SimpleX"
var subtitle: LocalizedStringKey = "Get badge + files up to 5GB"
var subtitle: LocalizedStringKey = "Get badge + better files"
let onTap: () -> Void
let onDismiss: () -> Void
@@ -387,7 +387,7 @@ struct ChatListView: View {
}
private func showSupportEndedDismissAlert() {
showAlert(NSLocalizedString("Support ended", comment: "alert title")) {
showAlert(NSLocalizedString("Your badge expired", comment: "alert title")) {
[
UIAlertAction(title: NSLocalizedString("Remind me later", comment: "alert button"), style: .default) { _ in
Task { await ackBadgeAlert(snooze: true) }
@@ -464,8 +464,8 @@ struct ChatListView: View {
// one slot: a badge the user paid for ending outranks the pitch to get one
if supportEnded, let alert = badgeModel.alert {
SupportSimpleXBanner(
title: "Support ended",
subtitle: "Your support ended on \(alert.dateText).",
title: "Your badge expired",
subtitle: "Your badge expired on \(alert.dateText).",
onTap: { showBadgesSheet = true },
onDismiss: showSupportEndedDismissAlert
)
@@ -10,9 +10,9 @@ import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import dev.icerock.moko.resources.compose.stringResource
import chat.simplex.common.platform.ColumnWithScrollBar
import chat.simplex.common.views.onboarding.ReadableTextWithLink
import chat.simplex.res.MR
// TODO [badges]: replace lorem ipsum with the real copy once the badge protocol and privacy properties are documented.
@Composable
fun BadgesHowItWorksView() {
ColumnWithScrollBar(
@@ -30,5 +30,6 @@ fun BadgesHowItWorksView() {
Text(stringResource(MR.strings.badges_how_it_works_p1), style = MaterialTheme.typography.body1)
Text(stringResource(MR.strings.badges_how_it_works_p2), style = MaterialTheme.typography.body1)
Text(stringResource(MR.strings.badges_how_it_works_p3), style = MaterialTheme.typography.body1)
ReadableTextWithLink(MR.strings.badges_how_it_works_read_more_with_link, "https://simplex.chat/blog/20260919-simplex-supporter-badges.html")
}
}
@@ -3159,19 +3159,20 @@
<string name="badges_billing_footer_one_month">Ends on %1$s.</string>
<string name="badges_your_level_title">Your level</string>
<string name="badges_support_simplex_title">Support SimpleX</string>
<string name="badges_support_simplex_body">SimpleX doesn\'t sell ads or data. It\'s funded by its users and by investors who share the mission. You can support the project and show a badge on your profile.</string>
<string name="badges_support_simplex_body">Get a badge to send larger files (2-5GB) that stay available longer (7-21 days), and to show it on your profile.</string>
<string name="badges_why_simplex_is_built">Why SimpleX is built.</string>
<string name="badges_choose_your_level">Choose your level</string>
<string name="badges_redeem_code_button">Redeem badge code</string>
<string name="badges_continue">Continue</string>
<string name="badges_how_it_works_button">How private badges work</string>
<string name="badges_how_it_works_title">How private badges work</string>
<string name="badges_how_it_works_p1">A badge is not an account. It is a signed credential stored on your device. It does not identify you, and no one keeps a record of who holds which badge.</string>
<string name="badges_how_it_works_p2">Your contacts see the badge and its expiry date, and nothing else. The badge carries no identifier, so it cannot be used to find out who you are or to match you across chats.</string>
<string name="badges_how_it_works_p3">Payment and badge are kept apart. Paying is one step; the badge is issued in another, under a key that exists only for that badge. Whoever handles the payment cannot see where the badge ends up.</string>
<string name="badges_how_it_works_button">How badges protect your privacy</string>
<string name="badges_how_it_works_title">How badges protect your privacy</string>
<string name="badges_how_it_works_p1">A badge is an anonymous credential stored in your profile on your device. This credential is never sent to anyone.</string>
<string name="badges_how_it_works_p2">To prove to a contact or a server that you have a badge, the app generates a new proof that reveals only the badge type and the expiry date, rounded to a week.</string>
<string name="badges_how_it_works_p3">Nobody can link two different proofs to each other or to the purchase.</string>
<string name="badges_how_it_works_read_more_with_link"><![CDATA[Read more in <font color="#0088ff">our blog</font>.]]></string>
<string name="badges_preview_my_nickname">My nickname</string>
<string name="badges_banner_title">Support SimpleX</string>
<string name="badges_banner_subtitle">Get badge + files up to 5GB</string>
<string name="badges_banner_subtitle">Get badge + better files</string>
<string name="badges_banner_dismiss_message">You can support SimpleX later in Settings.</string>
<string name="badges_purchase_successful">Purchase successful</string>
<string name="badges_purchase_pending">Purchase pending</string>
@@ -3179,7 +3180,7 @@
<string name="badges_purchase_error">Purchase error</string>
<string name="badges_get_your_code">Get your code</string>
<string name="badges_redeem_code_title">Redeem code</string>
<string name="badges_redeem_code_body">Paste the code from your receipt.</string>
<string name="badges_redeem_code_body">Paste the code you received.</string>
<string name="badges_redeem_code_placeholder" translatable="false">SB-XXXXX-XXXXX-XXXXX-XXXXX</string>
<string name="badges_redeem">Redeem</string>
<string name="badges_error_title">Cannot redeem code</string>
@@ -3197,12 +3198,12 @@
<string name="badges_error_unknown">The code could not be redeemed.</string>
<string name="badges_code_you_scanned_is_not_badge_code">The code you scanned is not a badge code.</string>
<string name="badges_your_badge">Your badge</string>
<string name="badges_support_ended">Support ended</string>
<string name="badges_support_ended">Your badge expired</string>
<string name="badges_shown_on_your_profile">shown on your profile</string>
<string name="badges_ends">Ends</string>
<string name="badges_prepaid_footer">Prepaid months have no billing date. The badge is reissued each month from the balance you already paid for, and ends when it runs out.</string>
<string name="badges_type_investor">Investor</string>
<string name="badges_support_ended_on">Your support ended on %1$s.</string>
<string name="badges_support_ended_on">Your badge expired on %1$s.</string>
<string name="badges_remind_me_later">Remind me later</string>
<string name="badges_dismiss">Dismiss</string>
<string name="badges_credential">Credential</string>
+1 -1
View File
@@ -20,7 +20,7 @@ You can now support SimpleX Chat and get a supporter badge, larger files and lon
A supporter badge is shown on your profile to your contacts, group members and channel subscribers. With a badge you can send files up to 2GB, or 5GB with a legend badge, instead of 1GB, and servers keep your files for longer &mdash; 7 days with a supporter badge and 21 days with a legend badge.
A badge is a credential stored in your profile on your device. The credential itself is not sent to anyone: to show the badge to a contact or to present it to a server, the app generates a new zero-knowledge proof that reveals only the badge type and the expiry date, and no two proofs can be linked to each other or to the purchase, by the badge service, your contacts or servers. Credentials are issued for one month at a time, and all badges expire on the same day of the week, so a badge places you among all supporters of that week and nothing more.
A badge is an anonymous credential stored in your profile on your device. The credential itself is not sent to anyone: to show the badge to a contact or to present it to a server, the app generates a new zero-knowledge proof that reveals only the badge type and the expiry date, and no two proofs can be linked to each other or to the purchase, by the badge service, your contacts or servers. Credentials are issued for one month at a time, and all badges expire on the same day of the week, so a badge places you among all supporters of that week and nothing more.
This is only possible because the network has no user identifiers &mdash; in other messengers a paid feature is attached to the account, so the operator knows who paid and what they do with the feature.