diff --git a/SportsTime/Features/Paywall/Views/PaywallView.swift b/SportsTime/Features/Paywall/Views/PaywallView.swift index 6e6da67..69e0724 100644 --- a/SportsTime/Features/Paywall/Views/PaywallView.swift +++ b/SportsTime/Features/Paywall/Views/PaywallView.swift @@ -74,6 +74,7 @@ struct PaywallView: View { } } .storeButton(.visible, for: .restorePurchases) + .storeButton(.visible, for: .redeemCode) .subscriptionStoreControlStyle(.prominentPicker) .subscriptionStoreButtonLabel(.displayName.multiline) .onInAppPurchaseStart { product in diff --git a/SportsTime/Features/Settings/Views/SettingsView.swift b/SportsTime/Features/Settings/Views/SettingsView.swift index af18bbe..95eba1f 100644 --- a/SportsTime/Features/Settings/Views/SettingsView.swift +++ b/SportsTime/Features/Settings/Views/SettingsView.swift @@ -3,6 +3,7 @@ // SportsTime // +import StoreKit import SwiftUI struct SettingsView: View { @@ -11,6 +12,7 @@ struct SettingsView: View { @State private var viewModel = SettingsViewModel() @State private var showResetConfirmation = false @State private var showPaywall = false + @State private var showRedeemCode = false @State private var showOnboardingPaywall = false @State private var showSyncLogs = false @State private var isSyncActionInProgress = false @@ -79,6 +81,7 @@ struct SettingsView: View { .sheet(isPresented: $showPaywall) { PaywallView(source: "settings") } + .offerCodeRedemption(isPresented: $showRedeemCode) .sheet(isPresented: $showOnboardingPaywall) { OnboardingPaywallView(isPresented: $showOnboardingPaywall) } @@ -812,6 +815,13 @@ struct SettingsView: View { Label("Restore Purchases", systemImage: "arrow.clockwise") } .accessibilityIdentifier("settings.restorePurchasesButton") + + Button { + showRedeemCode = true + } label: { + Label("Redeem Code", systemImage: "giftcard") + } + .accessibilityIdentifier("settings.redeemCodeButton") } } header: { Text("Subscription") diff --git a/SportsTime/Features/Trip/Views/Wizard/Steps/TeamPickerStep.swift b/SportsTime/Features/Trip/Views/Wizard/Steps/TeamPickerStep.swift index 9bc11d5..d0796bd 100644 --- a/SportsTime/Features/Trip/Views/Wizard/Steps/TeamPickerStep.swift +++ b/SportsTime/Features/Trip/Views/Wizard/Steps/TeamPickerStep.swift @@ -116,7 +116,8 @@ struct TeamPickerStep: View { .sheet(isPresented: $showTeamPicker) { TeamPickerSheet( selectedSport: $selectedSport, - selectedTeamId: $selectedTeamId + selectedTeamId: $selectedTeamId, + isPresented: $showTeamPicker ) } } @@ -125,11 +126,11 @@ struct TeamPickerStep: View { // MARK: - Team Picker Sheet private struct TeamPickerSheet: View { - @Environment(\.dismiss) private var dismiss @Environment(\.colorScheme) private var colorScheme @Binding var selectedSport: Sport? @Binding var selectedTeamId: String? + @Binding var isPresented: Bool var body: some View { NavigationStack { @@ -142,7 +143,7 @@ private struct TeamPickerSheet: View { onSelect: { teamId in selectedSport = sport selectedTeamId = teamId - dismiss() + isPresented = false } ) } label: { @@ -171,7 +172,7 @@ private struct TeamPickerSheet: View { .navigationBarTitleDisplayMode(.inline) .toolbar { ToolbarItem(placement: .cancellationAction) { - Button("Cancel") { dismiss() } + Button("Cancel") { isPresented = false } } } } diff --git a/SportsTime/Features/Trip/Views/Wizard/TeamFirstWizardStep.swift b/SportsTime/Features/Trip/Views/Wizard/TeamFirstWizardStep.swift index 954c8a5..461435f 100644 --- a/SportsTime/Features/Trip/Views/Wizard/TeamFirstWizardStep.swift +++ b/SportsTime/Features/Trip/Views/Wizard/TeamFirstWizardStep.swift @@ -115,7 +115,8 @@ struct TeamFirstWizardStep: View { .sheet(isPresented: $showTeamPicker) { TeamFirstPickerSheet( selectedSport: $selectedSport, - selectedTeamIds: $selectedTeamIds + selectedTeamIds: $selectedTeamIds, + isPresented: $showTeamPicker ) } } @@ -184,11 +185,11 @@ struct TeamFirstWizardStep: View { // MARK: - Team First Picker Sheet private struct TeamFirstPickerSheet: View { - @Environment(\.dismiss) private var dismiss @Environment(\.colorScheme) private var colorScheme @Binding var selectedSport: Sport? @Binding var selectedTeamIds: Set + @Binding var isPresented: Bool var body: some View { NavigationStack { @@ -200,7 +201,7 @@ private struct TeamFirstPickerSheet: View { selectedTeamIds: $selectedTeamIds, onDone: { selectedSport = sport - dismiss() + isPresented = false } ) } label: { @@ -229,7 +230,7 @@ private struct TeamFirstPickerSheet: View { .navigationBarTitleDisplayMode(.inline) .toolbar { ToolbarItem(placement: .cancellationAction) { - Button("Cancel") { dismiss() } + Button("Cancel") { isPresented = false } } } } diff --git a/SportsTime/Planning/Engine/ScenarioCPlanner.swift b/SportsTime/Planning/Engine/ScenarioCPlanner.swift index 6188f9b..93509d7 100644 --- a/SportsTime/Planning/Engine/ScenarioCPlanner.swift +++ b/SportsTime/Planning/Engine/ScenarioCPlanner.swift @@ -215,6 +215,7 @@ final class ScenarioCPlanner: ScenarioPlanner { from: gamesInRange, stadiums: request.stadiums, anchorGameIds: [], // No anchors in Scenario C + allowRepeatCities: request.preferences.allowRepeatCities, stopBuilder: buildStops )