diff --git a/SportsTime/Core/Store/StoreManager.swift b/SportsTime/Core/Store/StoreManager.swift index 7c287d7..39dea35 100644 --- a/SportsTime/Core/Store/StoreManager.swift +++ b/SportsTime/Core/Store/StoreManager.swift @@ -31,10 +31,30 @@ final class StoreManager { private(set) var isLoading = false private(set) var error: StoreError? + // MARK: - Debug Override (DEBUG builds only) + + #if DEBUG + private static let debugProOverrideKey = "debugProOverride" + + /// When true, isPro returns true regardless of actual subscription status. + /// Defaults to true in debug builds. Only compiled in DEBUG configuration. + var debugProOverride: Bool { + get { + UserDefaults.standard.object(forKey: Self.debugProOverrideKey) as? Bool ?? true + } + set { + UserDefaults.standard.set(newValue, forKey: Self.debugProOverrideKey) + } + } + #endif + // MARK: - Computed Properties var isPro: Bool { - !purchasedProductIDs.intersection(Self.proProductIDs).isEmpty + #if DEBUG + if debugProOverride { return true } + #endif + return !purchasedProductIDs.intersection(Self.proProductIDs).isEmpty } var monthlyProduct: Product? { diff --git a/SportsTime/Features/Settings/Views/SettingsView.swift b/SportsTime/Features/Settings/Views/SettingsView.swift index 1bd8166..eb64b7f 100644 --- a/SportsTime/Features/Settings/Views/SettingsView.swift +++ b/SportsTime/Features/Settings/Views/SettingsView.swift @@ -260,6 +260,13 @@ struct SettingsView: View { #if DEBUG private var debugSection: some View { Section { + Toggle(isOn: Binding( + get: { StoreManager.shared.debugProOverride }, + set: { StoreManager.shared.debugProOverride = $0 } + )) { + Label("Override Pro Status", systemImage: "star.fill") + } + Button { showOnboardingPaywall = true } label: { diff --git a/SportsTime/Features/Trip/Views/Wizard/Steps/DatesStep.swift b/SportsTime/Features/Trip/Views/Wizard/Steps/DatesStep.swift index bbaf458..7f646bd 100644 --- a/SportsTime/Features/Trip/Views/Wizard/Steps/DatesStep.swift +++ b/SportsTime/Features/Trip/Views/Wizard/Steps/DatesStep.swift @@ -43,6 +43,10 @@ struct DatesStep: View { RoundedRectangle(cornerRadius: Theme.CornerRadius.large) .stroke(Theme.surfaceGlow(colorScheme), lineWidth: 1) } + .onAppear { + // Auto-validate if dates are already valid (e.g., defaults) + updateHasSetDates() + } } private func updateHasSetDates() { diff --git a/SportsTime/Features/Trip/Views/Wizard/Steps/RepeatCitiesStep.swift b/SportsTime/Features/Trip/Views/Wizard/Steps/RepeatCitiesStep.swift index f2ad5e1..24fee62 100644 --- a/SportsTime/Features/Trip/Views/Wizard/Steps/RepeatCitiesStep.swift +++ b/SportsTime/Features/Trip/Views/Wizard/Steps/RepeatCitiesStep.swift @@ -48,6 +48,12 @@ struct RepeatCitiesStep: View { RoundedRectangle(cornerRadius: Theme.CornerRadius.large) .stroke(Theme.surfaceGlow(colorScheme), lineWidth: 1) } + .onAppear { + // Auto-select the default if not already set (enables button with defaults) + if !hasSetRepeatCities { + hasSetRepeatCities = true + } + } } } diff --git a/SportsTime/Features/Trip/Views/Wizard/Steps/RoutePreferenceStep.swift b/SportsTime/Features/Trip/Views/Wizard/Steps/RoutePreferenceStep.swift index d6f0cac..600b195 100644 --- a/SportsTime/Features/Trip/Views/Wizard/Steps/RoutePreferenceStep.swift +++ b/SportsTime/Features/Trip/Views/Wizard/Steps/RoutePreferenceStep.swift @@ -39,6 +39,12 @@ struct RoutePreferenceStep: View { RoundedRectangle(cornerRadius: Theme.CornerRadius.large) .stroke(Theme.surfaceGlow(colorScheme), lineWidth: 1) } + .onAppear { + // Auto-select the default if not already set (enables button with defaults) + if !hasSetRoutePreference { + hasSetRoutePreference = true + } + } } }