Make iCloud sync available to all users (remove from premium)

- Remove PremiumGate from iCloudEnabled property
- Update SettingsView to use regular toggle instead of premiumToggle
- Remove premium section header for iCloud sync
- Update proSection description to remove 'sync'
- Remove iCloud Settings Sync from ProPaywallView benefits
This commit is contained in:
Matt Bruce 2026-01-04 13:31:11 -06:00
parent 53170a1de4
commit f73da42a3d
4 changed files with 31 additions and 31 deletions

View File

@ -29,7 +29,6 @@ struct ProPaywallView: View {
BenefitRow(image: "person.crop.rectangle.fill", text: String(localized: "Center Stage Auto-Framing")) BenefitRow(image: "person.crop.rectangle.fill", text: String(localized: "Center Stage Auto-Framing"))
BenefitRow(image: "timer", text: String(localized: "Extended Self-Timers (5s, 10s)")) BenefitRow(image: "timer", text: String(localized: "Extended Self-Timers (5s, 10s)"))
BenefitRow(image: "star.fill", text: String(localized: "High Quality Photo Export")) BenefitRow(image: "star.fill", text: String(localized: "High Quality Photo Export"))
BenefitRow(image: "icloud.fill", text: String(localized: "iCloud Settings Sync"))
} }
.frame(maxWidth: .infinity, alignment: .leading) .frame(maxWidth: .infinity, alignment: .leading)

View File

@ -129,9 +129,9 @@ struct SettingsView: View {
proSection proSection
// MARK: - Sync Section (Premium) // MARK: - Sync Section
premiumSectionHeader(title: "iCloud Sync", systemImage: "icloud") SettingsSectionHeader(title: String(localized: "iCloud Sync"), systemImage: "icloud")
iCloudSyncSection iCloudSyncSection
@ -543,7 +543,7 @@ struct SettingsView: View {
.font(.system(size: Design.BaseFontSize.medium, weight: .semibold)) .font(.system(size: Design.BaseFontSize.medium, weight: .semibold))
.foregroundStyle(.white) .foregroundStyle(.white)
Text(String(localized: "Premium colors, HDR, timers, sync & more")) Text(String(localized: "Premium colors, HDR, timers & more"))
.font(.system(size: Design.BaseFontSize.caption)) .font(.system(size: Design.BaseFontSize.caption))
.foregroundStyle(.white.opacity(Design.Opacity.medium)) .foregroundStyle(.white.opacity(Design.Opacity.medium))
} }
@ -566,24 +566,31 @@ struct SettingsView: View {
.accessibilityHint(String(localized: "Opens upgrade options")) .accessibilityHint(String(localized: "Opens upgrade options"))
} }
// MARK: - iCloud Sync Section (Premium) // MARK: - iCloud Sync Section
private var iCloudSyncSection: some View { private var iCloudSyncSection: some View {
VStack(alignment: .leading, spacing: Design.Spacing.small) { VStack(alignment: .leading, spacing: Design.Spacing.small) {
// Sync toggle (premium) // Sync toggle
premiumToggle( Toggle(isOn: $viewModel.iCloudEnabled) {
title: String(localized: "Sync Settings"), VStack(alignment: .leading, spacing: Design.Spacing.xxSmall) {
subtitle: !isPremiumUnlocked Text(String(localized: "Sync Settings"))
? String(localized: "Upgrade to sync settings across devices") .font(.system(size: Design.BaseFontSize.medium, weight: .medium))
: (viewModel.iCloudAvailable .foregroundStyle(.white)
Text(viewModel.iCloudAvailable
? String(localized: "Sync settings across all your devices") ? String(localized: "Sync settings across all your devices")
: String(localized: "Sign in to iCloud to enable sync")), : String(localized: "Sign in to iCloud to enable sync"))
isOn: $viewModel.iCloudEnabled, .font(.system(size: Design.BaseFontSize.body))
accessibilityHint: String(localized: "Syncs settings across all your devices via iCloud") .foregroundStyle(.white.opacity(Design.Opacity.medium))
) }
}
.tint(Color.Accent.primary)
.padding(.vertical, Design.Spacing.xSmall)
.disabled(!viewModel.iCloudAvailable)
.accessibilityHint(String(localized: "Syncs settings across all your devices via iCloud"))
// Sync status (only show when premium and enabled) // Sync status (show when enabled and available)
if isPremiumUnlocked && viewModel.iCloudEnabled && viewModel.iCloudAvailable { if viewModel.iCloudEnabled && viewModel.iCloudAvailable {
HStack(spacing: Design.Spacing.small) { HStack(spacing: Design.Spacing.small) {
Image(systemName: syncStatusIcon) Image(systemName: syncStatusIcon)
.font(.system(size: Design.BaseFontSize.body)) .font(.system(size: Design.BaseFontSize.body))

View File

@ -347,13 +347,10 @@ final class SettingsViewModel: RingLightConfigurable {
/// Whether iCloud sync is available /// Whether iCloud sync is available
var iCloudAvailable: Bool { cloudSync.iCloudAvailable } var iCloudAvailable: Bool { cloudSync.iCloudAvailable }
/// Whether iCloud sync is enabled (PREMIUM) /// Whether iCloud sync is enabled (available to all users)
var iCloudEnabled: Bool { var iCloudEnabled: Bool {
get { PremiumGate.get(cloudSync.iCloudEnabled, default: false, isPremium: isPremiumUnlocked) } get { cloudSync.iCloudEnabled }
set { set { cloudSync.iCloudEnabled = newValue }
guard PremiumGate.canSet(isPremium: isPremiumUnlocked) else { return }
cloudSync.iCloudEnabled = newValue
}
} }
/// Last sync date /// Last sync date

View File

@ -242,8 +242,8 @@
"comment" : "Name of a ring light color preset.", "comment" : "Name of a ring light color preset.",
"isCommentAutoGenerated" : true "isCommentAutoGenerated" : true
}, },
"iCloud Settings Sync" : { "iCloud Sync" : {
"comment" : "Description of a benefit when the user has the premium membership and can sync their iCloud settings.", "comment" : "Title of the section that allows users to enable or disable iCloud sync of their photos and videos.",
"isCommentAutoGenerated" : true "isCommentAutoGenerated" : true
}, },
"Last synced %@" : { "Last synced %@" : {
@ -292,8 +292,9 @@
"comment" : "Benefit description for the \"Premium Colors + Custom Color Picker\" benefit.", "comment" : "Benefit description for the \"Premium Colors + Custom Color Picker\" benefit.",
"isCommentAutoGenerated" : true "isCommentAutoGenerated" : true
}, },
"Premium colors, HDR, timers, sync & more" : { "Premium colors, HDR, timers & more" : {
"comment" : "A description of the additional features available in the Pro version of the app.",
"isCommentAutoGenerated" : true
}, },
"Purchase successful! Pro features unlocked." : { "Purchase successful! Pro features unlocked." : {
"comment" : "Announcement read out to the user when a premium purchase is successful.", "comment" : "Announcement read out to the user when a premium purchase is successful.",
@ -483,10 +484,6 @@
"comment" : "A button label that prompts users to upgrade to the premium version of the app.", "comment" : "A button label that prompts users to upgrade to the premium version of the app.",
"isCommentAutoGenerated" : true "isCommentAutoGenerated" : true
}, },
"Upgrade to sync settings across devices" : {
"comment" : "A description of the benefit of upgrading to sync settings across devices.",
"isCommentAutoGenerated" : true
},
"Upgrade to unlock 5s and 10s timers" : { "Upgrade to unlock 5s and 10s timers" : {
"comment" : "A message displayed to users who want to upgrade to unlock longer self-timer durations.", "comment" : "A message displayed to users who want to upgrade to unlock longer self-timer durations.",
"isCommentAutoGenerated" : true "isCommentAutoGenerated" : true