From 187b25308415403dc11637b0baa7bc199036735f Mon Sep 17 00:00:00 2001 From: Matheus Davidson Date: Sat, 18 Feb 2023 13:56:43 -0300 Subject: [PATCH] feat(get-medias/sort): add option to customize sort on getMedias (#37) * feat(get-medias/sort): add option to customize sort on getMedias * refactor(get-medias/sort): make search accept either a string or an array * refactor(get-medias/sort): use MediaField type instead of string * chore(clean): remove print --- ios/Plugin.xcodeproj/project.pbxproj | 2 ++ ios/Plugin/MediaPlugin.swift | 30 +++++++++++++++++++++++++++- src/definitions.ts | 21 +++++++++++++++++++ 3 files changed, 52 insertions(+), 1 deletion(-) diff --git a/ios/Plugin.xcodeproj/project.pbxproj b/ios/Plugin.xcodeproj/project.pbxproj index e6d524f..da0a161 100644 --- a/ios/Plugin.xcodeproj/project.pbxproj +++ b/ios/Plugin.xcodeproj/project.pbxproj @@ -267,11 +267,13 @@ "${PODS_ROOT}/Target Support Files/Pods-PluginTests/Pods-PluginTests-frameworks.sh", "${BUILT_PRODUCTS_DIR}/Capacitor/Capacitor.framework", "${BUILT_PRODUCTS_DIR}/CapacitorCordova/Cordova.framework", + "${BUILT_PRODUCTS_DIR}/SDWebImage/SDWebImage.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Capacitor.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Cordova.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SDWebImage.framework", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; diff --git a/ios/Plugin/MediaPlugin.swift b/ios/Plugin/MediaPlugin.swift index c826ff5..1e6782a 100644 --- a/ios/Plugin/MediaPlugin.swift +++ b/ios/Plugin/MediaPlugin.swift @@ -286,7 +286,35 @@ public class MediaPlugin: CAPPlugin { let options = PHFetchOptions() options.fetchLimit = quantity - options.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: true)] + + // Set sort + var sortDescriptors = [] as [NSSortDescriptor]; + + // Handle when sort is string + if call.getString("sort") != nil { + let key = call.getString("sort") ?? "creationDate" + sortDescriptors.append(NSSortDescriptor(key: key, ascending: false)) + } + // Handle when sort is an array + else if let sortArray = call.getArray("sort") as? [[String: Any]] { + for object in sortArray { + + // Should have at least key for array value + if let key = object["key"] as? String { + let ascending = object["ascending"] as? Bool ?? false + sortDescriptors.append(NSSortDescriptor(key: key, ascending: ascending)) + } + } + } + + // Check if sort descriptors is empty + // it can happen because of validations inside the previous if, in this case, set a default value + if sortDescriptors.isEmpty { + sortDescriptors.append(NSSortDescriptor(key: "creationDate", ascending: false)) + } + + // Set sort descriptors + options.sortDescriptors = sortDescriptors if albumId != nil { let albumFetchResult = PHAssetCollection.fetchAssetCollections(withLocalIdentifiers: [albumId!], options: nil) diff --git a/src/definitions.ts b/src/definitions.ts index 648e965..3a4a790 100644 --- a/src/definitions.ts +++ b/src/definitions.ts @@ -37,8 +37,29 @@ export interface MediaFetchOptions { * Which album identifier to query in (get identifier with getAlbums()) */ albumIdentifier?: string; + /** + * Sort order of returned assets by field and ascending/descending + */ + sort?: MediaField | MediaSort[]; } +export interface MediaSort { + key: MediaField; + ascending: boolean; +} + +export type MediaField = + | 'meidaType' + | 'mediaSubtypes' + | 'sourceType' + | 'pixelWidth' + | 'pixelHeight' + | 'creationDate' + | 'modificationDate' + | 'duration' + | 'isFavorite' + | 'hasAdjustments'; + export interface MediaResponse { medias: MediaAsset[]; }