Stabilize planner UI, fix reset flow, and force Premium on TestFlight
This commit is contained in:
@@ -33,7 +33,7 @@ struct HomeView: View {
|
||||
Color.mealMoodBackground.ignoresSafeArea()
|
||||
|
||||
if let settings = settings {
|
||||
let plan = viewModel.getOrCreateWeekPlan(context: context, settings: settings)
|
||||
let plan = fetchWeekPlan(for: viewModel.currentWeekStart)
|
||||
if let plan {
|
||||
mainContent(plan: plan, settings: settings)
|
||||
}
|
||||
@@ -109,7 +109,7 @@ struct HomeView: View {
|
||||
ToolbarItem(placement: .navigationBarTrailing) {
|
||||
HStack(spacing: 10) {
|
||||
if let settings = settings,
|
||||
let plan = viewModel.getOrCreateWeekPlan(context: context, settings: settings) {
|
||||
let plan = fetchWeekPlan(for: viewModel.currentWeekStart) {
|
||||
if viewModel.canEditCurrentWeek {
|
||||
Button {
|
||||
viewModel.autoComplete(plan: plan, dishes: dishes, tags: tags, settings: settings)
|
||||
@@ -161,22 +161,22 @@ struct HomeView: View {
|
||||
}
|
||||
.onAppear {
|
||||
guard let settings = settings,
|
||||
let plan = viewModel.getOrCreateWeekPlan(context: context, settings: settings) else { return }
|
||||
let plan = ensureCurrentWeekPlanExists(settings: settings) else { return }
|
||||
viewModel.reconcileSlotsIfNeeded(plan: plan, settings: settings, context: context)
|
||||
}
|
||||
.onChange(of: settings?.includeWeekends) { _, _ in
|
||||
guard let settings = settings,
|
||||
let plan = viewModel.getOrCreateWeekPlan(context: context, settings: settings) else { return }
|
||||
let plan = ensureCurrentWeekPlanExists(settings: settings) else { return }
|
||||
viewModel.reconcileSlotsIfNeeded(plan: plan, settings: settings, context: context)
|
||||
}
|
||||
.onChange(of: settings?.mealWindows) { _, _ in
|
||||
guard let settings = settings,
|
||||
let plan = viewModel.getOrCreateWeekPlan(context: context, settings: settings) else { return }
|
||||
let plan = ensureCurrentWeekPlanExists(settings: settings) else { return }
|
||||
viewModel.reconcileSlotsIfNeeded(plan: plan, settings: settings, context: context)
|
||||
}
|
||||
.onChange(of: viewModel.currentWeekStart) { _, _ in
|
||||
guard let settings = settings,
|
||||
let plan = viewModel.getOrCreateWeekPlan(context: context, settings: settings) else { return }
|
||||
let plan = ensureCurrentWeekPlanExists(settings: settings) else { return }
|
||||
viewModel.reconcileSlotsIfNeeded(plan: plan, settings: settings, context: context)
|
||||
}
|
||||
}
|
||||
@@ -655,12 +655,42 @@ struct HomeView: View {
|
||||
}
|
||||
|
||||
private func fetchWeekPlan(for weekStartDate: Date) -> WeekPlan? {
|
||||
let matches = weekPlanCandidates(for: weekStartDate)
|
||||
guard !matches.isEmpty else { return nil }
|
||||
return preferredWeekPlan(from: matches)
|
||||
}
|
||||
|
||||
private func weekPlanCandidates(for weekStartDate: Date) -> [WeekPlan] {
|
||||
let descriptor = FetchDescriptor<WeekPlan>(
|
||||
predicate: #Predicate<WeekPlan> { plan in
|
||||
plan.weekStartDate == weekStartDate
|
||||
}
|
||||
)
|
||||
return try? context.fetch(descriptor).first
|
||||
return (try? context.fetch(descriptor)) ?? []
|
||||
}
|
||||
|
||||
private func preferredWeekPlan(from plans: [WeekPlan]) -> WeekPlan? {
|
||||
plans.max { lhs, rhs in
|
||||
let lhsAssigned = lhs.slots.filter { $0.dishId != nil }.count
|
||||
let rhsAssigned = rhs.slots.filter { $0.dishId != nil }.count
|
||||
if lhsAssigned != rhsAssigned { return lhsAssigned < rhsAssigned }
|
||||
if lhs.slots.count != rhs.slots.count { return lhs.slots.count < rhs.slots.count }
|
||||
return lhs.updatedAt < rhs.updatedAt
|
||||
}
|
||||
}
|
||||
|
||||
private func ensureCurrentWeekPlanExists(settings: AppSettings) -> WeekPlan? {
|
||||
let matches = weekPlanCandidates(for: viewModel.currentWeekStart)
|
||||
if let preferred = preferredWeekPlan(from: matches) {
|
||||
if matches.count > 1 {
|
||||
for duplicate in matches where duplicate.id != preferred.id {
|
||||
context.delete(duplicate)
|
||||
}
|
||||
try? context.save()
|
||||
}
|
||||
return preferred
|
||||
}
|
||||
return DefaultDataService.createWeekPlan(for: viewModel.currentWeekStart, settings: settings, context: context)
|
||||
}
|
||||
|
||||
private func evaluateReviewPrompt() {
|
||||
|
||||
Reference in New Issue
Block a user