Просмотр исходного кода

Apply DRY to getCurrentGlucoseTarget

Mike Plante 6 дней назад
Родитель
Сommit
f37f239740

+ 38 - 0
Trio/Sources/Models/BGTargets.swift

@@ -24,3 +24,41 @@ struct BGTargetEntry: JSON {
     let start: String
     let offset: Int
 }
+
+extension BGTargets {
+    func currentTarget(at date: Date = Date()) -> Decimal? {
+        let calendar = Calendar.current
+
+        for (index, entry) in targets.enumerated() {
+            guard let entryTime = TherapySettingsUtil.parseTime(entry.start) else {
+                debug(.default, "Invalid BG target entry start time: \(entry.start)")
+                continue
+            }
+            let components = calendar.dateComponents([.hour, .minute, .second], from: entryTime)
+            guard let start = calendar.date(
+                bySettingHour: components.hour ?? 0,
+                minute: components.minute ?? 0,
+                second: components.second ?? 0,
+                of: date
+            ) else { continue }
+
+            let end: Date
+            if index < targets.count - 1, let nextTime = TherapySettingsUtil.parseTime(targets[index + 1].start) {
+                let nextComponents = calendar.dateComponents([.hour, .minute, .second], from: nextTime)
+                end = calendar.date(
+                    bySettingHour: nextComponents.hour ?? 0,
+                    minute: nextComponents.minute ?? 0,
+                    second: nextComponents.second ?? 0,
+                    of: date
+                ) ?? start
+            } else {
+                end = calendar.date(byAdding: .day, value: 1, to: start) ?? start
+            }
+
+            if date >= start, date < end {
+                return entry.low
+            }
+        }
+        return nil
+    }
+}

+ 4 - 43
Trio/Sources/Modules/Adjustments/AdjustmentsStateModel.swift

@@ -100,50 +100,11 @@ extension Adjustments {
 
         /// Retrieves the current glucose target based on the time of day.
         func getCurrentGlucoseTarget() async {
-            let now = Date()
-            let calendar = Calendar.current
-            let dateFormatter = DateFormatter()
-            dateFormatter.dateFormat = "HH:mm:ss"
-            dateFormatter.timeZone = TimeZone.current
-
             let bgTargets = await provider.getBGTargets()
-            let entries: [(start: String, value: Decimal)] = bgTargets.targets.map { ($0.start, $0.low) }
-
-            for (index, entry) in entries.enumerated() {
-                guard let entryTime = dateFormatter.date(from: entry.start) else {
-                    print("Invalid entry start time: \(entry.start)")
-                    continue
-                }
-
-                let entryComponents = calendar.dateComponents([.hour, .minute, .second], from: entryTime)
-                let entryStartTime = calendar.date(
-                    bySettingHour: entryComponents.hour!,
-                    minute: entryComponents.minute!,
-                    second: entryComponents.second!,
-                    of: now
-                )!
-
-                let entryEndTime: Date
-                if index < entries.count - 1,
-                   let nextEntryTime = dateFormatter.date(from: entries[index + 1].start)
-                {
-                    let nextEntryComponents = calendar.dateComponents([.hour, .minute, .second], from: nextEntryTime)
-                    entryEndTime = calendar.date(
-                        bySettingHour: nextEntryComponents.hour!,
-                        minute: nextEntryComponents.minute!,
-                        second: nextEntryComponents.second!,
-                        of: now
-                    )!
-                } else {
-                    entryEndTime = calendar.date(byAdding: .day, value: 1, to: entryStartTime)!
-                }
-
-                if now >= entryStartTime, now < entryEndTime {
-                    await MainActor.run {
-                        currentGlucoseTarget = entry.value
-                        target = currentGlucoseTarget
-                    }
-                    return
+            if let currentTarget = bgTargets.currentTarget() {
+                await MainActor.run {
+                    currentGlucoseTarget = currentTarget
+                    target = currentGlucoseTarget
                 }
             }
         }

+ 2 - 40
Trio/Sources/Modules/Home/HomeStateModel.swift

@@ -930,46 +930,8 @@ extension Home {
         }
 
         private func getCurrentGlucoseTarget() async {
-            let now = Date()
-            let calendar = Calendar.current
-
-            let entries: [(start: String, value: Decimal)] = bgTargets.targets.map { ($0.start, $0.low) }
-
-            for (index, entry) in entries.enumerated() {
-                guard let entryTime = TherapySettingsUtil.parseTime(entry.start) else {
-                    debug(.default, "Invalid entry start time: \(entry.start)")
-                    continue
-                }
-
-                let entryComponents = calendar.dateComponents([.hour, .minute, .second], from: entryTime)
-                let entryStartTime = calendar.date(
-                    bySettingHour: entryComponents.hour!,
-                    minute: entryComponents.minute!,
-                    second: entryComponents.second!,
-                    of: now
-                )!
-
-                let entryEndTime: Date
-                if index < entries.count - 1,
-                   let nextEntryTime = TherapySettingsUtil.parseTime(entries[index + 1].start)
-                {
-                    let nextEntryComponents = calendar.dateComponents([.hour, .minute, .second], from: nextEntryTime)
-                    entryEndTime = calendar.date(
-                        bySettingHour: nextEntryComponents.hour!,
-                        minute: nextEntryComponents.minute!,
-                        second: nextEntryComponents.second!,
-                        of: now
-                    )!
-                } else {
-                    entryEndTime = calendar.date(byAdding: .day, value: 1, to: entryStartTime)!
-                }
-
-                if now >= entryStartTime, now < entryEndTime {
-                    await MainActor.run {
-                        currentGlucoseTarget = entry.value
-                    }
-                    return
-                }
+            if let target = bgTargets.currentTarget() {
+                await MainActor.run { currentGlucoseTarget = target }
             }
         }
 

+ 2 - 39
Trio/Sources/Modules/UserInterfaceSettings/UserInterfaceSettingsStateModel.swift

@@ -54,47 +54,10 @@ extension UserInterfaceSettings {
         }
 
         /// Resolves the glucose target active right now from the BG target schedule.
-        /// NOTE: same logic as HomeStateModel/AdjustmentsStateModel — candidate for a shared helper.
         func getCurrentGlucoseTarget() async {
-            let now = Date()
-            let calendar = Calendar.current
-            let dateFormatter = DateFormatter()
-            dateFormatter.dateFormat = "HH:mm:ss"
-            dateFormatter.timeZone = TimeZone.current
-
             let bgTargets = await provider.getBGTargets()
-            let entries: [(start: String, value: Decimal)] = bgTargets.targets.map { ($0.start, $0.low) }
-
-            for (index, entry) in entries.enumerated() {
-                guard let entryTime = dateFormatter.date(from: entry.start) else { continue }
-
-                let entryComponents = calendar.dateComponents([.hour, .minute, .second], from: entryTime)
-                let entryStartTime = calendar.date(
-                    bySettingHour: entryComponents.hour!,
-                    minute: entryComponents.minute!,
-                    second: entryComponents.second!,
-                    of: now
-                )!
-
-                let entryEndTime: Date
-                if index < entries.count - 1,
-                   let nextEntryTime = dateFormatter.date(from: entries[index + 1].start)
-                {
-                    let nextEntryComponents = calendar.dateComponents([.hour, .minute, .second], from: nextEntryTime)
-                    entryEndTime = calendar.date(
-                        bySettingHour: nextEntryComponents.hour!,
-                        minute: nextEntryComponents.minute!,
-                        second: nextEntryComponents.second!,
-                        of: now
-                    )!
-                } else {
-                    entryEndTime = calendar.date(byAdding: .day, value: 1, to: entryStartTime)!
-                }
-
-                if now >= entryStartTime, now < entryEndTime {
-                    await MainActor.run { currentGlucoseTarget = entry.value }
-                    return
-                }
+            if let target = bgTargets.currentTarget() {
+                await MainActor.run { currentGlucoseTarget = target }
             }
         }
     }