IobChart.swift 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import Charts
  2. import Foundation
  3. import SwiftUI
  4. extension MainChartView {
  5. var iobChart: some View {
  6. VStack {
  7. Chart {
  8. drawIOB()
  9. if #available(iOS 17, *) {
  10. if let selectedIOBValue {
  11. PointMark(
  12. x: .value("Time", selectedIOBValue.deliverAt ?? now, unit: .minute),
  13. y: .value("Value", Int(truncating: selectedIOBValue.iob ?? 0))
  14. )
  15. .symbolSize(CGSize(width: 15, height: 15))
  16. .foregroundStyle(Color.darkerBlue.opacity(0.8))
  17. PointMark(
  18. x: .value("Time", selectedIOBValue.deliverAt ?? now, unit: .minute),
  19. y: .value("Value", Int(truncating: selectedIOBValue.iob ?? 0))
  20. )
  21. .symbolSize(CGSize(width: 6, height: 6))
  22. .foregroundStyle(Color.primary)
  23. }
  24. }
  25. }
  26. .frame(minHeight: geo.size.height * 0.12)
  27. .frame(width: fullWidth(viewWidth: screenSize.width))
  28. .chartXScale(domain: startMarker ... endMarker)
  29. .backport.chartXSelection(value: $selection)
  30. .chartXAxis { basalChartXAxis }
  31. .chartYAxis { cobChartYAxis }
  32. .chartYScale(domain: state.minValueIobChart ... state.maxValueIobChart)
  33. .chartYAxis(.hidden)
  34. }
  35. }
  36. func drawIOB() -> some ChartContent {
  37. ForEach(state.enactedAndNonEnactedDeterminations) { iob in
  38. let rawAmount = iob.iob?.doubleValue ?? 0
  39. let amount: Double = rawAmount > 0 ? rawAmount : rawAmount * 2 // weigh negative iob with factor 2
  40. let date: Date = iob.deliverAt ?? Date()
  41. LineMark(x: .value("Time", date), y: .value("Amount", amount))
  42. .foregroundStyle(Color.darkerBlue)
  43. AreaMark(x: .value("Time", date), y: .value("Amount", amount))
  44. .foregroundStyle(
  45. LinearGradient(
  46. gradient: Gradient(
  47. colors: [
  48. Color.darkerBlue.opacity(0.8),
  49. Color.darkerBlue.opacity(0.01)
  50. ]
  51. ),
  52. startPoint: .top,
  53. endPoint: .bottom
  54. )
  55. )
  56. }
  57. }
  58. }