| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- import CoreData
- import Foundation
- import Observation
- import SwiftUI
- import Swinject
- extension Stat {
- @Observable final class StateModel: BaseStateModel<Provider> {
- @ObservationIgnored @Injected() var settings: SettingsManager!
- var highLimit: Decimal = 10 / 0.0555
- var lowLimit: Decimal = 4 / 0.0555
- var overrideUnit: Bool = false
- var layingChart: Bool = false
- var units: GlucoseUnits = .mgdL
- var glucoseFromPersistence: [GlucoseStored] = []
- 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] {
- 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
- }
- let results = await CoreDataStack.shared.fetchEntitiesAsync(
- ofType: GlucoseStored.self,
- onContext: context,
- predicate: predicate,
- key: "date",
- ascending: false,
- batchSize: 100,
- propertiesToFetch: ["glucose", "objectID"]
- )
- return await context.perform {
- guard let fetchedResults = results as? [[String: Any]] else { return [] }
- return fetchedResults.compactMap { $0["objectID"] as? NSManagedObjectID }
- }
- }
- @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)"
- )
- }
- }
- }
- }
|