| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- import SwiftUI
- extension ISFEditor {
- struct RootView: BaseView {
- @EnvironmentObject var viewModel: ViewModel<Provider>
- @State private var editMode = EditMode.inactive
- private var dateFormatter: DateFormatter {
- let formatter = DateFormatter()
- formatter.timeZone = TimeZone(secondsFromGMT: 0)
- formatter.timeStyle = .short
- return formatter
- }
- private var rateFormatter: NumberFormatter {
- let formatter = NumberFormatter()
- formatter.numberStyle = .decimal
- formatter.maximumFractionDigits = 1
- return formatter
- }
- var body: some View {
- Form {
- if let newISF = viewModel.autosensISF {
- Section(header: Text("Autosens")) {
- HStack {
- Text("New ISF")
- Spacer()
- Text(rateFormatter.string(from: newISF as NSNumber) ?? "0" + " \(viewModel.units)/U")
- }
- }
- }
- Section(header: Text("Schedule")) {
- list
- addButton
- }
- Section {
- Button { viewModel.save() }
- label: {
- Text("Save")
- }
- .disabled(viewModel.items.isEmpty)
- }
- }
- .navigationTitle("Insulin Sensitivities")
- .navigationBarTitleDisplayMode(.automatic)
- .navigationBarItems(
- trailing: EditButton()
- )
- .environment(\.editMode, $editMode)
- .onAppear {
- viewModel.validate()
- }
- }
- private func pickers(for index: Int) -> some View {
- GeometryReader { geometry in
- VStack {
- HStack {
- Text("Rate").frame(width: geometry.size.width / 2)
- Text("Time").frame(width: geometry.size.width / 2)
- }
- HStack(spacing: 0) {
- Picker(selection: $viewModel.items[index].rateIndex, label: EmptyView()) {
- ForEach(0 ..< viewModel.rateValues.count, id: \.self) { i in
- Text(
- (
- self.rateFormatter
- .string(from: viewModel.rateValues[i] as NSNumber) ?? ""
- ) + " \(viewModel.units.rawValue)/U"
- ).tag(i)
- }
- }
- .frame(maxWidth: geometry.size.width / 2)
- .clipped()
- Picker(selection: $viewModel.items[index].timeIndex, label: EmptyView()) {
- ForEach(0 ..< viewModel.timeValues.count, id: \.self) { i in
- Text(
- self.dateFormatter
- .string(from: Date(
- timeIntervalSince1970: viewModel
- .timeValues[i]
- ))
- ).tag(i)
- }
- }
- .frame(maxWidth: geometry.size.width / 2)
- .clipped()
- }
- }
- }
- }
- private var list: some View {
- List {
- ForEach(viewModel.items.indexed(), id: \.1.id) { index, item in
- NavigationLink(destination: pickers(for: index)) {
- HStack {
- Text("Rate").foregroundColor(.secondary)
- Text(
- "\(rateFormatter.string(from: viewModel.rateValues[item.rateIndex] as NSNumber) ?? "0") \(viewModel.units.rawValue)/U"
- )
- Spacer()
- Text("starts at").foregroundColor(.secondary)
- Text(
- "\(dateFormatter.string(from: Date(timeIntervalSince1970: viewModel.timeValues[item.timeIndex])))"
- )
- }
- }
- .moveDisabled(true)
- }
- .onDelete(perform: onDelete)
- }
- }
- private var addButton: some View {
- guard viewModel.canAdd else {
- return AnyView(EmptyView())
- }
- switch editMode {
- case .inactive:
- return AnyView(Button(action: onAdd) { Text("Add") })
- default:
- return AnyView(EmptyView())
- }
- }
- func onAdd() {
- viewModel.add()
- }
- private func onDelete(offsets: IndexSet) {
- viewModel.items.remove(atOffsets: offsets)
- viewModel.validate()
- }
- }
- }
|