| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- //
- // MockCGMManagerSettingsViewModel.swift
- // MockKitUI
- //
- // Created by Nathaniel Hamming on 2023-05-18.
- // Copyright © 2023 LoopKit Authors. All rights reserved.
- //
- import SwiftUI
- import Combine
- import HealthKit
- import LoopKit
- import LoopKitUI
- import MockKit
- class MockCGMManagerSettingsViewModel: ObservableObject {
-
- let cgmManager: MockCGMManager
-
- var displayGlucosePreference: DisplayGlucosePreference
- static private let dateTimeFormatter: DateFormatter = {
- let timeFormatter = DateFormatter()
- timeFormatter.dateStyle = .short
- timeFormatter.timeStyle = .short
- return timeFormatter
- }()
-
- var sensorInsertionDateTimeString: String {
- Self.dateTimeFormatter.string(from: Date().addingTimeInterval(sensorInsertionInterval))
- }
- var sensorExpirationRemaining = TimeInterval(days: 5.0)
- var sensorInsertionInterval = TimeInterval(days: -5.0)
- var sensorExpirationPercentComplete: Double = 0.25
- var sensorExpirationDateTimeString: String {
- Self.dateTimeFormatter.string(from: Date().addingTimeInterval(sensorExpirationRemaining))
- }
-
- @Published private(set) var lastGlucoseValueWithUnitFormatted: String?
-
- @Published private(set) var lastGlucoseValueFormatted: String = "---"
-
- var glucoseUnitString: String {
- displayGlucosePreference.unit.shortLocalizedUnitString()
- }
-
- @Published private(set) var lastGlucoseDate: Date? {
- didSet {
- updateLastReadingTime()
- }
- }
-
- @Published var lastReadingMinutesFromNow: Int = 0
-
- func updateLastReadingTime() {
- guard let lastGlucoseDate = lastGlucoseDate else {
- lastReadingMinutesFromNow = 0
- return
- }
- lastReadingMinutesFromNow = Int(Date().timeIntervalSince(lastGlucoseDate).minutes)
- }
-
- @Published private(set) var lastGlucoseTrend: GlucoseTrend?
-
- var lastGlucoseDateFormatted: String? {
- guard let lastGlucoseDate = lastGlucoseDate else {
- return nil
- }
- return Self.dateTimeFormatter.string(from: lastGlucoseDate)
- }
-
- @Published private(set) var lastGlucoseTrendFormatted: String?
-
- init(cgmManager: MockCGMManager, displayGlucosePreference: DisplayGlucosePreference) {
- self.cgmManager = cgmManager
- self.displayGlucosePreference = displayGlucosePreference
-
- lastGlucoseDate = cgmManager.cgmManagerStatus.lastCommunicationDate
- lastGlucoseTrend = cgmManager.mockSensorState.trendType
- setLastGlucoseTrend(cgmManager.mockSensorState.trendRate)
- setLastGlucoseValue(cgmManager.mockSensorState.currentGlucose)
-
- cgmManager.addStatusObserver(self, queue: .main)
- }
-
- func setLastGlucoseTrend(_ trendRate: HKQuantity?) {
- guard let trendRate = trendRate else {
- lastGlucoseTrendFormatted = nil
- return
- }
- let glucoseUnitPerMinute = displayGlucosePreference.unit.unitDivided(by: .minute())
- lastGlucoseTrendFormatted = displayGlucosePreference.formatMinuteRate(trendRate)
- }
-
- func setLastGlucoseValue(_ lastGlucose: HKQuantity?) {
- guard let lastGlucose = lastGlucose else {
- lastGlucoseValueWithUnitFormatted = nil
- lastGlucoseValueFormatted = "---"
- return
- }
- lastGlucoseValueWithUnitFormatted = displayGlucosePreference.format(lastGlucose)
- lastGlucoseValueFormatted = displayGlucosePreference.format(lastGlucose, includeUnit: false)
- }
- }
- extension MockCGMManagerSettingsViewModel: CGMManagerStatusObserver {
- func cgmManager(_ manager: LoopKit.CGMManager, didUpdate status: LoopKit.CGMManagerStatus) {
- lastGlucoseDate = status.lastCommunicationDate
- lastGlucoseTrend = cgmManager.mockSensorState.trendType
-
- setLastGlucoseTrend(cgmManager.mockSensorState.trendRate)
-
- setLastGlucoseValue(cgmManager.mockSensorState.currentGlucose)
- }
- }
|