From 198eef3b21bdec9428f1b6453db9517406859adc Mon Sep 17 00:00:00 2001 From: Alan Serralde Date: Thu, 11 Jan 2024 12:13:47 -0600 Subject: [PATCH 1/3] Add ex --- .../UserInterfaceState.xcuserstate | Bin 0 -> 24895 bytes SwiftUIBasics/Views/PlansView.swift | 59 +++++++++++++++++- SwiftUIBasics/Views/RatingView.swift | 31 ++++++++- 3 files changed, 86 insertions(+), 4 deletions(-) create mode 100644 SwiftUIBasics.xcodeproj/project.xcworkspace/xcuserdata/diplomado.xcuserdatad/UserInterfaceState.xcuserstate diff --git a/SwiftUIBasics.xcodeproj/project.xcworkspace/xcuserdata/diplomado.xcuserdatad/UserInterfaceState.xcuserstate b/SwiftUIBasics.xcodeproj/project.xcworkspace/xcuserdata/diplomado.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..d030e9e6f561bb269cd3c500a27397cbdb8838f7 GIT binary patch literal 24895 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 I{p}+AFIh!k6aWAK literal 0 HcmV?d00001 diff --git a/SwiftUIBasics/Views/PlansView.swift b/SwiftUIBasics/Views/PlansView.swift index cb97876..2d026b2 100644 --- a/SwiftUIBasics/Views/PlansView.swift +++ b/SwiftUIBasics/Views/PlansView.swift @@ -7,12 +7,69 @@ import SwiftUI +struct Plans: View{ + let hasImg: Bool + let imgName: String + let planName: String + let planCost: Double + let hasDesc: Bool + let description: String + let backColor: Color + let fontColor: Color + let sizesBack: CGSize + var body: some View{ + ZStack{ + RoundedRectangle(cornerSize: CGSize(width: 20, height: 20)) + .frame(width: sizesBack.width, height: sizesBack.height) + .aspectRatio(contentMode: .fill) + .foregroundStyle(backColor) + VStack{ + if hasImg{ + Image(systemName: imgName) + + .font(.largeTitle) + } + Text(planName) + .font(.title.bold()) + .foregroundStyle(fontColor) + Text("$\(planCost)") + .font(.title.bold()) + .foregroundStyle(fontColor) + Text("per month") + .font(.footnote) + .foregroundStyle(fontColor) + if hasDesc{ + Text(description) + .font(.footnote) + .padding(5) + .foregroundStyle(.white) + .background(.orange) + + } + } + } + } +} + struct PlansView: View { var body: some View { - Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/) + + Text("Choose \n ur plan 🐥") + .font(.title.bold()) + .foregroundStyle(.black) + + VStack{ + HStack{ + Plans(hasImg: false, imgName: "", planName: "Basic", planCost: 9.9, hasDesc: false, description: "", backColor: .purple, fontColor: .white, sizesBack: CGSize(width: 177, height: 177)) + Plans(hasImg: false, imgName: "", planName: "Pro", planCost: 19, hasDesc: true, description: "Best for designer", backColor: .gray, fontColor: .black, sizesBack: CGSize(width: 177, height: 177)) + } + + Plans(hasImg: true, imgName: "wand.and.stars", planName: "Team", planCost: 299, hasDesc: true, description: "Perfect for teams with 20 members", backColor: .gray, fontColor: .white, sizesBack: CGSize(width: 300, height: 177)) + } } } #Preview { PlansView() } + diff --git a/SwiftUIBasics/Views/RatingView.swift b/SwiftUIBasics/Views/RatingView.swift index 3ca74af..1965b7d 100644 --- a/SwiftUIBasics/Views/RatingView.swift +++ b/SwiftUIBasics/Views/RatingView.swift @@ -8,9 +8,34 @@ import SwiftUI struct RatingView: View { - var body: some View { - Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/) - } + @State var rating: Int? = 0 + @State private var animate = false + + private func starType(index: Int) -> String { + + if let rating = self.rating { + return index <= rating ? "star.fill" : "star" + } else { + return "star" + } + } + + var body: some View { + HStack { + ForEach(1...5, id: \.self) { index in + Image(systemName: self.starType(index: index)) + .symbolEffect(.bounce, value: animate) + .contentTransition(.symbolEffect(.replace)) + .foregroundColor(Color.orange) + .onTapGesture { + UIImpactFeedbackGenerator(style: .medium).impactOccurred() + if self.rating != index{ + self.rating = index + } else { self.rating = index-1} + } + } + } + } } #Preview { From 20d4ea7a0a0a8809f78ac636071a33c612b8a28a Mon Sep 17 00:00:00 2001 From: Alan Serralde Date: Fri, 12 Jan 2024 16:40:26 -0600 Subject: [PATCH 2/3] Solve Rating view --- .../UserInterfaceState.xcuserstate | Bin 24895 -> 27598 bytes SwiftUIBasics/Views/RatingView.swift | 1 + 2 files changed, 1 insertion(+) diff --git a/SwiftUIBasics.xcodeproj/project.xcworkspace/xcuserdata/diplomado.xcuserdatad/UserInterfaceState.xcuserstate b/SwiftUIBasics.xcodeproj/project.xcworkspace/xcuserdata/diplomado.xcuserdatad/UserInterfaceState.xcuserstate index d030e9e6f561bb269cd3c500a27397cbdb8838f7..b4fbd98a330a27329224f09e721bff41831c754a 100644 GIT binary patch literal 27598 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 K{j~kA_WwTx0LTCU literal 24895 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 I{p}+AFIh!k6aWAK diff --git a/SwiftUIBasics/Views/RatingView.swift b/SwiftUIBasics/Views/RatingView.swift index 1965b7d..10b700a 100644 --- a/SwiftUIBasics/Views/RatingView.swift +++ b/SwiftUIBasics/Views/RatingView.swift @@ -4,6 +4,7 @@ // // Created by Diplomado on 09/12/23. // +// import SwiftUI From 6002f9266dbfeb497cf82a85e0ca7a25a0b58d6f Mon Sep 17 00:00:00 2001 From: Alan Serralde Date: Fri, 12 Jan 2024 20:08:47 -0600 Subject: [PATCH 3/3] Solve SignUpView --- SwiftUIBasics.xcodeproj/project.pbxproj | 12 ++ .../UserInterfaceState.xcuserstate | Bin 27598 -> 40993 bytes .../ViewModels/AuthenticationViewModel.swift | 68 ++++++ .../ViewModels/SignUpViewModel.swift | 80 +++++++ .../Views/Components/TestSignUp.swift | 50 +++++ SwiftUIBasics/Views/SignUpView.swift | 203 +++++++++++++++--- 6 files changed, 385 insertions(+), 28 deletions(-) create mode 100644 SwiftUIBasics/ViewModels/AuthenticationViewModel.swift create mode 100644 SwiftUIBasics/ViewModels/SignUpViewModel.swift create mode 100644 SwiftUIBasics/Views/Components/TestSignUp.swift diff --git a/SwiftUIBasics.xcodeproj/project.pbxproj b/SwiftUIBasics.xcodeproj/project.pbxproj index b66523d..70672e9 100644 --- a/SwiftUIBasics.xcodeproj/project.pbxproj +++ b/SwiftUIBasics.xcodeproj/project.pbxproj @@ -8,6 +8,9 @@ /* Begin PBXBuildFile section */ 30CA734E2B24AE460025B2EB /* SymbolsAnimations.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30CA734D2B24AE460025B2EB /* SymbolsAnimations.swift */; }; + 5544EF492B52003C0070BA56 /* AuthenticationViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5544EF482B52003C0070BA56 /* AuthenticationViewModel.swift */; }; + 5544EF4B2B5202A60070BA56 /* TestSignUp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5544EF4A2B5202A60070BA56 /* TestSignUp.swift */; }; + 5544EF4D2B5204A00070BA56 /* SignUpViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5544EF4C2B5204A00070BA56 /* SignUpViewModel.swift */; }; 557042892B24CB310048C81C /* ProfileListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 557042882B24CB310048C81C /* ProfileListView.swift */; }; 5570428B2B24D2F90048C81C /* TabBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5570428A2B24D2F90048C81C /* TabBarView.swift */; }; 5570428D2B24D8050048C81C /* SignUpView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5570428C2B24D8050048C81C /* SignUpView.swift */; }; @@ -24,6 +27,9 @@ /* Begin PBXFileReference section */ 30CA734D2B24AE460025B2EB /* SymbolsAnimations.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SymbolsAnimations.swift; sourceTree = ""; }; + 5544EF482B52003C0070BA56 /* AuthenticationViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthenticationViewModel.swift; sourceTree = ""; }; + 5544EF4A2B5202A60070BA56 /* TestSignUp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestSignUp.swift; sourceTree = ""; }; + 5544EF4C2B5204A00070BA56 /* SignUpViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignUpViewModel.swift; sourceTree = ""; }; 557042882B24CB310048C81C /* ProfileListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileListView.swift; sourceTree = ""; }; 5570428A2B24D2F90048C81C /* TabBarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabBarView.swift; sourceTree = ""; }; 5570428C2B24D8050048C81C /* SignUpView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignUpView.swift; sourceTree = ""; }; @@ -54,6 +60,8 @@ isa = PBXGroup; children = ( 5598D3252B2404FC00A6AFD3 /* ProfileCardVM.swift */, + 5544EF482B52003C0070BA56 /* AuthenticationViewModel.swift */, + 5544EF4C2B5204A00070BA56 /* SignUpViewModel.swift */, ); path = ViewModels; sourceTree = ""; @@ -77,6 +85,7 @@ isa = PBXGroup; children = ( 5598D3212B2403CE00A6AFD3 /* CircularImage.swift */, + 5544EF4A2B5202A60070BA56 /* TestSignUp.swift */, ); path = Components; sourceTree = ""; @@ -188,10 +197,13 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 5544EF492B52003C0070BA56 /* AuthenticationViewModel.swift in Sources */, 5570428B2B24D2F90048C81C /* TabBarView.swift in Sources */, 5598D3162B23DF6D00A6AFD3 /* ContentView.swift in Sources */, 5598D3262B2404FC00A6AFD3 /* ProfileCardVM.swift in Sources */, 5570428F2B24E50E0048C81C /* RatingView.swift in Sources */, + 5544EF4B2B5202A60070BA56 /* TestSignUp.swift in Sources */, + 5544EF4D2B5204A00070BA56 /* SignUpViewModel.swift in Sources */, 30CA734E2B24AE460025B2EB /* SymbolsAnimations.swift in Sources */, 5598D3142B23DF6D00A6AFD3 /* SwiftUIBasicsApp.swift in Sources */, 5598D3242B24049B00A6AFD3 /* ProfileCardView.swift in Sources */, diff --git a/SwiftUIBasics.xcodeproj/project.xcworkspace/xcuserdata/diplomado.xcuserdatad/UserInterfaceState.xcuserstate b/SwiftUIBasics.xcodeproj/project.xcworkspace/xcuserdata/diplomado.xcuserdatad/UserInterfaceState.xcuserstate index b4fbd98a330a27329224f09e721bff41831c754a..a4bf5b8a45fda258465cfd3754bc994380546b50 100644 GIT binary patch literal 40993 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±5$zGc0C?Wg}+KReU7%a$U-^LY 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 K{j~kA_WwTx0LTCU diff --git a/SwiftUIBasics/ViewModels/AuthenticationViewModel.swift b/SwiftUIBasics/ViewModels/AuthenticationViewModel.swift new file mode 100644 index 0000000..2dc767a --- /dev/null +++ b/SwiftUIBasics/ViewModels/AuthenticationViewModel.swift @@ -0,0 +1,68 @@ +// +// AuthenticationViewModel.swift +// SwiftUIBasics +// +// Created by Diplomado on 12/01/24. +// + +import Foundation +import Combine + +final class AuthenticationViewModel: ObservableObject { + // MARK: - Password input + @Published var password = "" + @Published var confirmPassword = "" + + // MARK: - Password requirements + @Published var hasEightChar = false + @Published var hasSpacialChar = false + @Published var hasOneDigit = false + @Published var hasOneUpperCaseChar = false + @Published var confirmationMatch = false + @Published var areAllFieldsValid = false + + init() { + validateSignUpFields() + } + + private func validateSignUpFields() { + /// Check password has minimum 8 characters + $password + .map { password in + password.count >= 8 + } + .assign(to: &$hasEightChar) + /// Check password has minimum 1 special character + $password + .map { password in + password.rangeOfCharacter(from: CharacterSet(charactersIn: "!@#$%^&*()_+-=[]{}|:\"';<>,.?/~`")) != nil + } + .assign(to: &$hasSpacialChar) + /// Check password has minimum 1 digit + $password + .map { password in + password.contains { $0.isNumber } + } + .assign(to: &$hasOneDigit) + /// Check password has minimum 1 uppercase letter + $password + .map { password in + password.contains { $0.isUppercase } + } + .assign(to: &$hasOneUpperCaseChar) + /// Check confirmation match password + Publishers.CombineLatest($password, $confirmPassword) + .map { [weak self] _, _ in + guard let self else { return false} + return self.password == self.confirmPassword + } + .assign(to: &$confirmationMatch) + /// Check all fields match + Publishers.CombineLatest($password, $confirmPassword) + .map { [weak self] _, _ in + guard let self else { return false} + return self.hasEightChar && self.hasSpacialChar && self.hasOneDigit && self.hasOneUpperCaseChar && self.confirmationMatch + } + .assign(to: &$areAllFieldsValid) + } + } diff --git a/SwiftUIBasics/ViewModels/SignUpViewModel.swift b/SwiftUIBasics/ViewModels/SignUpViewModel.swift new file mode 100644 index 0000000..f9b7d31 --- /dev/null +++ b/SwiftUIBasics/ViewModels/SignUpViewModel.swift @@ -0,0 +1,80 @@ +// +// SignUpViewModel.swift +// SwiftUIBasics +// +// Created by Diplomado on 12/01/24. +// + +import Foundation +import Combine + + +final class SignUpViewModel: ObservableObject { + + // Input values from view + @Published var userName = "" + @Published var userEmail = "" + @Published var userPassword = "" + @Published var userRepeatedPassword = "" + + // Output subscribers + @Published var formIsValid = false + + private var publishers = Set() + + init() { + isSignupFormValidPublisher + .receive(on: RunLoop.main) + .assign(to: \.formIsValid, on: self) + .store(in: &publishers) + } + +} + +private extension SignUpViewModel { + + var isUserNameValidPublisher: AnyPublisher { + $userName + .map { name in + return name.count >= 3 + } + .eraseToAnyPublisher() + } + + var isUserEmailValidPublisher: AnyPublisher { + $userPassword + .map { password in + return password.count >= 8 + } + .eraseToAnyPublisher() + } + + var isPasswordValidPublisher: AnyPublisher { + $userPassword + .map { password in + return password.count >= 8 + } + .eraseToAnyPublisher() + } + + var passwordMatchesPublisher: AnyPublisher { + Publishers.CombineLatest($userPassword, $userRepeatedPassword) + .map { password, repeated in + return password == repeated + } + .eraseToAnyPublisher() + } + + var isSignupFormValidPublisher: AnyPublisher { + Publishers.CombineLatest4( + isUserNameValidPublisher, + isUserEmailValidPublisher, + isPasswordValidPublisher, + passwordMatchesPublisher) + .map { isNameValid, isEmailValid, isPasswordValid, passwordMatches in + return isNameValid && isEmailValid && isPasswordValid && passwordMatches + } + .eraseToAnyPublisher() + } + +} diff --git a/SwiftUIBasics/Views/Components/TestSignUp.swift b/SwiftUIBasics/Views/Components/TestSignUp.swift new file mode 100644 index 0000000..7580542 --- /dev/null +++ b/SwiftUIBasics/Views/Components/TestSignUp.swift @@ -0,0 +1,50 @@ +// +// TestSignUp.swift +// SwiftUIBasics +// +// Created by Diplomado on 12/01/24. +// + +import SwiftUI + +struct UserFormTextField: View { + + + + +} + + + +struct SignUpPasswordScreen: View { + @StateObject private var authVM = AuthenticationViewModel() + + var body: some View { + VStack(spacing: 0) { + VStack { + VStack(alignment: .leading, spacing: 10) { + Text("Password") + .font(.title) + .bold() + Text("Password must have more than 8 characters, contain some special character, one digit, one uppercase letter") + .font(.caption) + } + Group { + UserFormTextField(text: $authVM.password, type: .password) + VStack(alignment: .leading) { + RequirementsPickerView(type: .eightChar, toggleState: $authVM.hasEightChar) + RequirementsPickerView(type: .spacialChar, toggleState: $authVM.hasSpacialChar) + RequirementsPickerView(type: .oneDigit, toggleState: $authVM.hasOneDigit) + RequirementsPickerView(type: .upperCaseChar, toggleState: $authVM.hasOneUpperCaseChar) + } + UserFormTextField(text: $authVM.confirmPassword, type: .repeatPassword) + RequirementsPickerView(type: .confirmation, toggleState: $authVM.confirmationMatch) + } + } + } + } +} + +#Preview { + SignUpPasswordScreen() +} diff --git a/SwiftUIBasics/Views/SignUpView.swift b/SwiftUIBasics/Views/SignUpView.swift index 4f8aeb9..854cd3d 100644 --- a/SwiftUIBasics/Views/SignUpView.swift +++ b/SwiftUIBasics/Views/SignUpView.swift @@ -6,40 +6,187 @@ // import SwiftUI +import Combine + +class SignUpViewModel: ObservableObject { + // inputs + @Published var email: String = "" + @Published var password: String = "" + @Published var passwordConfirm: String = "" + + // outputs + + @Published var isValidPasswordLowerCase: Bool = false + @Published var isValidPasswordHasASymbol: Bool = false + @Published var isValidPasswordHasANumber: Bool = false + @Published var isValidUsernameLength: Bool = false + @Published var isValidPasswordLength: Bool = false + @Published var isValidPasswordUpperCase: Bool = false + @Published var isValidPasswordMatch: Bool = false + @Published var isValid: Bool = false +// mailOutputs + + @Published var isValidEmail: Bool = false + + private var cancelableSet: Set = [] + + init() { + + $email + .receive(on: RunLoop.main) + .map { mail in + let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}" + let emailPred = NSPredicate(format:"SELF MATCHES %@", emailRegEx) + return emailPred.evaluate(with: mail) + } + .assign(to: \.isValidEmail, on: self) + .store(in: &cancelableSet) + + + $password + .receive(on: RunLoop.main) + .map { password in + return password.count >= 8 + } + .assign(to: \.isValidPasswordLength, on: self) + .store(in: &cancelableSet) + + $password + .receive(on: RunLoop.main) + .map { password in + let pattern = "[A-Z]" + if let _ = password.range(of: pattern, options: .regularExpression) { + return true + } else { + return false + } + } + .assign(to: \.isValidPasswordUpperCase, on: self) + .store(in: &cancelableSet) + + $password + .receive(on: RunLoop.main) + .map { password in + let pattern = "[a-z]" + if let _ = password.range(of: pattern, options: .regularExpression) { + return true + } else { + return false + } + } + .assign(to: \.isValidPasswordLowerCase, on: self) + .store(in: &cancelableSet) + + $password + .receive(on: RunLoop.main) + .map { password in + let pattern = "[!@#$%^&*()_+\\-=\\[\\]{};':\"\\\\|,.<>\\/?]" + if let _ = password.range(of: pattern, options: .regularExpression) { + return true + } else { + return false + } + } + .assign(to: \.isValidPasswordHasASymbol, on: self) + .store(in: &cancelableSet) + + $password + .receive(on: RunLoop.main) + .map { password in + let pattern = "[0-9]+" + if let _ = password.range(of: pattern, options: .regularExpression) { + return true + } else { + return false + } + } + .assign(to: \.isValidPasswordHasANumber, on: self) + .store(in: &cancelableSet) + + Publishers.CombineLatest($password, $passwordConfirm) + .receive(on: RunLoop.main) + .map { (password, passwordConfirm) in + return !password.isEmpty && !passwordConfirm.isEmpty && password == passwordConfirm + } + .assign(to: \.isValidPasswordMatch, on: self) + .store(in: &cancelableSet) + + Publishers.CombineLatest4($isValidUsernameLength, $isValidPasswordLength, $isValidPasswordUpperCase, $isValidPasswordMatch) + .map { (a, b, c, d) in + return a && b && c && d + } + .assign(to: \.isValid, on: self) + .store(in: &cancelableSet) + } +} + +/// struct SignUpView: View { - @State var email: String = "" - @State var password: String = "" - @State var passwordConfirmation: String = "" - @State var terms: Bool = true + @ObservedObject var vm = SignUpViewModel() + var body: some View { - NavigationView { + VStack { + Text("Create an account") + .font(.system(.largeTitle, design: .rounded)) + .bold() + .foregroundStyle(.maryBlue) + .padding(.bottom, 30) + FormTextField(name: "Email", value: $vm.email).keyboardType(.emailAddress) + + RequirementText(text: "Valid Email", isValid: vm.isValidEmail) + .padding() + + + FormTextField(name: "Password", value: $vm.password, isSecure: true) VStack { - Form { - TextField(text: $email) { - Text("email") - } - .autocorrectionDisabled() - .textInputAutocapitalization(.never) - SecureField(text: $password) { - Text("Password") - } - .autocorrectionDisabled() - SecureField(text: $passwordConfirmation) { - Text("Password Confirmation") - } - .autocorrectionDisabled() - - Toggle("Accept Terms and conditions", isOn: $terms) - } - Button("Create Account") { - print("Create account") - } - .font(.system(size: 24)) - .buttonStyle(.borderedProminent) + RequirementText(text: "A minimum of 8 characters", isValid: vm.isValidPasswordLength) + RequirementText(text: "One uppercase letter", isValid: vm.isValidPasswordUpperCase) + RequirementText(text: "One lowercase letter", isValid: vm.isValidPasswordLowerCase) + RequirementText(text: "One symbol", isValid: vm.isValidPasswordHasASymbol) + RequirementText(text: "One number", isValid: vm.isValidPasswordHasANumber) + } + .padding() + FormTextField(name: "Confirm Password", value: $vm.passwordConfirm, isSecure: true) + VStack{ + RequirementText(text: "Your confirm password should be the same as password", isValid: vm.isValidPasswordMatch) + } - .navigationTitle("Sign Up") + .padding() + .padding(.bottom, 50) + Button(action: { + print("Doing") + // Proceed to the next screen + }) { + Text("Sign Up") + .font(.system(.body, design: .rounded)) + .foregroundColor(.white) + .bold() + .padding() + .frame(minWidth: 0, maxWidth: .infinity) + .background(vm.isValid ? .maryBlue :.turquoise) + // .background(LinearGradient(gradient: Gradient(colors: [.turquoise, .maryBlue]), startPoint: .leading, endPoint: .trailing)) + .cornerRadius(10) + .padding(.horizontal) + } + .disabled(!vm.isValid) + + HStack { + Text("Already have an account?") + .font(.system(.body, design: .rounded)) + .bold() + Button(action: { + // Proceed to Sign in screen + }) { + Text("Sign in") + .font(.system(.body, design: .rounded)) + .bold() + .foregroundColor(.maryBlue) + } + }.padding(.top, 50) + Spacer() } + .padding() } }