CurrentGlucoseView.swift 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import SwiftUI
  2. struct CurrentGlucoseView: View {
  3. @Binding var recentGlucose: BloodGlucose?
  4. @Binding var delta: Int?
  5. let units: GlucoseUnits
  6. private var glucoseFormatter: NumberFormatter {
  7. let formatter = NumberFormatter()
  8. formatter.numberStyle = .decimal
  9. formatter.maximumFractionDigits = 1
  10. return formatter
  11. }
  12. private var deltaFormatter: NumberFormatter {
  13. let formatter = NumberFormatter()
  14. formatter.numberStyle = .decimal
  15. formatter.maximumFractionDigits = 2
  16. formatter.positivePrefix = "+"
  17. return formatter
  18. }
  19. private var dateFormatter: DateFormatter {
  20. let formatter = DateFormatter()
  21. formatter.timeStyle = .short
  22. return formatter
  23. }
  24. var body: some View {
  25. HStack {
  26. VStack {
  27. Text(
  28. recentGlucose?.glucose
  29. .map { glucoseFormatter.string(from: Double(units == .mmolL ? $0.asMmolL : Decimal($0)) as NSNumber)! } ??
  30. "--"
  31. )
  32. .font(.largeTitle)
  33. Spacer()
  34. Text(
  35. recentGlucose.map { dateFormatter.string(from: $0.dateString) } ?? "--"
  36. ).font(.caption)
  37. }
  38. VStack {
  39. Spacer()
  40. image.padding(.bottom, 2)
  41. Text(
  42. delta
  43. .map { deltaFormatter.string(from: Double(units == .mmolL ? $0.asMmolL : Decimal($0)) as NSNumber)!
  44. } ??
  45. "--"
  46. ).font(.caption)
  47. Text("\(units.rawValue)").font(.caption2)
  48. }
  49. }.frame(minWidth: 120)
  50. }
  51. var image: Image {
  52. guard let direction = recentGlucose?.direction else {
  53. return Image(systemName: "arrow.left.and.right")
  54. }
  55. switch direction {
  56. case .doubleUp,
  57. .singleUp,
  58. .tripleUp:
  59. return Image(systemName: "arrow.up")
  60. case .fortyFiveUp:
  61. return Image(systemName: "arrow.up.right")
  62. case .flat:
  63. return Image(systemName: "arrow.forward")
  64. case .fortyFiveDown:
  65. return Image(systemName: "arrow.down.forward")
  66. case .doubleDown,
  67. .singleDown,
  68. .tripleDown:
  69. return Image(systemName: "arrow.down")
  70. case .none,
  71. .notComputable,
  72. .rateOutOfRange:
  73. return Image(systemName: "arrow.left.and.right")
  74. }
  75. }
  76. }