You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
PadelClub/PadelClub/Views/User/LoginView.swift

132 lines
3.3 KiB

//
// LoginView.swift
// PadelClub
//
// Created by Laurent Morvillier on 19/02/2024.
//
import SwiftUI
import LeStorage
struct LoginView: View {
@EnvironmentObject var dataStore: DataStore
@State var username: String = "razmig"
@State var password: String = "StaxKikoo12"
@State var showEmailPopup: Bool = false
@State var error: Error? = nil
var showEmailValidationMessage: Bool = false
var handler: (User) -> ()
var body: some View {
Form {
Section {
TextField("Username", text: self.$username)
.autocorrectionDisabled()
.textInputAutocapitalization(.never)
SecureField("Password", text: self.$password)
} header: {
if self.showEmailValidationMessage {
Text("Vous pouvez maintenant ouvrir votre boîte mail pour valider votre compte. Vous pourrez ensuite vous connecter ici.")
}
}
Section {
Button(action: {
self._login()
}, label: {
Text("Login")
})
.frame(maxWidth: .infinity)
}
if !self.showEmailValidationMessage {
Section {
NavigationLink("Sign up") {
UserCreationView()
}
Button(action: {
self.showEmailPopup = true
}, label: {
Text("Forgotten password")
})
.alert(
Text("Password reset"),
isPresented: self.$showEmailPopup
) {
EmailConfirmationView()
} message: {
Text("Please enter your email")
}
}
}
}
.navigationTitle("Login")
}
fileprivate func _login() {
Task {
do {
let service = try Store.main.service()
let user: User = try await service.login(
username: self.username,
password: self.password)
self.dataStore.setUser(user)
self.handler(user)
} catch {
Logger.error(error)
}
}
}
}
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() {
Task {
do {
let service = try Store.main.service()
try await service.forgotPassword(email: self.email)
} catch {
Logger.error(error)
}
}
}
}
#Preview {
NavigationStack {
LoginView(handler: { _ in })
}
}
#Preview {
EmailConfirmationView()
}