Skip to content

Commit bfd1c9d

Browse files
Fix width bug and rearrange Add Carb Entry view
The fix maintains the existing StackNavigationViewStyle() while adding proper width constraints. This should resolve the issue where the "Add Carb Entry" screen appears too wide and cuts off content after using AI analysis. We also moved the Food Search enablement toggle and Food Search's section below Absorption Time row for a more logical flow. Confirmed that the FPU formula implementation is CORRECT and adheres to the standard. No changes are needed to the calculation formula. Minor tweak to AI prompt.
1 parent 509619d commit bfd1c9d

File tree

2 files changed

+44
-45
lines changed

2 files changed

+44
-45
lines changed

Loop/Views/AISettingsView.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ struct AISettingsView: View {
8383
// GPT-5 Feature Section - Only show when OpenAI is selected for AI Image Analysis
8484
if aiService.aiImageSearchProvider.rawValue.contains("OpenAI") {
8585
Section(header: Text("OpenAI GPT-5 (Latest)"),
86-
footer: Text("Enable GPT-5, GPT-5-mini, and GPT-5-nano models for OpenAI analysis. Standard Quality uses GPT-5, Fast Mode uses GPT-5-nano for ultra-fast analysis. GPT-5 takes longer to perform analysis but these are the latest models with significant improvements in health advisory accuracy. Fallback to GPT-4o if unavailable.")) {
86+
footer: Text("Enable GPT-5, GPT-5-mini, and GPT-5-nano models for OpenAI analysis. Standard Quality uses GPT-5, Fast Mode uses GPT-5-nano for ultra-fast analysis. GPT-5 takes longer to perform analysis but these are the latest models with some improvements in health advisory accuracy. Fallback to GPT-4o if unavailable.")) {
8787
Toggle("Use GPT-5 Models", isOn: $useGPT5ForOpenAI)
8888
.disabled(!foodSearchEnabled)
8989
.onChange(of: useGPT5ForOpenAI) { _ in

Loop/Views/CarbEntryView.swift

Lines changed: 43 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -47,22 +47,25 @@ struct CarbEntryView: View, HorizontalSizeClassOverride {
4747

4848
var body: some View {
4949
if isNewEntry {
50-
NavigationView {
51-
let title = NSLocalizedString("carb-entry-title-add", value: "Add Carb Entry", comment: "The title of the view controller to create a new carb entry")
52-
content
53-
.navigationBarTitle(title, displayMode: .inline)
54-
.toolbar {
55-
ToolbarItem(placement: .navigationBarLeading) {
56-
dismissButton
57-
}
58-
59-
ToolbarItem(placement: .navigationBarTrailing) {
60-
continueButton
50+
GeometryReader { geometry in
51+
NavigationView {
52+
let title = NSLocalizedString("carb-entry-title-add", value: "Add Carb Entry", comment: "The title of the view controller to create a new carb entry")
53+
content
54+
.navigationBarTitle(title, displayMode: .inline)
55+
.toolbar {
56+
ToolbarItem(placement: .navigationBarLeading) {
57+
dismissButton
58+
}
59+
60+
ToolbarItem(placement: .navigationBarTrailing) {
61+
continueButton
62+
}
6163
}
62-
}
63-
64+
65+
}
66+
.navigationViewStyle(StackNavigationViewStyle())
67+
.frame(width: geometry.size.width)
6468
}
65-
.navigationViewStyle(StackNavigationViewStyle())
6669
} else {
6770
content
6871
.toolbar {
@@ -148,8 +151,32 @@ struct CarbEntryView: View, HorizontalSizeClassOverride {
148151
let absorptionTimeFocused: Binding<Bool> = Binding(get: { expandedRow == .absorptionTime }, set: { expandedRow = $0 ? .absorptionTime : nil })
149152

150153
CarbQuantityRow(quantity: $viewModel.carbsQuantity, isFocused: amountConsumedFocused, title: NSLocalizedString("Amount Consumed", comment: "Label for carb quantity entry row on carb entry screen"), preferredCarbUnit: viewModel.preferredCarbUnit)
154+
155+
CardSectionDivider()
156+
157+
DatePickerRow(date: $viewModel.time, isFocused: timerFocused, minimumDate: viewModel.minimumDate, maximumDate: viewModel.maximumDate)
158+
159+
CardSectionDivider()
160+
161+
FoodTypeRow(foodType: $viewModel.foodType, absorptionTime: $viewModel.absorptionTime, selectedDefaultAbsorptionTimeEmoji: $viewModel.selectedDefaultAbsorptionTimeEmoji, usesCustomFoodType: $viewModel.usesCustomFoodType, absorptionTimeWasEdited: $viewModel.absorptionTimeWasEdited, isFocused: foodTypeFocused, defaultAbsorptionTimes: viewModel.defaultAbsorptionTimes)
162+
163+
CardSectionDivider()
164+
165+
AIAbsorptionTimePickerRow(absorptionTime: $viewModel.absorptionTime, isFocused: absorptionTimeFocused, validDurationRange: viewModel.absorptionRimesRange, isAIGenerated: viewModel.absorptionTimeWasAIGenerated, showHowAbsorptionTimeWorks: $showHowAbsorptionTimeWorks)
166+
.onReceive(viewModel.$absorptionTimeWasAIGenerated) { isAIGenerated in
167+
print("🎯 AIAbsorptionTimePickerRow received isAIGenerated: \(isAIGenerated)")
168+
}
169+
.padding(.bottom, 2)
170+
171+
// Food Search enablement toggle (only show when Food Search is disabled)
172+
if !isFoodSearchEnabled {
173+
CardSectionDivider()
174+
175+
FoodSearchEnableRow(isFoodSearchEnabled: $isFoodSearchEnabled)
176+
.padding(.bottom, 2)
177+
}
151178

152-
// Food search section - moved up from bottom
179+
// Food search section - moved after Absorption Time
153180
if isNewEntry && isFoodSearchEnabled {
154181
CardSectionDivider()
155182

@@ -213,11 +240,7 @@ struct CarbEntryView: View, HorizontalSizeClassOverride {
213240
viewModel.setupFoodSearchObservers()
214241
}
215242

216-
CardSectionDivider()
217-
}
218-
219-
// Food-related rows (only show if food search is enabled)
220-
if isFoodSearchEnabled {
243+
// Food-related rows (only show if food search is enabled)
221244
// Always show servings row when food search is enabled
222245
ServingsDisplayRow(
223246
servings: $viewModel.numberOfServings,
@@ -432,30 +455,6 @@ struct CarbEntryView: View, HorizontalSizeClassOverride {
432455
.padding(.vertical, 8)
433456
}
434457
} // End food search enabled section
435-
436-
CardSectionDivider()
437-
438-
DatePickerRow(date: $viewModel.time, isFocused: timerFocused, minimumDate: viewModel.minimumDate, maximumDate: viewModel.maximumDate)
439-
440-
CardSectionDivider()
441-
442-
FoodTypeRow(foodType: $viewModel.foodType, absorptionTime: $viewModel.absorptionTime, selectedDefaultAbsorptionTimeEmoji: $viewModel.selectedDefaultAbsorptionTimeEmoji, usesCustomFoodType: $viewModel.usesCustomFoodType, absorptionTimeWasEdited: $viewModel.absorptionTimeWasEdited, isFocused: foodTypeFocused, defaultAbsorptionTimes: viewModel.defaultAbsorptionTimes)
443-
444-
CardSectionDivider()
445-
446-
AIAbsorptionTimePickerRow(absorptionTime: $viewModel.absorptionTime, isFocused: absorptionTimeFocused, validDurationRange: viewModel.absorptionRimesRange, isAIGenerated: viewModel.absorptionTimeWasAIGenerated, showHowAbsorptionTimeWorks: $showHowAbsorptionTimeWorks)
447-
.onReceive(viewModel.$absorptionTimeWasAIGenerated) { isAIGenerated in
448-
print("🎯 AIAbsorptionTimePickerRow received isAIGenerated: \(isAIGenerated)")
449-
}
450-
.padding(.bottom, 2)
451-
452-
// Food Search enablement toggle (only show when Food Search is disabled)
453-
if !isFoodSearchEnabled {
454-
CardSectionDivider()
455-
456-
FoodSearchEnableRow(isFoodSearchEnabled: $isFoodSearchEnabled)
457-
.padding(.bottom, 2)
458-
}
459458
}
460459
.padding(.vertical, 12)
461460
.padding(.horizontal, 12)

0 commit comments

Comments
 (0)