PumpView.swift 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. import CoreData
  2. import SwiftUI
  3. struct PumpView: View {
  4. @Binding var reservoir: Decimal?
  5. // @Binding var battery: Battery?
  6. @Binding var name: String
  7. @Binding var expiresAtDate: Date?
  8. @Binding var timerDate: Date
  9. @Binding var timeZone: TimeZone?
  10. @State var state: Home.StateModel
  11. @FetchRequest(
  12. fetchRequest: OpenAPS_Battery.fetch(NSPredicate.predicateFor30MinAgo),
  13. animation: Animation.bouncy
  14. ) var battery: FetchedResults<OpenAPS_Battery>
  15. @Environment(\.colorScheme) var colorScheme
  16. private var reservoirFormatter: NumberFormatter {
  17. let formatter = NumberFormatter()
  18. formatter.numberStyle = .decimal
  19. formatter.maximumFractionDigits = 0
  20. return formatter
  21. }
  22. private var batteryFormatter: NumberFormatter {
  23. let formatter = NumberFormatter()
  24. formatter.numberStyle = .percent
  25. return formatter
  26. }
  27. private var numberFormatter: NumberFormatter {
  28. let formatter = NumberFormatter()
  29. formatter.numberStyle = .decimal
  30. formatter.maximumFractionDigits = 2
  31. return formatter
  32. }
  33. private var dateFormatter: DateFormatter {
  34. let dateFormatter = DateFormatter()
  35. dateFormatter.timeStyle = .short
  36. return dateFormatter
  37. }
  38. var body: some View {
  39. VStack(alignment: .leading, spacing: 20) {
  40. if let reservoir = reservoir {
  41. HStack {
  42. Image(systemName: "cross.vial.fill")
  43. .font(.system(size: 16))
  44. .foregroundColor(reservoirColor)
  45. if reservoir == 0xDEAD_BEEF {
  46. Text("50+ " + NSLocalizedString("U", comment: "Insulin unit")).font(.system(size: 15, design: .rounded))
  47. } else {
  48. Text(
  49. reservoirFormatter
  50. .string(from: reservoir as NSNumber)! + NSLocalizedString(" U", comment: "Insulin unit")
  51. )
  52. .font(.system(size: 16, design: .rounded))
  53. }
  54. }
  55. if let timeZone = timeZone, timeZone.secondsFromGMT() != TimeZone.current.secondsFromGMT() {
  56. Image(systemName: "clock.badge.exclamationmark.fill")
  57. .font(.system(size: 16))
  58. .symbolRenderingMode(.palette)
  59. .foregroundStyle(.red, Color(.warning))
  60. }
  61. }
  62. if (battery.first?.display) != nil, expiresAtDate == nil {
  63. HStack {
  64. Image(systemName: "battery.100")
  65. .font(.system(size: 16))
  66. .foregroundColor(batteryColor)
  67. Text("\(Int(battery.first?.percent ?? 100)) %").font(.system(size: 16, design: .rounded))
  68. }
  69. }
  70. if let date = expiresAtDate {
  71. HStack {
  72. Image(systemName: "stopwatch.fill")
  73. .font(.system(size: 16))
  74. .foregroundColor(timerColor)
  75. Text(remainingTimeString(time: date.timeIntervalSince(timerDate))).font(.system(size: 16, design: .rounded))
  76. }
  77. }
  78. }
  79. }
  80. private func remainingTimeString(time: TimeInterval) -> String {
  81. guard time > 0 else {
  82. return NSLocalizedString("Replace pod", comment: "View/Header when pod expired")
  83. }
  84. var time = time
  85. let days = Int(time / 1.days.timeInterval)
  86. time -= days.days.timeInterval
  87. let hours = Int(time / 1.hours.timeInterval)
  88. time -= hours.hours.timeInterval
  89. let minutes = Int(time / 1.minutes.timeInterval)
  90. if days >= 1 {
  91. return "\(days)" + NSLocalizedString("d", comment: "abbreviation for days") + " \(hours)" +
  92. NSLocalizedString("h", comment: "abbreviation for hours")
  93. }
  94. if hours >= 1 {
  95. return "\(hours)" + NSLocalizedString("h", comment: "abbreviation for hours")
  96. }
  97. return "\(minutes)" + NSLocalizedString("m", comment: "abbreviation for minutes")
  98. }
  99. private var batteryColor: Color {
  100. guard let battery = battery.first else {
  101. return .gray
  102. }
  103. switch battery.percent {
  104. case ...10:
  105. return .red
  106. case ...20:
  107. return .yellow
  108. default:
  109. return .green
  110. }
  111. }
  112. private var reservoirColor: Color {
  113. guard let reservoir = reservoir else {
  114. return .gray
  115. }
  116. switch reservoir {
  117. case ...10:
  118. return .red
  119. case ...30:
  120. return .yellow
  121. default:
  122. return .blue
  123. }
  124. }
  125. private var timerColor: Color {
  126. guard let expisesAt = expiresAtDate else {
  127. return .gray
  128. }
  129. let time = expisesAt.timeIntervalSince(timerDate)
  130. switch time {
  131. case ...8.hours.timeInterval:
  132. return .red
  133. case ...1.days.timeInterval:
  134. return .yellow
  135. default:
  136. return .green
  137. }
  138. }
  139. }
  140. struct Hairline: View {
  141. let color: Color
  142. var body: some View {
  143. Rectangle()
  144. .fill(color)
  145. .frame(width: UIScreen.main.bounds.width / 1.3, height: 1)
  146. .opacity(0.5)
  147. }
  148. }