Skip to content

Commit ece373d

Browse files
RSNarafacebook-github-bot
authored andcommitted
Introduce RCTCallableJSModules
Summary: This is a Bridgeless-compatible API to allow our NativeModules to call JSModule methods. Changelog: [iOS][Added] - Introduce RCTCallableJSModules API for NativeModules Differential Revision: D28395448 fbshipit-source-id: b7929ba8b4cc4410361961b45efa23c76baacd24
1 parent c6d77a8 commit ece373d

File tree

2 files changed

+80
-0
lines changed

2 files changed

+80
-0
lines changed

React/Base/RCTBridgeModule.h

+33
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
@class RCTModuleRegistry;
1616
@class RCTViewRegistry;
1717
@class RCTBundleManager;
18+
@class RCTCallableJSModules;
1819

1920
/**
2021
* The type of a block that is capable of sending a response to a bridged
@@ -146,6 +147,17 @@ RCT_EXTERN_C_END
146147
*/
147148
@property (nonatomic, weak, readwrite) RCTBundleManager *bundleManager;
148149

150+
/**
151+
* A reference to an RCTCallableJSModules. Useful for modules that need to
152+
* call into methods on JavaScript modules registered as callable with
153+
* React Native.
154+
*
155+
* To implement this in your module, just add `@synthesize callableJSModules =
156+
* _callableJSModules;`. If using Swift, add `@objc var callableJSModules:
157+
* RCTCallableJSModules!` to your module.
158+
*/
159+
@property (nonatomic, weak, readwrite) RCTCallableJSModules *callableJSModules;
160+
149161
/**
150162
* A reference to the RCTBridge. Useful for modules that require access
151163
* to bridge features, such as sending events or making JS calls. This
@@ -443,3 +455,24 @@ typedef UIView * (^RCTBridgelessComponentViewProvider)(NSNumber *);
443455

444456
- (UIView *)viewForReactTag:(NSNumber *)reactTag;
445457
@end
458+
459+
typedef void (^RCTBridgelessJSModuleMethodInvoker)(
460+
NSString *moduleName,
461+
NSString *methodName,
462+
NSArray *args,
463+
dispatch_block_t onComplete);
464+
465+
/**
466+
* A class that allows NativeModules to call methods on JavaScript modules registered
467+
* as callable with React Native.
468+
*/
469+
@interface RCTCallableJSModules : NSObject
470+
- (void)setBridge:(RCTBridge *)bridge;
471+
- (void)setBridgelessJSModuleMethodInvoker:(RCTBridgelessJSModuleMethodInvoker)bridgelessJSModuleMethodInvoker;
472+
473+
- (void)invokeModule:(NSString *)moduleName method:(NSString *)methodName withArgs:(NSArray *)args;
474+
- (void)invokeModule:(NSString *)moduleName
475+
method:(NSString *)methodName
476+
withArgs:(NSArray *)args
477+
onComplete:(dispatch_block_t)onComplete;
478+
@end

React/Base/RCTCallableJSModules.m

+47
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/*
2+
* Copyright (c) Facebook, Inc. and its affiliates.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*/
7+
8+
#import "RCTBridge.h"
9+
#import "RCTBridgeModule.h"
10+
11+
@implementation RCTCallableJSModules {
12+
RCTBridgelessJSModuleMethodInvoker _bridgelessJSModuleMethodInvoker;
13+
__weak RCTBridge *_bridge;
14+
}
15+
16+
- (void)setBridge:(RCTBridge *)bridge
17+
{
18+
_bridge = bridge;
19+
}
20+
21+
- (void)setBridgelessJSModuleMethodInvoker:(RCTBridgelessJSModuleMethodInvoker)bridgelessJSModuleMethodInvoker
22+
{
23+
_bridgelessJSModuleMethodInvoker = bridgelessJSModuleMethodInvoker;
24+
}
25+
26+
- (void)invokeModule:(NSString *)moduleName method:(NSString *)methodName withArgs:(NSArray *)args
27+
{
28+
[self invokeModule:moduleName method:methodName withArgs:args onComplete:NULL];
29+
}
30+
31+
- (void)invokeModule:(NSString *)moduleName
32+
method:(NSString *)methodName
33+
withArgs:(NSArray *)args
34+
onComplete:(dispatch_block_t)onComplete
35+
{
36+
RCTBridge *bridge = _bridge;
37+
if (bridge) {
38+
[bridge enqueueJSCall:moduleName method:methodName args:args completion:onComplete];
39+
return;
40+
}
41+
42+
if (_bridgelessJSModuleMethodInvoker) {
43+
_bridgelessJSModuleMethodInvoker(moduleName, methodName, args, onComplete);
44+
}
45+
}
46+
47+
@end

0 commit comments

Comments
 (0)