Skip to content

Commit a6cfa54

Browse files
committed
fix: Fix condition limited access == true && asset count == 0
1 parent 3d50945 commit a6cfa54

File tree

3 files changed

+78
-56
lines changed

3 files changed

+78
-56
lines changed

example/src/App.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ export default function App() {
4545

4646
const onPicker = async () => {
4747
try {
48-
const singleSelectedMode = false;
48+
const singleSelectedMode = true;
4949

5050
const response = await openPicker({
5151
selectedAssets: images,
@@ -55,7 +55,7 @@ export default function App() {
5555
singleSelectedMode,
5656
isCrop: true,
5757
usedCameraButton: false,
58-
mediaType: 'video',
58+
mediaType: 'image',
5959
});
6060

6161
const crop = response.crop;

ios/MultipleImagePicker.swift

Lines changed: 75 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import CropViewController
22
import Photos
3-
import PhotosUI
43
import TLPhotoPicker
54
import UIKit
65

@@ -35,9 +34,6 @@ class MultipleImagePicker: NSObject, UINavigationControllerDelegate {
3534
var options = NSMutableDictionary()
3635
var videoAssets = [PHAsset]()
3736
var videoCount = 0
38-
var imageRequestOptions = PHImageRequestOptions()
39-
var videoRequestOptions = PHVideoRequestOptions()
40-
var viewController: CustomPhotoPickerViewController? = nil
4137

4238
// resolve/reject assets
4339
var resolve: RCTPromiseResolveBlock!
@@ -46,62 +42,84 @@ class MultipleImagePicker: NSObject, UINavigationControllerDelegate {
4642
@objc(openPicker:withResolver:withRejecter:)
4743
func openPicker(options: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
4844
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+
6846
// handle for Authorization === '.limit' on iOS 14 && limit selected === 0
6947
if #available(iOS 14, *) {
70-
PHPhotoLibrary.requestAuthorization(for: .readWrite) { [weak self] status in
48+
PHPhotoLibrary.requestAuthorization(for: .readWrite) { status in
7149
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
8152
}
82-
self!.navigatePicker()
53+
self.navigatePicker()
8354
}
55+
8456
} else {
8557
self.navigatePicker()
8658
}
8759
}
8860

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+
}
9393
}
9494
}
9595
}
96-
96+
9797
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+
98116
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)
102120
}
103121
}
104-
122+
105123
func getTopMostViewController() -> UIViewController? {
106124
var topMostViewController = UIApplication.shared.keyWindow?.rootViewController
107125
while let presentedViewController = topMostViewController?.presentedViewController {
@@ -120,15 +138,6 @@ class MultipleImagePicker: NSObject, UINavigationControllerDelegate {
120138
}
121139
}
122140

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-
132141
// config options
133142
config.tapHereToChange = self.options["tapHereToChange"] as! String
134143
config.numberOfColumn = self.options["numberOfColumn"] as! Int
@@ -308,7 +317,20 @@ extension MultipleImagePicker: TLPhotosPickerViewControllerDelegate {
308317
}
309318

310319
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
312334
}, completionBlock: { filePath, fileType in
313335

314336
let object = MediaResponse(filePath: filePath.absoluteString, mime: fileType, withTLAsset: TLAsset, isExportThumbnail: self.options["isExportThumbnail"] as! Bool)

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@baronha/react-native-multiple-image-picker",
3-
"version": "1.1.1",
3+
"version": "1.1.2",
44
"description": "react-native-multiple-image-picker enables application to pick images and videos from multiple smart album in iOS/Android, similar to the current facebook app.",
55
"main": "lib/commonjs/index",
66
"module": "lib/module/index",

0 commit comments

Comments
 (0)