Jelajahi Sumber

Migrate high

Jonas Björkert 1 tahun lalu
induk
melakukan
b5ca80109c
2 mengubah file dengan 109 tambahan dan 33 penghapusan
  1. 109 0
      LoopFollow/Storage/Storage+Migrate.swift
  2. 0 33
      LoopFollow/Storage/UserDefaults.swift

+ 109 - 0
LoopFollow/Storage/Storage+Migrate.swift

@@ -285,6 +285,8 @@ extension Storage {
 
         migrateUrgentLowAlarm()
         migrateLowAlarm()
+        migrateHighAlarm()
+        migrateUrgentHighAlarm()
     }
 
     // MARK: - One-off alarm migrations
@@ -401,4 +403,111 @@ extension Storage {
         // Done → append to the modern store
         Storage.shared.alarms.value.append(alarm)
     }
+
+    // MARK: - High-BG alarm -----------------------------------------------------
+
+    private func migrateHighAlarm() {
+        // Only run if the legacy key ever existed
+        guard UserDefaultsValue<Bool>(key: "alertHighActive", default: false).exists else { return }
+
+        /// Fetch → erase helper
+        func take<V: AnyConvertible & Equatable>(_ key: String, default def: V) -> V {
+            let box = UserDefaultsValue<V>(key: key, default: def)
+            defer { box.setNil(key: key) } // remove legacy value
+            return box.value
+        }
+
+        // ---------- Build Alarm -----------------------------------------------
+        var alarm = Alarm(type: .high)
+        alarm.name = "High"
+        alarm.isEnabled = take("alertHighActive", default: false)
+        alarm.aboveBG = Double(take("alertHighBG", default: 180.0))
+
+        alarm.persistentMinutes = take("alertHighPersistent", default: 60)
+        alarm.snoozeDuration = take("alertHighSnooze", default: 60)
+        alarm.snoozedUntil = take("alertHighSnoozedTime", default: nil as Date?)
+
+        alarm.soundFile = SoundFile(
+            rawValue: take("alertHighSound",
+                           default: "Time_Has_Come")) ?? .timeHasCome
+
+        alarm.playSoundOption = PlaySoundOption(
+            rawValue: take("alertHighAudible",
+                           default: "Always").lowercased()) ?? .always
+
+        alarm.repeatSoundOption = RepeatSoundOption(
+            rawValue: take("alertHighRepeat",
+                           default: "Always").lowercased()) ?? .always
+
+        // ── activeOption derived from “Pre-Snooze” picker & flags
+        let autoStr = take("alertHighAutosnooze", default: "Never").lowercased()
+        let dayFlag = take("alertHighAutosnoozeDay", default: false)
+        let nightFlag = take("alertHighAutosnoozeNight", default: false)
+
+        alarm.activeOption = {
+            if dayFlag, !nightFlag { return .day }
+            if !dayFlag, nightFlag { return .night }
+            switch autoStr {
+            case "day", "at day": return .day
+            case "night", "at night": return .night
+            default: return .always
+            }
+        }()
+
+        // ---------- Persist & we’re done --------------------------------------
+        Storage.shared.alarms.value.append(alarm)
+    }
+
+    // MARK: - Urgent-High alarm --------------------------------------------------
+
+    private func migrateUrgentHighAlarm() {
+        // run only once, only if the user ever changed that toggle
+        guard UserDefaultsValue<Bool>(key: "alertUrgentHighActive", default: false).exists else { return }
+
+        // helper: read-then-erase a legacy value
+        func take<V: AnyConvertible & Equatable>(_ key: String, default def: V) -> V {
+            let box = UserDefaultsValue<V>(key: key, default: def)
+            defer { box.setNil(key: key) } // wipe legacy key
+            return box.value
+        }
+
+        // ───────── Build the Alarm ────────────────────────────────────────────
+        var alarm = Alarm(type: .high) // we map to the existing `.high` type
+        alarm.name = "Urgent High"
+        alarm.isEnabled = take("alertUrgentHighActive", default: false)
+        alarm.aboveBG = Double(take("alertUrgentHighBG", default: 250.0))
+
+        alarm.snoozeDuration = take("alertUrgentHighSnooze", default: 30)
+        alarm.snoozedUntil = take("alertUrgentHighSnoozedTime", default: nil as Date?)
+
+        alarm.soundFile = SoundFile(
+            rawValue: take("alertUrgentHighSound",
+                           default: "Pager_Beeps")) ?? .pagerBeeps
+
+        alarm.playSoundOption = PlaySoundOption(
+            rawValue: take("alertUrgentHighAudible",
+                           default: "Always").lowercased()) ?? .always
+
+        alarm.repeatSoundOption = RepeatSoundOption(
+            rawValue: take("alertUrgentHighRepeat",
+                           default: "Always").lowercased()) ?? .always
+
+        // activeOption comes from the old “Pre-Snooze” picker + its day/night flags
+        let autoStr = take("alertUrgentHighAutosnooze", default: "Never").lowercased()
+        let dayFlag = take("alertUrgentHighAutosnoozeDay", default: false)
+        let nightFlag = take("alertUrgentHighAutosnoozeNight", default: false)
+
+        alarm.activeOption = {
+            if dayFlag, !nightFlag { return .day }
+            if !dayFlag, nightFlag { return .night }
+            switch autoStr { // fall back to picker value
+            case "day", "at day": return .day
+            case "night", "at night": return .night
+            default: return .always
+            }
+        }()
+
+        // ───────── Persist in new storage ─────────────────────────────────────
+        Storage.shared.alarms.value.append(alarm)
+    }
 }

+ 0 - 33
LoopFollow/Storage/UserDefaults.swift

@@ -97,39 +97,6 @@ class UserDefaultsRepository {
     static let alertCageInsertTime = UserDefaultsValue<TimeInterval>(key: "alertCageInsertTime", default: 0)
     static let alertSageInsertTime = UserDefaultsValue<TimeInterval>(key: "alertSageInsertTime", default: 0)
 
-    static let alertHighActive = UserDefaultsValue<Bool>(key: "alertHighActive", default: false)
-    static let alertHighBG = UserDefaultsValue<Float>(key: "alertHighBG", default: 180.0)
-    static let alertHighPersistent = UserDefaultsValue<Int>(key: "alertHighPersistent", default: 60)
-    static let alertHighSnooze = UserDefaultsValue<Int>(key: "alertHighSnooze", default: 60)
-    static let alertHighSnoozedTime = UserDefaultsValue<Date?>(key: "alertHighSnoozedTime", default: nil)
-    static let alertHighIsSnoozed = UserDefaultsValue<Bool>(key: "alertHighIsSnoozed", default: false)
-    static let alertHighRepeat = UserDefaultsValue<String>(key: "alertHighRepeat", default: "Always")
-    static let alertHighDayTime = UserDefaultsValue<Bool>(key: "alertHighDayTime", default: true)
-    static let alertHighNightTime = UserDefaultsValue<Bool>(key: "alertHighNightTime", default: true)
-    static let alertHighSound = UserDefaultsValue<String>(key: "alertHighSound", default: "Time_Has_Come")
-    static let alertHighAudible = UserDefaultsValue<String>(key: "alertHighAudible", default: "Always")
-    static let alertHighDayTimeAudible = UserDefaultsValue<Bool>(key: "alertHighDayTimeAudible", default: true)
-    static let alertHighNightTimeAudible = UserDefaultsValue<Bool>(key: "alertHighNightTimeAudible", default: true)
-    static let alertHighAutosnooze = UserDefaultsValue<String>(key: "alertHighAutosnooze", default: "Never")
-    static let alertHighAutosnoozeDay = UserDefaultsValue<Bool>(key: "alertHighAutosnoozeDay", default: false)
-    static let alertHighAutosnoozeNight = UserDefaultsValue<Bool>(key: "alertHighAutosnoozeNight", default: false)
-
-    static let alertUrgentHighActive = UserDefaultsValue<Bool>(key: "alertUrgentHighActive", default: false)
-    static let alertUrgentHighBG = UserDefaultsValue<Float>(key: "alertUrgentHighBG", default: 250.0)
-    static let alertUrgentHighSnooze = UserDefaultsValue<Int>(key: "alertUrgentHighSnooze", default: 30)
-    static let alertUrgentHighSnoozedTime = UserDefaultsValue<Date?>(key: "alertUrgentHighSnoozedTime", default: nil)
-    static let alertUrgentHighIsSnoozed = UserDefaultsValue<Bool>(key: "alertUrgentHighIsSnoozed", default: false)
-    static let alertUrgentHighRepeat = UserDefaultsValue<String>(key: "alertUrgentHighRepeat", default: "Always")
-    static let alertUrgentHighDayTime = UserDefaultsValue<Bool>(key: "alertUrgentHighDayTime", default: true)
-    static let alertUrgentHighNightTime = UserDefaultsValue<Bool>(key: "alertUrgentHighNightTime", default: true)
-    static let alertUrgentHighSound = UserDefaultsValue<String>(key: "alertUrgentHighSound", default: "Pager_Beeps")
-    static let alertUrgentHighAudible = UserDefaultsValue<String>(key: "alertUrgentHighAudible", default: "Always")
-    static let alertUrgentHighDayTimeAudible = UserDefaultsValue<Bool>(key: "alertUrgentHighDayTimeAudible", default: true)
-    static let alertUrgentHighNightTimeAudible = UserDefaultsValue<Bool>(key: "alertUrgentHighNightTimeAudible", default: true)
-    static let alertUrgentHighAutosnooze = UserDefaultsValue<String>(key: "alertUrgentHighAutosnooze", default: "Never")
-    static let alertUrgentHighAutosnoozeDay = UserDefaultsValue<Bool>(key: "alertUrgentHighAutosnoozeDay", default: false)
-    static let alertUrgentHighAutosnoozeNight = UserDefaultsValue<Bool>(key: "alertUrgentHighAutosnoozeNight", default: false)
-
     static let alertFastDropActive = UserDefaultsValue<Bool>(key: "alertFastDropDeltaActive", default: false)
     static let alertFastDropSnooze = UserDefaultsValue<Int>(key: "alertFastDropDeltaSnooze", default: 10)
     static let alertFastDropDelta = UserDefaultsValue<Float>(key: "alertFastDropDelta", default: 10.0)