InsulinSensitivityScheduleEditor.swift 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. //
  2. // InsulinSensitivityScheduleEditor.swift
  3. // LoopKitUI
  4. //
  5. // Created by Michael Pangburn on 4/20/20.
  6. // Copyright © 2020 LoopKit Authors. All rights reserved.
  7. //
  8. import SwiftUI
  9. import HealthKit
  10. import LoopKit
  11. public struct InsulinSensitivityScheduleEditor: View {
  12. @EnvironmentObject private var displayGlucosePreference: DisplayGlucosePreference
  13. @Environment(\.appName) private var appName
  14. let mode: SettingsPresentationMode
  15. let viewModel: InsulinSensitivityScheduleEditorViewModel
  16. var displayGlucoseUnit: HKUnit {
  17. displayGlucosePreference.unit
  18. }
  19. public init(
  20. mode: SettingsPresentationMode,
  21. therapySettingsViewModel: TherapySettingsViewModel,
  22. didSave: (() -> Void)? = nil
  23. ) {
  24. self.mode = mode
  25. self.viewModel = InsulinSensitivityScheduleEditorViewModel(
  26. therapySettingsViewModel: therapySettingsViewModel,
  27. didSave: didSave)
  28. }
  29. public var body: some View {
  30. QuantityScheduleEditor(
  31. title: Text(TherapySetting.insulinSensitivity.title),
  32. description: description,
  33. schedule: viewModel.insulinSensitivitySchedule?.schedule(for: displayGlucoseUnit),
  34. unit: sensitivityUnit,
  35. guardrail: .insulinSensitivity,
  36. defaultFirstScheduleItemValue: Guardrail.insulinSensitivity.startingSuggestion ?? Guardrail.insulinSensitivity.recommendedBounds.upperBound,
  37. confirmationAlertContent: confirmationAlertContent,
  38. guardrailWarning: InsulinSensitivityGuardrailWarning.init(crossedThresholds:),
  39. onSave: { insulinSensitivitySchedulePerU in
  40. // the sensitivity units are passed as the units to display `/U`
  41. // need to go back to displayGlucoseUnit. This does not affect the value
  42. // force unwrapping since dailyItems are already validated
  43. let insulinSensitivitySchedule = InsulinSensitivitySchedule(unit: displayGlucoseUnit,
  44. dailyItems: insulinSensitivitySchedulePerU.items,
  45. timeZone: insulinSensitivitySchedulePerU.timeZone)!
  46. viewModel.saveInsulinSensitivitySchedule(insulinSensitivitySchedule)
  47. },
  48. mode: mode,
  49. settingType: .insulinSensitivity
  50. )
  51. }
  52. private var description: Text {
  53. Text(TherapySetting.insulinSensitivity.descriptiveText(appName: appName))
  54. }
  55. private var sensitivityUnit: HKUnit {
  56. displayGlucoseUnit.unitDivided(by: .internationalUnit())
  57. }
  58. private var confirmationAlertContent: AlertContent {
  59. AlertContent(
  60. title: Text(LocalizedString("Save Insulin Sensitivities?", comment: "Alert title for confirming insulin sensitivities outside the recommended range")),
  61. message: Text(TherapySetting.insulinSensitivity.guardrailSaveWarningCaption)
  62. )
  63. }
  64. }
  65. private struct InsulinSensitivityGuardrailWarning: View {
  66. var crossedThresholds: [SafetyClassification.Threshold]
  67. var body: some View {
  68. assert(!crossedThresholds.isEmpty)
  69. return GuardrailWarning(
  70. therapySetting: .insulinSensitivity,
  71. title: crossedThresholds.count == 1 ? singularWarningTitle(for: crossedThresholds.first!) : multipleWarningTitle,
  72. thresholds: crossedThresholds
  73. )
  74. }
  75. private func singularWarningTitle(for threshold: SafetyClassification.Threshold) -> Text {
  76. switch threshold {
  77. case .minimum, .belowRecommended:
  78. return Text(LocalizedString("Low Insulin Sensitivity", comment: "Title text for the low insulin sensitivity warning"))
  79. case .aboveRecommended, .maximum:
  80. return Text(LocalizedString("High Insulin Sensitivity", comment: "Title text for the high insulin sensitivity warning"))
  81. }
  82. }
  83. private var multipleWarningTitle: Text {
  84. Text(LocalizedString("Insulin Sensitivities", comment: "Title text for multi-value insulin sensitivity warning"))
  85. }
  86. }