mirror of
https://github.com/status-im/react-native.git
synced 2025-01-14 19:44:13 +00:00
56d25bbbdd
Summary: The CameraRoll-related APIs were mixed in with the Image classes due to legacy coupling issues. Now that the APIs have been decoupled, it makes more sense for the CameraRoll classes to live in a separate library. This will be a breaking change for apps using the CameraRoll or related APIs. Fix is to add the RCTCameraRoll lib to your project.
136 lines
4.4 KiB
Objective-C
136 lines
4.4 KiB
Objective-C
/*
|
|
* Copyright (c) 2013, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
#import "RCTImagePickerManager.h"
|
|
#import "RCTRootView.h"
|
|
|
|
#import <UIKit/UIKit.h>
|
|
|
|
#import <MobileCoreServices/UTCoreTypes.h>
|
|
|
|
@interface RCTImagePickerManager ()<UIImagePickerControllerDelegate, UINavigationControllerDelegate>
|
|
|
|
@end
|
|
|
|
@implementation RCTImagePickerManager
|
|
{
|
|
NSMutableArray *_pickers;
|
|
NSMutableArray *_pickerCallbacks;
|
|
NSMutableArray *_pickerCancelCallbacks;
|
|
}
|
|
|
|
RCT_EXPORT_MODULE(ImagePickerIOS);
|
|
|
|
- (instancetype)init
|
|
{
|
|
if ((self = [super init])) {
|
|
_pickers = [NSMutableArray new];
|
|
_pickerCallbacks = [NSMutableArray new];
|
|
_pickerCancelCallbacks = [NSMutableArray new];
|
|
}
|
|
return self;
|
|
}
|
|
|
|
RCT_EXPORT_METHOD(canRecordVideos:(RCTResponseSenderBlock)callback)
|
|
{
|
|
NSArray *availableMediaTypes = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];
|
|
callback(@[@([availableMediaTypes containsObject:(NSString *)kUTTypeMovie])]);
|
|
}
|
|
|
|
RCT_EXPORT_METHOD(canUseCamera:(RCTResponseSenderBlock)callback)
|
|
{
|
|
callback(@[@([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])]);
|
|
}
|
|
|
|
RCT_EXPORT_METHOD(openCameraDialog:(NSDictionary *)config
|
|
successCallback:(RCTResponseSenderBlock)callback
|
|
cancelCallback:(RCTResponseSenderBlock)cancelCallback)
|
|
{
|
|
UIWindow *keyWindow = [UIApplication sharedApplication].keyWindow;
|
|
UIViewController *rootViewController = keyWindow.rootViewController;
|
|
|
|
UIImagePickerController *imagePicker = [UIImagePickerController new];
|
|
imagePicker.delegate = self;
|
|
imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
|
|
|
|
if ([config[@"videoMode"] boolValue]) {
|
|
imagePicker.cameraCaptureMode = UIImagePickerControllerCameraCaptureModeVideo;
|
|
}
|
|
|
|
[_pickers addObject:imagePicker];
|
|
[_pickerCallbacks addObject:callback];
|
|
[_pickerCancelCallbacks addObject:cancelCallback];
|
|
|
|
[rootViewController presentViewController:imagePicker animated:YES completion:nil];
|
|
}
|
|
|
|
RCT_EXPORT_METHOD(openSelectDialog:(NSDictionary *)config
|
|
successCallback:(RCTResponseSenderBlock)callback
|
|
cancelCallback:(RCTResponseSenderBlock)cancelCallback)
|
|
{
|
|
UIWindow *keyWindow = [UIApplication sharedApplication].keyWindow;
|
|
UIViewController *rootViewController = keyWindow.rootViewController;
|
|
|
|
UIImagePickerController *imagePicker = [UIImagePickerController new];
|
|
imagePicker.delegate = self;
|
|
imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
|
|
|
|
NSMutableArray *allowedTypes = [NSMutableArray new];
|
|
if ([config[@"showImages"] boolValue]) {
|
|
[allowedTypes addObject:(NSString *)kUTTypeImage];
|
|
}
|
|
if ([config[@"showVideos"] boolValue]) {
|
|
[allowedTypes addObject:(NSString *)kUTTypeMovie];
|
|
}
|
|
|
|
imagePicker.mediaTypes = allowedTypes;
|
|
|
|
[_pickers addObject:imagePicker];
|
|
[_pickerCallbacks addObject:callback];
|
|
[_pickerCancelCallbacks addObject:cancelCallback];
|
|
|
|
[rootViewController presentViewController:imagePicker animated:YES completion:nil];
|
|
}
|
|
|
|
- (void)imagePickerController:(UIImagePickerController *)picker
|
|
didFinishPickingMediaWithInfo:(NSDictionary *)info
|
|
{
|
|
NSUInteger index = [_pickers indexOfObject:picker];
|
|
RCTResponseSenderBlock callback = _pickerCallbacks[index];
|
|
|
|
[_pickers removeObjectAtIndex:index];
|
|
[_pickerCallbacks removeObjectAtIndex:index];
|
|
[_pickerCancelCallbacks removeObjectAtIndex:index];
|
|
|
|
UIWindow *keyWindow = [UIApplication sharedApplication].keyWindow;
|
|
UIViewController *rootViewController = keyWindow.rootViewController;
|
|
[rootViewController dismissViewControllerAnimated:YES completion:nil];
|
|
|
|
callback(@[[info[UIImagePickerControllerReferenceURL] absoluteString]]);
|
|
}
|
|
|
|
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
|
|
{
|
|
NSUInteger index = [_pickers indexOfObject:picker];
|
|
RCTResponseSenderBlock callback = _pickerCancelCallbacks[index];
|
|
|
|
[_pickers removeObjectAtIndex:index];
|
|
[_pickerCallbacks removeObjectAtIndex:index];
|
|
[_pickerCancelCallbacks removeObjectAtIndex:index];
|
|
|
|
UIWindow *keyWindow = [UIApplication sharedApplication].keyWindow;
|
|
UIViewController *rootViewController = keyWindow.rootViewController;
|
|
[rootViewController dismissViewControllerAnimated:YES completion:nil];
|
|
|
|
callback(@[]);
|
|
}
|
|
|
|
@end
|