import SwiftUI import UIKit struct SharingFilesPickerView: View { @EnvironmentObject var store: AppStore var body: some View { DocumentPicker( completion: { dataArray, extensionsArray in store.dispatch(.sharingAction(.showSharing(false))) store.dispatch(.sharingAction(.shareDocuments(dataArray, extensionsArray))) }, cancel: { store.dispatch(.sharingAction(.showSharing(false))) } ) } } struct DocumentPicker: UIViewControllerRepresentable { let completion: ([Data], [String]) -> Void let cancel: () -> Void func makeUIViewController(context: UIViewControllerRepresentableContext) -> UIDocumentPickerViewController { let picker: UIDocumentPickerViewController picker = UIDocumentPickerViewController(forOpeningContentTypes: [.item], asCopy: true) picker.delegate = context.coordinator picker.allowsMultipleSelection = true return picker } func updateUIViewController(_: UIDocumentPickerViewController, context _: UIViewControllerRepresentableContext) {} func makeCoordinator() -> Coordinator { Coordinator(self) } class Coordinator: NSObject, UIDocumentPickerDelegate { var parent: DocumentPicker init(_ parent: DocumentPicker) { self.parent = parent } func documentPicker(_: UIDocumentPickerViewController, didPickDocumentsAt: [URL]) { var dataArray = [Data]() var extensionArray = [String]() for url in didPickDocumentsAt { do { let data = try Data(contentsOf: url) dataArray.append(data) extensionArray.append(url.pathExtension) } catch { print("Unable to load data from \(url): \(error)") } } parent.completion(dataArray, extensionArray) } func documentPickerWasCancelled(_: UIDocumentPickerViewController) { parent.cancel() } } }