Skip to content

Commit

Permalink
Consolidate eventTypes registry with view configs
Browse files Browse the repository at this point in the history
We already have one stateful module that contains all the view config.
We might as well store the event types there too. That way the shared
state is compartmentalized (and I can move it out in a follow up PR).

The view config registry also already has an appropriate place to call
processEventTypes so now we no longer have to do it in RN.

Will follow up with a PR to RN to remove that call.
  • Loading branch information
sebmarkbage committed Apr 6, 2018
1 parent 7a3416f commit f947cdc
Show file tree
Hide file tree
Showing 6 changed files with 50 additions and 59 deletions.
2 changes: 0 additions & 2 deletions packages/react-native-renderer/src/ReactFabric.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ import TouchHistoryMath from 'events/TouchHistoryMath';
import ReactVersion from 'shared/ReactVersion';

import NativeMethodsMixin from './NativeMethodsMixin';
import ReactNativeBridgeEventPlugin from './ReactNativeBridgeEventPlugin';
import ReactNativeComponent from './ReactNativeComponent';
import * as ReactNativeComponentTree from './ReactNativeComponentTree';
import ReactFabricRenderer from './ReactFabricRenderer';
Expand Down Expand Up @@ -84,7 +83,6 @@ const ReactFabric: ReactNativeType = {
// Used as a mixin in many createClass-based components
NativeMethodsMixin,
// Used by react-native-github/Libraries/ components
ReactNativeBridgeEventPlugin, // requireNativeComponent
ReactNativeComponentTree, // ScrollResponder
ReactNativePropRegistry, // flattenStyle, Stylesheet
TouchHistoryMath, // PanResponder
Expand Down
51 changes: 7 additions & 44 deletions packages/react-native-renderer/src/ReactNativeBridgeEventPlugin.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,23 @@
* @flow
*/

import type {ReactNativeBaseComponentViewConfig} from './ReactNativeTypes';
import type {AnyNativeEvent} from 'events/PluginModuleType';
import {
accumulateTwoPhaseDispatches,
accumulateDirectDispatches,
} from 'events/EventPropagators';
import * as ReactNativeViewConfigRegistry from './ReactNativeViewConfigRegistry';
import SyntheticEvent from 'events/SyntheticEvent';
import invariant from 'fbjs/lib/invariant';

const customBubblingEventTypes = {};
const customDirectEventTypes = {};
const {
customBubblingEventTypes,
customDirectEventTypes,
eventTypes,
} = ReactNativeViewConfigRegistry;

const ReactNativeBridgeEventPlugin = {
eventTypes: {},
eventTypes: eventTypes,

/**
* @see {EventPluginHub.extractEvents}
Expand Down Expand Up @@ -57,46 +60,6 @@ const ReactNativeBridgeEventPlugin = {
}
return event;
},

processEventTypes: function(
viewConfig: ReactNativeBaseComponentViewConfig,
): void {
const {bubblingEventTypes, directEventTypes} = viewConfig;

if (__DEV__) {
if (bubblingEventTypes != null && directEventTypes != null) {
for (const topLevelType in directEventTypes) {
invariant(
bubblingEventTypes[topLevelType] == null,
'Event cannot be both direct and bubbling: %s',
topLevelType,
);
}
}
}

if (bubblingEventTypes != null) {
for (const topLevelType in bubblingEventTypes) {
if (customBubblingEventTypes[topLevelType] == null) {
ReactNativeBridgeEventPlugin.eventTypes[
topLevelType
] = customBubblingEventTypes[topLevelType] =
bubblingEventTypes[topLevelType];
}
}
}

if (directEventTypes != null) {
for (const topLevelType in directEventTypes) {
if (customDirectEventTypes[topLevelType] == null) {
ReactNativeBridgeEventPlugin.eventTypes[
topLevelType
] = customDirectEventTypes[topLevelType] =
directEventTypes[topLevelType];
}
}
}
},
};

export default ReactNativeBridgeEventPlugin;
2 changes: 0 additions & 2 deletions packages/react-native-renderer/src/ReactNativeRenderer.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ import UIManager from 'UIManager';
import {getStackAddendumByWorkInProgressFiber} from 'shared/ReactFiberComponentTreeHook';

import NativeMethodsMixin from './NativeMethodsMixin';
import ReactNativeBridgeEventPlugin from './ReactNativeBridgeEventPlugin';
import ReactNativeComponent from './ReactNativeComponent';
import * as ReactNativeComponentTree from './ReactNativeComponentTree';
import ReactNativeFiberRenderer from './ReactNativeFiberRenderer';
Expand Down Expand Up @@ -103,7 +102,6 @@ const ReactNativeRenderer: ReactNativeType = {
// Used as a mixin in many createClass-based components
NativeMethodsMixin,
// Used by react-native-github/Libraries/ components
ReactNativeBridgeEventPlugin, // requireNativeComponent
ReactNativeComponentTree, // ScrollResponder
ReactNativePropRegistry, // flattenStyle, Stylesheet
TouchHistoryMath, // PanResponder
Expand Down
5 changes: 0 additions & 5 deletions packages/react-native-renderer/src/ReactNativeTypes.js
Original file line number Diff line number Diff line change
Expand Up @@ -69,17 +69,12 @@ export type NativeMethodsMixinType = {
setNativeProps(nativeProps: Object): void,
};

type ReactNativeBridgeEventPlugin = {
processEventTypes(viewConfig: ReactNativeBaseComponentViewConfig): void,
};

type SecretInternalsType = {
NativeMethodsMixin: NativeMethodsMixinType,
createReactNativeComponentClass(
name: string,
callback: ViewConfigGetter,
): any,
ReactNativeBridgeEventPlugin: ReactNativeBridgeEventPlugin,
ReactNativeComponentTree: any,
ReactNativePropRegistry: any,
// TODO (bvaughn) Decide which additional types to expose here?
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,50 @@ import type {

import invariant from 'fbjs/lib/invariant';

// Event configs
export const customBubblingEventTypes = {};
export const customDirectEventTypes = {};
export const eventTypes = {};

const viewConfigCallbacks = new Map();
const viewConfigs = new Map();

function processEventTypes(
viewConfig: ReactNativeBaseComponentViewConfig,
): void {
const {bubblingEventTypes, directEventTypes} = viewConfig;

if (__DEV__) {
if (bubblingEventTypes != null && directEventTypes != null) {
for (const topLevelType in directEventTypes) {
invariant(
bubblingEventTypes[topLevelType] == null,
'Event cannot be both direct and bubbling: %s',
topLevelType,
);
}
}
}

if (bubblingEventTypes != null) {
for (const topLevelType in bubblingEventTypes) {
if (customBubblingEventTypes[topLevelType] == null) {
eventTypes[topLevelType] = customBubblingEventTypes[topLevelType] =
bubblingEventTypes[topLevelType];
}
}
}

if (directEventTypes != null) {
for (const topLevelType in directEventTypes) {
if (customDirectEventTypes[topLevelType] == null) {
eventTypes[topLevelType] = customDirectEventTypes[topLevelType] =
directEventTypes[topLevelType];
}
}
}
}

/**
* Registers a native view/component by name.
* A callback is provided to load the view config from UIManager.
Expand Down Expand Up @@ -49,6 +90,7 @@ export function get(name: string): ReactNativeBaseComponentViewConfig {
);
viewConfigCallbacks.set(name, null);
viewConfig = callback();
processEventTypes(viewConfig);
viewConfigs.set(name, viewConfig);
} else {
viewConfig = viewConfigs.get(name);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,12 @@ let PropTypes;
let RCTEventEmitter;
let React;
let ReactNative;
let ReactNativeBridgeEventPlugin;
let ResponderEventPlugin;
let UIManager;
let createReactNativeComponentClass;

// Parallels requireNativeComponent() in that it lazily constructs a view config,
// And registers view manager event types with ReactNativeBridgeEventPlugin.
// And registers view manager event types with ReactNativeViewConfigRegistry.
const fakeRequireNativeComponent = (uiViewClassName, validAttributes) => {
const getViewConfig = () => {
const viewConfig = {
Expand Down Expand Up @@ -55,8 +54,6 @@ const fakeRequireNativeComponent = (uiViewClassName, validAttributes) => {
directEventTypes: {},
};

ReactNativeBridgeEventPlugin.processEventTypes(viewConfig);

return viewConfig;
};

Expand All @@ -70,8 +67,6 @@ beforeEach(() => {
RCTEventEmitter = require('RCTEventEmitter');
React = require('react');
ReactNative = require('react-native-renderer');
ReactNativeBridgeEventPlugin = require('../ReactNativeBridgeEventPlugin')
.default;
ResponderEventPlugin = require('events/ResponderEventPlugin').default;
UIManager = require('UIManager');
createReactNativeComponentClass = require('../createReactNativeComponentClass')
Expand Down

0 comments on commit f947cdc

Please sign in to comment.