InsulinView.swift 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  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. PointMark(
  23. x: .value("Time", bolusDate, unit: .second),
  24. y: .value("Value", yPosition)
  25. )
  26. .symbol {
  27. Image(systemName: "arrowtriangle.down.fill").font(.system(size: size)).foregroundStyle(Color.insulin)
  28. }
  29. .annotation(position: .top) {
  30. Text(Formatter.bolusFormatter.string(from: amount) ?? "")
  31. .font(.caption2)
  32. .foregroundStyle(Color.primary)
  33. }
  34. }
  35. }
  36. }
  37. }