import SwiftUI struct LoginView: View { @EnvironmentObject private var session: Session @State private var server: String = Session.shared.baseURL?.absoluteString ?? "" @State private var username = "" @State private var password = "" @State private var error: String? @State private var busy = false @State private var stayLoggedIn = Session.shared.stayLoggedIn var body: some View { NavigationStack { Form { Section("Server") { TextField("http://192.168.1.10:8080", text: $server) .textInputAutocapitalization(.never) .autocorrectionDisabled() .keyboardType(.URL) } Section("Anmeldung") { TextField("Benutzername", text: $username) .textInputAutocapitalization(.never) .autocorrectionDisabled() SecureField("Passwort", text: $password) Toggle("Angemeldet bleiben", isOn: $stayLoggedIn) } if !stayLoggedIn { Section { Text("Die Anmeldung gilt nur, solange die App geoeffnet ist.") .font(.caption).foregroundStyle(.secondary) } } if let error { Section { Text(error).foregroundStyle(.red).font(.callout) } } Section { Button(busy ? "Anmelden…" : "Anmelden") { Task { await login() } } .disabled(busy || server.isEmpty || username.isEmpty) } } .navigationTitle("Vorrania") } } private func login() async { error = nil busy = true defer { busy = false } session.setServer(server) do { let token = try await APIClient.shared.login(username: username, password: password) session.store(token: token.accessToken, username: token.username, isAdmin: token.role == "admin", persist: stayLoggedIn) } catch { self.error = error.localizedDescription } } }