Skip to content

Commit 94da1e4

Browse files
authored
Add EntityConfigurationWebView and integrate in dialog (#4171)
Introduces EntityConfigurationWebView for entity configuration via web view. Integrates a toolbar button in EntityMoreInfoDialogView to present the new configuration view as a sheet. <!-- Thank you for submitting a Pull Request and helping to improve Home Assistant. Please complete the following sections to help the processing and review of your changes. Please do not delete anything from this template. --> ## Summary <!-- Provide a brief summary of the changes you have made and most importantly what they aim to achieve --> ## Screenshots <!-- If this is a user-facing change not in the frontend, please include screenshots in light and dark mode. --> ## Link to pull request in Documentation repository <!-- Pull requests that add, change or remove functionality must have a corresponding pull request in the Companion App Documentation repository (https://github.com/home-assistant/companion.home-assistant). Please add the number of this pull request after the "#" --> Documentation: home-assistant/companion.home-assistant# ## Any other notes <!-- If there is any other information of note, like if this Pull Request is part of a bigger change, please include it here. -->
1 parent 7474990 commit 94da1e4

File tree

3 files changed

+70
-13
lines changed

3 files changed

+70
-13
lines changed

HomeAssistant.xcodeproj/project.pbxproj

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -565,8 +565,6 @@
565565
420B100C2B1D204400D383D8 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 420B100B2B1D204400D383D8 /* Assets.xcassets */; };
566566
420C1BB22CF7DA9100AF22E7 /* ClientEventsLogView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 420C1BB12CF7DA9100AF22E7 /* ClientEventsLogView.swift */; };
567567
420C1BB52CF7DC1400AF22E7 /* ClientEventsLogViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 420C1BB42CF7DC1400AF22E7 /* ClientEventsLogViewModel.swift */; };
568-
420DBEXP2F10000000000001 /* DatabaseExplorerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 420DBEXP2F10000000000002 /* DatabaseExplorerView.swift */; };
569-
420DBEXP2F10000000000003 /* DatabaseTableDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 420DBEXP2F10000000000004 /* DatabaseTableDetailView.swift */; };
570568
420C91502F0C6CAC005D04A6 /* HomeViewCustomizationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 420C914F2F0C6CAC005D04A6 /* HomeViewCustomizationView.swift */; };
571569
420C91522F0C7988005D04A6 /* EntityRegistry.swift in Sources */ = {isa = PBXBuildFile; fileRef = 420C91512F0C7988005D04A6 /* EntityRegistry.swift */; };
572570
420C91532F0C7988005D04A6 /* EntityRegistry.swift in Sources */ = {isa = PBXBuildFile; fileRef = 420C91512F0C7988005D04A6 /* EntityRegistry.swift */; };
@@ -588,6 +586,8 @@
588586
420CFC852D3FECF6009A94F3 /* CustomWidgetTable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 420CFC832D3FECF6009A94F3 /* CustomWidgetTable.swift */; };
589587
420D5AE32C5A860900624A08 /* LocationPermissionSensor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 420D5AE22C5A860900624A08 /* LocationPermissionSensor.swift */; };
590588
420D5AE42C5A860900624A08 /* LocationPermissionSensor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 420D5AE22C5A860900624A08 /* LocationPermissionSensor.swift */; };
589+
420DBEXP2F10000000000001 /* DatabaseExplorerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 420DBEXP2F10000000000002 /* DatabaseExplorerView.swift */; };
590+
420DBEXP2F10000000000003 /* DatabaseTableDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 420DBEXP2F10000000000004 /* DatabaseTableDetailView.swift */; };
591591
420E2AE32C4746BB004921D8 /* WidgetBasicViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 420E2AE22C4746BB004921D8 /* WidgetBasicViewModel.swift */; };
592592
420E2AE52C4746CD004921D8 /* WidgetBasicSizeStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 420E2AE42C4746CD004921D8 /* WidgetBasicSizeStyle.swift */; };
593593
420E2AE62C474710004921D8 /* WidgetBasicButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 115560E227010DAB00A8F818 /* WidgetBasicButtonView.swift */; };
@@ -868,6 +868,7 @@
868868
428DC00F2F0D8BF5003B08D5 /* FanControlsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 428DC00E2F0D8BF5003B08D5 /* FanControlsView.swift */; };
869869
428DC0112F0D8C96003B08D5 /* FanControlIntents.swift in Sources */ = {isa = PBXBuildFile; fileRef = 428DC0102F0D8C96003B08D5 /* FanControlIntents.swift */; };
870870
428DC0142F0D921F003B08D5 /* Domain+AccentColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 428DC0132F0D921F003B08D5 /* Domain+AccentColor.swift */; };
871+
428DC0162F0DE882003B08D5 /* EntityConfigurationWebView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 428DC0152F0DE882003B08D5 /* EntityConfigurationWebView.swift */; };
871872
428ED98B2E9E4FBF0019113B /* CheckmarkDrawOnView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 428ED98A2E9E4FBF0019113B /* CheckmarkDrawOnView.swift */; };
872873
428ED98E2E9E555D0019113B /* OnboardingPermissionsNavigationViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 428ED98C2E9E54E60019113B /* OnboardingPermissionsNavigationViewModelTests.swift */; };
873874
428EDB652DAFD97F00A271A1 /* Domain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42CE8FAC2B46C12C00C707F9 /* Domain.swift */; };
@@ -2233,8 +2234,6 @@
22332234
420B100B2B1D204400D383D8 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
22342235
420C1BB12CF7DA9100AF22E7 /* ClientEventsLogView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClientEventsLogView.swift; sourceTree = "<group>"; };
22352236
420C1BB42CF7DC1400AF22E7 /* ClientEventsLogViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClientEventsLogViewModel.swift; sourceTree = "<group>"; };
2236-
420DBEXP2F10000000000002 /* DatabaseExplorerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DatabaseExplorerView.swift; sourceTree = "<group>"; };
2237-
420DBEXP2F10000000000004 /* DatabaseTableDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DatabaseTableDetailView.swift; sourceTree = "<group>"; };
22382237
420C914F2F0C6CAC005D04A6 /* HomeViewCustomizationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeViewCustomizationView.swift; sourceTree = "<group>"; };
22392238
420C91512F0C7988005D04A6 /* EntityRegistry.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EntityRegistry.swift; sourceTree = "<group>"; };
22402239
420C91542F0C7AB4005D04A6 /* EntityRegistry.test.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EntityRegistry.test.swift; sourceTree = "<group>"; };
@@ -2247,6 +2246,8 @@
22472246
420CFC7F2D3F9D89009A94F3 /* DatabaseTables.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DatabaseTables.swift; sourceTree = "<group>"; };
22482247
420CFC832D3FECF6009A94F3 /* CustomWidgetTable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomWidgetTable.swift; sourceTree = "<group>"; };
22492248
420D5AE22C5A860900624A08 /* LocationPermissionSensor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationPermissionSensor.swift; sourceTree = "<group>"; };
2249+
420DBEXP2F10000000000002 /* DatabaseExplorerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DatabaseExplorerView.swift; sourceTree = "<group>"; };
2250+
420DBEXP2F10000000000004 /* DatabaseTableDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DatabaseTableDetailView.swift; sourceTree = "<group>"; };
22502251
420E2AE22C4746BB004921D8 /* WidgetBasicViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WidgetBasicViewModel.swift; sourceTree = "<group>"; };
22512252
420E2AE42C4746CD004921D8 /* WidgetBasicSizeStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WidgetBasicSizeStyle.swift; sourceTree = "<group>"; };
22522253
420E64B82D676A5800A31E86 /* WidgetsSnapshot.test.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WidgetsSnapshot.test.swift; sourceTree = "<group>"; };
@@ -2491,6 +2492,7 @@
24912492
428DC00E2F0D8BF5003B08D5 /* FanControlsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FanControlsView.swift; sourceTree = "<group>"; };
24922493
428DC0102F0D8C96003B08D5 /* FanControlIntents.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FanControlIntents.swift; sourceTree = "<group>"; };
24932494
428DC0132F0D921F003B08D5 /* Domain+AccentColor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Domain+AccentColor.swift"; sourceTree = "<group>"; };
2495+
428DC0152F0DE882003B08D5 /* EntityConfigurationWebView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EntityConfigurationWebView.swift; sourceTree = "<group>"; };
24942496
428ED98A2E9E4FBF0019113B /* CheckmarkDrawOnView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckmarkDrawOnView.swift; sourceTree = "<group>"; };
24952497
428ED98C2E9E54E60019113B /* OnboardingPermissionsNavigationViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingPermissionsNavigationViewModelTests.swift; sourceTree = "<group>"; };
24962498
428EDB672DAFD9B900A271A1 /* HAEntity+DeviceClass.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "HAEntity+DeviceClass.swift"; sourceTree = "<group>"; };
@@ -4571,15 +4573,6 @@
45714573
path = ClientEventsLogView;
45724574
sourceTree = "<group>";
45734575
};
4574-
420DBEXP2F10000000000005 /* DatabaseExplorer */ = {
4575-
isa = PBXGroup;
4576-
children = (
4577-
420DBEXP2F10000000000002 /* DatabaseExplorerView.swift */,
4578-
420DBEXP2F10000000000004 /* DatabaseTableDetailView.swift */,
4579-
);
4580-
path = DatabaseExplorer;
4581-
sourceTree = "<group>";
4582-
};
45834576
420C915B2F0C7AF4005D04A6 /* Models */ = {
45844577
isa = PBXGroup;
45854578
children = (
@@ -4617,6 +4610,15 @@
46174610
path = Tables;
46184611
sourceTree = "<group>";
46194612
};
4613+
420DBEXP2F10000000000005 /* DatabaseExplorer */ = {
4614+
isa = PBXGroup;
4615+
children = (
4616+
420DBEXP2F10000000000002 /* DatabaseExplorerView.swift */,
4617+
420DBEXP2F10000000000004 /* DatabaseTableDetailView.swift */,
4618+
);
4619+
path = DatabaseExplorer;
4620+
sourceTree = "<group>";
4621+
};
46204622
420E64B72D676A4200A31E86 /* Widgets */ = {
46214623
isa = PBXGroup;
46224624
children = (
@@ -5867,6 +5869,7 @@
58675869
isa = PBXGroup;
58685870
children = (
58695871
42B129502F056DAC00B957AF /* EntityMoreInfoDialogView.swift */,
5872+
428DC0152F0DE882003B08D5 /* EntityConfigurationWebView.swift */,
58705873
42C60F912F07FB1D0071A6F6 /* DomainSpecific */,
58715874
);
58725875
path = MoreInfoDialog;
@@ -9264,6 +9267,7 @@
92649267
427FEE662D9EBC430047C00C /* OnboardingPermissionsNavigationView.swift in Sources */,
92659268
1185DFB1271FF53800ED7D9A /* OnboardingAuthStepNotify.swift in Sources */,
92669269
42C60F8B2F057C060071A6F6 /* LightControlIntents.swift in Sources */,
9270+
428DC0162F0DE882003B08D5 /* EntityConfigurationWebView.swift in Sources */,
92679271
4289FCAC2F0BEDD4005189AA /* EditModeIndicatorModifier.swift in Sources */,
92689272
4278CB852D01F0B200CFAAC9 /* GesturesSetupViewModel.swift in Sources */,
92699273
42AF759B2DDB5AA900ACDF45 /* WebViewSettingsUpdateReason.swift in Sources */,
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import HAKit
2+
import Shared
3+
import SwiftUI
4+
5+
@available(iOS 26.0, *)
6+
struct EntityConfigurationWebView: View {
7+
@Environment(\.dismiss) private var dismiss
8+
let haEntity: HAEntity
9+
let server: Server
10+
11+
@State private var webView: WebViewController?
12+
13+
var body: some View {
14+
NavigationStack {
15+
VStack {
16+
if let webView {
17+
embed(webView)
18+
}
19+
}
20+
.onAppear {
21+
loadWebView()
22+
}
23+
.onDisappear {
24+
webView = nil
25+
}
26+
}
27+
}
28+
29+
private func loadWebView() {
30+
guard let webViewURL = server.info.connection.webviewURL() else { return }
31+
let newWebView = WebViewController(server: server)
32+
webView = newWebView
33+
DispatchQueue.main.asyncAfter(deadline: .now() + 1.5) {
34+
webView?.load(request: .init(url: webViewURL.appending(queryItems: [.init(
35+
name: AppConstants.QueryItems.openMoreInfoDialog.rawValue,
36+
value: haEntity.entityId
37+
)])))
38+
}
39+
}
40+
}

Sources/App/WebView/ExperimentalSpace/EntityTile/MoreInfoDialog/EntityMoreInfoDialogView.swift

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ struct EntityMoreInfoDialogView: View {
1010

1111
@State private var triggerHaptic = 0
1212
@State private var areaName: String = ""
13+
@State private var showWebView = false
1314

1415
init(server: Server, haEntity: HAEntity) {
1516
self.server = server
@@ -42,6 +43,13 @@ struct EntityMoreInfoDialogView: View {
4243
.navigationSubtitle(areaName)
4344
.toolbarTitleDisplayMode(.inlineLarge)
4445
.toolbar {
46+
ToolbarItem(placement: .topBarTrailing) {
47+
Button {
48+
showWebView = true
49+
} label: {
50+
Image(systemSymbol: .gearshapeFill)
51+
}
52+
}
4553
ToolbarItem(placement: .topBarTrailing) {
4654
CloseButton {
4755
triggerHaptic += 1
@@ -52,6 +60,11 @@ struct EntityMoreInfoDialogView: View {
5260
.task {
5361
await loadAreaName()
5462
}
63+
.sheet(isPresented: $showWebView) {
64+
EntityConfigurationWebView(haEntity: haEntity, server: server)
65+
.presentationDetents([.medium, .large])
66+
.presentationDragIndicator(.visible)
67+
}
5568
}
5669
}
5770

0 commit comments

Comments
 (0)