Jonas Björkert 1 год назад
Родитель
Сommit
6aa3f7816c

+ 30 - 4
LoopFollow/Alarm/AlarmEditing/AlarmEditor.swift

@@ -5,14 +5,41 @@
 //  Created by Jonas Björkert on 2025-04-21.
 //  Copyright © 2025 Jon Fawcett. All rights reserved.
 //
-
-
 import SwiftUI
 
 struct AlarmEditor: View {
     @Binding var alarm: Alarm
+    var isNew:  Bool = false
+    var onDone: () -> Void = { }
+    var onCancel: () -> Void = { }
+
+    @Environment(\.dismiss) private var dismiss
 
     var body: some View {
+        NavigationStack {
+            innerEditor()
+                .navigationBarTitleDisplayMode(.inline)
+                .toolbar {
+                    if isNew {
+                        ToolbarItem(placement: .confirmationAction) {
+                            Button("Done") {
+                                onDone()
+                                dismiss()
+                            }
+                        }
+                        ToolbarItem(placement: .cancellationAction) {
+                            Button("Cancel") {
+                                onCancel()
+                                dismiss()
+                            }
+                        }
+                    }
+                }
+        }
+    }
+
+    @ViewBuilder
+    private func innerEditor() -> some View {
         switch alarm.type {
         case .buildExpire:
             BuildExpireAlarmEditor(alarm: $alarm)
@@ -25,8 +52,7 @@ struct AlarmEditor: View {
         case .fastDrop:
             FastDropAlarmEditor(alarm: $alarm)
 
-            // TODO: add other condition types here
-
+            /* TODO: add other condition types here */
         default:
             Text("No editor for \(alarm.type.rawValue)")
                 .padding()

+ 9 - 2
LoopFollow/Alarm/AlarmEditing/Components/AlarmBGSection.swift

@@ -37,8 +37,15 @@ struct AlarmBGSection: View {
     }
 
     private var allValues: [Double] {
-        let step = unit == .millimolesPerLiter ? 18.0 * 0.1 : 1
-        return Array(stride(from: range.lowerBound, through: range.upperBound, by: step))
+        if unit == .millimolesPerLiter {
+            let stepMMOL = 0.1
+            let lower = ceil((range.lowerBound / 18) / stepMMOL) * stepMMOL
+            let upper = floor((range.upperBound / 18) / stepMMOL) * stepMMOL
+
+            return stride(from: lower, through: upper, by: stepMMOL).map { $0 * 18 }
+        } else {
+            return Array(stride(from: range.lowerBound, through: range.upperBound, by: 1))
+        }
     }
 
     var body: some View {

+ 56 - 14
LoopFollow/Alarm/AlarmListView.swift

@@ -113,7 +113,7 @@ struct AddAlarmSheet: View {
                                         id: \.self) { type in
                                     AlarmTile(type: type) {
                                         onSelect(type)
-                                        dismiss()
+//                                        dismiss()
                                     }
                                 }
                             }
@@ -160,12 +160,26 @@ private struct AlarmTile: View {
     }
 }
 
+private enum SheetInfo: Identifiable {
+    case picker
+    case editor(id: UUID, isNew: Bool)
+
+    var id: UUID {
+        switch self {
+        case .picker:
+            return UUID(uuidString:"00000000-0000-0000-0000-000000000000")!
+        case .editor(let id, _):
+            return id
+        }
+    }
+}
+
 struct AlarmListView: View {
     @ObservedObject private var store = Storage.shared.alarms
     @Environment(\.dismiss) private var dismiss
 
-    @State private var showAddSheet = false
-    @State private var editingAlarmID: UUID?
+    @State private var sheetInfo: SheetInfo?
+    @State private var deleteAfterDismiss: UUID?
 
     var body: some View {
         NavigationStack {
@@ -183,20 +197,48 @@ struct AlarmListView: View {
                     Button("Done") { dismiss() }
                 }
                 ToolbarItem(placement: .navigationBarTrailing) {
-                    Button { showAddSheet = true } label: { Image(systemName: "plus") }
+                    Button { sheetInfo = .picker } label: { Image(systemName:"plus") }
                 }
             }
-            .sheet(isPresented: $showAddSheet) {
-                AddAlarmSheet { type in
-                    let new = Alarm(type: type)
-                    store.value.append(new)
-                    editingAlarmID = new.id
-                }
+            .sheet(item: $sheetInfo,
+                   onDismiss: handleSheetDismiss) { info in
+                sheetContent(for: info)
             }
-            .sheet(item: $editingAlarmID) { id in
-                if let idx = store.value.firstIndex(where: { $0.id == id }) {
-                    AlarmEditor(alarm: $store.value[idx])
-                }
+        }
+    }
+
+    private func handleSheetDismiss() {
+        if let id = deleteAfterDismiss,
+           let idx = store.value.firstIndex(where: { $0.id == id }) {
+            store.value.remove(at: idx)
+        }
+        deleteAfterDismiss = nil
+    }
+
+    @ViewBuilder
+    private func sheetContent(for info: SheetInfo) -> some View {
+        switch info {
+
+        case .picker:
+            AddAlarmSheet { type in
+                let new = Alarm(type: type)
+                store.value.append(new)
+                sheetInfo = .editor(id: new.id, isNew: true)
+            }
+
+        case .editor(let id, let isNew):
+            if let idx = store.value.firstIndex(where: { $0.id == id }) {
+                AlarmEditor(
+                    alarm: $store.value[idx],
+                    isNew:  isNew,
+                    onDone: { sheetInfo = nil },
+                    onCancel: {
+                        deleteAfterDismiss = id
+                        sheetInfo = nil
+                    }
+                )
+            } else {
+                Text("Alarm not found").padding()
             }
         }
     }