From e66f8056c891e330f8ab9fedd386e5cf61b3d4d6 Mon Sep 17 00:00:00 2001 From: Trey t Date: Tue, 13 Jan 2026 21:49:58 -0600 Subject: [PATCH] fix(wizard): enable Plan My Trip button with default values - Add debug toggle in Settings to override Pro subscription status (DEBUG builds only, defaults to true) - Auto-validate wizard step flags on appear so button enables without explicit user interaction: - DatesStep: calls updateHasSetDates() on appear - RoutePreferenceStep: sets hasSetRoutePreference on appear - RepeatCitiesStep: sets hasSetRepeatCities on appear Previously, canPlanTrip required all flags to be explicitly set by user interaction, even when valid defaults were showing. Co-Authored-By: Claude Opus 4.5 --- SportsTime/Core/Store/StoreManager.swift | 22 ++++++++++++++++++- .../Settings/Views/SettingsView.swift | 7 ++++++ .../Trip/Views/Wizard/Steps/DatesStep.swift | 4 ++++ .../Views/Wizard/Steps/RepeatCitiesStep.swift | 6 +++++ .../Wizard/Steps/RoutePreferenceStep.swift | 6 +++++ 5 files changed, 44 insertions(+), 1 deletion(-) 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 + } + } } }