Auf ausdruecklichen Wunsch jetzt auch die internen Bezeichner, weil die Installation noch keine echten Daten enthaelt: POSTGRES_USER/PASSWORD/DB, der Volume-Name, die Standard-DATABASE_URL, der localStorage-Schluessel und die iOS-Zeichenketten inklusive Keychain-Konto. Das setzt eine leere Datenbank voraus: Der neue Volume-Name legt eine neue, leere Datenbank an. Die alte bleibt als verwaistes Volume liegen und muss von Hand entfernt werden. Die Warnung in docker-compose.yml bleibt stehen, damit eine spaetere Umbenennung nicht versehentlich mit Daten im Volume passiert. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
61 lines
2.2 KiB
Swift
61 lines
2.2 KiB
Swift
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
|
|
}
|
|
}
|
|
}
|