Rework onboarding flow and move premium prompt post-setup
This commit is contained in:
@@ -21,6 +21,9 @@ struct HomeView: View {
|
||||
@State private var showCopyPreviousConfirm: Bool = false
|
||||
@State private var showReviewSentimentPrompt: Bool = false
|
||||
@State private var showReviewSupportPrompt: Bool = false
|
||||
@State private var showPostOnboardingAutoAssignPrompt: Bool = false
|
||||
@State private var showPostOnboardingPremiumPrompt: Bool = false
|
||||
@State private var hasEvaluatedPostOnboardingPrompts: Bool = false
|
||||
|
||||
private var settings: AppSettings? { allSettings.first }
|
||||
|
||||
@@ -251,6 +254,30 @@ struct HomeView: View {
|
||||
secondaryButton: .cancel(Text("reset_cancel"))
|
||||
)
|
||||
}
|
||||
.alert("onboarding_auto_assign_title", isPresented: $showPostOnboardingAutoAssignPrompt) {
|
||||
Button("onboarding_auto_assign_yes") {
|
||||
viewModel.autoComplete(plan: plan, dishes: dishes, tags: tags, settings: settings)
|
||||
UserDefaults.standard.set(false, forKey: OnboardingViewModel.pendingAutoAssignPromptKey)
|
||||
schedulePostOnboardingPremiumPromptIfNeeded(settings: settings)
|
||||
}
|
||||
Button("onboarding_auto_assign_no", role: .cancel) {
|
||||
UserDefaults.standard.set(false, forKey: OnboardingViewModel.pendingAutoAssignPromptKey)
|
||||
schedulePostOnboardingPremiumPromptIfNeeded(settings: settings)
|
||||
}
|
||||
} message: {
|
||||
Text("onboarding_auto_assign_message")
|
||||
}
|
||||
.alert("onboarding_premium_prompt_title", isPresented: $showPostOnboardingPremiumPrompt) {
|
||||
Button("onboarding_premium_prompt_cta") {
|
||||
UserDefaults.standard.set(false, forKey: OnboardingViewModel.pendingPremiumPromptKey)
|
||||
showPremiumFromExport = true
|
||||
}
|
||||
Button("reset_cancel", role: .cancel) {
|
||||
UserDefaults.standard.set(false, forKey: OnboardingViewModel.pendingPremiumPromptKey)
|
||||
}
|
||||
} message: {
|
||||
Text("onboarding_premium_prompt_message")
|
||||
}
|
||||
.alert("review_funnel_title", isPresented: $showReviewSentimentPrompt) {
|
||||
Button("review_funnel_positive") {
|
||||
ReviewPromptService.shared.requestReview()
|
||||
@@ -374,6 +401,7 @@ struct HomeView: View {
|
||||
language: settings.languageEnum.resolved()
|
||||
)
|
||||
wasWeekComplete = isWeekComplete(plan: plan)
|
||||
evaluatePostOnboardingPromptsIfNeeded(plan: plan, settings: settings)
|
||||
}
|
||||
.onChange(of: plan.updatedAt) { _, _ in
|
||||
let nowComplete = isWeekComplete(plan: plan)
|
||||
@@ -643,6 +671,34 @@ struct HomeView: View {
|
||||
ReviewPromptService.shared.markFunnelShown(completedWeeks: completedWeeks)
|
||||
showReviewSentimentPrompt = true
|
||||
}
|
||||
|
||||
private func evaluatePostOnboardingPromptsIfNeeded(plan: WeekPlan, settings: AppSettings) {
|
||||
guard !hasEvaluatedPostOnboardingPrompts else { return }
|
||||
hasEvaluatedPostOnboardingPrompts = true
|
||||
|
||||
let shouldAskAutoAssign = UserDefaults.standard.bool(forKey: OnboardingViewModel.pendingAutoAssignPromptKey)
|
||||
if shouldAskAutoAssign && plan.slots.contains(where: { $0.dishId == nil }) {
|
||||
showPostOnboardingAutoAssignPrompt = true
|
||||
return
|
||||
}
|
||||
|
||||
UserDefaults.standard.set(false, forKey: OnboardingViewModel.pendingAutoAssignPromptKey)
|
||||
schedulePostOnboardingPremiumPromptIfNeeded(settings: settings)
|
||||
}
|
||||
|
||||
private func schedulePostOnboardingPremiumPromptIfNeeded(settings: AppSettings) {
|
||||
guard !settings.isPremium else {
|
||||
UserDefaults.standard.set(false, forKey: OnboardingViewModel.pendingPremiumPromptKey)
|
||||
return
|
||||
}
|
||||
|
||||
let shouldShowPremiumPrompt = UserDefaults.standard.bool(forKey: OnboardingViewModel.pendingPremiumPromptKey)
|
||||
guard shouldShowPremiumPrompt else { return }
|
||||
|
||||
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
|
||||
showPostOnboardingPremiumPrompt = true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private struct MonthlyHistoryView: View {
|
||||
|
||||
Reference in New Issue
Block a user