| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253 |
- import ActivityKit
- import Combine
- import SwiftUI
- import Swinject
- extension GlucoseNotificationSettings {
- struct RootView: BaseView {
- let resolver: Resolver
- @StateObject var state = StateModel()
- @State private var shouldDisplayHint: Bool = false
- @State var hintDetent = PresentationDetent.large
- @State var selectedVerboseHint: String?
- @State var hintLabel: String?
- @State private var decimalPlaceholder: Decimal = 0.0
- @State private var booleanPlaceholder: Bool = false
- @State private var displayPickerLowGlucose: Bool = false
- @State private var displayPickerHighGlucose: Bool = false
- private var glucoseFormatter: NumberFormatter {
- let formatter = NumberFormatter()
- formatter.numberStyle = .decimal
- formatter.maximumFractionDigits = 0
- if state.units == .mmolL {
- formatter.maximumFractionDigits = 1
- }
- formatter.roundingMode = .halfUp
- return formatter
- }
- private var carbsFormatter: NumberFormatter {
- let formatter = NumberFormatter()
- formatter.numberStyle = .decimal
- formatter.maximumFractionDigits = 0
- return formatter
- }
- @Environment(\.colorScheme) var colorScheme
- var color: LinearGradient {
- colorScheme == .dark ? LinearGradient(
- gradient: Gradient(colors: [
- Color.bgDarkBlue,
- Color.bgDarkerDarkBlue
- ]),
- startPoint: .top,
- endPoint: .bottom
- )
- :
- LinearGradient(
- gradient: Gradient(colors: [Color.gray.opacity(0.1)]),
- startPoint: .top,
- endPoint: .bottom
- )
- }
- var body: some View {
- Form {
- SettingInputSection(
- decimalValue: $decimalPlaceholder,
- booleanValue: $state.glucoseBadge,
- shouldDisplayHint: $shouldDisplayHint,
- selectedVerboseHint: Binding(
- get: { selectedVerboseHint },
- set: {
- selectedVerboseHint = $0
- hintLabel = "Show Glucose App Badge"
- }
- ),
- units: state.units,
- type: .boolean,
- label: "Show Glucose App Badge",
- miniHint: "Lorem ipsum dolor sit amet, consetetur sadipscing elitr.",
- verboseHint: "Lorem ipsum dolor sit amet, consetetur sadipscing elitr.",
- headerText: "Various Glucose Notifications"
- )
- SettingInputSection(
- decimalValue: $decimalPlaceholder,
- booleanValue: $state.glucoseNotificationsAlways,
- shouldDisplayHint: $shouldDisplayHint,
- selectedVerboseHint: Binding(
- get: { selectedVerboseHint },
- set: {
- selectedVerboseHint = $0
- hintLabel = "Always Notify Glucose"
- }
- ),
- units: state.units,
- type: .boolean,
- label: "Always Notify Glucose",
- miniHint: "Lorem ipsum dolor sit amet, consetetur sadipscing elitr.",
- verboseHint: "Lorem ipsum dolor sit amet, consetetur sadipscing elitr."
- )
- SettingInputSection(
- decimalValue: $decimalPlaceholder,
- booleanValue: $state.useAlarmSound,
- shouldDisplayHint: $shouldDisplayHint,
- selectedVerboseHint: Binding(
- get: { selectedVerboseHint },
- set: {
- selectedVerboseHint = $0
- hintLabel = "Play Alarm Sound"
- }
- ),
- units: state.units,
- type: .boolean,
- label: "Play Alarm Sound",
- miniHint: "Lorem ipsum dolor sit amet, consetetur sadipscing elitr.",
- verboseHint: "Lorem ipsum dolor sit amet, consetetur sadipscing elitr."
- )
- SettingInputSection(
- decimalValue: $decimalPlaceholder,
- booleanValue: $state.addSourceInfoToGlucoseNotifications,
- shouldDisplayHint: $shouldDisplayHint,
- selectedVerboseHint: Binding(
- get: { selectedVerboseHint },
- set: {
- selectedVerboseHint = $0
- hintLabel = "Add Glucose Source to Alarm"
- }
- ),
- units: state.units,
- type: .boolean,
- label: "Add Glucose Source to Alarm",
- miniHint: "Lorem ipsum dolor sit amet, consetetur sadipscing elitr.",
- verboseHint: "Lorem ipsum dolor sit amet, consetetur sadipscing elitr."
- )
- self.lowAndHighGlucoseAlertSection
- }
- .sheet(isPresented: $shouldDisplayHint) {
- SettingInputHintView(
- hintDetent: $hintDetent,
- shouldDisplayHint: $shouldDisplayHint,
- hintLabel: hintLabel ?? "",
- hintText: selectedVerboseHint ?? "",
- sheetTitle: "Help"
- )
- }
- .scrollContentBackground(.hidden).background(color)
- .onAppear(perform: configureView)
- .navigationBarTitle("Glucose Notifications")
- .navigationBarTitleDisplayMode(.automatic)
- }
- var lowAndHighGlucoseAlertSection: some View {
- Section {
- VStack {
- VStack {
- HStack {
- Text("Low Glucose Alarm Limit")
- Spacer()
- Group {
- Text(
- state.units == .mgdL ? state.lowGlucose.description : state.lowGlucose.formattedAsMmolL
- )
- .foregroundColor(!displayPickerLowGlucose ? .primary : .accentColor)
- Text(state.units == .mgdL ? " mg/dL" : " mmol/L").foregroundColor(.secondary)
- }
- }
- .onTapGesture {
- displayPickerLowGlucose.toggle()
- }
- }
- .padding(.top)
- if displayPickerLowGlucose {
- let setting = PickerSettingsProvider.shared.settings.lowGlucose
- Picker(selection: $state.lowGlucose, label: Text("")) {
- ForEach(
- PickerSettingsProvider.shared.generatePickerValues(from: setting, units: state.units),
- id: \.self
- ) { value in
- let displayValue = state.units == .mgdL ? value.description : value.formattedAsMmolL
- Text(displayValue).tag(value)
- }
- }
- .pickerStyle(WheelPickerStyle())
- .frame(maxWidth: .infinity)
- }
- VStack {
- HStack {
- Text("High Glucose Alarm Limit")
- Spacer()
- Group {
- Text(
- state.units == .mgdL ? state.highGlucose.description : state.highGlucose.formattedAsMmolL
- )
- .foregroundColor(!displayPickerHighGlucose ? .primary : .accentColor)
- Text(state.units == .mgdL ? " mg/dL" : " mmol/L").foregroundColor(.secondary)
- }
- }
- .onTapGesture {
- displayPickerHighGlucose.toggle()
- }
- }
- .padding(.top)
- if displayPickerHighGlucose {
- let setting = PickerSettingsProvider.shared.settings.highGlucose
- Picker(selection: $state.highGlucose, label: Text("")) {
- ForEach(
- PickerSettingsProvider.shared.generatePickerValues(from: setting, units: state.units),
- id: \.self
- ) { value in
- let displayValue = state.units == .mgdL ? value.description : value.formattedAsMmolL
- Text(displayValue).tag(value)
- }
- }
- .pickerStyle(WheelPickerStyle())
- .frame(maxWidth: .infinity)
- }
- HStack(alignment: .top) {
- Text(
- "Set the lower and upper limit for glucose alarms. See hint for more details."
- )
- .lineLimit(nil)
- .font(.footnote)
- .foregroundColor(.secondary)
- Spacer()
- Button(
- action: {
- hintLabel = "Low and High Glucose Alarm Limits"
- selectedVerboseHint =
- "These two settings limit the range outside of which you will be notified via push notifications. If your CGM readings are below 'Low' or above 'High', you will receive an alarm via push notification."
- shouldDisplayHint.toggle()
- },
- label: {
- HStack {
- Image(systemName: "questionmark.circle")
- }
- }
- ).buttonStyle(BorderlessButtonStyle())
- }.padding(.top)
- }.padding(.bottom)
- }.listRowBackground(Color.chart)
- }
- }
- }
|