iOS: gescanntes Einzelstueck oeffnet sich (Abbruch behoben)

Der Abruf schlug mit „Abgebrochen" (URLError.cancelled) fehl, nicht mit 404:
openItemUid wurde zu Beginn des .task(id:) auf nil gesetzt, wodurch SwiftUI die
laufende Anfrage abbrach. Jetzt wird openItemUid erst NACH dem Laden
zurueckgesetzt – das Stueck oeffnet sich.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-07-26 11:23:27 +02:00
parent dcee7cab6c
commit 914118e33a

View File

@@ -46,21 +46,22 @@ struct RootView: View {
} }
.task(id: router.openItemUid) { .task(id: router.openItemUid) {
guard let uid = router.openItemUid else { return } guard let uid = router.openItemUid else { return }
router.openItemUid = nil // openItemUid NICHT vor dem Abruf zurücksetzen: das ändert die
// .task-id und SwiftUI bricht dadurch die laufende Anfrage ab
// (URLError.cancelled). Erst nach dem Laden auf nil setzen.
let host = session.activeProfile?.url?.host ?? "?" let host = session.activeProfile?.url?.host ?? "?"
guard session.isLoggedIn else { if session.isLoggedIn {
do {
linkedItem = try await APIClient.shared.itemByUid(uid: uid)
} catch {
linkError = "Einzelstück \(uid) auf Server \(host) nicht gefunden. "
+ "Zeigt der QR-Code auf denselben Server wie der oben gewählte? "
+ "(\(error.localizedDescription))"
}
} else {
linkError = "Bitte zuerst am Server \(host) anmelden, dann erneut scannen." linkError = "Bitte zuerst am Server \(host) anmelden, dann erneut scannen."
return
}
do {
linkedItem = try await APIClient.shared.itemByUid(uid: uid)
} catch {
// Bei korrekter UID heißt 404 fast immer: der aktive Server ist ein
// anderer als der im QR-Code. Deshalb den Server benennen.
linkError = "Einzelstück \(uid) auf Server \(host) nicht gefunden. "
+ "Zeigt der QR-Code auf denselben Server wie der oben gewählte? "
+ "(\(error.localizedDescription))"
} }
router.openItemUid = nil
} }
.sheet(item: $linkedItem) { it in .sheet(item: $linkedItem) { it in
NavigationStack { ItemEditView(item: it) } NavigationStack { ItemEditView(item: it) }