Jonas Björkert 1 rok temu
rodzic
commit
f03a2a6a5a

+ 3 - 0
LoopFollow/Alarm/Alarm.swift

@@ -268,6 +268,9 @@ struct Alarm: Identifiable, Codable, Equatable {
             repeatSoundOption = .never
         case .temporary:
             soundFile = .indeed
+            snoozeDuration = 0
+            aboveBG = 180
+            belowBG = 70
         }
     }
 }

+ 5 - 3
LoopFollow/Alarm/AlarmEditing/Components/AlarmSnoozeSection.swift

@@ -42,9 +42,11 @@ struct AlarmSnoozeSection: View {
         Section(
             header: Text("SNOOZE"),
             footer: Text(
-                "“Default Snooze” controls how long the alert stays quiet after "
-                    + "you press Snooze. Toggle “Snoozed” to mute this alarm right now "
-                    + "until the time below."
+                """
+                “Default Snooze” controls the default value for how long the alert stays quiet after you press Snooze. \
+                \(range.contains(0) ? "A snooze duration of 0 means the alarm is acknowledged (silenced), and will alert again next time the condition applies, without time limitation. " : "")\
+                Toggle “Snoozed” to mute this alarm right now.
+                """
             )
         ) {
             Stepper(

+ 1 - 5
LoopFollow/Alarm/AlarmEditing/Editors/FastDropAlarmEditor.swift

@@ -51,11 +51,7 @@ struct FastDropAlarmEditor: View {
 
             AlarmActiveSection(alarm: $alarm)
             AlarmAudioSection(alarm: $alarm)
-            AlarmSnoozeSection(
-                alarm: $alarm,
-                range: 5 ... 60,
-                step: 5
-            )
+            AlarmSnoozeSection(alarm: $alarm, range: 0 ... 60, step: 5)
         }
         .navigationTitle(alarm.type.rawValue)
     }

+ 1 - 1
LoopFollow/Alarm/AlarmEditing/Editors/FastRiseAlarmEditor.swift

@@ -54,7 +54,7 @@ struct FastRiseAlarmEditor: View {
 
             AlarmActiveSection(alarm: $alarm)
             AlarmAudioSection(alarm: $alarm)
-            AlarmSnoozeSection(alarm: $alarm, range: 5 ... 60, step: 5)
+            AlarmSnoozeSection(alarm: $alarm, range: 0 ... 60, step: 5)
         }
         .navigationTitle(alarm.type.rawValue)
     }

+ 1 - 5
LoopFollow/Alarm/AlarmEditing/Editors/OverrideEndAlarmEditor.swift

@@ -15,11 +15,7 @@ struct OverrideEndAlarmEditor: View {
 
             AlarmActiveSection(alarm: $alarm)
             AlarmAudioSection(alarm: $alarm, hideRepeat: true)
-            AlarmSnoozeSection(
-                alarm: $alarm,
-                range: 10 ... 60,
-                step: 5
-            )
+            AlarmSnoozeSection(alarm: $alarm, range: 0 ... 60, step: 5)
         }
         .navigationTitle(alarm.type.rawValue)
     }

+ 1 - 5
LoopFollow/Alarm/AlarmEditing/Editors/OverrideStartAlarmEditor.swift

@@ -18,11 +18,7 @@ struct OverrideStartAlarmEditor: View {
 
             AlarmActiveSection(alarm: $alarm)
             AlarmAudioSection(alarm: $alarm, hideRepeat: true)
-            AlarmSnoozeSection(
-                alarm: $alarm,
-                range: 10 ... 60,
-                step: 5
-            )
+            AlarmSnoozeSection(alarm: $alarm, range: 0 ... 60, step: 5)
         }
         .navigationTitle(alarm.type.rawValue)
     }

+ 1 - 1
LoopFollow/Alarm/AlarmEditing/Editors/TempTargetEndAlarmEditor.swift

@@ -15,7 +15,7 @@ struct TempTargetEndAlarmEditor: View {
 
             AlarmActiveSection(alarm: $alarm)
             AlarmAudioSection(alarm: $alarm, hideRepeat: true)
-            AlarmSnoozeSection(alarm: $alarm, range: 10 ... 60, step: 5)
+            AlarmSnoozeSection(alarm: $alarm, range: 0 ... 60, step: 5)
         }
         .navigationTitle(alarm.type.rawValue)
     }

+ 1 - 1
LoopFollow/Alarm/AlarmEditing/Editors/TempTargetStartAlarmEditor.swift

@@ -15,7 +15,7 @@ struct TempTargetStartAlarmEditor: View {
 
             AlarmActiveSection(alarm: $alarm)
             AlarmAudioSection(alarm: $alarm, hideRepeat: true)
-            AlarmSnoozeSection(alarm: $alarm, range: 10 ... 60, step: 5)
+            AlarmSnoozeSection(alarm: $alarm, range: 0 ... 60, step: 5)
         }
         .navigationTitle(alarm.type.rawValue)
     }

+ 0 - 2
LoopFollow/Alarm/AlarmEditing/Editors/TemporaryAlarmEditor.swift

@@ -37,7 +37,6 @@ struct TemporaryAlarmEditor: View {
                 value: $alarm.aboveBG
             )
 
-            // Validation: ensure at least one limit is on
             if alarm.belowBG == nil && alarm.aboveBG == nil {
                 Text("⚠️ Please enable at least one limit.")
                     .foregroundColor(.red)
@@ -45,7 +44,6 @@ struct TemporaryAlarmEditor: View {
 
             AlarmActiveSection(alarm: $alarm)
             AlarmAudioSection(alarm: $alarm)
-            AlarmSnoozeSection(alarm: $alarm, range: 5 ... 60, step: 5)
         }
         .navigationTitle(alarm.type.rawValue)
     }

+ 5 - 3
LoopFollow/Alarm/AlarmManager.swift

@@ -159,9 +159,11 @@ class AlarmManager {
         if let idx = alarms.firstIndex(where: { $0.id == alarmID }) {
             let alarm = alarms[idx]
             let units = snoozeUnits ?? alarm.snoozeDuration
-            let snoozeSeconds = Double(units) * alarm.type.snoozeTimeUnit.seconds
-            alarms[idx].snoozedUntil = Date().addingTimeInterval(snoozeSeconds)
-            Storage.shared.alarms.value = alarms
+            if units > 0 {
+                let snoozeSeconds = Double(units) * alarm.type.snoozeTimeUnit.seconds
+                alarms[idx].snoozedUntil = Date().addingTimeInterval(snoozeSeconds)
+                Storage.shared.alarms.value = alarms
+            }
             stopAlarm()
         }
     }

+ 6 - 2
LoopFollow/Alarm/AlarmType/AlarmType+timeUnit.swift

@@ -14,17 +14,19 @@ extension AlarmType {
              .missedReading, .notLooping, .missedBolus,
              .recBolus,
              .overrideStart, .overrideEnd, .tempTargetStart,
-             .tempTargetEnd, .temporary:
+             .tempTargetEnd:
             return .minute
         case .battery, .batteryDrop, .sensorChange, .pumpChange, .cob, .iob,
              .pump:
             return .hour
+        case .temporary:
+            return .none
         }
     }
 }
 
 enum TimeUnit {
-    case minute, hour, day
+    case minute, hour, day, none
 
     /// How many seconds in one “unit”
     var seconds: TimeInterval {
@@ -32,6 +34,7 @@ enum TimeUnit {
         case .minute: return 60
         case .hour: return 60 * 60
         case .day: return 60 * 60 * 24
+        case .none: return 0
         }
     }
 
@@ -41,6 +44,7 @@ enum TimeUnit {
         case .minute: return "min"
         case .hour: return "hours"
         case .day: return "days"
+        case .none: return "none"
         }
     }
 }

+ 16 - 14
LoopFollow/Snoozer/SnoozerView.swift

@@ -94,24 +94,26 @@ struct SnoozerView: View {
                     Divider()
 
                     // snooze controls
-                    HStack {
-                        VStack(alignment: .leading, spacing: 4) {
-                            Text("Snooze for")
-                                .font(.headline)
-                            Text("\(vm.snoozeUnits) \(vm.timeUnitLabel)")
-                                .font(.title3).bold()
+                    if alarm.type.snoozeTimeUnit != .none {
+                        HStack {
+                            VStack(alignment: .leading, spacing: 4) {
+                                Text("Snooze for")
+                                    .font(.headline)
+                                Text("\(vm.snoozeUnits) \(vm.timeUnitLabel)")
+                                    .font(.title3).bold()
+                            }
+                            Spacer()
+                            Stepper("", value: $vm.snoozeUnits,
+                                    in: 1 ... (alarm.type.snoozeTimeUnit == .day ? 30 :
+                                        alarm.type.snoozeTimeUnit == .hour ? 24 : 60),
+                                    step: alarm.type.snoozeTimeUnit == .minute ? 5 : 1)
+                                .labelsHidden()
                         }
-                        Spacer()
-                        Stepper("", value: $vm.snoozeUnits,
-                                in: 1 ... (alarm.type.snoozeTimeUnit == .day ? 30 :
-                                    alarm.type.snoozeTimeUnit == .hour ? 24 : 60),
-                                step: alarm.type.snoozeTimeUnit == .minute ? 5 : 1)
-                            .labelsHidden()
+                        .padding(.horizontal, 24)
                     }
-                    .padding(.horizontal, 24)
 
                     Button(action: vm.snoozeTapped) {
-                        Text("Snooze")
+                        Text(vm.snoozeUnits == 0 ? "Acknowledge" : "Snooze")
                             .font(.title2).bold()
                             .frame(maxWidth: .infinity, minHeight: 50)
                             .background(Color.accentColor)

+ 3 - 0
LoopFollow/Snoozer/SnoozerViewModel.swift

@@ -27,6 +27,9 @@ final class SnoozerViewModel: ObservableObject {
                 }
             }
             .store(in: &cancellables)
+        if let alarm = activeAlarm {
+            snoozeUnits = alarm.snoozeDuration
+        }
     }
 
     func snoozeTapped() {