PumpView.swift 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. import SwiftUI
  2. struct PumpView: View {
  3. @Binding var reservoir: Decimal?
  4. @Binding var battery: Battery?
  5. @Binding var name: String
  6. @Binding var expiresAtDate: Date?
  7. @Binding var timerDate: Date
  8. @Binding var boluses: [PumpHistoryEvent]
  9. @State var state: Home.StateModel
  10. @State var totalBolus: Decimal = 0
  11. private var reservoirFormatter: NumberFormatter {
  12. let formatter = NumberFormatter()
  13. formatter.numberStyle = .decimal
  14. formatter.maximumFractionDigits = 0
  15. return formatter
  16. }
  17. private var batteryFormatter: NumberFormatter {
  18. let formatter = NumberFormatter()
  19. formatter.numberStyle = .percent
  20. return formatter
  21. }
  22. private var numberFormatter: NumberFormatter {
  23. let formatter = NumberFormatter()
  24. formatter.numberStyle = .decimal
  25. formatter.maximumFractionDigits = 2
  26. return formatter
  27. }
  28. var body: some View {
  29. HStack {
  30. Text("IOB").font(.callout).foregroundColor(.secondary)
  31. Text(
  32. (numberFormatter.string(from: (state.suggestion?.iob ?? 0) as NSNumber) ?? "0") +
  33. NSLocalizedString(" U", comment: "Insulin unit")
  34. )
  35. .font(.callout).fontWeight(.bold)
  36. Spacer()
  37. Text("COB").font(.callout).foregroundColor(.secondary)
  38. Text(
  39. (numberFormatter.string(from: (state.suggestion?.cob ?? 0) as NSNumber) ?? "0") +
  40. NSLocalizedString(" g", comment: "gram of carbs")
  41. )
  42. .font(.callout).fontWeight(.bold)
  43. Spacer()
  44. if let reservoir = reservoir {
  45. HStack {
  46. Image(systemName: "drop.fill")
  47. .resizable()
  48. .aspectRatio(contentMode: .fit)
  49. .frame(maxHeight: 15)
  50. .foregroundColor(reservoirColor)
  51. if reservoir == 0xDEAD_BEEF {
  52. Text("50+ " + NSLocalizedString("U", comment: "Insulin unit")).font(.callout)
  53. .fontWeight(.bold)
  54. } else {
  55. Text(
  56. reservoirFormatter
  57. .string(from: reservoir as NSNumber)! + NSLocalizedString(" U", comment: "Insulin unit")
  58. )
  59. .font(.callout).fontWeight(.bold)
  60. }
  61. }
  62. }
  63. Spacer()
  64. if let battery = battery, battery.display ?? false, expiresAtDate == nil {
  65. HStack {
  66. Image(systemName: "battery.100")
  67. .resizable()
  68. .aspectRatio(contentMode: .fit)
  69. .frame(maxHeight: 15)
  70. .foregroundColor(batteryColor)
  71. Text("\(Int(battery.percent ?? 100)) %").font(.callout)
  72. .fontWeight(.bold)
  73. Text(calculateTINS())
  74. .font(.callout).fontWeight(.bold)
  75. }
  76. }
  77. if let date = expiresAtDate {
  78. HStack {
  79. Image(systemName: "stopwatch.fill")
  80. .resizable()
  81. .aspectRatio(contentMode: .fit)
  82. .frame(maxHeight: 15)
  83. .foregroundColor(timerColor)
  84. Text(remainingTimeString(time: date.timeIntervalSince(timerDate))).font(.callout)
  85. .fontWeight(.bold)
  86. }
  87. }
  88. }
  89. }
  90. //MARK: WORKS....
  91. func calculateTINS() -> String {
  92. let date = Date()
  93. let calendar = Calendar.current
  94. let offset = state.scale
  95. var offsetComponents = DateComponents()
  96. offsetComponents.hour = -offset.rawValue
  97. let startTime = calendar.date(byAdding: offsetComponents, to: date)!
  98. print("******************")
  99. print("die voll krasse start time ist: \(startTime)")
  100. let bolusesForCurrentDay = boluses.filter { $0.timestamp >= startTime && $0.type == .bolus }
  101. let totalBolus = bolusesForCurrentDay.map { $0.amount ?? 0 }.reduce(0, +)
  102. let roundedTotalBolus = Decimal(round(100 * Double(totalBolus)) / 100)
  103. return "\(roundedTotalBolus) U"
  104. }
  105. // MARK: THIS CRAP DOES NOT WORK
  106. // func calculateTINS() -> String {
  107. // let date = Date()
  108. // let calendar = Calendar.current
  109. // let offset = state.scale
  110. //
  111. // // let hour = calendar.component(.hour, from: date)
  112. // //
  113. // // let minutes = calendar.component(.minute, from: date)
  114. //
  115. // let startTime = calendar.startOfDay(for: date).addingTimeInterval(-Double(offset.rawValue))
  116. // print("******************")
  117. // print(startTime)
  118. //
  119. // let bolusesForCurrentDay = boluses.filter { $0.timestamp >= startTime && $0.type == .bolus }
  120. //
  121. // let totalBolus = bolusesForCurrentDay.map { $0.amount ?? 0 }.reduce(0, +)
  122. // let roundedTotalBolus = Decimal(round(100 * Double(totalBolus)) / 100)
  123. //
  124. // return "\(roundedTotalBolus) U"
  125. // }
  126. private func remainingTimeString(time: TimeInterval) -> String {
  127. guard time > 0 else {
  128. return NSLocalizedString("Replace pod", comment: "View/Header when pod expired")
  129. }
  130. var time = time
  131. let days = Int(time / 1.days.timeInterval)
  132. time -= days.days.timeInterval
  133. let hours = Int(time / 1.hours.timeInterval)
  134. time -= hours.hours.timeInterval
  135. let minutes = Int(time / 1.minutes.timeInterval)
  136. if days >= 1 {
  137. return "\(days)" + NSLocalizedString("d", comment: "abbreviation for days") + " \(hours)" +
  138. NSLocalizedString("h", comment: "abbreviation for hours")
  139. }
  140. if hours >= 1 {
  141. return "\(hours)" + NSLocalizedString("h", comment: "abbreviation for hours")
  142. }
  143. return "\(minutes)" + NSLocalizedString("m", comment: "abbreviation for minutes")
  144. }
  145. private var batteryColor: Color {
  146. guard let battery = battery, let percent = battery.percent else {
  147. return .gray
  148. }
  149. switch percent {
  150. case ...10:
  151. return .red
  152. case ...20:
  153. return .yellow
  154. default:
  155. return .green
  156. }
  157. }
  158. private var reservoirColor: Color {
  159. guard let reservoir = reservoir else {
  160. return .gray
  161. }
  162. switch reservoir {
  163. case ...10:
  164. return .red
  165. case ...30:
  166. return .yellow
  167. default:
  168. return .blue
  169. }
  170. }
  171. private var timerColor: Color {
  172. guard let expisesAt = expiresAtDate else {
  173. return .gray
  174. }
  175. let time = expisesAt.timeIntervalSince(timerDate)
  176. switch time {
  177. case ...8.hours.timeInterval:
  178. return .red
  179. case ...1.days.timeInterval:
  180. return .yellow
  181. default:
  182. return .green
  183. }
  184. }
  185. }
  186. struct Hairline: View {
  187. let color: Color
  188. var body: some View {
  189. Rectangle()
  190. .fill(color)
  191. .frame(width: UIScreen.main.bounds.width / 1.3, height: 1)
  192. .opacity(0.5)
  193. }
  194. }