Inhalt
Aktueller Ordner:
duesseldorfer-schuelerinventar-swift-client/Duesk/ViewsLoginView.swift
import SwiftUI
struct LoginView: View {
@StateObject private var viewModel = LoginViewModel()
@State private var isLoggedIn = false
var body: some View {
VStack(spacing: 25) {
// Logo / Titel
VStack(spacing: 10) {
Image(systemName: "person.3.fill")
.font(.system(size: 60))
.foregroundColor(.blue)
Text("DÜSK")
.font(.largeTitle)
.fontWeight(.bold)
Text("Düsseldorfer Schülerinventar")
.font(.title3)
.foregroundColor(.secondary)
}
.padding(.top, 40)
Spacer()
// Login Form
VStack(spacing: 20) {
TextField("Benutzername", text: $viewModel.username)
.textFieldStyle(RoundedBorderTextFieldStyle())
.autocapitalization(.none)
.disableAutocorrection(true)
SecureField("Passwort", text: $viewModel.password)
.textFieldStyle(RoundedBorderTextFieldStyle())
}
.padding(.horizontal, 30)
// Login Button
if viewModel.isLoading {
ProgressView()
.padding()
} else {
Button(action: {
Task {
if await viewModel.login() {
isLoggedIn = true
}
}
}) {
Text("Anmelden")
.font(.headline)
.foregroundColor(.white)
.frame(maxWidth: .infinity)
.padding()
.background(Color.blue)
.cornerRadius(10)
}
.disabled(viewModel.username.isEmpty || viewModel.password.isEmpty)
.padding(.horizontal, 30)
}
if let error = viewModel.errorMessage {
Text(error)
.font(.caption)
.foregroundColor(.red)
.multilineTextAlignment(.center)
.padding(.horizontal)
}
Spacer()
// Footer
Text("Server: paul-koop.org | Demozugang: gast/gast")
.font(.caption2)
.foregroundColor(.gray)
.padding(.bottom, 20)
}
.frame(minWidth: 400, minHeight: 500)
.fullScreenCover(isPresented: $isLoggedIn) {
MainView()
}
}
}