polscm32 1 год назад
Родитель
Сommit
e94c8b1fc0

+ 0 - 9
Trio/Sources/Localizations/Main/Localizable.xcstrings

@@ -21747,15 +21747,6 @@
         }
       }
     },
-    "Add Initial Basal Rate" : {
-
-    },
-    "Add Initial Carb Ratio" : {
-
-    },
-    "Add Initial ISF Value" : {
-
-    },
     "Add insulin without actually bolusing" : {
       "comment" : "Bolus screen when adding insulin",
       "extractionState" : "manual",

+ 87 - 97
Trio/Sources/Modules/Main/View/OnboardingSteps/BasalProfileStepView.swift

@@ -83,108 +83,98 @@ struct BasalProfileStepView: View {
                     }
                     .padding(.horizontal)
 
-                    if onboardingData.basalProfileItems.isEmpty {
-                        // Add default entry if no items exist
-                        Button("Add Initial Basal Rate") {
-                            addBasalRate()
-                        }
-                        .foregroundColor(.purple)
-                        .padding()
-                        .frame(maxWidth: .infinity)
-                        .background(Color.purple.opacity(0.1))
-                        .cornerRadius(8)
-                        .padding(.horizontal)
-                    } else {
-                        // List of basal rates
-                        VStack(spacing: 2) {
-                            ForEach(Array(onboardingData.basalProfileItems.enumerated()), id: \.element.id) { index, item in
-                                HStack {
-                                    // Time display
-                                    Text(
-                                        dateFormatter
-                                            .string(from: Date(
-                                                timeIntervalSince1970: onboardingData
-                                                    .basalProfileTimeValues[item.timeIndex]
-                                            ))
-                                    )
-                                    .frame(width: 80, alignment: .leading)
-                                    .padding(.leading)
-
-                                    // Rate slider
-                                    Slider(
-                                        value: Binding(
-                                            get: {
-                                                guard !onboardingData.basalProfileRateValues.isEmpty,
-                                                      item.rateIndex < onboardingData.basalProfileRateValues.count
-                                                else {
-                                                    return 0.0
-                                                }
-                                                return Double(
-                                                    truncating: onboardingData
-                                                        .basalProfileRateValues[item.rateIndex] as NSNumber
-                                                )
-                                            },
-                                            set: { newValue in
-                                                guard !onboardingData.basalProfileRateValues.isEmpty else { return }
-
-                                                // Find closest match in rateValues array
-                                                let newIndex = onboardingData.basalProfileRateValues
-                                                    .firstIndex { abs(Double($0) - newValue) < 0.005 } ?? item.rateIndex
-
-                                                // Ensure index is valid before updating
-                                                if newIndex < onboardingData.basalProfileRateValues.count,
-                                                   index < onboardingData.basalProfileItems.count
-                                                {
-                                                    onboardingData.basalProfileItems[index].rateIndex = newIndex
-                                                    // Force refresh when slider changes
-                                                    refreshUI = UUID()
-                                                }
+                    // List of basal rates
+                    VStack(spacing: 2) {
+                        ForEach(Array(onboardingData.basalProfileItems.enumerated()), id: \.element.id) { index, item in
+                            HStack {
+                                // Time display
+                                Text(
+                                    dateFormatter
+                                        .string(from: Date(
+                                            timeIntervalSince1970: onboardingData
+                                                .basalProfileTimeValues[item.timeIndex]
+                                        ))
+                                )
+                                .frame(width: 80, alignment: .leading)
+                                .padding(.leading)
+
+                                // Rate slider
+                                Slider(
+                                    value: Binding(
+                                        get: {
+                                            guard !onboardingData.basalProfileRateValues.isEmpty,
+                                                  item.rateIndex < onboardingData.basalProfileRateValues.count
+                                            else {
+                                                return 0.0
+                                            }
+                                            return Double(
+                                                truncating: onboardingData
+                                                    .basalProfileRateValues[item.rateIndex] as NSNumber
+                                            )
+                                        },
+                                        set: { newValue in
+                                            guard !onboardingData.basalProfileRateValues.isEmpty else { return }
+
+                                            // Find closest match in rateValues array
+                                            let newIndex = onboardingData.basalProfileRateValues
+                                                .firstIndex { abs(Double($0) - newValue) < 0.005 } ?? item.rateIndex
+
+                                            // Ensure index is valid before updating
+                                            if newIndex < onboardingData.basalProfileRateValues.count,
+                                               index < onboardingData.basalProfileItems.count
+                                            {
+                                                onboardingData.basalProfileItems[index].rateIndex = newIndex
+                                                // Force refresh when slider changes
+                                                refreshUI = UUID()
                                             }
-                                        ),
-                                        in: onboardingData.basalProfileRateValues.isEmpty ? 0 ... 1 :
-                                            Double(truncating: onboardingData.basalProfileRateValues.first! as NSNumber) ...
-                                            Double(truncating: onboardingData.basalProfileRateValues.last! as NSNumber),
-                                        step: 0.05
-                                    )
-                                    .accentColor(.purple)
-                                    .padding(.horizontal, 5)
-                                    .onChange(of: onboardingData.basalProfileItems[index].rateIndex) { _, _ in
-                                        // Trigger immediate UI update when slider value changes
-                                        let impact = UIImpactFeedbackGenerator(style: .light)
-                                        impact.impactOccurred()
-                                    }
-
-                                    // Display the current value
-                                    Text(
-                                        "\(onboardingData.basalProfileRateValues.isEmpty || item.rateIndex >= onboardingData.basalProfileRateValues.count ? "--" : formatter.string(from: onboardingData.basalProfileRateValues[item.rateIndex] as NSNumber) ?? "--") U/h"
-                                    )
-                                    .frame(width: 80, alignment: .trailing)
-                                    .lineLimit(1)
-                                    .minimumScaleFactor(0.8)
-
-                                    // Delete button (not for the first entry at 00:00)
-                                    if index > 0 {
-                                        Button(action: {
-                                            onboardingData.basalProfileItems.remove(at: index)
-                                        }) {
-                                            Image(systemName: "trash")
-                                                .foregroundColor(.red)
-                                                .padding(.horizontal, 5)
                                         }
-                                    } else {
-                                        // Spacer to maintain alignment
-                                        Spacer()
-                                            .frame(width: 30)
+                                    ),
+                                    in: onboardingData.basalProfileRateValues.isEmpty ? 0 ... 1 :
+                                        Double(truncating: onboardingData.basalProfileRateValues.first! as NSNumber) ...
+                                        Double(truncating: onboardingData.basalProfileRateValues.last! as NSNumber),
+                                    step: 0.05
+                                )
+                                .accentColor(.purple)
+                                .padding(.horizontal, 5)
+                                .onChange(of: onboardingData.basalProfileItems[index].rateIndex) { _, _ in
+                                    // Trigger immediate UI update when slider value changes
+                                    let impact = UIImpactFeedbackGenerator(style: .light)
+                                    impact.impactOccurred()
+                                }
+
+                                // Display the current value
+                                Text(
+                                    "\(onboardingData.basalProfileRateValues.isEmpty || item.rateIndex >= onboardingData.basalProfileRateValues.count ? "--" : formatter.string(from: onboardingData.basalProfileRateValues[item.rateIndex] as NSNumber) ?? "--") U/h"
+                                )
+                                .frame(width: 80, alignment: .trailing)
+                                .lineLimit(1)
+                                .minimumScaleFactor(0.8)
+
+                                // Delete button (not for the first entry at 00:00)
+                                if index > 0 {
+                                    Button(action: {
+                                        onboardingData.basalProfileItems.remove(at: index)
+                                    }) {
+                                        Image(systemName: "trash")
+                                            .foregroundColor(.red)
+                                            .padding(.horizontal, 5)
                                     }
+                                } else {
+                                    // Spacer to maintain alignment
+                                    Spacer()
+                                        .frame(width: 30)
                                 }
-                                .padding(.vertical, 12)
-                                .background(index % 2 == 0 ? Color.purple.opacity(0.05) : Color.clear)
-                                .cornerRadius(8)
                             }
+                            .padding(.vertical, 12)
+                            .background(index % 2 == 0 ? Color.purple.opacity(0.05) : Color.clear)
+                            .cornerRadius(8)
                         }
-                        .background(Color.purple.opacity(0.05))
-                        .cornerRadius(10)
-                        .padding(.horizontal)
+                    }
+                    .background(Color.purple.opacity(0.05))
+                    .cornerRadius(10)
+                    .padding(.horizontal)
+                    .onAppear {
+                        addBasalRate()
                     }
                 }
 
@@ -378,7 +368,7 @@ struct BasalProfileStepView: View {
                     .lineStyle(.init(lineWidth: 1)).foregroundStyle(Color.purple)
             }
         }
-        .id(refreshUI) // Erzwingt die Aktualisierung des Charts
+        .id(refreshUI) // Force chart update
         .chartXAxis {
             AxisMarks(values: .automatic(desiredCount: 6)) { _ in
                 AxisValueLabel(format: .dateTime.hour())

+ 69 - 79
Trio/Sources/Modules/Main/View/OnboardingSteps/CarbRatioStepView.swift

@@ -81,92 +81,82 @@ struct CarbRatioStepView: View {
                     }
                     .padding(.horizontal)
 
-                    if onboardingData.carbRatioItems.isEmpty {
-                        // Add default entry if no items exist
-                        Button("Add Initial Carb Ratio") {
-                            onboardingData.addCarbRatio()
-                        }
-                        .foregroundColor(.orange)
-                        .padding()
-                        .frame(maxWidth: .infinity)
-                        .background(Color.orange.opacity(0.1))
-                        .cornerRadius(8)
-                        .padding(.horizontal)
-                    } else {
-                        // List of carb ratios
-                        VStack(spacing: 2) {
-                            ForEach(Array(onboardingData.carbRatioItems.enumerated()), id: \.element.id) { index, item in
-                                HStack {
-                                    // Time display
-                                    Text(
-                                        dateFormatter
-                                            .string(from: Date(
-                                                timeIntervalSince1970: onboardingData
-                                                    .carbRatioTimeValues[item.timeIndex]
-                                            ))
-                                    )
-                                    .frame(width: 80, alignment: .leading)
-                                    .padding(.leading)
+                    // List of carb ratios
+                    VStack(spacing: 2) {
+                        ForEach(Array(onboardingData.carbRatioItems.enumerated()), id: \.element.id) { index, item in
+                            HStack {
+                                // Time display
+                                Text(
+                                    dateFormatter
+                                        .string(from: Date(
+                                            timeIntervalSince1970: onboardingData
+                                                .carbRatioTimeValues[item.timeIndex]
+                                        ))
+                                )
+                                .frame(width: 80, alignment: .leading)
+                                .padding(.leading)
 
-                                    // Ratio slider
-                                    Slider(
-                                        value: Binding(
-                                            get: {
-                                                Double(
-                                                    truncating: onboardingData
-                                                        .carbRatioRateValues[item.rateIndex] as NSNumber
-                                                ) },
-                                            set: { newValue in
-                                                // Find closest match in rateValues array
-                                                let newIndex = onboardingData.carbRatioRateValues
-                                                    .firstIndex { abs(Double($0) - newValue) < 0.05 } ?? item.rateIndex
-                                                onboardingData.carbRatioItems[index].rateIndex = newIndex
-                                                // Force refresh when slider changes
-                                                refreshUI = UUID()
-                                            }
-                                        ),
-                                        in: Double(truncating: onboardingData.carbRatioRateValues.first! as NSNumber) ...
-                                            Double(truncating: onboardingData.carbRatioRateValues.last! as NSNumber),
-                                        step: 0.5
-                                    )
-                                    .accentColor(.orange)
-                                    .padding(.horizontal, 5)
-                                    .onChange(of: onboardingData.carbRatioItems[index].rateIndex) { _, _ in
-                                        let impact = UIImpactFeedbackGenerator(style: .light)
-                                        impact.impactOccurred()
-                                    }
+                                // Ratio slider
+                                Slider(
+                                    value: Binding(
+                                        get: {
+                                            Double(
+                                                truncating: onboardingData
+                                                    .carbRatioRateValues[item.rateIndex] as NSNumber
+                                            ) },
+                                        set: { newValue in
+                                            // Find closest match in rateValues array
+                                            let newIndex = onboardingData.carbRatioRateValues
+                                                .firstIndex { abs(Double($0) - newValue) < 0.05 } ?? item.rateIndex
+                                            onboardingData.carbRatioItems[index].rateIndex = newIndex
+                                            // Force refresh when slider changes
+                                            refreshUI = UUID()
+                                        }
+                                    ),
+                                    in: Double(truncating: onboardingData.carbRatioRateValues.first! as NSNumber) ...
+                                        Double(truncating: onboardingData.carbRatioRateValues.last! as NSNumber),
+                                    step: 0.5
+                                )
+                                .accentColor(.orange)
+                                .padding(.horizontal, 5)
+                                .onChange(of: onboardingData.carbRatioItems[index].rateIndex) { _, _ in
+                                    let impact = UIImpactFeedbackGenerator(style: .light)
+                                    impact.impactOccurred()
+                                }
 
-                                    // Display the current value
-                                    Text(
-                                        "\(formatter.string(from: onboardingData.carbRatioRateValues[item.rateIndex] as NSNumber) ?? "--") g/U"
-                                    )
-                                    .frame(width: 80, alignment: .trailing)
-                                    .lineLimit(1)
-                                    .minimumScaleFactor(0.8)
+                                // Display the current value
+                                Text(
+                                    "\(formatter.string(from: onboardingData.carbRatioRateValues[item.rateIndex] as NSNumber) ?? "--") g/U"
+                                )
+                                .frame(width: 80, alignment: .trailing)
+                                .lineLimit(1)
+                                .minimumScaleFactor(0.8)
 
-                                    // Delete button (not for the first entry at 00:00)
-                                    if index > 0 {
-                                        Button(action: {
-                                            onboardingData.carbRatioItems.remove(at: index)
-                                        }) {
-                                            Image(systemName: "trash")
-                                                .foregroundColor(.red)
-                                                .padding(.horizontal, 5)
-                                        }
-                                    } else {
-                                        // Spacer to maintain alignment
-                                        Spacer()
-                                            .frame(width: 30)
+                                // Delete button (not for the first entry at 00:00)
+                                if index > 0 {
+                                    Button(action: {
+                                        onboardingData.carbRatioItems.remove(at: index)
+                                    }) {
+                                        Image(systemName: "trash")
+                                            .foregroundColor(.red)
+                                            .padding(.horizontal, 5)
                                     }
+                                } else {
+                                    // Spacer to maintain alignment
+                                    Spacer()
+                                        .frame(width: 30)
                                 }
-                                .padding(.vertical, 12)
-                                .background(index % 2 == 0 ? Color.orange.opacity(0.05) : Color.clear)
-                                .cornerRadius(8)
                             }
+                            .padding(.vertical, 12)
+                            .background(index % 2 == 0 ? Color.orange.opacity(0.05) : Color.clear)
+                            .cornerRadius(8)
                         }
-                        .background(Color.orange.opacity(0.05))
-                        .cornerRadius(10)
-                        .padding(.horizontal)
+                    }
+                    .background(Color.orange.opacity(0.05))
+                    .cornerRadius(10)
+                    .padding(.horizontal)
+                    .onAppear {
+                        onboardingData.addCarbRatio()
                     }
                 }
 

+ 86 - 96
Trio/Sources/Modules/Main/View/OnboardingSteps/InsulinSensitivityStepView.swift

@@ -85,108 +85,98 @@ struct InsulinSensitivityStepView: View {
                     }
                     .padding(.horizontal)
 
-                    if onboardingData.isfItems.isEmpty {
-                        // Add default entry if no items exist
-                        Button("Add Initial ISF Value") {
-                            onboardingData.addISFValue()
-                        }
-                        .foregroundColor(.red)
-                        .padding()
-                        .frame(maxWidth: .infinity)
-                        .background(Color.red.opacity(0.1))
-                        .cornerRadius(8)
-                        .padding(.horizontal)
-                    } else {
-                        // List of ISF values
-                        VStack(spacing: 2) {
-                            ForEach(Array(onboardingData.isfItems.enumerated()), id: \.element.id) { index, item in
-                                HStack {
-                                    // Time display
-                                    Text(
-                                        dateFormatter
-                                            .string(from: Date(
-                                                timeIntervalSince1970: onboardingData
-                                                    .isfTimeValues[item.timeIndex]
-                                            ))
-                                    )
-                                    .frame(width: 80, alignment: .leading)
-                                    .padding(.leading)
-
-                                    // ISF slider
-                                    Slider(
-                                        value: Binding(
-                                            get: {
-                                                guard !onboardingData.rateValues.isEmpty,
-                                                      item.rateIndex < onboardingData.rateValues.count
-                                                else {
-                                                    return 0.0
-                                                }
-                                                return Double(
-                                                    truncating: onboardingData
-                                                        .rateValues[item.rateIndex] as NSNumber
-                                                )
-                                            },
-                                            set: { newValue in
-                                                guard !onboardingData.rateValues.isEmpty else { return }
-
-                                                // Find closest match in rateValues array
-                                                let newIndex = onboardingData.rateValues
-                                                    .firstIndex { abs(Double($0) - newValue) < 0.5 } ?? item.rateIndex
-
-                                                // Ensure index is valid before updating
-                                                if newIndex < onboardingData.rateValues.count,
-                                                   index < onboardingData.isfItems.count
-                                                {
-                                                    onboardingData.isfItems[index].rateIndex = newIndex
-                                                    // Force refresh when slider changes
-                                                    refreshUI = UUID()
-                                                }
+                    // List of ISF values
+                    VStack(spacing: 2) {
+                        ForEach(Array(onboardingData.isfItems.enumerated()), id: \.element.id) { index, item in
+                            HStack {
+                                // Time display
+                                Text(
+                                    dateFormatter
+                                        .string(from: Date(
+                                            timeIntervalSince1970: onboardingData
+                                                .isfTimeValues[item.timeIndex]
+                                        ))
+                                )
+                                .frame(width: 80, alignment: .leading)
+                                .padding(.leading)
+
+                                // ISF slider
+                                Slider(
+                                    value: Binding(
+                                        get: {
+                                            guard !onboardingData.rateValues.isEmpty,
+                                                  item.rateIndex < onboardingData.rateValues.count
+                                            else {
+                                                return 0.0
+                                            }
+                                            return Double(
+                                                truncating: onboardingData
+                                                    .rateValues[item.rateIndex] as NSNumber
+                                            )
+                                        },
+                                        set: { newValue in
+                                            guard !onboardingData.rateValues.isEmpty else { return }
+
+                                            // Find closest match in rateValues array
+                                            let newIndex = onboardingData.rateValues
+                                                .firstIndex { abs(Double($0) - newValue) < 0.5 } ?? item.rateIndex
+
+                                            // Ensure index is valid before updating
+                                            if newIndex < onboardingData.rateValues.count,
+                                               index < onboardingData.isfItems.count
+                                            {
+                                                onboardingData.isfItems[index].rateIndex = newIndex
+                                                // Force refresh when slider changes
+                                                refreshUI = UUID()
                                             }
-                                        ),
-                                        in: onboardingData.rateValues.isEmpty ? 0 ... 1 :
-                                            Double(truncating: onboardingData.rateValues.first! as NSNumber) ...
-                                            Double(truncating: onboardingData.rateValues.last! as NSNumber),
-                                        step: onboardingData.units == .mgdL ? 1 : 0.1
-                                    )
-                                    .accentColor(.red)
-                                    .padding(.horizontal, 5)
-                                    .onChange(of: onboardingData.isfItems[index].rateIndex) { _, _ in
-                                        // Trigger immediate UI update when slider value changes
-                                        let impact = UIImpactFeedbackGenerator(style: .light)
-                                        impact.impactOccurred()
-                                    }
-
-                                    // Display the current value
-                                    Text(
-                                        "\(onboardingData.rateValues.isEmpty || item.rateIndex >= onboardingData.rateValues.count ? "--" : numberFormatter.string(from: onboardingData.rateValues[item.rateIndex] as NSNumber) ?? "--") \(onboardingData.units == .mgdL ? "mg/dL" : "mmol/L")"
-                                    )
-                                    .frame(width: 90, alignment: .trailing)
-                                    .lineLimit(1)
-                                    .minimumScaleFactor(0.8)
-
-                                    // Delete button (not for the first entry at 00:00)
-                                    if index > 0 {
-                                        Button(action: {
-                                            onboardingData.isfItems.remove(at: index)
-                                        }) {
-                                            Image(systemName: "trash")
-                                                .foregroundColor(.red)
-                                                .padding(.horizontal, 5)
                                         }
-                                    } else {
-                                        // Spacer to maintain alignment
-                                        Spacer()
-                                            .frame(width: 30)
+                                    ),
+                                    in: onboardingData.rateValues.isEmpty ? 0 ... 1 :
+                                        Double(truncating: onboardingData.rateValues.first! as NSNumber) ...
+                                        Double(truncating: onboardingData.rateValues.last! as NSNumber),
+                                    step: onboardingData.units == .mgdL ? 1 : 0.1
+                                )
+                                .accentColor(.red)
+                                .padding(.horizontal, 5)
+                                .onChange(of: onboardingData.isfItems[index].rateIndex) { _, _ in
+                                    // Trigger immediate UI update when slider value changes
+                                    let impact = UIImpactFeedbackGenerator(style: .light)
+                                    impact.impactOccurred()
+                                }
+
+                                // Display the current value
+                                Text(
+                                    "\(onboardingData.rateValues.isEmpty || item.rateIndex >= onboardingData.rateValues.count ? "--" : numberFormatter.string(from: onboardingData.rateValues[item.rateIndex] as NSNumber) ?? "--") \(onboardingData.units == .mgdL ? "mg/dL" : "mmol/L")"
+                                )
+                                .frame(width: 90, alignment: .trailing)
+                                .lineLimit(1)
+                                .minimumScaleFactor(0.8)
+
+                                // Delete button (not for the first entry at 00:00)
+                                if index > 0 {
+                                    Button(action: {
+                                        onboardingData.isfItems.remove(at: index)
+                                    }) {
+                                        Image(systemName: "trash")
+                                            .foregroundColor(.red)
+                                            .padding(.horizontal, 5)
                                     }
+                                } else {
+                                    // Spacer to maintain alignment
+                                    Spacer()
+                                        .frame(width: 30)
                                 }
-                                .padding(.vertical, 12)
-                                .background(index % 2 == 0 ? Color.red.opacity(0.05) : Color.clear)
-                                .cornerRadius(8)
                             }
+                            .padding(.vertical, 12)
+                            .background(index % 2 == 0 ? Color.red.opacity(0.05) : Color.clear)
+                            .cornerRadius(8)
                         }
-                        .background(Color.red.opacity(0.05))
-                        .cornerRadius(10)
-                        .padding(.horizontal)
+                    }
+                    .background(Color.red.opacity(0.05))
+                    .cornerRadius(10)
+                    .padding(.horizontal)
+                    .onAppear {
+                        onboardingData.addISFValue()
                     }
                 }