From 5b029f3006c3f330183d076cd71c259e6bff3692 Mon Sep 17 00:00:00 2001 From: Daniel Mayo Date: Fri, 12 Jan 2024 18:49:27 -0600 Subject: [PATCH 1/2] commit Validations, email valid --- SwiftUIBasics/Views/CatsView.swift | 2 +- SwiftUIBasics/Views/SignUpView.swift | 74 ++++++++++++++++++++++++++-- 2 files changed, 70 insertions(+), 6 deletions(-) diff --git a/SwiftUIBasics/Views/CatsView.swift b/SwiftUIBasics/Views/CatsView.swift index 1bb38e4..9910aa8 100644 --- a/SwiftUIBasics/Views/CatsView.swift +++ b/SwiftUIBasics/Views/CatsView.swift @@ -41,7 +41,7 @@ struct CacheAsyncImage: View where Content: View { var body: some View { if let cached = ImageCache[url] { - _ = print("Rendering from cache at:\(url)") + let _ = print("Rendering from cache at:\(url)") content(.success(cached)) } else { AsyncImage( diff --git a/SwiftUIBasics/Views/SignUpView.swift b/SwiftUIBasics/Views/SignUpView.swift index 6cef5d9..6ddf0d9 100644 --- a/SwiftUIBasics/Views/SignUpView.swift +++ b/SwiftUIBasics/Views/SignUpView.swift @@ -10,7 +10,7 @@ import Combine class SignUpViewModel: ObservableObject { // inputs - @Published var username: String = "" + @Published var email: String = "" @Published var password: String = "" @Published var passwordConfirm: String = "" @@ -20,17 +20,36 @@ class SignUpViewModel: ObservableObject { @Published var isValidPasswordUpperCase: Bool = false @Published var isValidPasswordMatch: Bool = false @Published var isValid: Bool = false - + // New Rules + @Published var isValidPasswordSymbol : Bool = false + @Published var isValidPasswordNumber : Bool = false + @Published var isValidPasswordLowerCase : Bool = false + @Published var isValidEmail : Bool = false + + private var cancelableSet: Set = [] init() { - $username + $email .receive(on: RunLoop.main) .map { username in return username.count >= 4 } .assign(to: \.isValidUsernameLength, on: self) .store(in: &cancelableSet) + $email + .receive(on: RunLoop.main) + .map { password in + let pattern = "[@.]" + if let _ = password.range(of: pattern, options: .regularExpression) { + return true + } else { + return false + } + } + .assign(to: \.isValidEmail, on: self) + .store(in: &cancelableSet) + $password .receive(on: RunLoop.main) @@ -53,6 +72,45 @@ class SignUpViewModel: ObservableObject { .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 = "[0-9]" + if let _ = password.range(of: pattern, options: .regularExpression) { + return true + } else { + return false + } + } + .assign(to: \.isValidPasswordNumber, 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: \.isValidPasswordSymbol, on: self) + .store(in: &cancelableSet) + Publishers.CombineLatest($password, $passwordConfirm) .receive(on: RunLoop.main) .map { (password, passwordConfirm) in @@ -80,13 +138,19 @@ struct SignUpView: View { .bold() .foregroundStyle(.maryBlue) .padding(.bottom, 30) - FormTextField(name: "Username", value: $vm.username) - RequirementText(text: "A minimum of 4 characters", isValid: vm.isValidUsernameLength) + FormTextField(name: "email", value: $vm.email) + VStack{ + RequirementText(text: "A minimum of 4 characters", isValid: vm.isValidUsernameLength) + RequirementText(text: "Is email valid", isValid: vm.isValidEmail) + } .padding() FormTextField(name: "Password", value: $vm.password, isSecure: true) VStack { 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 Number", isValid: vm.isValidPasswordNumber) + RequirementText(text: "One Symbol", isValid: vm.isValidPasswordSymbol) } .padding() FormTextField(name: "Confirm Password", value: $vm.passwordConfirm, isSecure: true) From 3d54ccf10bf85613cfc7433ee2d2e1153f60e4d8 Mon Sep 17 00:00:00 2001 From: Daniel Mayo Date: Fri, 12 Jan 2024 20:00:38 -0600 Subject: [PATCH 2/2] commit validations --- SwiftUIBasics/Views/SignUpView.swift | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/SwiftUIBasics/Views/SignUpView.swift b/SwiftUIBasics/Views/SignUpView.swift index 6ddf0d9..76366b7 100644 --- a/SwiftUIBasics/Views/SignUpView.swift +++ b/SwiftUIBasics/Views/SignUpView.swift @@ -25,6 +25,7 @@ class SignUpViewModel: ObservableObject { @Published var isValidPasswordNumber : Bool = false @Published var isValidPasswordLowerCase : Bool = false @Published var isValidEmail : Bool = false + @Published var isValidation : Bool = false private var cancelableSet: Set = [] @@ -119,7 +120,14 @@ class SignUpViewModel: ObservableObject { .assign(to: \.isValidPasswordMatch, on: self) .store(in: &cancelableSet) - Publishers.CombineLatest4($isValidUsernameLength, $isValidPasswordLength, $isValidPasswordUpperCase, $isValidPasswordMatch) + Publishers.CombineLatest4($isValidPasswordLowerCase, $isValidPasswordNumber, $isValidPasswordSymbol,$isValidUsernameLength ) + .map { (a, b, c, d) in + return a && b && c && d + } + .assign(to: \.isValidation, on: self) + .store(in: &cancelableSet) + + Publishers.CombineLatest4($isValidation, $isValidPasswordLength, $isValidPasswordUpperCase, $isValidPasswordMatch) .map { (a, b, c, d) in return a && b && c && d }