IOBAlarmEditor.swift 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. // LoopFollow
  2. // IOBAlarmEditor.swift
  3. // Created by Jonas Björkert on 2025-05-19.
  4. //
  5. // IOBAlarmEditor.swift
  6. // LoopFollow
  7. //
  8. // Created by Jonas Björkert on 2025-05-17.
  9. //
  10. import SwiftUI
  11. struct IOBAlarmEditor: View {
  12. @Binding var alarm: Alarm
  13. var body: some View {
  14. Form {
  15. InfoBanner(
  16. text: "Alerts when insulin-on-board is high, or when several "
  17. + "boluses in quick succession exceed the limits you set.",
  18. alarmType: alarm.type
  19. )
  20. AlarmGeneralSection(alarm: $alarm)
  21. // ── individual bolus size ──
  22. AlarmStepperSection(
  23. header: "Bolus Size",
  24. footer: "Only boluses equal to or larger than this are counted.",
  25. title: "Bolus ≥",
  26. range: 0.1 ... 20,
  27. step: 0.1,
  28. value: Binding(
  29. get: { alarm.delta ?? 1.0 },
  30. set: { alarm.delta = $0 }
  31. )
  32. )
  33. // ── number of boluses ──
  34. AlarmStepperSection(
  35. header: "Bolus Count",
  36. footer: "Number of qualifying boluses needed to trigger.",
  37. title: "Count ≥",
  38. range: 1 ... 10,
  39. step: 1,
  40. value: Binding(
  41. get: { Double(alarm.monitoringWindow ?? 2) },
  42. set: { alarm.monitoringWindow = Int($0) }
  43. )
  44. )
  45. // ── look-back window ──
  46. AlarmStepperSection(
  47. header: "Time Window",
  48. footer: "How far back to look for those boluses.",
  49. title: "Minutes",
  50. range: 5 ... 120,
  51. step: 5,
  52. value: Binding(
  53. get: { Double(alarm.predictiveMinutes ?? 30) },
  54. set: { alarm.predictiveMinutes = Int($0) }
  55. )
  56. )
  57. // ── absolute IOB limit ──
  58. AlarmStepperSection(
  59. header: "Total IOB",
  60. footer: "Alert if current IOB or total boluses reach this.",
  61. title: "IOB ≥",
  62. range: 1 ... 20,
  63. step: 0.5,
  64. value: Binding(
  65. get: { alarm.threshold ?? 6 },
  66. set: { alarm.threshold = $0 }
  67. )
  68. )
  69. AlarmActiveSection(alarm: $alarm)
  70. AlarmAudioSection(alarm: $alarm)
  71. AlarmSnoozeSection(alarm: $alarm,
  72. range: 1 ... 24,
  73. step: 1) // snooze in hours
  74. }
  75. .navigationTitle(alarm.type.rawValue)
  76. }
  77. }