72 lines
2.4 KiB
Swift
72 lines
2.4 KiB
Swift
import SwiftUI
|
|
|
|
struct AuthView: View {
|
|
@EnvironmentObject private var router: AppRouter
|
|
@ObservedObject var viewModel: AuthViewModel
|
|
|
|
var body: some View {
|
|
VStack(spacing: 24) {
|
|
Spacer()
|
|
|
|
Text("Bookibra")
|
|
.font(Theme.headerSerif(size: 48))
|
|
.foregroundStyle(.black)
|
|
|
|
Picker("Mode", selection: $viewModel.mode) {
|
|
Text(String(localized: "auth.login")).tag(AuthViewModel.Mode.login)
|
|
Text(String(localized: "auth.register")).tag(AuthViewModel.Mode.register)
|
|
}
|
|
.pickerStyle(.segmented)
|
|
.padding(.horizontal, 24)
|
|
|
|
VStack(spacing: 14) {
|
|
TextField(String(localized: "auth.email"), text: $viewModel.email)
|
|
.textInputAutocapitalization(.never)
|
|
.keyboardType(.emailAddress)
|
|
.padding()
|
|
.background(Color.white, in: RoundedRectangle(cornerRadius: 12))
|
|
|
|
SecureField(String(localized: "auth.password"), text: $viewModel.password)
|
|
.padding()
|
|
.background(Color.white, in: RoundedRectangle(cornerRadius: 12))
|
|
}
|
|
.padding(.horizontal, 24)
|
|
|
|
if let error = viewModel.errorMessage {
|
|
Text(error)
|
|
.font(.footnote)
|
|
.foregroundStyle(.red)
|
|
.padding(.horizontal, 24)
|
|
.multilineTextAlignment(.center)
|
|
}
|
|
|
|
Button {
|
|
Task {
|
|
await viewModel.submit {
|
|
router.isAuthenticated = true
|
|
}
|
|
}
|
|
} label: {
|
|
if viewModel.isLoading {
|
|
ProgressView()
|
|
.tint(.white)
|
|
.frame(maxWidth: .infinity)
|
|
.padding(.vertical, 16)
|
|
} else {
|
|
Text(String(localized: "auth.continue"))
|
|
.font(.headline)
|
|
.foregroundStyle(.white)
|
|
.frame(maxWidth: .infinity)
|
|
.padding(.vertical, 16)
|
|
}
|
|
}
|
|
.background(Color.black)
|
|
.clipShape(Capsule())
|
|
.padding(.horizontal, 24)
|
|
|
|
Spacer()
|
|
}
|
|
.background(Theme.background.ignoresSafeArea())
|
|
}
|
|
}
|