Skip to content

Commit fd61881

Browse files
Add EventEmitter code-gen support for C++ Turbo Modules (#44809)
Summary: Pull Request resolved: #44809 Adding react-native-codegen parser support for a new `EventEmitter` property type on C++ Turbo Modules. It is possible to later expand this feature to other languages (Java, ObjC). ## Characteristics An `EventEmitter` must: - be non null: `EventEmitter<string>` works, `?EventEmitter<string>` does NOT - have a non null eventType: `EventEmitter<number>` works, `EventEmitter<?number>` does NOT - have at most 1 eventType, `void` is possible as well: `EventEmitter<>` or `EventEmitter<MyObject>` work - `EventEmitter<number, string>` do NOT - have a concrete eventType, `{}` is not allowed `EventEmitter<{}>` does NOT work - be used in `Cxx` Turbo Modules only at this time ## Example For these 4 eventEmitters in on an RN JS TM spec ``` +onPress: EventEmitter<void>; +onClick: EventEmitter<string>; +onChange: EventEmitter<ObjectStruct>; +onSubmit: EventEmitter<ObjectStruct[]>; ``` We now generate this code: 1.) in the spec based header `{MyModuleName}CxxSpec` in the constructor: ``` ... // existing code eventEmitterMap_["onPress"] = std::make_shared<AsyncEventEmitter<>>(); eventEmitterMap_["onClick"] = std::make_shared<AsyncEventEmitter<OnClickType>>(); eventEmitterMap_["onChange"] = std::make_shared<AsyncEventEmitter<OnChangeType>>(); eventEmitterMap_["onSubmit"] = std::make_shared<AsyncEventEmitter<OnSubmitType>>(); ``` 2.) as `protected` functions ``` void emitOnPress() { std::static_pointer_cast<AsyncEventEmitter<>>(delegate_.eventEmitterMap_["onPress"])->emit(); } void emitOnClick(const OnClickType& value) { std::static_pointer_cast<AsyncEventEmitter<OnClickType>>(delegate_.eventEmitterMap_["onClick"])->emit(value); } void emitOnChange(const OnChangeType& value) { std::static_pointer_cast<AsyncEventEmitter<OnChangeType>>(delegate_.eventEmitterMap_["onChange"])->emit(value); } void emitOnSubmit(const OnSubmitType& value) { std::static_pointer_cast<AsyncEventEmitter<OnSubmitType>>(delegate_.eventEmitterMap_["onSubmit"])->emit(value); } ``` ## Changelog: [General] [Added] - Add EventEmitter code-gen support for C++ Turbo Modules Reviewed By: javache Differential Revision: D57407871 fbshipit-source-id: 2345cc6dacf0cb0d45f8a374ad9d4cbf8082f9d6
1 parent bfb3b70 commit fd61881

File tree

17 files changed

+605
-79
lines changed

17 files changed

+605
-79
lines changed

packages/react-native-codegen-typescript-test/src/__tests__/simple-scenario-frontend-test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ export default TurboModuleRegistry.getEnforcing<Spec>('SampleTurboModule');
2929
excludedPlatforms: undefined,
3030
moduleName: 'SampleTurboModule',
3131
spec: {
32+
eventEmitters: [],
3233
properties: [],
3334
},
3435
type: 'NativeModule',

0 commit comments

Comments
 (0)