Quellcode durchsuchen

PumpConfig module

Ivan Valkou vor 5 Jahren
Ursprung
Commit
ac3aaa2b0c

+ 39 - 15
FreeAPS.xcodeproj/project.pbxproj

@@ -7,6 +7,7 @@
 	objects = {
 
 /* Begin PBXBuildFile section */
+		3340E0D14D4701342D459C95 /* PumpConfigBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = E01C416A0792696C6911C1D7 /* PumpConfigBuilder.swift */; };
 		3811DE0925C9D32F00A708ED /* BaseViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3811DE0525C9D32E00A708ED /* BaseViewModel.swift */; };
 		3811DE0A25C9D32F00A708ED /* BaseModuleBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3811DE0625C9D32E00A708ED /* BaseModuleBuilder.swift */; };
 		3811DE0B25C9D32F00A708ED /* BaseView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3811DE0725C9D32E00A708ED /* BaseView.swift */; };
@@ -85,7 +86,6 @@
 		384E803825C388640086DB71 /* Script.swift in Sources */ = {isa = PBXBuildFile; fileRef = 384E803725C388640086DB71 /* Script.swift */; };
 		388E595C25AD948C0019842D /* FreeAPSApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 388E595B25AD948C0019842D /* FreeAPSApp.swift */; };
 		388E596025AD948E0019842D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 388E595F25AD948E0019842D /* Assets.xcassets */; };
-		388E596325AD948E0019842D /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 388E596225AD948E0019842D /* Preview Assets.xcassets */; };
 		388E596C25AD95110019842D /* OpenAPS.swift in Sources */ = {isa = PBXBuildFile; fileRef = 388E596B25AD95110019842D /* OpenAPS.swift */; };
 		388E596F25AD96040019842D /* javascript in Resources */ = {isa = PBXBuildFile; fileRef = 388E596E25AD96040019842D /* javascript */; };
 		388E597225AD9CF10019842D /* json in Resources */ = {isa = PBXBuildFile; fileRef = 388E597125AD9CF10019842D /* json */; };
@@ -125,14 +125,18 @@
 		38FE826D25CC8461001FF17A /* NightscoutAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38FE826C25CC8461001FF17A /* NightscoutAPI.swift */; };
 		45252C95D220E796FDB3B022 /* ConfigEditorDataFlow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F8A87AA037BD079BA3528BA /* ConfigEditorDataFlow.swift */; };
 		45717281F743594AA9D87191 /* ConfigEditorRootView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 920DDB21E5D0EB813197500D /* ConfigEditorRootView.swift */; };
+		53F2382465BF74DB1A967C8B /* PumpConfigProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8630D58BDAD6D9C650B9B39 /* PumpConfigProvider.swift */; };
+		5D16287A969E64D18CE40E44 /* PumpConfigViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F60E97100041040446F44E7 /* PumpConfigViewModel.swift */; };
 		642F76A05A4FF530463A9FD0 /* NightscoutConfigRootView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8782B44544F38F2B2D82C38E /* NightscoutConfigRootView.swift */; };
 		72F1BD388F42FCA6C52E4500 /* ConfigEditorProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44080E4709E3AE4B73054563 /* ConfigEditorProvider.swift */; };
 		9825E5E923F0B8FA80C8C7C7 /* NightscoutConfigViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A0A48AE3AC813A49A517846A /* NightscoutConfigViewModel.swift */; };
+		AD3D2CD42CD01B9EB8F26522 /* PumpConfigDataFlow.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF65DA88F972B56090AD6AC3 /* PumpConfigDataFlow.swift */; };
 		BD2B464E0745FBE7B79913F4 /* NightscoutConfigProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BF768BD6264FF7D71D66767 /* NightscoutConfigProvider.swift */; };
 		CDB87FA71A93F3739D3D338E /* NightscoutConfigBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 111579A6E3AC6BFA79C4DD43 /* NightscoutConfigBuilder.swift */; };
 		D6DEC113821A7F1056C4AA1E /* NightscoutConfigDataFlow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F2A13DF0EDEEEDC4106AA2A /* NightscoutConfigDataFlow.swift */; };
 		E102DE9C3E9C8AEDCB3C61BB /* ConfigEditorBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = E492D5B2EEF2119977EA2CE4 /* ConfigEditorBuilder.swift */; };
 		E39E418C56A5A46B61D960EE /* ConfigEditorViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D5B4F8B4194BB7E260EF251 /* ConfigEditorViewModel.swift */; };
+		E974172296125A5AE99E634C /* PumpConfigRootView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2AD22C985B79A2F0D2EA3D9D /* PumpConfigRootView.swift */; };
 /* End PBXBuildFile section */
 
 /* Begin PBXContainerItemProxy section */
@@ -488,6 +492,7 @@
 
 /* Begin PBXFileReference section */
 		111579A6E3AC6BFA79C4DD43 /* NightscoutConfigBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NightscoutConfigBuilder.swift; sourceTree = "<group>"; };
+		2AD22C985B79A2F0D2EA3D9D /* PumpConfigRootView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PumpConfigRootView.swift; sourceTree = "<group>"; };
 		2F2A13DF0EDEEEDC4106AA2A /* NightscoutConfigDataFlow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NightscoutConfigDataFlow.swift; sourceTree = "<group>"; };
 		3811DE0525C9D32E00A708ED /* BaseViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BaseViewModel.swift; sourceTree = "<group>"; };
 		3811DE0625C9D32E00A708ED /* BaseModuleBuilder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BaseModuleBuilder.swift; sourceTree = "<group>"; };
@@ -567,7 +572,6 @@
 		388E595825AD948C0019842D /* FreeAPS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = FreeAPS.app; sourceTree = BUILT_PRODUCTS_DIR; };
 		388E595B25AD948C0019842D /* FreeAPSApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FreeAPSApp.swift; sourceTree = "<group>"; };
 		388E595F25AD948E0019842D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
-		388E596225AD948E0019842D /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = "<group>"; };
 		388E596425AD948E0019842D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
 		388E596B25AD95110019842D /* OpenAPS.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenAPS.swift; sourceTree = "<group>"; };
 		388E596E25AD96040019842D /* javascript */ = {isa = PBXFileReference; lastKnownFileType = folder; path = javascript; sourceTree = "<group>"; };
@@ -584,12 +588,16 @@
 		38FE826925CC82DB001FF17A /* NetworkService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkService.swift; sourceTree = "<group>"; };
 		38FE826C25CC8461001FF17A /* NightscoutAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NightscoutAPI.swift; sourceTree = "<group>"; };
 		3BF768BD6264FF7D71D66767 /* NightscoutConfigProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NightscoutConfigProvider.swift; sourceTree = "<group>"; };
+		3F60E97100041040446F44E7 /* PumpConfigViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PumpConfigViewModel.swift; sourceTree = "<group>"; };
 		3F8A87AA037BD079BA3528BA /* ConfigEditorDataFlow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ConfigEditorDataFlow.swift; sourceTree = "<group>"; };
 		44080E4709E3AE4B73054563 /* ConfigEditorProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ConfigEditorProvider.swift; sourceTree = "<group>"; };
 		5D5B4F8B4194BB7E260EF251 /* ConfigEditorViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ConfigEditorViewModel.swift; sourceTree = "<group>"; };
 		8782B44544F38F2B2D82C38E /* NightscoutConfigRootView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NightscoutConfigRootView.swift; sourceTree = "<group>"; };
 		920DDB21E5D0EB813197500D /* ConfigEditorRootView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ConfigEditorRootView.swift; sourceTree = "<group>"; };
 		A0A48AE3AC813A49A517846A /* NightscoutConfigViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NightscoutConfigViewModel.swift; sourceTree = "<group>"; };
+		A8630D58BDAD6D9C650B9B39 /* PumpConfigProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PumpConfigProvider.swift; sourceTree = "<group>"; };
+		AF65DA88F972B56090AD6AC3 /* PumpConfigDataFlow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PumpConfigDataFlow.swift; sourceTree = "<group>"; };
+		E01C416A0792696C6911C1D7 /* PumpConfigBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PumpConfigBuilder.swift; sourceTree = "<group>"; };
 		E492D5B2EEF2119977EA2CE4 /* ConfigEditorBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ConfigEditorBuilder.swift; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
@@ -645,6 +653,7 @@
 				3811DE3825C9D4A100A708ED /* Settings */,
 				0610F7D6D2EC00E3BA1569F0 /* ConfigEditor */,
 				D533BF261CDC1C3F871E7BFD /* NightscoutConfig */,
+				99C01B871ACAB3F32CE755C7 /* PumpConfig */,
 			);
 			path = Modules;
 			sourceTree = "<group>";
@@ -669,7 +678,6 @@
 				388E5A5A25B6F05F0019842D /* Helpers */,
 				388E5A5925B6F0250019842D /* Models */,
 				3811DE0325C9D31700A708ED /* Modules */,
-				38B17B5F25DD6E38005CAE3D /* RileyLink */,
 				3811DE1425C9D40400A708ED /* Router */,
 				3811DE9125C9D88200A708ED /* Services */,
 			);
@@ -951,6 +959,7 @@
 				3811DF0B25CAAABD00A708ED /* APSManager.swift */,
 				3811DF0F25CAAAE200A708ED /* BaseAPSManager.swift */,
 				388E5A5825B6F0070019842D /* OpenAPS */,
+				38B17B5F25DD6E38005CAE3D /* RileyLink */,
 			);
 			path = APS;
 			sourceTree = "<group>";
@@ -976,21 +985,12 @@
 		388E595A25AD948C0019842D /* FreeAPS */ = {
 			isa = PBXGroup;
 			children = (
-				388E596125AD948E0019842D /* Preview Content */,
 				3811DED425C9E1E300A708ED /* Resources */,
 				3811DE1325C9D39E00A708ED /* Sources */,
 			);
 			path = FreeAPS;
 			sourceTree = "<group>";
 		};
-		388E596125AD948E0019842D /* Preview Content */ = {
-			isa = PBXGroup;
-			children = (
-				388E596225AD948E0019842D /* Preview Assets.xcassets */,
-			);
-			path = "Preview Content";
-			sourceTree = "<group>";
-		};
 		388E5A5825B6F0070019842D /* OpenAPS */ = {
 			isa = PBXGroup;
 			children = (
@@ -1137,6 +1137,26 @@
 			path = View;
 			sourceTree = "<group>";
 		};
+		510CCF29FD3216C5BBC49A15 /* View */ = {
+			isa = PBXGroup;
+			children = (
+				2AD22C985B79A2F0D2EA3D9D /* PumpConfigRootView.swift */,
+			);
+			path = View;
+			sourceTree = "<group>";
+		};
+		99C01B871ACAB3F32CE755C7 /* PumpConfig */ = {
+			isa = PBXGroup;
+			children = (
+				E01C416A0792696C6911C1D7 /* PumpConfigBuilder.swift */,
+				AF65DA88F972B56090AD6AC3 /* PumpConfigDataFlow.swift */,
+				A8630D58BDAD6D9C650B9B39 /* PumpConfigProvider.swift */,
+				3F60E97100041040446F44E7 /* PumpConfigViewModel.swift */,
+				510CCF29FD3216C5BBC49A15 /* View */,
+			);
+			path = PumpConfig;
+			sourceTree = "<group>";
+		};
 		D533BF261CDC1C3F871E7BFD /* NightscoutConfig */ = {
 			isa = PBXGroup;
 			children = (
@@ -1471,7 +1491,6 @@
 			isa = PBXResourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				388E596325AD948E0019842D /* Preview Assets.xcassets in Resources */,
 				388E596025AD948E0019842D /* Assets.xcassets in Resources */,
 				388E597225AD9CF10019842D /* json in Resources */,
 				388E596F25AD96040019842D /* javascript in Resources */,
@@ -1599,6 +1618,11 @@
 				BD2B464E0745FBE7B79913F4 /* NightscoutConfigProvider.swift in Sources */,
 				9825E5E923F0B8FA80C8C7C7 /* NightscoutConfigViewModel.swift in Sources */,
 				642F76A05A4FF530463A9FD0 /* NightscoutConfigRootView.swift in Sources */,
+				3340E0D14D4701342D459C95 /* PumpConfigBuilder.swift in Sources */,
+				AD3D2CD42CD01B9EB8F26522 /* PumpConfigDataFlow.swift in Sources */,
+				53F2382465BF74DB1A967C8B /* PumpConfigProvider.swift in Sources */,
+				5D16287A969E64D18CE40E44 /* PumpConfigViewModel.swift in Sources */,
+				E974172296125A5AE99E634C /* PumpConfigRootView.swift in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -1806,7 +1830,7 @@
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				CODE_SIGN_ENTITLEMENTS = FreeAPS/Resources/FreeAPS.entitlements;
 				CODE_SIGN_STYLE = Automatic;
-				DEVELOPMENT_ASSET_PATHS = "\"FreeAPS/Preview Content\"";
+				DEVELOPMENT_ASSET_PATHS = "";
 				DEVELOPMENT_TEAM = BA7ZHP4963;
 				ENABLE_PREVIEWS = YES;
 				INFOPLIST_FILE = FreeAPS/Resources/Info.plist;
@@ -1829,7 +1853,7 @@
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				CODE_SIGN_ENTITLEMENTS = FreeAPS/Resources/FreeAPS.entitlements;
 				CODE_SIGN_STYLE = Automatic;
-				DEVELOPMENT_ASSET_PATHS = "\"FreeAPS/Preview Content\"";
+				DEVELOPMENT_ASSET_PATHS = "";
 				DEVELOPMENT_TEAM = BA7ZHP4963;
 				ENABLE_PREVIEWS = YES;
 				INFOPLIST_FILE = FreeAPS/Resources/Info.plist;

+ 0 - 6
FreeAPS/Preview Content/Preview Assets.xcassets/Contents.json

@@ -1,6 +0,0 @@
-{
-  "info" : {
-    "author" : "xcode",
-    "version" : 1
-  }
-}

+ 11 - 0
FreeAPS/Sources/APS/APSManager.swift

@@ -1,3 +1,14 @@
+import Combine
+import RileyLinkBLEKit
+
+struct RileyDisplayState: Identifiable {
+    let id: UUID
+    let name: String
+    let rssi: Int?
+    let connected: Bool
+}
+
 protocol APSManager {
+    var rileyDisplayStates: CurrentValueSubject<[RileyDisplayState], Never> { get }
     func runTest()
 }

+ 16 - 0
FreeAPS/Sources/APS/BaseAPSManager.swift

@@ -1,3 +1,4 @@
+import Combine
 import LoopKit
 import MinimedKit
 import RileyLinkBLEKit
@@ -8,15 +9,19 @@ final class BaseAPSManager: APSManager, Injectable {
     private var openAPS: OpenAPS!
     @Injected() var deviceDataManager: DeviceDataManager!
 
+    let rileyDisplayStates = CurrentValueSubject<[RileyDisplayState], Never>([])
+
     private(set) var devices: [RileyLinkDevice] = [] {
         didSet {
             print("Devices: \(devices)")
+            updateDisplayStates()
         }
     }
 
     private var deviceRSSI: [UUID: Int] = [:] {
         didSet {
             print("RSSI: \(deviceRSSI)")
+            updateDisplayStates()
         }
     }
 
@@ -47,6 +52,17 @@ final class BaseAPSManager: APSManager, Injectable {
         updateRSSI()
     }
 
+    private func updateDisplayStates() {
+        rileyDisplayStates.value = devices.map {
+            RileyDisplayState(
+                id: $0.peripheralIdentifier,
+                name: $0.name ?? "unknown",
+                rssi: self.deviceRSSI[$0.peripheralIdentifier],
+                connected: false
+            )
+        }
+    }
+
     private func registerNotifications() {
         // Register for manager notifications
         NotificationCenter.default.addObserver(

FreeAPS/Sources/RileyLink/DeviceDataManager.swift → FreeAPS/Sources/APS/RileyLink/DeviceDataManager.swift


FreeAPS/Sources/RileyLink/Extensions/UserDefaultsExtensions.swift → FreeAPS/Sources/APS/RileyLink/Extensions/UserDefaultsExtensions.swift


+ 3 - 0
FreeAPS/Sources/Modules/PumpConfig/PumpConfigBuilder.swift

@@ -0,0 +1,3 @@
+extension PumpConfig {
+    final class Builder: BaseModuleBuilder<RootView, ViewModel<Provider>, Provider> {}
+}

+ 9 - 0
FreeAPS/Sources/Modules/PumpConfig/PumpConfigDataFlow.swift

@@ -0,0 +1,9 @@
+import Combine
+
+enum PumpConfig {
+    enum Config {}
+}
+
+protocol PumpConfigProvider: Provider {
+    func rileyDisplayStates() -> AnyPublisher<[RileyDisplayState], Never>
+}

+ 11 - 0
FreeAPS/Sources/Modules/PumpConfig/PumpConfigProvider.swift

@@ -0,0 +1,11 @@
+import Combine
+
+extension PumpConfig {
+    final class Provider: BaseProvider, PumpConfigProvider {
+        @Injected() var apsManager: APSManager!
+
+        func rileyDisplayStates() -> AnyPublisher<[RileyDisplayState], Never> {
+            apsManager.rileyDisplayStates.eraseToAnyPublisher()
+        }
+    }
+}

+ 14 - 0
FreeAPS/Sources/Modules/PumpConfig/PumpConfigViewModel.swift

@@ -0,0 +1,14 @@
+import SwiftUI
+
+extension PumpConfig {
+    class ViewModel<Provider>: BaseViewModel<Provider>, ObservableObject where Provider: PumpConfigProvider {
+        @Published var rileyDisplayStates: [RileyDisplayState] = []
+
+        override func subscribe() {
+            provider.rileyDisplayStates()
+                .receive(on: DispatchQueue.main)
+                .assign(to: \.rileyDisplayStates, on: self)
+                .store(in: &lifetime)
+        }
+    }
+}

+ 29 - 0
FreeAPS/Sources/Modules/PumpConfig/View/PumpConfigRootView.swift

@@ -0,0 +1,29 @@
+import SwiftUI
+
+extension PumpConfig {
+    struct RootView: BaseView {
+        @EnvironmentObject var viewModel: ViewModel<Provider>
+
+        var body: some View {
+            Form {
+                Section(header: Text("Devices")) {
+                    ForEach(viewModel.rileyDisplayStates) { state in
+                        HStack {
+                            Text(state.name)
+                            Spacer()
+                            Text(state.rssi.map { "\($0) " } ?? "")
+                        }
+                    }
+                }
+
+                Section(header: Text("Pump")) {
+                    Button("Add Medtronic") {}
+                    Button("Add Omnipod") {}
+                }
+            }
+            .toolbar { ToolbarItem(placement: .principal) { Text("Pump Config") } }
+            .navigationBarItems(leading: Button("Close", action: viewModel.hideModal))
+            .navigationBarTitleDisplayMode(.inline)
+        }
+    }
+}

+ 1 - 0
FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift

@@ -9,6 +9,7 @@ extension Settings {
                 Text("Preferences").modal(for: .configEditor(file: OpenAPS.Settings.preferences), from: self)
                 Text("Autosense").modal(for: .configEditor(file: OpenAPS.Settings.autosense), from: self)
                 Text("Nightscout").modal(for: .nighscoutConfig, from: self)
+                Text("Pump").modal(for: .pumpConfig, from: self)
             }
             .toolbar { ToolbarItem(placement: .principal) { Text("Settings") } }
         }

+ 4 - 6
FreeAPS/Sources/Router/Screen.swift

@@ -10,6 +10,7 @@ enum Screen: Identifiable {
     case requestPermissions
     case configEditor(file: String)
     case nighscoutConfig
+    case pumpConfig
 
     var id: Int { String(reflecting: self).hashValue }
 }
@@ -33,6 +34,8 @@ extension Screen {
             return ConfigEditor.Builder(resolver: resolver, file: file).buildView()
         case .nighscoutConfig:
             return NightscoutConfig.Builder(resolver: resolver).buildView()
+        case .pumpConfig:
+            return PumpConfig.Builder(resolver: resolver).buildView()
         }
     }
 
@@ -53,12 +56,7 @@ extension Screen {
                 image: Image(systemName: "gear"),
                 text: Text("Settings")
             )
-        case .authorizedRoot,
-             .configEditor,
-             .login,
-             .nighscoutConfig,
-             .onboarding,
-             .requestPermissions:
+        default:
             fatalError("Tab for this screen \(self) did not specified")
         }
     }