From f82d82663c559d5ba886c35a81bb0500c1952781 Mon Sep 17 00:00:00 2001 From: Laurent Date: Tue, 9 Apr 2024 16:11:20 +0200 Subject: [PATCH] Account creation --- PadelClub.xcodeproj/project.pbxproj | 4 + PadelClub/Data/User.swift | 20 ++++- PadelClub/Extensions/Locale+Extensions.swift | 23 ++++++ PadelClub/Views/User/AccountView.swift | 2 +- PadelClub/Views/User/LoginView.swift | 52 ++++++++++--- PadelClub/Views/User/UserCreationView.swift | 79 ++++++++++++++++++-- 6 files changed, 158 insertions(+), 22 deletions(-) create mode 100644 PadelClub/Extensions/Locale+Extensions.swift diff --git a/PadelClub.xcodeproj/project.pbxproj b/PadelClub.xcodeproj/project.pbxproj index 5425ef6..3f5a6f4 100644 --- a/PadelClub.xcodeproj/project.pbxproj +++ b/PadelClub.xcodeproj/project.pbxproj @@ -14,6 +14,7 @@ C425D4122B6D249E002A7B48 /* PadelClubTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C425D4112B6D249E002A7B48 /* PadelClubTests.swift */; }; C425D41C2B6D249E002A7B48 /* PadelClubUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C425D41B2B6D249E002A7B48 /* PadelClubUITests.swift */; }; C425D41E2B6D249E002A7B48 /* PadelClubUITestsLaunchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C425D41D2B6D249E002A7B48 /* PadelClubUITestsLaunchTests.swift */; }; + C44B79112BBDA63A00906534 /* Locale+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C44B79102BBDA63A00906534 /* Locale+Extensions.swift */; }; C4A47D5A2B6D383C00ADC637 /* Tournament.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4A47D592B6D383C00ADC637 /* Tournament.swift */; }; C4A47D5E2B6D38EC00ADC637 /* DataStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4A47D5D2B6D38EC00ADC637 /* DataStore.swift */; }; C4A47D632B6D3D6500ADC637 /* Club.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4A47D622B6D3D6500ADC637 /* Club.swift */; }; @@ -246,6 +247,7 @@ C425D41B2B6D249E002A7B48 /* PadelClubUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PadelClubUITests.swift; sourceTree = ""; }; C425D41D2B6D249E002A7B48 /* PadelClubUITestsLaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PadelClubUITestsLaunchTests.swift; sourceTree = ""; }; C425D44E2B6D24E1002A7B48 /* LeStorage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = LeStorage.xcodeproj; path = ../../LeStorage/LeStorage.xcodeproj; sourceTree = ""; }; + C44B79102BBDA63A00906534 /* Locale+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Locale+Extensions.swift"; sourceTree = ""; }; C4A47D592B6D383C00ADC637 /* Tournament.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tournament.swift; sourceTree = ""; }; C4A47D5D2B6D38EC00ADC637 /* DataStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataStore.swift; sourceTree = ""; }; C4A47D622B6D3D6500ADC637 /* Club.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Club.swift; sourceTree = ""; }; @@ -946,6 +948,7 @@ FF6EC90A2B947AC000EA7F5A /* Array+Extensions.swift */, FF5D0D732BB41DF8005CB568 /* Color+Extensions.swift */, FFDB1C722BB2CFE900F1E467 /* MySortDescriptor.swift */, + C44B79102BBDA63A00906534 /* Locale+Extensions.swift */, ); path = Extensions; sourceTree = ""; @@ -1187,6 +1190,7 @@ FF967CF62BAED51600A9A3BD /* TournamentRunningView.swift in Sources */, FF8F264D2BAE0B4100650388 /* TournamentDatePickerView.swift in Sources */, FF967D042BAEF1C300A9A3BD /* MatchRowView.swift in Sources */, + C44B79112BBDA63A00906534 /* Locale+Extensions.swift in Sources */, FF967CEA2BAEC70100A9A3BD /* GroupStage.swift in Sources */, C4A47D742B72881F00ADC637 /* ClubView.swift in Sources */, C4A47D902B7BBBEC00ADC637 /* StoreManager.swift in Sources */, diff --git a/PadelClub/Data/User.swift b/PadelClub/Data/User.swift index 960bb20..1626594 100644 --- a/PadelClub/Data/User.swift +++ b/PadelClub/Data/User.swift @@ -19,14 +19,22 @@ class User: UserBase { public var id: String = Store.randomId() public var username: String - public var email: String? + public var email: String var club: String? var umpireCode: String? var licenceId: String? + var firstName: String + var lastName: String + var phone: String? + var country: String? - init(username: String, email: String? = nil) { + init(username: String, email: String, firstName: String, lastName: String, phone: String?, country: String?) { self.username = username + self.firstName = firstName + self.lastName = lastName self.email = email + self.phone = phone + self.country = country } public func uuid() throws -> UUID { @@ -52,15 +60,19 @@ class User: UserBase { case _club = "club" case _umpireCode = "umpireCode" case _licenceId = "licenceId" + case _firstName = "firstName" + case _lastName = "lastName" + case _phone = "phone" + case _country = "country" } } class UserCreationForm: User, UserPasswordBase { - init(username: String, password: String, email: String?) { + init(username: String, password: String, firstName: String, lastName: String, email: String, phone: String?, country: String?) { self.password = password - super.init(username: username, email: email) + super.init(username: username, email: email, firstName: firstName, lastName: lastName, phone: phone, country: country) } required init(from decoder: Decoder) throws { diff --git a/PadelClub/Extensions/Locale+Extensions.swift b/PadelClub/Extensions/Locale+Extensions.swift new file mode 100644 index 0000000..e1d91ba --- /dev/null +++ b/PadelClub/Extensions/Locale+Extensions.swift @@ -0,0 +1,23 @@ +// +// Locale+Extensions.swift +// PadelClub +// +// Created by Laurent Morvillier on 03/04/2024. +// + +import Foundation + +extension Locale { + + static func countries() -> [String] { + var countries: [String] = [] + + for countryCode in Locale.isoRegionCodes { + if let countryName = Locale.current.localizedString(forRegionCode: countryCode) { + countries.append(countryName) + } + } + + return countries.sorted() + } +} diff --git a/PadelClub/Views/User/AccountView.swift b/PadelClub/Views/User/AccountView.swift index d386646..d524d2f 100644 --- a/PadelClub/Views/User/AccountView.swift +++ b/PadelClub/Views/User/AccountView.swift @@ -27,7 +27,7 @@ struct AccountView: View { } #Preview { - AccountView(user: User(username: "coco")) { + AccountView(user: User(username: "coco", email: ",mail", firstName: "first", lastName: "last", phone: "44444", country: "US")) { } } diff --git a/PadelClub/Views/User/LoginView.swift b/PadelClub/Views/User/LoginView.swift index d6c0ece..0478b77 100644 --- a/PadelClub/Views/User/LoginView.swift +++ b/PadelClub/Views/User/LoginView.swift @@ -14,6 +14,8 @@ struct LoginView: View { @State var username: String = "razmig" @State var password: String = "StaxKikoo12" + + @State var showEmailPopup: Bool = false @State var error: Error? = nil @@ -38,16 +40,22 @@ struct LoginView: View { } Section { + NavigationLink("Sign up") { + UserCreationView() + } Button(action: { - self._signUp() - }, label: { - Text("Sign up") - }) - Button(action: { - self._forgottenPassword() + self.showEmailPopup = true }, label: { Text("Forgotten password") }) + .alert( + Text("Password reset"), + isPresented: self.$showEmailPopup + ) { + EmailConfirmationView() + } message: { + Text("Please enter your email") + } } } @@ -71,12 +79,34 @@ struct LoginView: View { } } - fileprivate func _signUp() { - +} + +struct EmailConfirmationView: View { + + @State var email: String = "" + + var body: some View { + VStack { + TextField("Email", text: self.$email) + .keyboardType(.emailAddress) + Button { + self._forgottenPassword() + } label: { + Text("Send email") + } + + } } fileprivate func _forgottenPassword() { -// Store.main.service?.forgotPassword(user: <#T##UserBase#>) + + Task { + do { + try await Store.main.service?.forgotPassword(email: self.email) + } catch { + Logger.error(error) + } + } } } @@ -86,3 +116,7 @@ struct LoginView: View { LoginView(handler: { _ in }) } } + +#Preview { + EmailConfirmationView() +} diff --git a/PadelClub/Views/User/UserCreationView.swift b/PadelClub/Views/User/UserCreationView.swift index c9029c6..7677ef4 100644 --- a/PadelClub/Views/User/UserCreationView.swift +++ b/PadelClub/Views/User/UserCreationView.swift @@ -11,18 +11,53 @@ import LeStorage struct UserCreationView: View { @State var username: String = "" - @State var password: String = "" + @State var password1: String = "" + @State var password2: String = "" @State var email: String = "" + @State var firstName: String = "" + @State var lastName: String = "" + @State var phone: String = "" + + @State var showUnmatchingPasswordView = false + @State var selectedCountryIndex = 0 + + let countries: [String] = Locale.countries() + var body: some View { Form { + + Section { + TextField("Username", text: self.$username) + .autocorrectionDisabled() + .textInputAutocapitalization(.never) + TextField("Email", text: self.$email) + .keyboardType(.emailAddress) + .textInputAutocapitalization(.never) + + } + + Section { + SecureField("Password", text: self.$password1) + SecureField("Confirm password", text: self.$password2) + } - TextField("Username", text: self.$username) - .autocorrectionDisabled() - TextField("Password", text: self.$password) - .autocorrectionDisabled() - TextField("Email", text: self.$email) + Section { + TextField("First Name", text: self.$firstName) + .autocorrectionDisabled() + TextField("Last Name", text: self.$lastName) + .autocorrectionDisabled() + TextField("Phone", text: self.$phone) + .autocorrectionDisabled() + Picker("Select a country", selection: $selectedCountryIndex) { + ForEach(0..