Fixes #4435 - Preserve the user chosen order when uploading multiple media files.

This commit is contained in:
Stefan Ceriu
2025-08-24 10:17:50 +03:00
parent 64306dd315
commit e4de85c7ba
2 changed files with 22 additions and 16 deletions
@@ -34,7 +34,7 @@ struct PhotoLibraryPicker: UIViewControllerRepresentable {
func makeUIViewController(context: Context) -> PHPickerViewController { func makeUIViewController(context: Context) -> PHPickerViewController {
var configuration = PHPickerConfiguration(photoLibrary: .shared()) var configuration = PHPickerConfiguration(photoLibrary: .shared())
configuration.selection = .ordered
configuration.selectionLimit = switch selectionType { configuration.selectionLimit = switch selectionType {
case .single: case .single:
1 1
@@ -86,18 +86,21 @@ struct PhotoLibraryPicker: UIViewControllerRepresentable {
Task { Task {
let selectedURLs = await withTaskGroup { taskGroup in let selectedURLs = await withTaskGroup { taskGroup in
for result in results { for (index, result) in results.enumerated() {
taskGroup.addTask { await self.processResult(result) } taskGroup.addTask {
} let url = await self.processResult(result)
return (index, url)
var selectedURLs = [URL]()
for await url in taskGroup {
if let url {
selectedURLs.append(url)
} }
} }
return selectedURLs var selectedURLs = [URL?](repeating: nil, count: results.count)
for await (index, url) in taskGroup {
if let url {
selectedURLs[index] = url
}
}
return selectedURLs.compactMap { $0 }
} }
photoLibraryPicker.callback(.selectedMediaAtURLs(selectedURLs)) photoLibraryPicker.callback(.selectedMediaAtURLs(selectedURLs))
@@ -101,23 +101,26 @@ struct MediaUploadingPreprocessor {
/// and its associated details or any resulting error /// and its associated details or any resulting error
func processMedia(at urls: [URL], maxUploadSize: UInt) async -> Result<[MediaInfo], MediaUploadingPreprocessorError> { func processMedia(at urls: [URL], maxUploadSize: UInt) async -> Result<[MediaInfo], MediaUploadingPreprocessorError> {
await withTaskGroup { taskGroup in await withTaskGroup { taskGroup in
for url in urls { for (index, url) in urls.enumerated() {
taskGroup.addTask { taskGroup.addTask {
await processMedia(at: url, maxUploadSize: maxUploadSize) let result = await processMedia(at: url, maxUploadSize: maxUploadSize)
return (index, result)
} }
} }
var mediaInfos = [MediaInfo]() // Store results in their respective index as they come in
for await result in taskGroup { var results = [MediaInfo?](repeating: nil, count: urls.count)
for await (index, result) in taskGroup {
switch result { switch result {
case .success(let mediaInfo): case .success(let mediaInfo):
mediaInfos.append(mediaInfo) results[index] = mediaInfo
case .failure(let error): case .failure(let error):
return .failure(error) return .failure(error)
} }
} }
return .success(mediaInfos) return .success(results.compactMap { $0 })
} }
} }