Skip to content

Commit 22d8b14

Browse files
authored
Improve onboarding servers searching screen (#3688)
<!-- 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 --> - New UI - New loader animation - Preparation for the soon to come "auto-connect to first discovered instance" ## Screenshots <!-- If this is a user-facing change not in the frontend, please include screenshots in light and dark mode. --> https://github.com/user-attachments/assets/4e4ab89e-de47-4a4c-be14-10db1dce135d ## 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 7372b1f commit 22d8b14

File tree

17 files changed

+368
-219
lines changed

17 files changed

+368
-219
lines changed

HomeAssistant.xcodeproj/project.pbxproj

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -739,7 +739,6 @@
739739
427FEE032D9BE7690047C00C /* OnboardingServersListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 427FEE022D9BE7690047C00C /* OnboardingServersListView.swift */; };
740740
427FEE072D9C03DE0047C00C /* OnboardingScanningInstanceRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 427FEE062D9C03DE0047C00C /* OnboardingScanningInstanceRow.swift */; };
741741
427FEE092D9C04050047C00C /* OnboardingServersListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 427FEE082D9C04050047C00C /* OnboardingServersListViewModel.swift */; };
742-
427FEE0B2D9C05EF0047C00C /* ServersScanAnimationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 427FEE0A2D9C05EF0047C00C /* ServersScanAnimationView.swift */; };
743742
427FEE0E2D9C22310047C00C /* ManualURLEntryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 427FEE0D2D9C22310047C00C /* ManualURLEntryView.swift */; };
744743
427FEE562D9D39A50047C00C /* OnboardingNavigationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 427FEE552D9D39A50047C00C /* OnboardingNavigationView.swift */; };
745744
427FEE592D9D48120047C00C /* View+HA.swift in Sources */ = {isa = PBXBuildFile; fileRef = 427FEE572D9D48120047C00C /* View+HA.swift */; };
@@ -919,6 +918,7 @@
919918
42D996E62D89863A001737A0 /* Bool+HA.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42D996E42D89863A001737A0 /* Bool+HA.swift */; };
920919
42DB4D0B2CEE292D00F6C20D /* AppEntitiesModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4297ADA42C89C43F00790812 /* AppEntitiesModel.swift */; };
921920
42DB4D0C2CEE292D00F6C20D /* AppEntitiesModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4297ADA42C89C43F00790812 /* AppEntitiesModel.swift */; };
921+
42DC8B782E14027000D9999E /* SearchingServersAnimationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42DC8B772E14027000D9999E /* SearchingServersAnimationView.swift */; };
922922
42DD84162B14D7AC00936F16 /* WebViewExternalBusMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42DD84142B14D68C00936F16 /* WebViewExternalBusMessage.swift */; };
923923
42DD84192B14D83B00936F16 /* WebViewExternalBusMessageTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42DD84182B14D83B00936F16 /* WebViewExternalBusMessageTests.swift */; };
924924
42DE75D32D1061A600FF379F /* PanelsUpdater.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42DE75D12D105F3000FF379F /* PanelsUpdater.swift */; };
@@ -2216,7 +2216,6 @@
22162216
427FEE022D9BE7690047C00C /* OnboardingServersListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingServersListView.swift; sourceTree = "<group>"; };
22172217
427FEE062D9C03DE0047C00C /* OnboardingScanningInstanceRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingScanningInstanceRow.swift; sourceTree = "<group>"; };
22182218
427FEE082D9C04050047C00C /* OnboardingServersListViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingServersListViewModel.swift; sourceTree = "<group>"; };
2219-
427FEE0A2D9C05EF0047C00C /* ServersScanAnimationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServersScanAnimationView.swift; sourceTree = "<group>"; };
22202219
427FEE0D2D9C22310047C00C /* ManualURLEntryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ManualURLEntryView.swift; sourceTree = "<group>"; };
22212220
427FEE552D9D39A50047C00C /* OnboardingNavigationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingNavigationView.swift; sourceTree = "<group>"; };
22222221
427FEE572D9D48120047C00C /* View+HA.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "View+HA.swift"; sourceTree = "<group>"; };
@@ -2364,6 +2363,7 @@
23642363
42D5ACD82C64C0E000D9C4E2 /* MagicItemAddView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MagicItemAddView.swift; sourceTree = "<group>"; };
23652364
42D5ACDA2C64C82600D9C4E2 /* MagicItemAddViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MagicItemAddViewModel.swift; sourceTree = "<group>"; };
23662365
42D996E42D89863A001737A0 /* Bool+HA.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Bool+HA.swift"; sourceTree = "<group>"; };
2366+
42DC8B772E14027000D9999E /* SearchingServersAnimationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchingServersAnimationView.swift; sourceTree = "<group>"; };
23672367
42DD84142B14D68C00936F16 /* WebViewExternalBusMessage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebViewExternalBusMessage.swift; sourceTree = "<group>"; };
23682368
42DD84182B14D83B00936F16 /* WebViewExternalBusMessageTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebViewExternalBusMessageTests.swift; sourceTree = "<group>"; };
23692369
42DD84322B15DC2F00936F16 /* he */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = he; path = he.lproj/Intents.strings; sourceTree = "<group>"; };
@@ -3557,6 +3557,7 @@
35573557
11AF1ED82528FBAA00AAE364 /* Onboarding */ = {
35583558
isa = PBXGroup;
35593559
children = (
3560+
42DC8B762E14026100D9999E /* Views */,
35603561
42E95C562CA45EFA0010ECE3 /* OnboardingErrorView.swift */,
35613562
42E95C582CA46AD50010ECE3 /* ShareActivityView.swift */,
35623563
42E95C542CA44FC90010ECE3 /* SafariWebView.swift */,
@@ -4386,18 +4387,6 @@
43864387
path = Views;
43874388
sourceTree = "<group>";
43884389
};
4389-
427FEE052D9C03C50047C00C /* OnboardingServersList */ = {
4390-
isa = PBXGroup;
4391-
children = (
4392-
427FEE0C2D9C221D0047C00C /* ManualURLEntry */,
4393-
427FEE022D9BE7690047C00C /* OnboardingServersListView.swift */,
4394-
427FEE062D9C03DE0047C00C /* OnboardingScanningInstanceRow.swift */,
4395-
427FEE082D9C04050047C00C /* OnboardingServersListViewModel.swift */,
4396-
427FEE0A2D9C05EF0047C00C /* ServersScanAnimationView.swift */,
4397-
);
4398-
path = OnboardingServersList;
4399-
sourceTree = "<group>";
4400-
};
44014390
427FEE0C2D9C221D0047C00C /* ManualURLEntry */ = {
44024391
isa = PBXGroup;
44034392
children = (
@@ -4504,7 +4493,10 @@
45044493
42905D822E1297C500250728 /* Servers */ = {
45054494
isa = PBXGroup;
45064495
children = (
4507-
427FEE052D9C03C50047C00C /* OnboardingServersList */,
4496+
427FEE0C2D9C221D0047C00C /* ManualURLEntry */,
4497+
427FEE022D9BE7690047C00C /* OnboardingServersListView.swift */,
4498+
427FEE062D9C03DE0047C00C /* OnboardingScanningInstanceRow.swift */,
4499+
427FEE082D9C04050047C00C /* OnboardingServersListViewModel.swift */,
45084500
);
45094501
path = Servers;
45104502
sourceTree = "<group>";
@@ -4875,6 +4867,14 @@
48754867
path = Add;
48764868
sourceTree = "<group>";
48774869
};
4870+
42DC8B762E14026100D9999E /* Views */ = {
4871+
isa = PBXGroup;
4872+
children = (
4873+
42DC8B772E14027000D9999E /* SearchingServersAnimationView.swift */,
4874+
);
4875+
path = Views;
4876+
sourceTree = "<group>";
4877+
};
48784878
42E3B8BB2D8ACDC100F5D084 /* Extensions */ = {
48794879
isa = PBXGroup;
48804880
children = (
@@ -7828,7 +7828,6 @@
78287828
420E2AE72C474718004921D8 /* WidgetBasicViewModel.swift in Sources */,
78297829
1178C4E524D5CEB200FDEC3E /* ConnectionURLViewController.swift in Sources */,
78307830
42F1DA6B2B4ED1BF002729BC /* CarPlayAreasZonesTemplate.swift in Sources */,
7831-
427FEE0B2D9C05EF0047C00C /* ServersScanAnimationView.swift in Sources */,
78327831
11A48D8124CA8ADB0021BDD9 /* NotificationCategory+Observation.swift in Sources */,
78337832
42462E692D9ED75900ECC8A7 /* LocationPermissionView.swift in Sources */,
78347833
42D0AE452D88259000D9715A /* WidgetDocumentationLink.swift in Sources */,
@@ -7927,6 +7926,7 @@
79277926
11B1FFC524CCD72F00F9BCB2 /* VoiceShortcutRow.swift in Sources */,
79287927
42B74A642D36B17000C37304 /* ReloadWidgetsAppIntent.swift in Sources */,
79297928
42FCD0152B9B29740057783F /* ThreadCredentialsManagementView.swift in Sources */,
7929+
42DC8B782E14027000D9999E /* SearchingServersAnimationView.swift in Sources */,
79307930
42B980DE2DC3599300BC5C08 /* PrivacyView.swift in Sources */,
79317931
1168BF33271809C600DD4D15 /* OnboardingAuthError.swift in Sources */,
79327932
B661FB6F226BCCAD00E541DD /* ConnectionSettingsViewController.swift in Sources */,

Sources/App/Onboarding/Steps/Servers/OnboardingServersList/ManualURLEntry/ManualURLEntryView.swift renamed to Sources/App/Onboarding/Steps/Servers/ManualURLEntry/ManualURLEntryView.swift

File renamed without changes.
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
import Shared
2+
import SwiftUI
3+
4+
struct OnboardingScanningInstanceRow: View {
5+
private enum Constants {
6+
static let iconContainerSize: CGFloat = 60
7+
static let minHeight: CGFloat = 60
8+
}
9+
10+
let name: String
11+
let internalURLString: String?
12+
let externalURLString: String?
13+
let internalOrExternalURLString: String
14+
let isLoading: Bool
15+
16+
var body: some View {
17+
HStack(spacing: DesignSystem.Spaces.one) {
18+
icon
19+
VStack(alignment: .leading) {
20+
Text(name)
21+
.font(.headline)
22+
Text(internalURLString ?? internalOrExternalURLString)
23+
.font(.subheadline)
24+
.foregroundColor(.secondary)
25+
if let externalURLString {
26+
Text(externalURLString)
27+
.font(.caption2)
28+
.foregroundColor(.secondary)
29+
}
30+
}
31+
.frame(maxWidth: .infinity, alignment: .leading)
32+
if isLoading {
33+
HAProgressView(style: .small)
34+
.padding(.trailing, DesignSystem.Spaces.one)
35+
}
36+
}
37+
.frame(maxWidth: .infinity)
38+
.frame(minHeight: Constants.minHeight)
39+
.padding(DesignSystem.Spaces.one)
40+
.overlay(
41+
RoundedRectangle(cornerRadius: DesignSystem.CornerRadius.two)
42+
.stroke(Color.tileBorder, lineWidth: DesignSystem.Border.Width.default)
43+
)
44+
}
45+
46+
private var icon: some View {
47+
ZStack {
48+
Image(systemSymbol: .externaldriveConnectedToLineBelow)
49+
.resizable()
50+
.aspectRatio(contentMode: .fit)
51+
.foregroundStyle(.haPrimary)
52+
.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .center)
53+
.padding(DesignSystem.Spaces.oneAndHalf)
54+
}
55+
.frame(width: Constants.iconContainerSize, height: Constants.iconContainerSize)
56+
}
57+
}
58+
59+
#Preview {
60+
List {
61+
Group {
62+
OnboardingScanningInstanceRow(
63+
name: "Home Assistant",
64+
internalURLString: "https://example.com",
65+
externalURLString: "https://example.com",
66+
internalOrExternalURLString: "https://example.com",
67+
isLoading: true
68+
)
69+
OnboardingScanningInstanceRow(
70+
name: "Home Assistant",
71+
internalURLString: "https://example.com",
72+
externalURLString: "https://example.com",
73+
internalOrExternalURLString: "https://example.com",
74+
isLoading: false
75+
)
76+
OnboardingScanningInstanceRow(
77+
name: "Home Assistant",
78+
internalURLString: "https://example.com",
79+
externalURLString: "https://example.com",
80+
internalOrExternalURLString: "https://example.com",
81+
isLoading: false
82+
)
83+
}
84+
.listRowSeparator(.hidden)
85+
}
86+
.listStyle(.plain)
87+
}

Sources/App/Onboarding/Steps/Servers/OnboardingServersList/OnboardingScanningInstanceRow.swift

Lines changed: 0 additions & 75 deletions
This file was deleted.

Sources/App/Onboarding/Steps/Servers/OnboardingServersList/ServersScanAnimationView.swift

Lines changed: 0 additions & 38 deletions
This file was deleted.

0 commit comments

Comments
 (0)