1
1
import CropViewController
2
2
import Photos
3
- import PhotosUI
4
3
import TLPhotoPicker
5
4
import UIKit
6
5
@@ -35,9 +34,6 @@ class MultipleImagePicker: NSObject, UINavigationControllerDelegate {
35
34
var options = NSMutableDictionary ( )
36
35
var videoAssets = [ PHAsset] ( )
37
36
var videoCount = 0
38
- var imageRequestOptions = PHImageRequestOptions ( )
39
- var videoRequestOptions = PHVideoRequestOptions ( )
40
- var viewController : CustomPhotoPickerViewController ? = nil
41
37
42
38
// resolve/reject assets
43
39
var resolve : RCTPromiseResolveBlock !
@@ -46,62 +42,84 @@ class MultipleImagePicker: NSObject, UINavigationControllerDelegate {
46
42
@objc ( openPicker: withResolver: withRejecter: )
47
43
func openPicker( options: NSDictionary , resolve: @escaping RCTPromiseResolveBlock , reject: @escaping RCTPromiseRejectBlock ) {
48
44
self . setConfiguration ( options: options, resolve: resolve, reject: reject)
49
-
50
- self . viewController = CustomPhotoPickerViewController ( )
51
-
52
- self . viewController!. delegate = self
53
-
54
- // dismissPhotoPicker for CustomPhotoPickerViewController()
55
- self . viewController!. dismissPhotoPicker = { [ weak self] withPHAssets in
56
- self ? . dismissPhotoPicker ( withTLPHAssets: withPHAssets)
57
- }
58
-
59
- self . viewController!. didExceedMaximumNumberOfSelection = { [ weak self] picker in
60
- self ? . showExceededMaximumAlert ( vc: picker, isVideo: false )
61
- }
62
-
63
- self . viewController!. selectedAssets = self . selectedAssets
64
- self . viewController!. logDelegate = self
65
-
66
- self . viewController!. configure = config
67
-
45
+
68
46
// handle for Authorization === '.limit' on iOS 14 && limit selected === 0
69
47
if #available( iOS 14 , * ) {
70
- PHPhotoLibrary . requestAuthorization ( for: . readWrite) { [ weak self ] status in
48
+ PHPhotoLibrary . requestAuthorization ( for: . readWrite) { status in
71
49
if status == . limited {
72
- let options = PHFetchOptions ( )
73
- options. predicate = NSPredicate ( format: " mediaType = %d " , config. mediaType != nil ?
74
- ( config. mediaType == . image ? PHAssetMediaType . image. rawValue : PHAssetMediaType . video. rawValue) : PHAssetMediaType . unknown. rawValue)
75
-
76
- let fetchResult = PHAsset . fetchAssets ( with: options)
77
- if fetchResult. count == 0 {
78
- self !. presentLimitedLibraryPicker ( )
79
- return
80
- }
50
+ self . handleLimitedCondition ( )
51
+ return
81
52
}
82
- self ! . navigatePicker ( )
53
+ self . navigatePicker ( )
83
54
}
55
+
84
56
} else {
85
57
self . navigatePicker ( )
86
58
}
87
59
}
88
60
89
- func presentLimitedLibraryPicker( ) {
90
- if #available( iOS 14 , * ) {
91
- DispatchQueue . main. async {
92
- PHPhotoLibrary . shared ( ) . presentLimitedLibraryPicker ( from: self . getTopMostViewController ( ) !)
61
+ private func handleLimitedCondition( ) {
62
+ let options = PHFetchOptions ( )
63
+ options. predicate = NSPredicate ( format: " mediaType = %d " , config. mediaType != nil ?
64
+ ( config. mediaType == . image ? PHAssetMediaType . image. rawValue : PHAssetMediaType . video. rawValue) : PHAssetMediaType . unknown. rawValue)
65
+ let fetchResult = PHAsset . fetchAssets ( with: options)
66
+
67
+ if fetchResult. count == 0 {
68
+ self . presentLimitedController ( )
69
+ } else {
70
+ self . navigatePicker ( )
71
+ }
72
+ }
73
+
74
+ private func presentLimitedController( ) {
75
+ DispatchQueue . main. async {
76
+ if #available( iOS 14 , * ) {
77
+ if #available( iOS 15 , * ) {
78
+ let topViewController = self . getTopMostViewController ( ) !
79
+ var show = 0
80
+
81
+ PHPhotoLibrary . shared ( ) . presentLimitedLibraryPicker ( from: topViewController) { _ in
82
+ show += 1 // presentLimitedLibraryPicker run twice and I DONT KNOWWWWW...
83
+ if show == 1 {
84
+ topViewController. dismiss ( animated: true ) {
85
+ self . handleLimitedCondition ( )
86
+ }
87
+ }
88
+ }
89
+
90
+ } else {
91
+ PHPhotoLibrary . shared ( ) . presentLimitedLibraryPicker ( from: self . getTopMostViewController ( ) !)
92
+ }
93
93
}
94
94
}
95
95
}
96
-
96
+
97
97
func navigatePicker( ) {
98
+ let viewController = CustomPhotoPickerViewController ( )
99
+
100
+ viewController. delegate = self
101
+
102
+ // dismissPhotoPicker for CustomPhotoPickerViewController()
103
+ viewController. dismissPhotoPicker = { [ weak self] withPHAssets in
104
+ self ? . dismissPhotoPicker ( withTLPHAssets: withPHAssets)
105
+ }
106
+
107
+ viewController. didExceedMaximumNumberOfSelection = { [ weak self] picker in
108
+ self ? . showExceededMaximumAlert ( vc: picker, isVideo: false )
109
+ }
110
+
111
+ viewController. selectedAssets = self . selectedAssets
112
+ viewController. logDelegate = self
113
+
114
+ viewController. configure = config
115
+
98
116
DispatchQueue . main. async {
99
- self . viewController! . modalTransitionStyle = . coverVertical
100
- self . viewController! . modalPresentationStyle = . fullScreen
101
- self . getTopMostViewController ( ) ? . present ( self . viewController! , animated: true , completion: nil )
117
+ viewController. modalTransitionStyle = . coverVertical
118
+ viewController. modalPresentationStyle = . fullScreen
119
+ self . getTopMostViewController ( ) ? . present ( viewController, animated: true , completion: nil )
102
120
}
103
121
}
104
-
122
+
105
123
func getTopMostViewController( ) -> UIViewController ? {
106
124
var topMostViewController = UIApplication . shared. keyWindow? . rootViewController
107
125
while let presentedViewController = topMostViewController? . presentedViewController {
@@ -120,15 +138,6 @@ class MultipleImagePicker: NSObject, UINavigationControllerDelegate {
120
138
}
121
139
}
122
140
123
- // set image / video request option.
124
- self . imageRequestOptions. deliveryMode = . fastFormat
125
- self . imageRequestOptions. resizeMode = . fast
126
- self . imageRequestOptions. isNetworkAccessAllowed = true
127
- self . imageRequestOptions. isSynchronous = false
128
- self . videoRequestOptions. version = PHVideoRequestOptionsVersion . current
129
- self . videoRequestOptions. deliveryMode = PHVideoRequestOptionsDeliveryMode . automatic
130
- self . videoRequestOptions. isNetworkAccessAllowed = true
131
-
132
141
// config options
133
142
config. tapHereToChange = self . options [ " tapHereToChange " ] as! String
134
143
config. numberOfColumn = self . options [ " numberOfColumn " ] as! Int
@@ -308,7 +317,20 @@ extension MultipleImagePicker: TLPhotosPickerViewControllerDelegate {
308
317
}
309
318
310
319
func fetchAsset( TLAsset: TLPHAsset , completion: @escaping ( MediaResponse ) -> Void ) {
311
- TLAsset . tempCopyMediaFile ( videoRequestOptions: self . videoRequestOptions, imageRequestOptions: self . imageRequestOptions, livePhotoRequestOptions: nil , exportPreset: AVAssetExportPresetHighestQuality, convertLivePhotosToJPG: true , progressBlock: { _ in
320
+ // set image / video request option.
321
+ let imageRequestOptions = PHImageRequestOptions ( )
322
+ let videoRequestOptions = PHVideoRequestOptions ( )
323
+
324
+ imageRequestOptions. deliveryMode = . fastFormat
325
+ imageRequestOptions. resizeMode = . fast
326
+ imageRequestOptions. isNetworkAccessAllowed = true
327
+ imageRequestOptions. isSynchronous = false
328
+
329
+ videoRequestOptions. version = PHVideoRequestOptionsVersion . current
330
+ videoRequestOptions. deliveryMode = PHVideoRequestOptionsDeliveryMode . automatic
331
+ videoRequestOptions. isNetworkAccessAllowed = true
332
+
333
+ TLAsset . tempCopyMediaFile ( videoRequestOptions: videoRequestOptions, imageRequestOptions: imageRequestOptions, livePhotoRequestOptions: nil , exportPreset: AVAssetExportPresetHighestQuality, convertLivePhotosToJPG: true , progressBlock: { _ in
312
334
} , completionBlock: { filePath, fileType in
313
335
314
336
let object = MediaResponse ( filePath: filePath. absoluteString, mime: fileType, withTLAsset: TLAsset, isExportThumbnail: self . options [ " isExportThumbnail " ] as! Bool )
0 commit comments