Product
Socket Now Supports uv.lock Files
Socket now supports uv.lock files to ensure consistent, secure dependency resolution for Python projects and enhance supply chain security.
react-native-event-bridge
Advanced tools
Send and Receive events between React Native and native.
Send and Receive events between React Native and native.
This project is currently in beta.
Core APIs are subject to change. We encourage people to try this library out and provide us feedback as we get it to a stable state.
$ npm install react-native-event-bridge --save
$ react-native link react-native-event-bridge
Libraries
➜ Add Files to [your project's name]
node_modules
➜ react-native-event-bridge
and add MSREventBridge.xcodeproj
libMSREventBridge.a
to your project's Build Phases
➜ Link Binary With Libraries
Cmd+R
)<You can use CocoaPods to manage your native (Swift and Objective-C) dependencies:
pod 'MSREventBridge', :path => '../node_modules/react-native-event-bridge'
android/app/src/main/java/[...]/MainActivity.java
import net.mischneider.MSREventBridgePackage;
to the imports at the top of the filenew MSREventBridgePackage()
to the list returned by the getPackages()
methodandroid/settings.gradle
:
include ':react-native-event-bridge'
project(':react-native-event-bridge').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-event-bridge/android')
android/app/build.gradle
:
compile project(':react-native-event-bridge')
For different usage examples look into the example and example-swift folder.
import EventBridge from 'react-native-event-bridge';
// Emit an event from within a React component
EventBridge.emitEvent(this, 'PresentScreen');
// Emit an event with callback from within a React component
EventBridge.emitEventCallback(this, 'EventWithCallback', () => {
Alert.alert("Callback Response", "Some Callback Response");
});
#import "MSREventBridge.h"
// Receiver needs to conform to the MSREventBridgeEventReceiver protocol
@interface ViewController () <MSREventBridgeEventReceiver>
// ...
@end
// Implement the following two methods by receiver that conforms to MSREventBridgeEventReceiver
// Handle events
- (void)onEventWithName:(NSString *)eventName info:(nullable NSDictionary *)info
{
// Handle events dispatched from React Native
RCTLog(@"%@ - Received event: '%@', with info: %@", self.UUID.UUIDString, eventName, info);
// Example for PresentScreen event
if ([eventName isEqualToString:PresentScreenEvent] ) {
ViewController *newViewController = [ViewController new];
[self presentViewController:newViewController animated:YES completion:nil];
return;
}
// ...
}
// Handle events with callback
- (void)onEventWithName:(NSString *)eventName info:(nullable NSDictionary *)info callback:(MSREventBridgeReventReceiverCallback)callback;
{
// ...
}
import net.mischneider.MSREventBridgeEventReceiver;
import net.mischneider.MSREventBridgeReceiverCallback;
// Receiver needs to implement MSREventBridgeEventReceiver e.g.
public class MainActivity extends ReactActivity implements MSREventBridgeEventReceiver {
// ...
// Implement the following two methods by receiver that conforms to MSREventBridgeEventReceiver
// Handle events
@Override
public void onEvent(final String name, final ReadableMap info) {
Log.d(ReactConstants.TAG, this.getClass().getName() + ": Received event: ".concat(name));
// Example to just present a new activity
if (name.equals(PresentScreenEventName)) {
Intent myIntent = new Intent(getBaseContext(), SecondActivity.class);
startActivity(myIntent);
return;
}
// ...
}
// Handle events with callback
@Override
public void onEventCallback(final String name, final ReadableMap info, final MSREventBridgeReceiverCallback callback) {
// Handle event with callback
// ...
}
// ...
}
// Import PropTypes for contextTypes
import PropTypes from 'prop-types';
// Import EventBridge from the react-native-event-bridge native module
import EventBridge from 'react-native-event-bridge';
// Event listener need to define a rootTag contextType.
static contextTypes = {
rootTag: PropTypes.number,
};
// Add and remove as event listener
componentDidMount() {
// Register for any kind of event that will be sent from the native side
this._eventSubscription = EventBridge.addEventListener(this, (name, info) => {
console.log("Received event from native: '" + name + "' with info: " + JSON.stringify(info));
});
}
componentWillUnmount() {
this._eventSubscription && this._eventSubscription.remove();
}
//...
// Get the RCTBridge
RCTBridge *bridge = ...;
// Send an event with name 'eventName' to listeners for this event within the React Native component hierarchy
// of that is managed by this view
[bridge.viewControllerEventEmitter emitEventForView:self.view name:@"eventName" info:@{
@"rowSelected" : info[@"rowID"]
}];
/...
// Get the MSREventBridgeInstanceManagerProvider somehow
MSREventBridgeInstanceManagerProvider instanceManagerProvider =
(MSREventBridgeInstanceManagerProvider)this.getApplicationContext();
// Emit event via MSREventBridgeModule
String rowID = ...;
WritableMap map = new WritableNativeMap();
map.putString("rowSelected", rowID);
MSREventBridgeModule.emitEventForActivity(this, instanceManagerProvider, "eventName", map);
// Fetch some data
this.setState({
isLoading: true
})
// Load some data and update the data source
EventBridge.emitEventInfoCallback(this, 'LoadData', {'count' : 10}, (error, result) => {
this.setState({
isLoading: false,
dataSource: this.state.dataSource.cloneWithRows(result),
});
});
- (void)onEventWithName:(NSString *)eventName info:(nullable NSDictionary *)info callback:(MSREventBridgeReventReceiverCallback)callback
{
RCTLog(@"%@ - Received event that expects callback: '%@', with info: %@", self.UUID.UUIDString, eventName, info);
// Example for LoadData event
if ([eventName isEqualToString:LoadDataEvent]) {
// Get the count parameter from the LoadDataEvent
NSNumber *count = info[LoadDataEventCountParameterKey];
// Simulate some data fetching
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSMutableArray *responseData = [NSMutableArray array];
for (int i = 0; i < count.integerValue; i++) {
[responseData addObject:[NSString stringWithFormat:@"row %i", i]];
}
// Call callback with some error as first parameter if so and second with response data
if (callback) {
callback(nil, responseData);
}
});
return;
}
// ...
}
@Override
public void onEventCallback(final String name, final ReadableMap info, final MSREventBridgeReceiverCallback callback) {
Log.d(ReactConstants.TAG, this.getClass().getName() + ": Received event with callback: ".concat(name));
final String activityClassName = this.getClass().getSimpleName();
// Example how to load some async data
if (name.equals(LoadDataEventName)) {
final int count = info.getInt("count");
// Simulate some data loading delay
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
WritableArray array = new WritableNativeArray();
for (int i = 0; i < count; i++) {
array.pushString("Row " + i + " - " + activityClassName);
}
callback.onSuccess(array);
}
}, 2000);
return;
}
//...
}
$ cd example && npm run-script sync-rneb
. This will
make changes that you make to the module available to the example app, in
a way that will trigger the Example app’s ‘packager’ to reload those files.$ cd example && react-native run-ios
. This will start the
‘packager’ for the example app, which serves the processed JS source to the
Example app.Copyright 2017-2018 Michael Schneider
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
FAQs
Send and Receive events between React Native and native.
We found that react-native-event-bridge demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Product
Socket now supports uv.lock files to ensure consistent, secure dependency resolution for Python projects and enhance supply chain security.
Research
Security News
Socket researchers have discovered multiple malicious npm packages targeting Solana private keys, abusing Gmail to exfiltrate the data and drain Solana wallets.
Security News
PEP 770 proposes adding SBOM support to Python packages to improve transparency and catch hidden non-Python dependencies that security tools often miss.