Verbinden-Tab: Sicherung direkt nach dem Verbinden erstellbar

"Jetzt sichern"-Button erscheint sobald verbunden, noch bevor man in
den Einrichten-Tab wechselt -- Nutzer-Wunsch, um vor Änderungen ohne
Tab-Wechsel sichern zu können. Zeigt zusätzlich "Zuletzt gesichert: ..."
für den aktuell verbundenen Host, falls schon eine Sicherung existiert
(gefiltert auf den aktuellen Host, damit es bei mehreren Routern nicht
verwirrt). Nutzt dieselbe BackupViewModel/BackupService-Logik wie der
Sicherungen-Tab, eigene Instanz.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HReLXMbmPvtQ23p1iWiJNW
This commit is contained in:
Kay
2026-09-12 20:44:47 +02:00
co-authored by Claude Sonnet 5
parent 9d1aecc452
commit 9993f84311
@@ -3,6 +3,7 @@ import SwiftUI
struct ConnectView: View {
@ObservedObject private var connectionService: ConnectionService
@StateObject private var viewModel: ConnectViewModel
@StateObject private var backupViewModel = BackupViewModel()
init(connectionService: ConnectionService) {
self.connectionService = connectionService
@@ -37,7 +38,10 @@ struct ConnectView: View {
} detail: {
deviceDetail
}
.onAppear { viewModel.onAppear() }
.onAppear {
viewModel.onAppear()
backupViewModel.load()
}
.alert(
"Unbekanntes Zertifikat",
isPresented: certificateAlertBinding,
@@ -50,6 +54,18 @@ struct ConnectView: View {
} message: { fingerprint in
Text("Der Router hat sich mit einem unbekannten Zertifikat gemeldet.\nFingerabdruck: \(fingerprint)\n\nNur bestätigen, wenn dies dein eigenes Gerät im lokalen Netzwerk ist.")
}
.alert(
"Sicherung fehlgeschlagen",
isPresented: Binding(
get: { backupViewModel.errorMessage != nil },
set: { _ in backupViewModel.errorMessage = nil }
),
presenting: backupViewModel.errorMessage
) { _ in
Button("OK") {}
} message: { message in
Text(message)
}
}
private var certificateFingerprint: String? {
@@ -82,6 +98,32 @@ struct ConnectView: View {
Section {
Label("Verbunden (\(kind == .rest ? "REST-API" : "SSH"))", systemImage: "checkmark.circle.fill")
.foregroundStyle(.green)
Button {
if let credentials = connectionService.credentials {
backupViewModel.createBackup(for: credentials)
}
} label: {
if backupViewModel.isCreatingBackup {
HStack {
ProgressView()
Text("Sichere…")
}
} else {
Label("Jetzt sichern", systemImage: "square.and.arrow.down")
}
}
.disabled(backupViewModel.isCreatingBackup)
.help("Sichert die aktuelle Router-Konfiguration — sinnvoll direkt nach dem Verbinden, bevor du im Einrichten-Tab etwas änderst.")
if let lastBackup = backupViewModel.backups.first(where: { $0.host == connectionService.credentials?.host }) {
Label(
"Zuletzt gesichert: \(lastBackup.createdAt.formatted(date: .abbreviated, time: .standard))",
systemImage: "checkmark"
)
.font(.caption)
.foregroundStyle(.secondary)
}
}
case .failed(let message):
Section {