From 6e7b43806dcf493e4c6ba01ff5d284df1f595eed Mon Sep 17 00:00:00 2001 From: Ramanpreet Nara Date: Fri, 19 Jul 2019 12:02:19 -0700 Subject: [PATCH] Add NativeModule Spec for ImagePickerIOS Summary: This diff introduces NativeImagePickerIOS. Reviewed By: fkgozali Differential Revision: D16287452 fbshipit-source-id: 80a334887c2155e76ab13e7adffefde258de7cdb --- .../FBReactNativeSpec-generated.mm | 55 +++++++++++++ .../FBReactNativeSpec/FBReactNativeSpec.h | 79 +++++++++++++++++++ Libraries/Image/ImagePickerIOS.js | 70 +++++++++++----- Libraries/Image/NativeImagePickerIOS.js | 38 +++++++++ 4 files changed, 222 insertions(+), 20 deletions(-) create mode 100644 Libraries/Image/NativeImagePickerIOS.js diff --git a/Libraries/FBReactNativeSpec/FBReactNativeSpec/FBReactNativeSpec-generated.mm b/Libraries/FBReactNativeSpec/FBReactNativeSpec/FBReactNativeSpec-generated.mm index 374a99f0d2d..9f199e9a296 100644 --- a/Libraries/FBReactNativeSpec/FBReactNativeSpec/FBReactNativeSpec-generated.mm +++ b/Libraries/FBReactNativeSpec/FBReactNativeSpec/FBReactNativeSpec-generated.mm @@ -986,6 +986,61 @@ namespace facebook { + } + + } // namespace react +} // namespace facebook +@implementation RCTCxxConvert (NativeImagePickerIOS_SpecOpenCameraDialogConfig) ++ (RCTManagedPointer *)JS_NativeImagePickerIOS_SpecOpenCameraDialogConfig:(id)json +{ + return facebook::react::managedPointer(json); +} +@end +@implementation RCTCxxConvert (NativeImagePickerIOS_SpecOpenSelectDialogConfig) ++ (RCTManagedPointer *)JS_NativeImagePickerIOS_SpecOpenSelectDialogConfig:(id)json +{ + return facebook::react::managedPointer(json); +} +@end +namespace facebook { + namespace react { + + + static facebook::jsi::Value __hostFunction_NativeImagePickerIOSSpecJSI_canRecordVideos(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "canRecordVideos", @selector(canRecordVideos:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeImagePickerIOSSpecJSI_canUseCamera(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "canUseCamera", @selector(canUseCamera:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeImagePickerIOSSpecJSI_openCameraDialog(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "openCameraDialog", @selector(openCameraDialog:successCallback:cancelCallback:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeImagePickerIOSSpecJSI_openSelectDialog(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "openSelectDialog", @selector(openSelectDialog:successCallback:cancelCallback:), args, count); + } + + + NativeImagePickerIOSSpecJSI::NativeImagePickerIOSSpecJSI(id instance, std::shared_ptr jsInvoker) + : ObjCTurboModule("ImagePickerIOS", instance, jsInvoker) { + + methodMap_["canRecordVideos"] = MethodMetadata {1, __hostFunction_NativeImagePickerIOSSpecJSI_canRecordVideos}; + + + methodMap_["canUseCamera"] = MethodMetadata {1, __hostFunction_NativeImagePickerIOSSpecJSI_canUseCamera}; + + + methodMap_["openCameraDialog"] = MethodMetadata {3, __hostFunction_NativeImagePickerIOSSpecJSI_openCameraDialog}; + + setMethodArgConversionSelector(@"openCameraDialog", 0, @"JS_NativeImagePickerIOS_SpecOpenCameraDialogConfig:"); + + methodMap_["openSelectDialog"] = MethodMetadata {3, __hostFunction_NativeImagePickerIOSSpecJSI_openSelectDialog}; + + setMethodArgConversionSelector(@"openSelectDialog", 0, @"JS_NativeImagePickerIOS_SpecOpenSelectDialogConfig:"); + + } } // namespace react diff --git a/Libraries/FBReactNativeSpec/FBReactNativeSpec/FBReactNativeSpec.h b/Libraries/FBReactNativeSpec/FBReactNativeSpec/FBReactNativeSpec.h index 62860466d9a..7a3e83d4e40 100644 --- a/Libraries/FBReactNativeSpec/FBReactNativeSpec/FBReactNativeSpec.h +++ b/Libraries/FBReactNativeSpec/FBReactNativeSpec/FBReactNativeSpec.h @@ -1102,6 +1102,65 @@ namespace facebook { }; } // namespace react } // namespace facebook + +namespace JS { + namespace NativeImagePickerIOS { + struct SpecOpenCameraDialogConfig { + bool unmirrorFrontFacingCamera() const; + bool videoMode() const; + + SpecOpenCameraDialogConfig(NSDictionary *const v) : _v(v) {} + private: + NSDictionary *_v; + }; + } +} + +@interface RCTCxxConvert (NativeImagePickerIOS_SpecOpenCameraDialogConfig) ++ (RCTManagedPointer *)JS_NativeImagePickerIOS_SpecOpenCameraDialogConfig:(id)json; +@end + +namespace JS { + namespace NativeImagePickerIOS { + struct SpecOpenSelectDialogConfig { + bool showImages() const; + bool showVideos() const; + + SpecOpenSelectDialogConfig(NSDictionary *const v) : _v(v) {} + private: + NSDictionary *_v; + }; + } +} + +@interface RCTCxxConvert (NativeImagePickerIOS_SpecOpenSelectDialogConfig) ++ (RCTManagedPointer *)JS_NativeImagePickerIOS_SpecOpenSelectDialogConfig:(id)json; +@end +@protocol NativeImagePickerIOSSpec + +- (void)canRecordVideos:(RCTResponseSenderBlock)callback; +- (void)canUseCamera:(RCTResponseSenderBlock)callback; +- (void)openCameraDialog:(JS::NativeImagePickerIOS::SpecOpenCameraDialogConfig &)config + successCallback:(RCTResponseSenderBlock)successCallback + cancelCallback:(RCTResponseSenderBlock)cancelCallback; +- (void)openSelectDialog:(JS::NativeImagePickerIOS::SpecOpenSelectDialogConfig &)config + successCallback:(RCTResponseSenderBlock)successCallback + cancelCallback:(RCTResponseSenderBlock)cancelCallback; + +@end +namespace facebook { + namespace react { + /** + * ObjC++ class for module 'ImagePickerIOS' + */ + + class JSI_EXPORT NativeImagePickerIOSSpecJSI : public ObjCTurboModule { + public: + NativeImagePickerIOSSpecJSI(id instance, std::shared_ptr jsInvoker); + + }; + } // namespace react +} // namespace facebook @protocol NativeJSCSamplingProfilerSpec - (void)operationComplete:(double)token @@ -2395,6 +2454,26 @@ inline JS::NativeI18nManager::Constants::Builder::Builder(const Input i) : _fact inline JS::NativeI18nManager::Constants::Builder::Builder(Constants i) : _factory(^{ return i.unsafeRawValue(); }) {} +inline bool JS::NativeImagePickerIOS::SpecOpenCameraDialogConfig::unmirrorFrontFacingCamera() const +{ + id const p = _v[@"unmirrorFrontFacingCamera"]; + return RCTBridgingToBool(p); +} +inline bool JS::NativeImagePickerIOS::SpecOpenCameraDialogConfig::videoMode() const +{ + id const p = _v[@"videoMode"]; + return RCTBridgingToBool(p); +} +inline bool JS::NativeImagePickerIOS::SpecOpenSelectDialogConfig::showImages() const +{ + id const p = _v[@"showImages"]; + return RCTBridgingToBool(p); +} +inline bool JS::NativeImagePickerIOS::SpecOpenSelectDialogConfig::showVideos() const +{ + id const p = _v[@"showVideos"]; + return RCTBridgingToBool(p); +} inline JS::NativeJSDevSupport::Constants::Builder::Builder(const Input i) : _factory(^{ NSMutableDictionary *d = [NSMutableDictionary new]; auto ERROR_CODE_EXCEPTION = i.ERROR_CODE_EXCEPTION.get(); diff --git a/Libraries/Image/ImagePickerIOS.js b/Libraries/Image/ImagePickerIOS.js index 0254e222c5c..378636d0fcb 100644 --- a/Libraries/Image/ImagePickerIOS.js +++ b/Libraries/Image/ImagePickerIOS.js @@ -10,42 +10,72 @@ 'use strict'; -const RCTImagePicker = require('../BatchedBridge/NativeModules').ImagePickerIOS; +import NativeImagePickerIOS from './NativeImagePickerIOS'; +import invariant from 'invariant'; const ImagePickerIOS = { - canRecordVideos: function(callback: Function) { - return RCTImagePicker.canRecordVideos(callback); + canRecordVideos: function(callback: (result: boolean) => void) { + invariant(NativeImagePickerIOS, 'ImagePickerIOS is not available'); + return NativeImagePickerIOS.canRecordVideos(callback); }, - canUseCamera: function(callback: Function) { - return RCTImagePicker.canUseCamera(callback); + canUseCamera: function(callback: (result: boolean) => void) { + invariant(NativeImagePickerIOS, 'ImagePickerIOS is not available'); + return NativeImagePickerIOS.canUseCamera(callback); }, openCameraDialog: function( - config: Object, - successCallback: Function, - cancelCallback: Function, + config: $ReadOnly<{| + unmirrorFrontFacingCamera?: boolean, + videoMode?: boolean, + |}>, + successCallback: (imageURL: string, height: number, width: number) => void, + cancelCallback: () => void, ) { - config = { - videoMode: false, - ...config, + invariant(NativeImagePickerIOS, 'ImagePickerIOS is not available'); + + var newConfig = { + videoMode: true, + unmirrorFrontFacingCamera: false, }; - return RCTImagePicker.openCameraDialog( - config, + + if (config.videoMode != null) { + newConfig.videoMode = config.videoMode; + } + + if (config.unmirrorFrontFacingCamera != null) { + newConfig.unmirrorFrontFacingCamera = config.unmirrorFrontFacingCamera; + } + + return NativeImagePickerIOS.openCameraDialog( + newConfig, successCallback, cancelCallback, ); }, openSelectDialog: function( - config: Object, - successCallback: Function, - cancelCallback: Function, + config: $ReadOnly<{| + showImages?: boolean, + showVideos?: boolean, + |}>, + successCallback: (imageURL: string, height: number, width: number) => void, + cancelCallback: () => void, ) { - config = { + invariant(NativeImagePickerIOS, 'ImagePickerIOS is not available'); + + var newConfig = { showImages: true, showVideos: false, - ...config, }; - return RCTImagePicker.openSelectDialog( - config, + + if (config.showImages != null) { + newConfig.showImages = config.showImages; + } + + if (config.showVideos != null) { + newConfig.showVideos = config.showVideos; + } + + return NativeImagePickerIOS.openSelectDialog( + newConfig, successCallback, cancelCallback, ); diff --git a/Libraries/Image/NativeImagePickerIOS.js b/Libraries/Image/NativeImagePickerIOS.js new file mode 100644 index 00000000000..668a2af7e34 --- /dev/null +++ b/Libraries/Image/NativeImagePickerIOS.js @@ -0,0 +1,38 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @flow + * @format + */ + +'use strict'; + +import type {TurboModule} from '../TurboModule/RCTExport'; +import * as TurboModuleRegistry from '../TurboModule/TurboModuleRegistry'; + +export interface Spec extends TurboModule { + +getConstants: () => {||}; + +canRecordVideos: (callback: (result: boolean) => void) => void; + +canUseCamera: (callback: (result: boolean) => void) => void; + +openCameraDialog: ( + config: {| + unmirrorFrontFacingCamera: boolean, + videoMode: boolean, + |}, + successCallback: (imageURL: string, height: number, width: number) => void, + cancelCallback: () => void, + ) => void; + +openSelectDialog: ( + config: {| + showImages: boolean, + showVideos: boolean, + |}, + successCallback: (imageURL: string, height: number, width: number) => void, + cancelCallback: () => void, + ) => void; +} + +export default TurboModuleRegistry.get('ImagePickerIOS');