diff --git a/ios/Sources/RootView.swift b/ios/Sources/RootView.swift index 69611b8..ec919f5 100644 --- a/ios/Sources/RootView.swift +++ b/ios/Sources/RootView.swift @@ -46,21 +46,22 @@ struct RootView: View { } .task(id: router.openItemUid) { 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 ?? "?" - 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." - 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 NavigationStack { ItemEditView(item: it) }