From 1e7a9a5ae59de3d1621661931e8015c1c7a3639c Mon Sep 17 00:00:00 2001 From: Stefan Ceriu Date: Mon, 22 Jun 2026 14:20:58 +0300 Subject: [PATCH] Don't report an empty media selection as a successful pick Both PhotoLibraryPicker and DocumentPicker reported failures via .error but still emitted .selectedMediaAtURLs([]) when every selected item failed to load or export (e.g. an iCloud photo that isn't downloaded, or a document that fails the security-scoped temp copy) - an empty "success" that consumers had to defend against. Skip that emission in both, and report .error for PhotoLibraryPicker's previously silent missing-content-type case so the user gets feedback. --- .../Screens/MediaPickerScreen/DocumentPicker.swift | 5 +++++ .../Screens/MediaPickerScreen/PhotoLibraryPicker.swift | 8 ++++++++ 2 files changed, 13 insertions(+) diff --git a/ElementX/Sources/Screens/MediaPickerScreen/DocumentPicker.swift b/ElementX/Sources/Screens/MediaPickerScreen/DocumentPicker.swift index 28287d8f1..972522b45 100644 --- a/ElementX/Sources/Screens/MediaPickerScreen/DocumentPicker.swift +++ b/ElementX/Sources/Screens/MediaPickerScreen/DocumentPicker.swift @@ -90,6 +90,11 @@ struct DocumentPicker: UIViewControllerRepresentable { } } + guard !selectedURLs.isEmpty else { + // Every picked document failed to copy; each failure was already surfaced via .error. + return + } + documentPicker.callback(.selectedMediaAtURLs(selectedURLs)) } } diff --git a/ElementX/Sources/Screens/MediaPickerScreen/PhotoLibraryPicker.swift b/ElementX/Sources/Screens/MediaPickerScreen/PhotoLibraryPicker.swift index 9f3931bb3..96e32afd1 100644 --- a/ElementX/Sources/Screens/MediaPickerScreen/PhotoLibraryPicker.swift +++ b/ElementX/Sources/Screens/MediaPickerScreen/PhotoLibraryPicker.swift @@ -104,6 +104,11 @@ struct PhotoLibraryPicker: UIViewControllerRepresentable { return selectedURLs.compactMap { $0 } } + guard !selectedURLs.isEmpty else { + // Every selected item failed to load; each failure was already surfaced via .error. + return + } + photoLibraryPicker.callback(.selectedMediaAtURLs(selectedURLs)) } } @@ -114,6 +119,9 @@ struct PhotoLibraryPicker: UIViewControllerRepresentable { let provider = result.itemProvider guard let contentType = provider.preferredContentType else { + Task { @MainActor in + photoLibraryPicker.callback(.error(.failedLoadingFileRepresentation(nil))) + } return nil }