From 6a694fcbcff6c585eae2632792564718ceeb3e08 Mon Sep 17 00:00:00 2001 From: Yusuf Suleman Date: Sat, 4 Apr 2026 22:33:21 -0500 Subject: [PATCH] =?UTF-8?q?fix:=20#31=20=E2=80=94=20changing=20quantity=20?= =?UTF-8?q?auto-recalculates=20macros=20in=20draft=20card?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Captures base per-unit values (calories/protein/carbs/fat/sugar/fiber divided by original quantity) when draft first appears. When quantity changes, recalculateMacros() multiplies base values by new quantity. Example: AI drafts "1 medium banana" at 105 cal. User changes quantity to 2.0 → calories becomes 210, protein doubles, etc. Values round to integers for calories, 1 decimal for macros. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../Assistant/EditableDraftCard.swift | 38 ++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/ios/Platform/Platform/Features/Assistant/EditableDraftCard.swift b/ios/Platform/Platform/Features/Assistant/EditableDraftCard.swift index 4525ef6..50d39b3 100644 --- a/ios/Platform/Platform/Features/Assistant/EditableDraftCard.swift +++ b/ios/Platform/Platform/Features/Assistant/EditableDraftCard.swift @@ -3,6 +3,13 @@ import SwiftUI struct EditableDraftCard: View { @Bindable var vm: AssistantViewModel @State private var isEditing = false + // Base values per 1.0 quantity — set once when draft appears + @State private var baseCalories: Double? + @State private var baseProtein: Double? + @State private var baseCarbs: Double? + @State private var baseFat: Double? + @State private var baseSugar: Double? + @State private var baseFiber: Double? private var draft: FitnessDraft? { vm.currentDraft } @@ -135,9 +142,35 @@ struct EditableDraftCard: View { .clipShape(RoundedRectangle(cornerRadius: 14)) .shadow(color: .black.opacity(0.06), radius: 6, y: 2) .padding(.horizontal, 12) + .onAppear { + // Capture base per-unit values on first appearance + if baseCalories == nil, let d = vm.currentDraft { + let q = max(d.quantity, 0.01) + baseCalories = d.calories / q + baseProtein = d.protein / q + baseCarbs = d.carbs / q + baseFat = d.fat / q + baseSugar = d.sugar / q + baseFiber = d.fiber / q + } + } } } + /// Recalculate macros from base values when quantity changes + private func recalculateMacros() { + guard let bc = baseCalories, let bp = baseProtein, + let bca = baseCarbs, let bf = baseFat, + let bs = baseSugar, let bfi = baseFiber else { return } + let q = vm.currentDraft?.quantity ?? 1.0 + vm.currentDraft?.calories = (bc * q).rounded() + vm.currentDraft?.protein = (bp * q * 10).rounded() / 10 + vm.currentDraft?.carbs = (bca * q * 10).rounded() / 10 + vm.currentDraft?.fat = (bf * q * 10).rounded() / 10 + vm.currentDraft?.sugar = (bs * q * 10).rounded() / 10 + vm.currentDraft?.fiber = (bfi * q * 10).rounded() / 10 + } + // MARK: - Editable macro cell private func editableMacro(_ label: String, value: Binding, color: Color) -> some View { @@ -196,7 +229,10 @@ struct EditableDraftCard: View { private var quantityBinding: Binding { Binding( get: { String(format: "%.1f", vm.currentDraft?.quantity ?? 1) }, - set: { vm.currentDraft?.quantity = Double($0) ?? 1 } + set: { + vm.currentDraft?.quantity = Double($0) ?? 1 + recalculateMacros() + } ) } }