diff --git a/packages/react-native-codegen/src/parsers/flow/components/events.js b/packages/react-native-codegen/src/parsers/flow/components/events.js index fa2b236722f..a1d4dc742cb 100644 --- a/packages/react-native-codegen/src/parsers/flow/components/events.js +++ b/packages/react-native-codegen/src/parsers/flow/components/events.js @@ -16,6 +16,7 @@ import type { EventTypeAnnotation, } from '../../../CodegenSchema.js'; import type {Parser} from '../../parser'; +import type {EventArgumentReturnType} from '../../parsers-commons'; const { throwIfEventHasNoName, @@ -25,6 +26,7 @@ const { const { getEventArgument, buildPropertiesForEvent, + handleEventHandler, } = require('../../parsers-commons'); const { emitBoolProp, @@ -178,11 +180,7 @@ function findEventArgumentsAndType( types: TypeMap, bubblingType: void | 'direct' | 'bubble', paperName: ?$FlowFixMe, -): { - argumentProps: $FlowFixMe, - bubblingType: ?('direct' | 'bubble'), - paperTopLevelNameDeprecated: ?$FlowFixMe, -} { +): EventArgumentReturnType { throwIfEventHasNoName(typeAnnotation, parser); const name = parser.getTypeAnnotationName(typeAnnotation); if (name === '$ReadOnly') { @@ -192,25 +190,12 @@ function findEventArgumentsAndType( bubblingType, }; } else if (name === 'BubblingEventHandler' || name === 'DirectEventHandler') { - const eventType = name === 'BubblingEventHandler' ? 'bubble' : 'direct'; - const paperTopLevelNameDeprecated = - parser.getPaperTopLevelNameDeprecated(typeAnnotation); - if ( - typeAnnotation.typeParameters.params[0].type === - parser.nullLiteralTypeAnnotation - ) { - return { - argumentProps: [], - bubblingType: eventType, - paperTopLevelNameDeprecated, - }; - } - return findEventArgumentsAndType( + return handleEventHandler( + name, + typeAnnotation, parser, - typeAnnotation.typeParameters.params[0], types, - eventType, - paperTopLevelNameDeprecated, + findEventArgumentsAndType, ); } else if (types[name]) { return findEventArgumentsAndType( diff --git a/packages/react-native-codegen/src/parsers/parsers-commons.js b/packages/react-native-codegen/src/parsers/parsers-commons.js index fb5e639d612..da81ac62ec8 100644 --- a/packages/react-native-codegen/src/parsers/parsers-commons.js +++ b/packages/react-native-codegen/src/parsers/parsers-commons.js @@ -87,6 +87,12 @@ type ExtendedPropResult = { knownTypeName: 'ReactNativeCoreViewProps', } | null; +export type EventArgumentReturnType = { + argumentProps: ?$ReadOnlyArray<$FlowFixMe>, + paperTopLevelNameDeprecated: ?$FlowFixMe, + bubblingType: ?'direct' | 'bubble', +}; + function wrapModuleSchema( nativeModuleSchema: NativeModuleSchema, hasteModuleName: string, @@ -1083,6 +1089,42 @@ function verifyPropNotAlreadyDefined( } } +function handleEventHandler( + name: 'BubblingEventHandler' | 'DirectEventHandler', + typeAnnotation: $FlowFixMe, + parser: Parser, + types: TypeDeclarationMap, + findEventArgumentsAndType: ( + parser: Parser, + typeAnnotation: $FlowFixMe, + types: TypeDeclarationMap, + bubblingType: void | 'direct' | 'bubble', + paperName: ?$FlowFixMe, + ) => EventArgumentReturnType, +): EventArgumentReturnType { + const eventType = name === 'BubblingEventHandler' ? 'bubble' : 'direct'; + const paperTopLevelNameDeprecated = + parser.getPaperTopLevelNameDeprecated(typeAnnotation); + + switch (typeAnnotation.typeParameters.params[0].type) { + case parser.nullLiteralTypeAnnotation: + case parser.undefinedLiteralTypeAnnotation: + return { + argumentProps: [], + bubblingType: eventType, + paperTopLevelNameDeprecated, + }; + default: + return findEventArgumentsAndType( + parser, + typeAnnotation.typeParameters.params[0], + types, + eventType, + paperTopLevelNameDeprecated, + ); + } +} + module.exports = { wrapModuleSchema, unwrapNullable, @@ -1111,4 +1153,5 @@ module.exports = { getTypeResolutionStatus, buildPropertiesForEvent, verifyPropNotAlreadyDefined, + handleEventHandler, }; diff --git a/packages/react-native-codegen/src/parsers/typescript/components/events.js b/packages/react-native-codegen/src/parsers/typescript/components/events.js index bcc56ea4f51..83379b2ed67 100644 --- a/packages/react-native-codegen/src/parsers/typescript/components/events.js +++ b/packages/react-native-codegen/src/parsers/typescript/components/events.js @@ -27,6 +27,7 @@ const { const { getEventArgument, buildPropertiesForEvent, + handleEventHandler, } = require('../../parsers-commons'); const { emitBoolProp, @@ -204,27 +205,13 @@ function findEventArgumentsAndType( paperName, ); } else if (name === 'BubblingEventHandler' || name === 'DirectEventHandler') { - const eventType = name === 'BubblingEventHandler' ? 'bubble' : 'direct'; - const paperTopLevelNameDeprecated = - parser.getPaperTopLevelNameDeprecated(typeAnnotation); - - switch (typeAnnotation.typeParameters.params[0].type) { - case parser.nullLiteralTypeAnnotation: - case parser.undefinedLiteralTypeAnnotation: - return { - argumentProps: [], - bubblingType: eventType, - paperTopLevelNameDeprecated, - }; - default: - return findEventArgumentsAndType( - parser, - typeAnnotation.typeParameters.params[0], - types, - eventType, - paperTopLevelNameDeprecated, - ); - } + return handleEventHandler( + name, + typeAnnotation, + parser, + types, + findEventArgumentsAndType, + ); } else if (types[name]) { let elementType = types[name]; if (elementType.type === 'TSTypeAliasDeclaration') {