mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-04 19:44:05 +00:00
Improve media uploading content type selection. Fix pasting in screenshots not working
This commit is contained in:
committed by
Stefan Ceriu
parent
ba02c439dd
commit
061e66ff57
@@ -15,12 +15,30 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
|
import UniformTypeIdentifiers
|
||||||
|
|
||||||
extension NSItemProvider {
|
extension NSItemProvider {
|
||||||
var isSupportedForPasteOrDrop: Bool {
|
var isSupportedForPasteOrDrop: Bool {
|
||||||
!registeredContentTypes
|
preferredContentType != nil
|
||||||
.compactMap(\.preferredMIMEType)
|
}
|
||||||
.filter { $0.hasPrefix("image/") || $0.hasPrefix("video/") || $0.hasPrefix("application/") }
|
|
||||||
.isEmpty
|
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/")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ struct PhotoLibraryPicker: UIViewControllerRepresentable {
|
|||||||
|
|
||||||
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
|
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
|
||||||
guard let provider = results.first?.itemProvider,
|
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)
|
photoLibraryPicker.callback(.cancel)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -335,8 +335,8 @@ class RoomScreenViewModel: RoomScreenViewModelType, RoomScreenViewModelProtocol
|
|||||||
// Pasting and dropping
|
// Pasting and dropping
|
||||||
|
|
||||||
private func handlePasteOrDrop(_ provider: NSItemProvider) {
|
private func handlePasteOrDrop(_ provider: NSItemProvider) {
|
||||||
guard let type = provider.registeredContentTypes.first,
|
guard let contentType = provider.preferredContentType,
|
||||||
let preferredExtension = type.preferredFilenameExtension else {
|
let preferredExtension = contentType.preferredFilenameExtension else {
|
||||||
MXLog.error("Invalid NSItemProvider: \(provider)")
|
MXLog.error("Invalid NSItemProvider: \(provider)")
|
||||||
displayError(.toast(L10n.screenRoomErrorFailedProcessingMedia))
|
displayError(.toast(L10n.screenRoomErrorFailedProcessingMedia))
|
||||||
return
|
return
|
||||||
@@ -345,7 +345,7 @@ class RoomScreenViewModel: RoomScreenViewModelType, RoomScreenViewModelProtocol
|
|||||||
let providerSuggestedName = provider.suggestedName
|
let providerSuggestedName = provider.suggestedName
|
||||||
let providerDescription = provider.description
|
let providerDescription = provider.description
|
||||||
|
|
||||||
_ = provider.loadDataRepresentation(for: type) { data, error in
|
_ = provider.loadDataRepresentation(for: contentType) { data, error in
|
||||||
Task { @MainActor in
|
Task { @MainActor in
|
||||||
let loadingIndicatorIdentifier = UUID().uuidString
|
let loadingIndicatorIdentifier = UUID().uuidString
|
||||||
ServiceLocator.shared.userIndicatorController.submitIndicator(UserIndicator(id: loadingIndicatorIdentifier, type: .modal, title: L10n.commonLoading, persistent: true))
|
ServiceLocator.shared.userIndicatorController.submitIndicator(UserIndicator(id: loadingIndicatorIdentifier, type: .modal, title: L10n.commonLoading, persistent: true))
|
||||||
|
|||||||
Reference in New Issue
Block a user