Improve media uploading content type selection. Fix pasting in screenshots not working

This commit is contained in:
Stefan Ceriu
2023-05-06 13:52:57 +03:00
committed by Stefan Ceriu
parent b02c76ac1c
commit e9af6ec541
3 changed files with 26 additions and 8 deletions

View File

@@ -15,12 +15,30 @@
//
import Foundation
import UniformTypeIdentifiers
extension NSItemProvider {
var isSupportedForPasteOrDrop: Bool {
!registeredContentTypes
.compactMap(\.preferredMIMEType)
.filter { $0.hasPrefix("image/") || $0.hasPrefix("video/") || $0.hasPrefix("application/") }
.isEmpty
preferredContentType != nil
}
var preferredContentType: UTType? {
let supportedContentTypes = registeredContentTypes
.filter { isMimeTypeSupported($0.preferredMIMEType) }
// Have .jpeg take priority over .heic
if supportedContentTypes.contains(.jpeg) {
return .jpeg
}
return supportedContentTypes.first
}
private func isMimeTypeSupported(_ mimeType: String?) -> Bool {
guard let mimeType else {
return false
}
return mimeType.hasPrefix("image/") || mimeType.hasPrefix("video/") || mimeType.hasPrefix("application/")
}
}

View File

@@ -62,7 +62,7 @@ struct PhotoLibraryPicker: UIViewControllerRepresentable {
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
guard let provider = results.first?.itemProvider,
let contentType = provider.registeredContentTypes.filter({ $0.conforms(to: .image) || $0.conforms(to: .movie) || $0.conforms(to: .video) }).first else {
let contentType = provider.preferredContentType else {
photoLibraryPicker.callback(.cancel)
return
}

View File

@@ -335,8 +335,8 @@ class RoomScreenViewModel: RoomScreenViewModelType, RoomScreenViewModelProtocol
// Pasting and dropping
private func handlePasteOrDrop(_ provider: NSItemProvider) {
guard let type = provider.registeredContentTypes.first,
let preferredExtension = type.preferredFilenameExtension else {
guard let contentType = provider.preferredContentType,
let preferredExtension = contentType.preferredFilenameExtension else {
MXLog.error("Invalid NSItemProvider: \(provider)")
displayError(.toast(L10n.screenRoomErrorFailedProcessingMedia))
return
@@ -345,7 +345,7 @@ class RoomScreenViewModel: RoomScreenViewModelType, RoomScreenViewModelProtocol
let providerSuggestedName = provider.suggestedName
let providerDescription = provider.description
_ = provider.loadDataRepresentation(for: type) { data, error in
_ = provider.loadDataRepresentation(for: contentType) { data, error in
Task { @MainActor in
let loadingIndicatorIdentifier = UUID().uuidString
ServiceLocator.shared.userIndicatorController.submitIndicator(UserIndicator(id: loadingIndicatorIdentifier, type: .modal, title: L10n.commonLoading, persistent: true))