From e56d83dbe3767ad4c0ecf2ff43b3354453faee1f Mon Sep 17 00:00:00 2001 From: Duong Thai Date: Fri, 13 Oct 2023 13:37:41 +0700 Subject: [PATCH] move identical builds view to `IdenticalBuildView.swift` --- Xcodes.xcodeproj/project.pbxproj | 4 + .../InfoPane/IdenticalBuildView.swift | 83 +++++++++++++++++++ Xcodes/Frontend/InfoPane/InfoPane.swift | 30 +------ 3 files changed, 88 insertions(+), 29 deletions(-) create mode 100644 Xcodes/Frontend/InfoPane/IdenticalBuildView.swift diff --git a/Xcodes.xcodeproj/project.pbxproj b/Xcodes.xcodeproj/project.pbxproj index d4b06bd..cb19dcd 100644 --- a/Xcodes.xcodeproj/project.pbxproj +++ b/Xcodes.xcodeproj/project.pbxproj @@ -14,6 +14,7 @@ 53CBAB2C263DCC9100410495 /* XcodesAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53CBAB2B263DCC9100410495 /* XcodesAlert.swift */; }; 63EAA4EB259944450046AB8F /* ProgressButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63EAA4EA259944450046AB8F /* ProgressButton.swift */; }; B0C6AD042AD6E65700E64698 /* ReleaseDateView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B0C6AD032AD6E65700E64698 /* ReleaseDateView.swift */; }; + B0C6AD0B2AD9178E00E64698 /* IdenticalBuildView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B0C6AD0A2AD9178E00E64698 /* IdenticalBuildView.swift */; }; CA11E7BA2598476C00D2EE1C /* XcodeCommands.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA11E7B92598476C00D2EE1C /* XcodeCommands.swift */; }; CA2518EC25A7FF2B00F08414 /* AppStateUpdateTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA2518EB25A7FF2B00F08414 /* AppStateUpdateTests.swift */; }; CA25192A25A9644800F08414 /* XcodeInstallState.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA25192925A9644800F08414 /* XcodeInstallState.swift */; }; @@ -194,6 +195,7 @@ AAB037D32839BD4700017680 /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/Localizable.strings; sourceTree = ""; }; AB4EB0DE28541FA000FF3B1D /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Localizable.strings; sourceTree = ""; }; B0C6AD032AD6E65700E64698 /* ReleaseDateView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReleaseDateView.swift; sourceTree = ""; }; + B0C6AD0A2AD9178E00E64698 /* IdenticalBuildView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IdenticalBuildView.swift; sourceTree = ""; }; B648F22B2810C1130096781B /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = ""; }; C0AE7FA4283002DC00DA63D2 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = ""; }; CA11E7B92598476C00D2EE1C /* XcodeCommands.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XcodeCommands.swift; sourceTree = ""; }; @@ -620,6 +622,7 @@ CAFBDC67259A308B003DCC5A /* InfoPane.swift */, E8E98A9525D863D700EC89A0 /* InstallationStepDetailView.swift */, B0C6AD032AD6E65700E64698 /* ReleaseDateView.swift */, + B0C6AD0A2AD9178E00E64698 /* IdenticalBuildView.swift */, ); path = InfoPane; sourceTree = ""; @@ -891,6 +894,7 @@ E87DD6EB25D053FA00D86808 /* Progress+.swift in Sources */, CAC281CD259F97FA00B8AB0B /* ObservingProgressIndicator.swift in Sources */, CABFA9C22592EEEA00380FEE /* Publisher+Resumable.swift in Sources */, + B0C6AD0B2AD9178E00E64698 /* IdenticalBuildView.swift in Sources */, CAFBDC68259A308B003DCC5A /* InfoPane.swift in Sources */, E87AB3C52939B65E00D72F43 /* Hardware.swift in Sources */, CAA1CB4D255A5CFD003FD669 /* SignInPhoneListView.swift in Sources */, diff --git a/Xcodes/Frontend/InfoPane/IdenticalBuildView.swift b/Xcodes/Frontend/InfoPane/IdenticalBuildView.swift new file mode 100644 index 0000000..3c78eb0 --- /dev/null +++ b/Xcodes/Frontend/InfoPane/IdenticalBuildView.swift @@ -0,0 +1,83 @@ +// +// IdenticalBuildView.swift +// Xcodes +// +// Created by Duong Thai on 11/10/2023. +// Copyright © 2023 Robots and Pencils. All rights reserved. +// + +import SwiftUI +import Version + +struct IdenticalBuildsView: View { + let builds: [Version] + private let isEmpty: Bool + private let accessibilityDescription: String + + var body: some View { + if isEmpty { + EmptyView() + } else { + VStack(alignment: .leading) { + HStack { + Text("IdenticalBuilds") + Image(systemName: "square.fill.on.square.fill") + .foregroundColor(.secondary) + .accessibility(hidden: true) + .help("IdenticalBuilds.help") + } + .font(.headline) + + ForEach(builds, id: \.description) { version in + Text("• \(version.appleDescription)") + .font(.subheadline) + } + } + .frame(maxWidth: .infinity, alignment: .leading) + .accessibilityElement() + .accessibility(label: Text("IdenticalBuilds")) + .accessibility(value: Text(accessibilityDescription)) + .accessibility(hint: Text("IdenticalBuilds.help")) + } + } + + init(builds: [Version]) { + self.builds = builds + self.isEmpty = builds.isEmpty + self.accessibilityDescription = builds + .map(\.appleDescription) + .joined(separator: ", ") + } +} + +struct IdenticalBuildsView_Preview: PreviewProvider { + static var previews: some View { + WrapperView() + } +} + +private struct WrapperView: View { + @State var isEmpty = false + var builds: [Version] { + isEmpty + ? [] + : [.init(xcodeVersion: "15.0")!, + .init(xcodeVersion: "15.1")!] + } + + var body: some View { + VStack { + HStack { + IdenticalBuildsView(builds: builds) + .border(.red) + } + Spacer() + Toggle(isOn: $isEmpty) { + Text("Is Empty?") + } + } + .animation(.default) + .frame(width: 300, height: 100) + .padding() + } +} diff --git a/Xcodes/Frontend/InfoPane/InfoPane.swift b/Xcodes/Frontend/InfoPane/InfoPane.swift index 2a71240..1af1f9c 100644 --- a/Xcodes/Frontend/InfoPane/InfoPane.swift +++ b/Xcodes/Frontend/InfoPane/InfoPane.swift @@ -57,7 +57,7 @@ struct InfoPane: View { releaseNotes(for: xcode) ReleaseDateView(date: xcode.releaseDate) .frame(maxWidth: .infinity, alignment: .leading) - identicalBuilds(for: xcode) + IdenticalBuildsView(builds: xcode.identicalBuilds) compatibility(for: xcode) sdks(for: xcode) compilers(for: xcode) @@ -86,34 +86,6 @@ struct InfoPane: View { } } - @ViewBuilder - private func identicalBuilds(for xcode: Xcode) -> some View { - if !xcode.identicalBuilds.isEmpty { - VStack(alignment: .leading) { - HStack { - Text("IdenticalBuilds") - Image(systemName: "square.fill.on.square.fill") - .foregroundColor(.secondary) - .accessibility(hidden: true) - .help("IdenticalBuilds.help") - } - .font(.headline) - - ForEach(xcode.identicalBuilds, id: \.description) { version in - Text("• \(version.appleDescription)") - .font(.subheadline) - } - } - .frame(maxWidth: .infinity, alignment: .leading) - .accessibilityElement() - .accessibility(label: Text("IdenticalBuilds")) - .accessibility(value: Text(xcode.identicalBuilds.map(\.appleDescription).joined(separator: ", "))) - .accessibility(hint: Text("IdenticalBuilds.help")) - } else { - EmptyView() - } - } - @ViewBuilder private func releaseNotes(for xcode: Xcode) -> some View { if let releaseNotesURL = xcode.releaseNotesURL {