diff --git a/packages/react-native/Libraries/Components/Touchable/TouchableOpacity.js b/packages/react-native/Libraries/Components/Touchable/TouchableOpacity.js index 9733b42c7aa4c1..3ff35fc7c057f2 100644 --- a/packages/react-native/Libraries/Components/Touchable/TouchableOpacity.js +++ b/packages/react-native/Libraries/Components/Touchable/TouchableOpacity.js @@ -308,6 +308,9 @@ class TouchableOpacity extends React.Component< accessibilityState={_accessibilityState} accessibilityActions={this.props.accessibilityActions} onAccessibilityAction={this.props.onAccessibilityAction} + onAccessibilityTap={this.props.onAccessibilityTap} + onAccessibilityEscape={this.props.onAccessibilityEscape} + onMagicTap={this.props.onMagicTap} accessibilityValue={accessibilityValue} importantForAccessibility={ this.props['aria-hidden'] === true diff --git a/packages/react-native/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm b/packages/react-native/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm index 2fcb76ae5e0a85..db05db7922a445 100644 --- a/packages/react-native/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm +++ b/packages/react-native/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm @@ -1421,7 +1421,11 @@ - (BOOL)shouldGroupAccessibilityChildren - (BOOL)accessibilityActivate { if (_eventEmitter && _props->onAccessibilityTap) { - _eventEmitter->onAccessibilityTap(); + auto emitter = std::static_pointer_cast(_eventEmitter); + + emitter->experimental_flushSync([&emitter]() { + emitter->onAccessibilityTap(); + }); return YES; } else { return NO; @@ -1431,7 +1435,11 @@ - (BOOL)accessibilityActivate - (BOOL)accessibilityPerformMagicTap { if (_eventEmitter && _props->onAccessibilityMagicTap) { - _eventEmitter->onAccessibilityMagicTap(); + auto emitter = std::static_pointer_cast(_eventEmitter); + + emitter->experimental_flushSync([&emitter]() { + emitter->onAccessibilityMagicTap(); + }); return YES; } else { return NO; @@ -1441,7 +1449,10 @@ - (BOOL)accessibilityPerformMagicTap - (BOOL)accessibilityPerformEscape { if (_eventEmitter && _props->onAccessibilityEscape) { - _eventEmitter->onAccessibilityEscape(); + auto emitter = std::static_pointer_cast(_eventEmitter); + emitter->experimental_flushSync([&emitter]() { + emitter->onAccessibilityEscape(); + }); return YES; } else { return NO; @@ -1451,21 +1462,35 @@ - (BOOL)accessibilityPerformEscape - (void)accessibilityIncrement { if (_eventEmitter && _props->onAccessibilityAction) { - _eventEmitter->onAccessibilityAction("increment"); + auto emitter = std::static_pointer_cast(_eventEmitter); + + // Dispatch the event synchronously - JS will run and update props immediately + emitter->experimental_flushSync([&emitter]() { + emitter->onAccessibilityAction("increment"); + }); } } - (void)accessibilityDecrement { if (_eventEmitter && _props->onAccessibilityAction) { - _eventEmitter->onAccessibilityAction("decrement"); + auto emitter = std::static_pointer_cast(_eventEmitter); + + // Dispatch the event synchronously - JS will run and update props immediately + emitter->experimental_flushSync([&emitter]() { + emitter->onAccessibilityAction("decrement"); + }); } } - (BOOL)didActivateAccessibilityCustomAction:(UIAccessibilityCustomAction *)action { if (_eventEmitter && _props->onAccessibilityAction) { - _eventEmitter->onAccessibilityAction(RCTStringFromNSString(action.name)); + auto emitter = std::static_pointer_cast(_eventEmitter); + + emitter->experimental_flushSync([&emitter, &action]() { + emitter->onAccessibilityAction(RCTStringFromNSString(action.name)); + }); return YES; } else { return NO;