| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- import CoreData
- import Foundation
- import SwiftUI
- import Swinject
- extension Stat {
- final class StateModel: BaseStateModel<Provider> {
- @Injected() var settings: SettingsManager!
- @Published var highLimit: Decimal = 10 / 0.0555
- @Published var lowLimit: Decimal = 4 / 0.0555
- @Published var overrideUnit: Bool = false
- @Published var layingChart: Bool = false
- @Published var units: GlucoseUnits = .mmolL
- @Published var glucoseFromPersistence: [GlucoseStored] = []
- @Published var selectedDuration: Duration = .Today
- private let context = CoreDataStack.shared.newTaskContext()
- private let viewContext = CoreDataStack.shared.persistentContainer.viewContext
- enum Duration: String, CaseIterable, Identifiable {
- case Today
- case Day
- case Week
- case Month
- case Total
- var id: Self { self }
- }
- override func subscribe() {
- /// Default is today
- setupGlucoseArray(for: .Today)
- highLimit = settingsManager.settings.high
- lowLimit = settingsManager.settings.low
- units = settingsManager.settings.units
- overrideUnit = settingsManager.settings.overrideHbA1cUnit
- layingChart = settingsManager.settings.oneDimensionalGraph
- }
- func setupGlucoseArray(for duration: Duration) {
- Task {
- let ids = await self.fetchGlucose(for: duration)
- await updateGlucoseArray(with: ids)
- }
- }
- private func fetchGlucose(for duration: Duration) async -> [NSManagedObjectID] {
- await context.perform {
- let predicate: NSPredicate
- switch duration {
- case .Day:
- predicate = NSPredicate.glucoseForStatsDay
- case .Week:
- predicate = NSPredicate.glucoseForStatsWeek
- case .Today:
- predicate = NSPredicate.glucoseForStatsToday
- case .Month:
- predicate = NSPredicate.glucoseForStatsMonth
- case .Total:
- predicate = NSPredicate.glucoseForStatsTotal
- }
- return CoreDataStack.shared.fetchEntities(
- ofType: GlucoseStored.self,
- onContext: self.context,
- predicate: predicate,
- key: "date",
- ascending: false,
- batchSize: 100,
- propertiesToFetch: ["glucose", "date"]
- ).map(\.objectID)
- }
- }
- @MainActor private func updateGlucoseArray(with IDs: [NSManagedObjectID]) {
- do {
- let glucoseObjects = try IDs.compactMap { id in
- try viewContext.existingObject(with: id) as? GlucoseStored
- }
- glucoseFromPersistence = glucoseObjects
- } catch {
- debugPrint(
- "Home State: \(#function) \(DebuggingIdentifiers.failed) error while updating the glucose array: \(error.localizedDescription)"
- )
- }
- }
- }
- }
|