Jelajahi Sumber

Refactored glucose target settings WIP

Deniz Cengiz 1 tahun lalu
induk
melakukan
27ab0bd321

+ 1 - 9
Trio/Sources/Modules/Onboarding/OnboardingStateModel.swift

@@ -203,11 +203,9 @@ extension Onboarding {
 
 
         func getTherapyItems(from targets: [TargetsEditor.Item]) -> [TherapySettingItem] {
         func getTherapyItems(from targets: [TargetsEditor.Item]) -> [TherapySettingItem] {
             targets.map {
             targets.map {
-                debug(.default, "- timeIndex: \($0.timeIndex), valueIndex: \($0.lowIndex)")
                 return TherapySettingItem(
                 return TherapySettingItem(
                     id: UUID(),
                     id: UUID(),
-//                    time: targetTimeValues[$0.timeIndex],
-                    time: targetTimeValues[safe: $0.timeIndex] ?? 0.0,
+                    time: targetTimeValues[$0.timeIndex],
                     value: Double(targetRateValues[$0.lowIndex])
                     value: Double(targetRateValues[$0.lowIndex])
                 )
                 )
             }
             }
@@ -476,9 +474,3 @@ extension Onboarding.StateModel {
         }.eraseToAnyPublisher()
         }.eraseToAnyPublisher()
     }
     }
 }
 }
-
-extension Collection {
-    subscript(safe index: Index) -> Element? {
-        indices.contains(index) ? self[index] : nil
-    }
-}

+ 18 - 22
Trio/Sources/Modules/Onboarding/View/OnboardingSteps/GlucoseTargetStepView.swift

@@ -11,10 +11,6 @@ import UIKit
 /// Glucose target step view for setting target glucose range.
 /// Glucose target step view for setting target glucose range.
 struct GlucoseTargetStepView: View {
 struct GlucoseTargetStepView: View {
     @Bindable var state: Onboarding.StateModel
     @Bindable var state: Onboarding.StateModel
-    @State private var showTimeSelector = false
-    @State private var selectedTargetIndex: Int?
-    @State private var showAlert = false
-    @State private var errorMessage = ""
     @State private var refreshUI = UUID() // to update chart when slider value changes
     @State private var refreshUI = UUID() // to update chart when slider value changes
     @State private var therapyItems: [TherapySettingItem] = []
     @State private var therapyItems: [TherapySettingItem] = []
 
 
@@ -39,39 +35,39 @@ struct GlucoseTargetStepView: View {
 
 
     var body: some View {
     var body: some View {
         ScrollView {
         ScrollView {
-            VStack(alignment: .leading, spacing: 20) {
+            VStack(alignment: .leading, spacing: 0) {
                 // Chart visualization
                 // Chart visualization
                 if !state.targetItems.isEmpty {
                 if !state.targetItems.isEmpty {
                     VStack(alignment: .leading) {
                     VStack(alignment: .leading) {
-                        Text("Glucose Targets")
-                            .font(.headline)
-                            .padding(.horizontal)
-
                         glucoseTargetChart
                         glucoseTargetChart
                             .frame(height: 180)
                             .frame(height: 180)
                             .padding(.horizontal)
                             .padding(.horizontal)
                     }
                     }
-                    .padding(.vertical, 5)
-                    .background(Color.blue.opacity(0.05))
-                    .cornerRadius(10)
+                    .padding(.vertical)
+                    .background(Color.chart)
+                    .clipShape(
+                        .rect(
+                            topLeadingRadius: 10,
+                            bottomLeadingRadius: 0,
+                            bottomTrailingRadius: 0,
+                            topTrailingRadius: 10
+                        )
+                    )
                 }
                 }
 
 
                 // Glucose target list
                 // Glucose target list
-                VStack(alignment: .leading) {
-                    TimeValueEditorView(
-                        items: $therapyItems,
-                        unit: state.units.rawValue,
-                        valueOptions: state.targetRateValues
-                    )
-                    .id(therapyItems.count) // quick workaround to force refresh on change
-                }
+                TimeValueEditorView(
+                    items: $therapyItems,
+                    unit: state.units.rawValue,
+                    valueOptions: state.targetRateValues
+                ).scaledToFit()
             }
             }
-        }.onAppear {
+        }
+        .onAppear {
             if state.targetItems.isEmpty {
             if state.targetItems.isEmpty {
                 state.addTarget()
                 state.addTarget()
             }
             }
             therapyItems = state.getTherapyItems(from: state.targetItems)
             therapyItems = state.getTherapyItems(from: state.targetItems)
-            debug(.default, "THERAPY ITEMS: \(therapyItems)")
         }.onChange(of: therapyItems) { _, newItems in
         }.onChange(of: therapyItems) { _, newItems in
             state.updateTargets(from: newItems)
             state.updateTargets(from: newItems)
             refreshUI = UUID()
             refreshUI = UUID()

+ 20 - 7
Trio/Sources/Modules/Onboarding/View/OnboardingView+Util.swift

@@ -72,11 +72,12 @@ struct TimeValueEditorView: View {
                     HStack {
                     HStack {
                         Image(systemName: "plus")
                         Image(systemName: "plus")
                         Text("Add")
                         Text("Add")
-                            .foregroundColor(.accentColor)
-                    }
+                    }.foregroundColor(.accentColor)
                 }
                 }
                 .disabled(items.count >= 48)
                 .disabled(items.count >= 48)
             }
             }
+            .listRowBackground(Color.chart)
+            .padding(.vertical, 5)
 
 
             ForEach($items) { $item in
             ForEach($items) { $item in
                 VStack(spacing: 0) {
                 VStack(spacing: 0) {
@@ -97,7 +98,6 @@ struct TimeValueEditorView: View {
                         }.contentShape(Rectangle())
                         }.contentShape(Rectangle())
                     }
                     }
                     .buttonStyle(.plain)
                     .buttonStyle(.plain)
-                    .padding(.vertical, 8)
 
 
                     if selectedItemID == item.id {
                     if selectedItemID == item.id {
                         TimeValuePickerRow(
                         TimeValuePickerRow(
@@ -109,7 +109,7 @@ struct TimeValueEditorView: View {
                     }
                     }
                 }
                 }
                 .swipeActions(edge: .trailing, allowsFullSwipe: true) {
                 .swipeActions(edge: .trailing, allowsFullSwipe: true) {
-                    if let index = items.firstIndex(where: { $0.id == item.id }), index > 0 {
+                    if let index = items.firstIndex(where: { $0.id == item.id }), items.count > 1 {
                         Button(role: .destructive) {
                         Button(role: .destructive) {
                             items.remove(at: index)
                             items.remove(at: index)
                             selectedItemID = nil
                             selectedItemID = nil
@@ -119,10 +119,23 @@ struct TimeValueEditorView: View {
                     }
                     }
                 }
                 }
             }
             }
+            .listRowBackground(Color.chart)
+
+            Rectangle().fill(Color.chart).frame(height: 10)
+                .clipShape(
+                    .rect(
+                        topLeadingRadius: 0,
+                        bottomLeadingRadius: 10,
+                        bottomTrailingRadius: 10,
+                        topTrailingRadius: 0
+                    )
+                )
+                .listRowBackground(Color.clear)
+                .listRowInsets(EdgeInsets(top: -22, leading: 0, bottom: 0, trailing: 0))
+                .listRowSeparator(.hidden)
         }
         }
-        .onAppear {
-            debug(.default, "ITEMS TO DISPLAY: \(items)")
-        }
+        .listStyle(.plain)
+        .scrollContentBackground(.hidden)
     }
     }
 
 
     private var timeFormatter: DateFormatter {
     private var timeFormatter: DateFormatter {