Inhalt

Aktueller Ordner: duesseldorfer-schuelerinventar-swift-client/Duesk/Views
⬅ Übergeordnet

LoginView.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()
        }
    }
}