Przeglądaj źródła

Improved calibrations screen

Ivan Valkou 4 lat temu
rodzic
commit
1bfa154046

+ 8 - 0
FreeAPS/Sources/Modules/Calibrations/CalibrationsDataFlow.swift

@@ -1,5 +1,13 @@
 enum Calibrations {
     enum Config {}
+
+    struct Item: Hashable, Identifiable {
+        let calibration: Calibration
+
+        var id: String {
+            calibration.id.uuidString
+        }
+    }
 }
 
 protocol CalibrationsProvider {}

+ 20 - 7
FreeAPS/Sources/Modules/Calibrations/CalibrationsStateModel.swift

@@ -11,21 +11,29 @@ extension Calibrations {
         @Published var newCalibration: Decimal = 0
         @Published var calibrations: [Calibration] = []
         @Published var calibrate: (Double) -> Double = { $0 }
+        @Published var items: [Item] = []
 
         var units: GlucoseUnits = .mmolL
 
         override func subscribe() {
+            units = settingsManager.settings.units
+            calibrate = calibrationService.calibrate
+            setupCalibrations()
+        }
+
+        private func setupCalibrations() {
             slope = calibrationService.slope
             intercept = calibrationService.intercept
-
-            units = settingsManager.settings.units
             calibrations = calibrationService.calibrations
-            calibrate = calibrationService.calibrate
+            items = calibrations.map {
+                Item(calibration: $0)
+            }
         }
 
         func addCalibration() {
             defer {
-                hideModal()
+                UIApplication.shared.endEditing()
+                setupCalibrations()
             }
 
             var glucose = newCalibration
@@ -37,7 +45,6 @@ extension Calibrations {
                   lastGlucose.dateString.addingTimeInterval(60 * 4.5) > Date(),
                   let unfiltered = lastGlucose.unfiltered
             else {
-                warning(.service, "Glucose is invalid for calibration")
                 return
             }
 
@@ -48,12 +55,18 @@ extension Calibrations {
 
         func removeLast() {
             calibrationService.removeLast()
-            hideModal()
+            setupCalibrations()
         }
 
         func removeAll() {
             calibrationService.removeAllCalibrations()
-            hideModal()
+            setupCalibrations()
+        }
+
+        func removeAtIndex(_ index: Int) {
+            let calibration = calibrations[index]
+            calibrationService.removeCalibration(calibration)
+            setupCalibrations()
         }
     }
 }

+ 22 - 6
FreeAPS/Sources/Modules/Calibrations/View/CalibrationsChart.swift

@@ -3,6 +3,13 @@ import SwiftUI
 struct CalibrationsChart: View {
     @EnvironmentObject var state: Calibrations.StateModel
 
+    private var dateFormatter: DateFormatter {
+        let formatter = DateFormatter()
+        formatter.timeStyle = .short
+        formatter.dateStyle = .short
+        return formatter
+    }
+
     private let maxValue = 400.0
 
     var body: some View {
@@ -29,12 +36,21 @@ struct CalibrationsChart: View {
                 .stroke(.blue, lineWidth: 2)
 
                 ForEach(state.calibrations, id: \.self) { value in
-                    Circle().fill(.red)
-                        .frame(width: 6, height: 6)
-                        .position(
-                            x: value.x / maxValue * geo.size.width,
-                            y: geo.size.width - (value.y / maxValue * geo.size.width)
-                        )
+                    ZStack {
+                        Circle().fill(.red)
+                            .frame(width: 6, height: 6)
+                            .position(
+                                x: value.x / maxValue * geo.size.width,
+                                y: geo.size.width - (value.y / maxValue * geo.size.width)
+                            )
+                        Text(dateFormatter.string(from: value.date))
+                            .foregroundColor(.white)
+                            .font(.system(size: 10))
+                            .position(
+                                x: value.x / maxValue * geo.size.width,
+                                y: geo.size.width - (value.y / maxValue * geo.size.width) + 10
+                            )
+                    }
                 }
             }
             .frame(height: geo.size.width)

+ 34 - 3
FreeAPS/Sources/Modules/Calibrations/View/CalibrationsRootView.swift

@@ -13,6 +13,13 @@ extension Calibrations {
             return formatter
         }
 
+        private var dateFormatter: DateFormatter {
+            let formatter = DateFormatter()
+            formatter.timeStyle = .short
+            formatter.dateStyle = .short
+            return formatter
+        }
+
         var body: some View {
             GeometryReader { geo in
                 Form {
@@ -61,17 +68,41 @@ extension Calibrations {
                         }
                         label: { Text("Remove All") }
                             .disabled(state.calibrations.isEmpty)
+                        List {
+                            ForEach(state.items) { item in
+                                HStack {
+                                    Text(dateFormatter.string(from: item.calibration.date))
+                                    Spacer()
+                                    VStack(alignment: .leading) {
+                                        Text("raw: \(item.calibration.x)")
+                                            .font(.caption2)
+                                            .foregroundColor(.secondary)
+                                        Text("value: \(item.calibration.y)")
+                                            .font(.caption2)
+                                            .foregroundColor(.secondary)
+                                    }
+                                }
+
+                            }.onDelete(perform: delete)
+                        }
                     }
 
-                    Section(header: Text("Chart")) {
-                        CalibrationsChart().environmentObject(state)
-                            .frame(minHeight: geo.size.width)
+                    if state.calibrations.isNotEmpty {
+                        Section(header: Text("Chart")) {
+                            CalibrationsChart().environmentObject(state)
+                                .frame(minHeight: geo.size.width)
+                        }
                     }
                 }
             }
             .onAppear(perform: configureView)
             .navigationTitle("Calibrations")
+            .navigationBarItems(trailing: EditButton().disabled(state.calibrations.isEmpty))
             .navigationBarTitleDisplayMode(.automatic)
         }
+
+        private func delete(at offsets: IndexSet) {
+            state.removeAtIndex(offsets[offsets.startIndex])
+        }
     }
 }

+ 1 - 1
FreeAPS/Sources/Modules/Main/MainStateModel.swift

@@ -31,7 +31,7 @@ extension Main {
             router.alertMessage
                 .receive(on: DispatchQueue.main)
                 .sink { message in
-                    self.isAlertPresented = true
+                    self.isAlertPresented = message.isNotEmpty
                     self.alertMessage = message
                 }
                 .store(in: &lifetime)