diff --git a/BeReal.xcodeproj/project.pbxproj b/BeReal.xcodeproj/project.pbxproj index a49d426..a2b3b16 100644 --- a/BeReal.xcodeproj/project.pbxproj +++ b/BeReal.xcodeproj/project.pbxproj @@ -14,6 +14,8 @@ 02AE650029363DC1005A4AF3 /* BeRealTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02AE64FF29363DC1005A4AF3 /* BeRealTests.swift */; }; 02AE650A29363DC1005A4AF3 /* BeRealUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02AE650929363DC1005A4AF3 /* BeRealUITests.swift */; }; 02AE650C29363DC1005A4AF3 /* BeRealUITestsLaunchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02AE650B29363DC1005A4AF3 /* BeRealUITestsLaunchTests.swift */; }; + 02CE5562293B452E00730DC9 /* ProfileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02CE5561293B452E00730DC9 /* ProfileView.swift */; }; + 02CE5565293B517700730DC9 /* NameAndValueLabelStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02CE5564293B517700730DC9 /* NameAndValueLabelStyle.swift */; }; 02FFFD7B29395DD200306533 /* String+Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02FFFD7A29395DD200306533 /* String+Constants.swift */; }; 4694AAA0293A7C8800D54903 /* Modules in Frameworks */ = {isa = PBXBuildFile; productRef = 4694AA9F293A7C8800D54903 /* Modules */; }; /* End PBXBuildFile section */ @@ -47,6 +49,8 @@ 02AE650529363DC1005A4AF3 /* BeRealUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = BeRealUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 02AE650929363DC1005A4AF3 /* BeRealUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BeRealUITests.swift; sourceTree = ""; }; 02AE650B29363DC1005A4AF3 /* BeRealUITestsLaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BeRealUITestsLaunchTests.swift; sourceTree = ""; }; + 02CE5561293B452E00730DC9 /* ProfileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileView.swift; sourceTree = ""; }; + 02CE5564293B517700730DC9 /* NameAndValueLabelStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NameAndValueLabelStyle.swift; sourceTree = ""; }; 02FFFD7A29395DD200306533 /* String+Constants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+Constants.swift"; sourceTree = ""; }; /* End PBXFileReference section */ @@ -101,6 +105,7 @@ 02AE64ED29363DBF005A4AF3 /* BeReal */ = { isa = PBXGroup; children = ( + 02CE555F293B44C900730DC9 /* Profile */, 02FFFD7929395DBF00306533 /* Extensions */, 02AE64EE29363DBF005A4AF3 /* BeRealApp.swift */, 02AE64F029363DBF005A4AF3 /* ContentView.swift */, @@ -135,9 +140,34 @@ path = BeRealUITests; sourceTree = ""; }; + 02CE555F293B44C900730DC9 /* Profile */ = { + isa = PBXGroup; + children = ( + ); + path = Profile; + sourceTree = ""; + }; + 02CE5560293B452400730DC9 /* Views */ = { + isa = PBXGroup; + children = ( + 02CE5561293B452E00730DC9 /* ProfileView.swift */, + ); + path = Views; + sourceTree = ""; + }; + 02CE5563293B516600730DC9 /* Styles */ = { + isa = PBXGroup; + children = ( + 02CE5564293B517700730DC9 /* NameAndValueLabelStyle.swift */, + ); + path = Styles; + sourceTree = ""; + }; 02FFFD7929395DBF00306533 /* Extensions */ = { isa = PBXGroup; children = ( + 02CE5563293B516600730DC9 /* Styles */, + 02CE5560293B452400730DC9 /* Views */, 02FFFD7A29395DD200306533 /* String+Constants.swift */, ); path = Extensions; @@ -284,8 +314,10 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 02CE5562293B452E00730DC9 /* ProfileView.swift in Sources */, 02AE64F129363DBF005A4AF3 /* ContentView.swift in Sources */, 02AE64EF29363DBF005A4AF3 /* BeRealApp.swift in Sources */, + 02CE5565293B517700730DC9 /* NameAndValueLabelStyle.swift in Sources */, 02FFFD7B29395DD200306533 /* String+Constants.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/BeReal/Extensions/Styles/NameAndValueLabelStyle.swift b/BeReal/Extensions/Styles/NameAndValueLabelStyle.swift new file mode 100644 index 0000000..7e7f232 --- /dev/null +++ b/BeReal/Extensions/Styles/NameAndValueLabelStyle.swift @@ -0,0 +1,38 @@ +// +// NameAndValueLabelStyle.swift +// Profile +// +// Created by Javier Cicchelli on 03/12/2022. +// Copyright © 2022 Röck+Cöde. All rights reserved. +// + +import SwiftUI + +struct NameAndValueLabelStyle: LabelStyle { + func makeBody(configuration: Configuration) -> some View { + VStack( + alignment: .leading, + spacing: 0 + ) { + configuration.icon + .font(.subheadline) + .foregroundColor(.secondary) + + configuration.title + .font(.headline) + .lineLimit(1) + .truncationMode(.middle) + .foregroundColor(.primary) + .frame(maxWidth: .infinity, alignment: .trailing) + } + .padding(.vertical, 8) + } +} + +// MARK: - LabelStyle + +extension LabelStyle where Self == NameAndValueLabelStyle { + static var nameAndValue: Self { + NameAndValueLabelStyle() + } +} diff --git a/BeReal/Extensions/Views/ProfileView.swift b/BeReal/Extensions/Views/ProfileView.swift new file mode 100644 index 0000000..858797d --- /dev/null +++ b/BeReal/Extensions/Views/ProfileView.swift @@ -0,0 +1,109 @@ +// +// ProfileView.swift +// BeReal +// +// Created by Javier Cicchelli on 03/12/2022. +// Copyright © 2022 Röck+Cöde. All rights reserved. +// + +import SwiftUI + +struct ProfileView: View { + var body: some View { + List { + Section { + Image.photo + .resizable() + .scaledToFit() + .frame(width: 160) + .frame(maxWidth: .infinity) + } + .listRowBackground(Color.clear) + + Section { + Label { + Text("Javier") + } icon: { + Text("First name") + } + .labelStyle(.nameAndValue) + + Label { + Text("Cicchelli") + } icon: { + Text("Last name") + } + .labelStyle(.nameAndValue) + } header: { + Text("Names") + } + + Section { + Label { + Text("71207ee4c0573fde80b03643caafe62731406404") + } icon: { + Text("Identifier") + } + .labelStyle(.nameAndValue) + + Label { + Text("Yes") + } icon: { + Text("Is a directory?") + } + .labelStyle(.nameAndValue) + + Label { + Text("3 days ago") + } icon: { + Text("Last modified") + } + .labelStyle(.nameAndValue) + + Label { + Text("My files") + } icon: { + Text("name") + } + .labelStyle(.nameAndValue) + } header: { + Text("Root item information") + } + + Section { + Button { + // TODO: Log out the existing user. + } label: { + Text("Log out") + .fontWeight(.semibold) + .foregroundColor(.primary) + .frame(maxWidth: .infinity) + } + .tint(.orange) + .buttonStyle(.borderedProminent) + .buttonBorderShape(.roundedRectangle(radius: 8)) + .controlSize(.large) + .padding(0) + } + .listRowBackground(Color.clear) + } + .background(Color.red) + .onAppear { + UITableView.appearance().backgroundColor = .clear + } + } +} + +// MARK: - Images+Constants + +private extension Image { + static let photo = Image(systemName: "person.crop.circle.fill") +} + +// MARK: - Previews + +struct ProfileView_Previews: PreviewProvider { + static var previews: some View { + ProfileView() + } +}