From b0f2bdf430b8f85b62ac1f685b1115b438fdcc5f Mon Sep 17 00:00:00 2001 From: Christoph Hagen Date: Fri, 10 Nov 2023 11:22:49 +0100 Subject: [PATCH] Add links for email, phone and domain --- ResumeBuilder.xcodeproj/project.pbxproj | 17 ++++++++ .../xcshareddata/swiftpm/Package.resolved | 9 ++++ .../UserInterfaceState.xcuserstate | Bin 0 -> 24932 bytes .../xcschemes/xcschememanagement.plist | 14 ++++++ .../Generic Elements/LeftImageLabel.swift | 16 +++---- ResumeBuilder/Main Elements/TopView.swift | 41 +++++++++++++++--- 6 files changed, 82 insertions(+), 15 deletions(-) create mode 100644 ResumeBuilder.xcodeproj/project.xcworkspace/xcuserdata/imac.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 ResumeBuilder.xcodeproj/xcuserdata/imac.xcuserdatad/xcschemes/xcschememanagement.plist diff --git a/ResumeBuilder.xcodeproj/project.pbxproj b/ResumeBuilder.xcodeproj/project.pbxproj index 1e0c36f..f46d3d8 100644 --- a/ResumeBuilder.xcodeproj/project.pbxproj +++ b/ResumeBuilder.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 880A8C212AFE3B0C000ABBFA /* PhoneNumberKit in Frameworks */ = {isa = PBXBuildFile; productRef = 880A8C202AFE3B0C000ABBFA /* PhoneNumberKit */; }; 886AD6452AB9CD9100B1A00D /* ColorScheme+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 886AD6442AB9CD9100B1A00D /* ColorScheme+Extensions.swift */; }; E267D1742A8E0DE80069112B /* ResumeBuilderApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = E267D1732A8E0DE80069112B /* ResumeBuilderApp.swift */; }; E267D1762A8E0DE80069112B /* CV.swift in Sources */ = {isa = PBXBuildFile; fileRef = E267D1752A8E0DE80069112B /* CV.swift */; }; @@ -84,6 +85,7 @@ buildActionMask = 2147483647; files = ( E267D1882A8E12D60069112B /* SFSafeSymbols in Frameworks */, + 880A8C212AFE3B0C000ABBFA /* PhoneNumberKit in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -220,6 +222,7 @@ name = ResumeBuilder; packageProductDependencies = ( E267D1872A8E12D60069112B /* SFSafeSymbols */, + 880A8C202AFE3B0C000ABBFA /* PhoneNumberKit */, ); productName = ResumeBuilder; productReference = E267D1702A8E0DE80069112B /* ResumeBuilder.app */; @@ -251,6 +254,7 @@ mainGroup = E267D1672A8E0DE80069112B; packageReferences = ( E267D1862A8E12D60069112B /* XCRemoteSwiftPackageReference "SFSafeSymbols" */, + 880A8C1F2AFE3B0C000ABBFA /* XCRemoteSwiftPackageReference "PhoneNumberKit" */, ); productRefGroup = E267D1712A8E0DE80069112B /* Products */; projectDirPath = ""; @@ -516,6 +520,14 @@ /* End XCConfigurationList section */ /* Begin XCRemoteSwiftPackageReference section */ + 880A8C1F2AFE3B0C000ABBFA /* XCRemoteSwiftPackageReference "PhoneNumberKit" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/marmelroy/PhoneNumberKit"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 3.7.4; + }; + }; E267D1862A8E12D60069112B /* XCRemoteSwiftPackageReference "SFSafeSymbols" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/SFSafeSymbols/SFSafeSymbols"; @@ -527,6 +539,11 @@ /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ + 880A8C202AFE3B0C000ABBFA /* PhoneNumberKit */ = { + isa = XCSwiftPackageProductDependency; + package = 880A8C1F2AFE3B0C000ABBFA /* XCRemoteSwiftPackageReference "PhoneNumberKit" */; + productName = PhoneNumberKit; + }; E267D1872A8E12D60069112B /* SFSafeSymbols */ = { isa = XCSwiftPackageProductDependency; package = E267D1862A8E12D60069112B /* XCRemoteSwiftPackageReference "SFSafeSymbols" */; diff --git a/ResumeBuilder.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/ResumeBuilder.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index e8341d6..07827d5 100644 --- a/ResumeBuilder.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/ResumeBuilder.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -1,5 +1,14 @@ { "pins" : [ + { + "identity" : "phonenumberkit", + "kind" : "remoteSourceControl", + "location" : "https://github.com/marmelroy/PhoneNumberKit", + "state" : { + "revision" : "b456f2f9be10c1d183158220b831afd22697dd68", + "version" : "3.7.4" + } + }, { "identity" : "sfsafesymbols", "kind" : "remoteSourceControl", diff --git a/ResumeBuilder.xcodeproj/project.xcworkspace/xcuserdata/imac.xcuserdatad/UserInterfaceState.xcuserstate b/ResumeBuilder.xcodeproj/project.xcworkspace/xcuserdata/imac.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..fb1063b098582b114295f938a8b144359e551776 GIT binary patch literal 24932 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 literal 0 HcmV?d00001 diff --git a/ResumeBuilder.xcodeproj/xcuserdata/imac.xcuserdatad/xcschemes/xcschememanagement.plist b/ResumeBuilder.xcodeproj/xcuserdata/imac.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..f00878d --- /dev/null +++ b/ResumeBuilder.xcodeproj/xcuserdata/imac.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ + + + + + SchemeUserState + + ResumeBuilder.xcscheme_^#shared#^_ + + orderHint + 0 + + + + diff --git a/ResumeBuilder/Generic Elements/LeftImageLabel.swift b/ResumeBuilder/Generic Elements/LeftImageLabel.swift index 79b0ca6..c69aca5 100644 --- a/ResumeBuilder/Generic Elements/LeftImageLabel.swift +++ b/ResumeBuilder/Generic Elements/LeftImageLabel.swift @@ -1,20 +1,20 @@ import SwiftUI import SFSafeSymbols -struct LeftImageLabel: View { - - let text: String +struct LeftImageLabel: View where Content: View { let systemSymbol: SFSymbol + + let content: Content - init(_ text: String, systemSymbol: SFSymbol) { - self.text = text + init(systemSymbol: SFSymbol, @ViewBuilder content: () -> Content) { self.systemSymbol = systemSymbol + self.content = content() } var body: some View { - HStack(alignment: .firstTextBaseline, spacing: 0) { - Text(text) + HStack(alignment: .center, spacing: 0) { + content Image(systemSymbol: systemSymbol) .frame(width: 20) } @@ -23,6 +23,6 @@ struct LeftImageLabel: View { struct LeftImageLabel_Previews: PreviewProvider { static var previews: some View { - LeftImageLabel("Home address", systemSymbol: .house) + LeftImageLabel(systemSymbol: .house) { Text("Home address") } } } diff --git a/ResumeBuilder/Main Elements/TopView.swift b/ResumeBuilder/Main Elements/TopView.swift index 67ece5b..f613169 100644 --- a/ResumeBuilder/Main Elements/TopView.swift +++ b/ResumeBuilder/Main Elements/TopView.swift @@ -1,5 +1,8 @@ import SwiftUI import SFSafeSymbols +import PhoneNumberKit + +private let emailPattern = #"^\S+@\S+\.\S+$"# struct TopView: View { @@ -8,6 +11,21 @@ struct TopView: View { let style: HeaderStyle let accent: Color + + private let phoneNumberKit = PhoneNumberKit() + + var isValidEmail: Bool { + info.email.range(of: emailPattern, options: .regularExpression) != nil + } + + var isValidPhoneNumber: Bool { + do { + _ = try phoneNumberKit.parse(info.phone) + return true + } catch { + return false + } + } var body: some View { GeometryReader { geo in @@ -34,18 +52,26 @@ struct TopView: View { shadow: style.imageShadowSize, lineWidth: style.imageBorderWidth) VStack(alignment: .trailing) { - LeftImageLabel(info.web, systemSymbol: .globe) - .frame(maxHeight: style.iconHeight) + LeftImageLabel(systemSymbol: .globe) { + Link(info.web, destination: URL(string: "https://" + info.web)!) + } + .frame(maxHeight: style.iconHeight) Spacer() - LeftImageLabel(info.email, systemSymbol: .envelope) - .frame(maxHeight: style.iconHeight) + LeftImageLabel(systemSymbol: .envelope) { + Link(info.email, destination: URL(string: "mailto:" + info.email)!) + .disabled(!isValidEmail) + } + .frame(maxHeight: style.iconHeight) Spacer() - LeftImageLabel(info.phone, systemSymbol: .phone) - .frame(maxHeight: style.iconHeight) + LeftImageLabel(systemSymbol: .phone) { + Link(info.phone, destination: URL(string: "tel:" + info.phone)!) + .disabled(!isValidPhoneNumber) + } + .frame(maxHeight: style.iconHeight) Spacer() HStack(spacing: 0) { Spacer() - Text(info.github) + Link(info.github, destination: URL(string: "https://" + info.github)!) Image("Github") .resizable() .aspectRatio(1.0, contentMode: .fit) @@ -55,6 +81,7 @@ struct TopView: View { } .font(.subheadline) .frame(width: sideWidth) + .foregroundStyle(.primary) } } }