mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-05 11:58:32 +00:00
Fixes #4435 - Preserve the user chosen order when uploading multiple media files.
This commit is contained in:
@@ -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 })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user