Stabilize planner UI, fix reset flow, and force Premium on TestFlight

This commit is contained in:
alexandrev-tibco
2026-02-27 13:09:58 +01:00
parent ae40ec6f09
commit a532afbee6
8 changed files with 327 additions and 89 deletions
@@ -30,34 +30,38 @@ struct FirstDishesStepView: View {
}
private let maxVisibleSuggestions = 3
private var addedDishesReversed: [(index: Int, dish: (name: String, tagIds: [UUID]))] {
Array(viewModel.addedDishes.enumerated()).reversed().map { ($0.offset, $0.element) }
}
var body: some View {
ScrollView {
VStack(spacing: 24) {
Text("first_dishes_title")
.font(.mealMoodH1)
.foregroundColor(.mealMoodTextPrimary)
.frame(maxWidth: .infinity, alignment: .leading)
.padding(.horizontal, 24)
.padding(.top, 12)
VStack(spacing: 0) {
VStack(spacing: 24) {
Text("first_dishes_title")
.font(.mealMoodH1)
.foregroundColor(.mealMoodTextPrimary)
.frame(maxWidth: .infinity, alignment: .leading)
.padding(.horizontal, 24)
.padding(.top, 12)
Text("first_dishes_subtitle")
.font(.mealMoodSmall)
.foregroundColor(.mealMoodTextSecondary)
.frame(maxWidth: .infinity, alignment: .leading)
.padding(.horizontal, 24)
Text("first_dishes_subtitle")
.font(.mealMoodSmall)
.foregroundColor(.mealMoodTextSecondary)
.frame(maxWidth: .infinity, alignment: .leading)
.padding(.horizontal, 24)
// New dish form
VStack(spacing: 12) {
TextField("first_dishes_name_placeholder", text: $viewModel.newDishName)
.font(.mealMoodBody)
.padding(14)
.background(Color.mealMoodSurface)
.cornerRadius(12)
.overlay(
RoundedRectangle(cornerRadius: 12)
.stroke(Color(hex: "#F0F0F0"), lineWidth: 1)
)
// New dish form
VStack(spacing: 12) {
TextField("first_dishes_name_placeholder", text: $viewModel.newDishName)
.font(.mealMoodBody)
.padding(14)
.background(Color.mealMoodSurface)
.cornerRadius(12)
.overlay(
RoundedRectangle(cornerRadius: 12)
.stroke(Color(hex: "#F0F0F0"), lineWidth: 1)
)
// Selected tags
if !viewModel.newDishTags.isEmpty {
@@ -117,26 +121,28 @@ struct FirstDishesStepView: View {
}
.disabled(!viewModel.canAddDish)
}
.padding(.horizontal, 24)
.padding(.horizontal, 24)
// Added dishes list
if !viewModel.addedDishes.isEmpty {
VStack(alignment: .leading, spacing: 8) {
Text("first_dishes_added")
.font(.mealMoodSmall)
.foregroundColor(.mealMoodTextSecondary)
.padding(.horizontal, 24)
// Added dishes list
if !viewModel.addedDishes.isEmpty {
VStack(alignment: .leading, spacing: 8) {
Text("first_dishes_added")
.font(.mealMoodSmall)
.foregroundColor(.mealMoodTextSecondary)
.padding(.horizontal, 24)
ScrollView {
LazyVStack(spacing: 8) {
ForEach(Array(viewModel.addedDishes.enumerated()), id: \.offset) { index, dish in
HStack {
Image(systemName: "checkmark.circle.fill")
.foregroundColor(.mealMoodSuccess)
ScrollView {
LazyVStack(spacing: 8) {
ForEach(addedDishesReversed, id: \.index) { item in
let index = item.index
let dish = item.dish
HStack {
Image(systemName: "checkmark.circle.fill")
.foregroundColor(.mealMoodSuccess)
Text(dish.name)
.font(.mealMoodBody)
.foregroundColor(.mealMoodTextPrimary)
Text(dish.name)
.font(.mealMoodBody)
.foregroundColor(.mealMoodTextPrimary)
// Show tag pills
HStack(spacing: 4) {
@@ -145,26 +151,26 @@ struct FirstDishesStepView: View {
}
}
Spacer()
Spacer()
Button {
viewModel.removeDish(at: index)
} label: {
Image(systemName: "trash")
.font(.system(size: 14))
.foregroundColor(.mealMoodError)
Button {
viewModel.removeDish(at: index)
} label: {
Image(systemName: "trash")
.font(.system(size: 14))
.foregroundColor(.mealMoodError)
}
}
.padding(12)
.background(Color.mealMoodSurface)
.cornerRadius(12)
}
.padding(12)
.background(Color.mealMoodSurface)
.cornerRadius(12)
}
}
.frame(maxHeight: 190)
.padding(.horizontal, 24)
}
.frame(maxHeight: 190)
.padding(.horizontal, 24)
}
}
VStack(alignment: .leading, spacing: 10) {
Text("first_dishes_suggestions")
@@ -214,7 +220,9 @@ struct FirstDishesStepView: View {
}
}
Spacer(minLength: 40)
Spacer(minLength: 20)
}
.frame(maxWidth: .infinity, alignment: .top)
PrimaryButton(
title: String(localized: "onboarding_finish"),
@@ -227,7 +235,8 @@ struct FirstDishesStepView: View {
isEnabled: viewModel.addedDishes.count >= 2
)
.padding(.horizontal, 24)
.padding(.bottom, 40)
.padding(.top, 12)
.padding(.bottom, 24)
}
}
.sheet(isPresented: $showTagSelector) {