浏览代码

Refactor treatment type filter to use enum

Introduced a TreatmentType enum to replace hardcoded treatment type strings in DataTableRootView. Updated filter logic and UI to use the enum, improving maintainability and reducing duplication.
Mike Plante 6 月之前
父节点
当前提交
8a9316dd8a

+ 3 - 0
Trio/Sources/Localizations/Main/Localizable.xcstrings

@@ -107923,6 +107923,9 @@
         }
       }
     },
+    "External Bolus" : {
+
+    },
     "External Insulin" : {
       "comment" : "A manually entered dose of external insulin",
       "localizations" : {

+ 26 - 0
Trio/Sources/Modules/DataTable/DataTableDataFlow.swift

@@ -6,6 +6,32 @@ import SwiftUI
 enum DataTable {
     enum Config {}
 
+    enum TreatmentType: String, CaseIterable {
+        case bolus = "Bolus"
+        case externalBolus = "External Bolus"
+        case smb = "SMB"
+        case tempBasal = "Temp Basal"
+        case suspend = "Suspend"
+        case other = "Other"
+
+        var displayName: String {
+            switch self {
+            case .bolus:
+                return String(localized: "Bolus")
+            case .externalBolus:
+                return String(localized: "External Bolus")
+            case .smb:
+                return String(localized: "SMB")
+            case .tempBasal:
+                return String(localized: "Temp Basal")
+            case .suspend:
+                return String(localized: "Suspend")
+            case .other:
+                return String(localized: "Other")
+            }
+        }
+    }
+
     enum Mode: String, Hashable, Identifiable, CaseIterable {
         case treatments
         case meals

+ 29 - 30
Trio/Sources/Modules/DataTable/View/DataTableRootView.swift

@@ -19,14 +19,7 @@ extension DataTable {
         @State private var showManualGlucose: Bool = false
         @State private var isAmountUnconfirmed: Bool = true
         @State private var showTreatmentTypeFilter = false
-        @State private var selectedTreatmentTypes: Set<String> = [
-            "Bolus",
-            "External Bolus",
-            "SMB",
-            "Temp Basal",
-            "Suspend",
-            "Other"
-        ]
+        @State private var selectedTreatmentTypes: Set<TreatmentType> = Set(TreatmentType.allCases)
         @State private var filterPopoverAnchor: CGRect = .zero
 
         @Environment(\.colorScheme) var colorScheme
@@ -186,30 +179,33 @@ extension DataTable {
                 HStack {
                     Text("Filter")
                     Image(
-                        systemName: selectedTreatmentTypes.count == 6
+                        systemName: selectedTreatmentTypes.count == TreatmentType.allCases.count
                             ? "line.3.horizontal.decrease.circle" : "line.3.horizontal.decrease.circle.fill"
                     )
-                    if selectedTreatmentTypes.count < 6 {
-                        Text(verbatim: "(\(selectedTreatmentTypes.count)/6)")
+                    if selectedTreatmentTypes.count < TreatmentType.allCases.count {
+                        Text(verbatim: "(\(selectedTreatmentTypes.count)/\(TreatmentType.allCases.count))")
                     }
                 }.foregroundColor(Color.accentColor)
             }
             .popover(isPresented: $showTreatmentTypeFilter, arrowEdge: .top) {
                 VStack(alignment: .leading, spacing: 20) {
                     Button(action: {
-                        if selectedTreatmentTypes.count == 6 {
+                        if selectedTreatmentTypes.count == TreatmentType.allCases.count {
                             // Deselect all - keep at least one selected
                             selectedTreatmentTypes = []
                         } else {
                             // Select all
-                            selectedTreatmentTypes = ["Bolus", "External Bolus", "SMB", "Temp Basal", "Suspend", "Other"]
+                            selectedTreatmentTypes = Set(TreatmentType.allCases)
                         }
                     }) {
                         HStack(spacing: 20) {
-                            Image(systemName: selectedTreatmentTypes.count == 6 ? "checkmark.circle.fill" : "circle")
-                                .frame(width: 20)
-                                .foregroundColor(Color.accentColor)
-                            Text(selectedTreatmentTypes.count == 6 ? "Deselect All" : "Select All")
+                            Image(
+                                systemName: selectedTreatmentTypes.count == TreatmentType.allCases.count
+                                    ? "checkmark.circle.fill" : "circle"
+                            )
+                            .frame(width: 20)
+                            .foregroundColor(Color.accentColor)
+                            Text(selectedTreatmentTypes.count == TreatmentType.allCases.count ? "Deselect All" : "Select All")
                                 .foregroundColor(Color.primary)
                         }.padding(4)
                     }
@@ -217,15 +213,18 @@ extension DataTable {
 
                     Divider()
 
-                    ForEach(["Bolus", "External Bolus", "SMB", "Temp Basal", "Suspend", "Other"], id: \.self) { type in
+                    ForEach(TreatmentType.allCases, id: \.rawValue) { treatmentType in
                         Button(action: {
-                            toggleTreatmentType(type)
+                            toggleTreatmentType(treatmentType)
                         }) {
                             HStack(spacing: 20) {
-                                Image(systemName: selectedTreatmentTypes.contains(type) ? "checkmark.circle.fill" : "circle")
-                                    .frame(width: 20)
-                                    .foregroundColor(Color.accentColor)
-                                Text(type)
+                                Image(
+                                    systemName: selectedTreatmentTypes
+                                        .contains(treatmentType) ? "checkmark.circle.fill" : "circle"
+                                )
+                                .frame(width: 20)
+                                .foregroundColor(Color.accentColor)
+                                Text(treatmentType.displayName)
                                     .foregroundColor(Color.primary)
                             }.padding(4)
                         }
@@ -262,7 +261,7 @@ extension DataTable {
             ).buttonStyle(.borderless)
         }
 
-        private func toggleTreatmentType(_ type: String) {
+        private func toggleTreatmentType(_ type: TreatmentType) {
             if selectedTreatmentTypes.contains(type) {
                 selectedTreatmentTypes.remove(type)
             } else {
@@ -280,18 +279,18 @@ extension DataTable {
                 // Then filter by treatment type
                 if let bolus = item.bolus {
                     if bolus.isSMB {
-                        return selectedTreatmentTypes.contains("SMB")
+                        return selectedTreatmentTypes.contains(.smb)
                     } else if bolus.isExternal {
-                        return selectedTreatmentTypes.contains("External Bolus")
+                        return selectedTreatmentTypes.contains(.externalBolus)
                     } else {
-                        return selectedTreatmentTypes.contains("Bolus")
+                        return selectedTreatmentTypes.contains(.bolus)
                     }
                 } else if item.tempBasal != nil {
-                    return selectedTreatmentTypes.contains("Temp Basal")
+                    return selectedTreatmentTypes.contains(.tempBasal)
                 } else if item.type == "PumpSuspend" {
-                    return selectedTreatmentTypes.contains("Suspend")
+                    return selectedTreatmentTypes.contains(.suspend)
                 } else {
-                    return selectedTreatmentTypes.contains("Other")
+                    return selectedTreatmentTypes.contains(.other)
                 }
             }
         }