InsulinView.swift 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. import Charts
  2. import Foundation
  3. import SwiftUI
  4. struct InsulinView: ChartContent {
  5. let glucoseData: [GlucoseStored]
  6. let insulinData: [PumpEventStored]
  7. let units: GlucoseUnits
  8. var body: some ChartContent {
  9. drawBoluses()
  10. }
  11. private func drawBoluses() -> some ChartContent {
  12. ForEach(insulinData) { insulin in
  13. let amount = insulin.bolus?.amount ?? 0 as NSDecimalNumber
  14. let bolusDate = insulin.timestamp ?? Date()
  15. if amount != 0, let glucose = MainChartHelper.timeToNearestGlucose(
  16. glucoseValues: glucoseData,
  17. time: bolusDate.timeIntervalSince1970
  18. )?.glucose {
  19. let yPosition = (units == .mgdL ? Decimal(glucose) : Decimal(glucose).asMmolL) + MainChartHelper
  20. .bolusOffset(units: units)
  21. let size = (MainChartHelper.Config.bolusSize + CGFloat(truncating: amount) * MainChartHelper.Config.bolusScale) *
  22. 1.8
  23. PointMark(
  24. x: .value("Time", bolusDate, unit: .second),
  25. y: .value("Value", yPosition)
  26. )
  27. .symbol {
  28. Image(systemName: "arrowtriangle.down.fill").font(.system(size: size)).foregroundStyle(Color.insulin)
  29. }
  30. .annotation(position: .top) {
  31. Text(MainChartHelper.bolusFormatter.string(from: amount) ?? "")
  32. .font(.caption2)
  33. .foregroundStyle(Color.primary)
  34. }
  35. }
  36. }
  37. }
  38. }