Przeglądaj źródła

Refactor calculateTTs() function

polscm32 1 rok temu
rodzic
commit
375414b586

+ 0 - 1
FreeAPS/Sources/Modules/Home/HomeStateModel.swift

@@ -59,7 +59,6 @@ extension Home {
         @Published var isLegendPresented: Bool = false
         @Published var legendSheetDetent = PresentationDetent.large
         @Published var totalInsulinDisplayType: TotalInsulinDisplayType = .totalDailyDose
-        @Published var isTempTargetActive: Bool = false
         @Published var roundedTotalBolus: String = ""
         @Published var selectedTab: Int = 0
         @Published var waitForSuggestion: Bool = false

+ 45 - 44
FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift

@@ -50,7 +50,6 @@ struct MainChartView: View {
     @Binding var displayXgridLines: Bool
     @Binding var displayYgridLines: Bool
     @Binding var thresholdLines: Bool
-    @Binding var isTempTargetActive: Bool
 
     @StateObject var state: Home.StateModel
 
@@ -316,10 +315,14 @@ extension MainChartView {
                 state.roundedTotalBolus = state.calculateTINS()
             }
             .onChange(of: tempTargets) { _ in
-                calculateTTs()
+                Task {
+                    await calculateTTs()
+                }
             }
             .onChange(of: didAppearTrigger) { _ in
-                calculateTTs()
+                Task {
+                    await calculateTTs()
+                }
             }
             .frame(minHeight: geo.size.height * 0.28)
             .frame(width: fullWidth(viewWidth: screenSize.width))
@@ -957,20 +960,22 @@ extension MainChartView {
     }
 
     /// calculations for temp target bar mark
-    private func calculateTTs() {
-        var groupedPackages: [[TempTarget]] = []
-        var currentPackage: [TempTarget] = []
-        var calculatedTTs: [ChartTempTarget] = []
-
-        for target in tempTargets {
-            if target.duration > 0 {
-                if !currentPackage.isEmpty {
-                    groupedPackages.append(currentPackage)
-                    currentPackage = []
-                }
-                currentPackage.append(target)
-            } else {
-                if let lastNonZeroTempTarget = currentPackage.last(where: { $0.duration > 0 }) {
+    private func calculateTTs() async {
+        // Perform calculations off the main thread
+        let calculatedTTs = await Task.detached { () -> [ChartTempTarget] in
+            var groupedPackages: [[TempTarget]] = []
+            var currentPackage: [TempTarget] = []
+            var calculatedTTs: [ChartTempTarget] = []
+
+            for target in await tempTargets {
+                if target.duration > 0 {
+                    if !currentPackage.isEmpty {
+                        groupedPackages.append(currentPackage)
+                        currentPackage = []
+                    }
+                    currentPackage.append(target)
+                } else if let lastNonZeroTempTarget = currentPackage.last(where: { $0.duration > 0 }) {
+                    // Ensure this cancel target is within the valid time range
                     if target.createdAt >= lastNonZeroTempTarget.createdAt,
                        target.createdAt <= lastNonZeroTempTarget.createdAt
                        .addingTimeInterval(TimeInterval(lastNonZeroTempTarget.duration * 60))
@@ -979,41 +984,37 @@ extension MainChartView {
                     }
                 }
             }
-        }
-
-        // appends last package, if exists
-        if !currentPackage.isEmpty {
-            groupedPackages.append(currentPackage)
-        }
 
-        for package in groupedPackages {
-            guard let firstNonZeroTarget = package.first(where: { $0.duration > 0 }) else {
-                continue
+            // Append the last group, if any
+            if !currentPackage.isEmpty {
+                groupedPackages.append(currentPackage)
             }
 
-            var end = firstNonZeroTarget.createdAt.addingTimeInterval(TimeInterval(firstNonZeroTarget.duration * 60))
+            for package in groupedPackages {
+                guard let firstNonZeroTarget = package.first(where: { $0.duration > 0 }) else { continue }
 
-            let earliestCancelTarget = package.filter({ $0.duration == 0 }).min(by: { $0.createdAt < $1.createdAt })
+                var end = firstNonZeroTarget.createdAt.addingTimeInterval(TimeInterval(firstNonZeroTarget.duration * 60))
 
-            if let earliestCancelTarget = earliestCancelTarget {
-                end = min(earliestCancelTarget.createdAt, end)
-            }
+                let earliestCancelTarget = package.filter({ $0.duration == 0 }).min(by: { $0.createdAt < $1.createdAt })
 
-            let now = Date()
-            isTempTargetActive = firstNonZeroTarget.createdAt <= now && now <= end
-
-            if firstNonZeroTarget.targetTop != nil {
-                let targetTop = firstNonZeroTarget.targetTop ?? 0
-                calculatedTTs
-                    .append(ChartTempTarget(
-                        amount: units == .mgdL ? targetTop : targetTop.asMmolL,
-                        start: firstNonZeroTarget.createdAt,
-                        end: end
-                    ))
+                if let earliestCancelTarget = earliestCancelTarget {
+                    end = min(earliestCancelTarget.createdAt, end)
+                }
+
+                if let targetTop = firstNonZeroTarget.targetTop {
+                    let adjustedTarget = await units == .mgdL ? targetTop : targetTop.asMmolL
+                    calculatedTTs
+                        .append(ChartTempTarget(amount: adjustedTarget, start: firstNonZeroTarget.createdAt, end: end))
+                }
             }
-        }
 
-        chartTempTargets = calculatedTTs
+            return calculatedTTs
+        }.value
+
+        // Update chartTempTargets on the main thread
+        await MainActor.run {
+            self.chartTempTargets = calculatedTTs
+        }
     }
 
     private func findRegularBasalPoints(

+ 0 - 1
FreeAPS/Sources/Modules/Home/View/HomeRootView.swift

@@ -358,7 +358,6 @@ extension Home {
                     displayXgridLines: $state.displayXgridLines,
                     displayYgridLines: $state.displayYgridLines,
                     thresholdLines: $state.thresholdLines,
-                    isTempTargetActive: $state.isTempTargetActive,
                     state: state
                 )
             }