From ea609defe8462a6beeac4da3aa7a43397ee9a77f Mon Sep 17 00:00:00 2001 From: Subramanya Chakravarthy Date: Tue, 18 May 2021 13:34:08 -0700 Subject: [PATCH] Disable TouchableOpacity when accessibility disabled is set (#31108) Summary: When using a screen reader the TouchableOpacity component disables click functionality. Fixes Issue https://github.com/facebook/react-native/issues/30951 ## Changelog [Android] [Changed] - Message Pull Request resolved: https://github.com/facebook/react-native/pull/31108 Test Plan: Added Exmple to Accessibility Reviewed By: yungsters Differential Revision: D28334356 Pulled By: kacieb fbshipit-source-id: 3a3e8efaf57272d2091392f6d7d3e0ba0f2a9adc --- .../Components/Touchable/TouchableOpacity.js | 12 +++- .../__tests__/TouchableOpacity-test.js | 27 +++++++-- .../TouchableOpacity-test.js.snap | 60 +++++++++++++++++++ .../Accessibility/AccessibilityExample.js | 12 ++++ 4 files changed, 105 insertions(+), 6 deletions(-) diff --git a/Libraries/Components/Touchable/TouchableOpacity.js b/Libraries/Components/Touchable/TouchableOpacity.js index 6ae8cd850f7..fc6da22f852 100644 --- a/Libraries/Components/Touchable/TouchableOpacity.js +++ b/Libraries/Components/Touchable/TouchableOpacity.js @@ -137,7 +137,7 @@ class TouchableOpacity extends React.Component { _createPressabilityConfig(): PressabilityConfig { return { cancelable: !this.props.rejectResponderTermination, - disabled: this.props.disabled, + disabled: this.props.disabled ?? this.props.accessibilityState?.disabled, hitSlop: this.props.hitSlop, delayLongPress: this.props.delayLongPress, delayPressIn: this.props.delayPressIn, @@ -215,13 +215,21 @@ class TouchableOpacity extends React.Component { ...eventHandlersWithoutBlurAndFocus } = this.state.pressability.getEventHandlers(); + const accessibilityState = + this.props.disabled != null + ? { + ...this.props.accessibilityState, + disabled: this.props.disabled, + } + : this.props.accessibilityState; + return ( { it('renders correctly', () => { - const instance = render.create( - + const instance = ReactTestRenderer.create( + + Touchable + , + ); + + expect(instance.toJSON()).toMatchSnapshot(); + }); + + it('renders in disabled state when a disabled prop is passed', () => { + const instance = ReactTestRenderer.create( + + Touchable + , + ); + + expect(instance.toJSON()).toMatchSnapshot(); + }); + + it('renders in disabled state when a key disabled in accessibilityState is passed', () => { + const instance = ReactTestRenderer.create( + Touchable , ); diff --git a/Libraries/Components/Touchable/__tests__/__snapshots__/TouchableOpacity-test.js.snap b/Libraries/Components/Touchable/__tests__/__snapshots__/TouchableOpacity-test.js.snap index c1a2ee35013..2492d8c3a01 100644 --- a/Libraries/Components/Touchable/__tests__/__snapshots__/TouchableOpacity-test.js.snap +++ b/Libraries/Components/Touchable/__tests__/__snapshots__/TouchableOpacity-test.js.snap @@ -24,3 +24,63 @@ exports[`TouchableOpacity renders correctly 1`] = ` `; + +exports[`TouchableOpacity renders in disabled state when a disabled prop is passed 1`] = ` + + + Touchable + + +`; + +exports[`TouchableOpacity renders in disabled state when a key disabled in accessibilityState is passed 1`] = ` + + + Touchable + + +`; diff --git a/packages/rn-tester/js/examples/Accessibility/AccessibilityExample.js b/packages/rn-tester/js/examples/Accessibility/AccessibilityExample.js index a45e293e421..f58cd1a465b 100644 --- a/packages/rn-tester/js/examples/Accessibility/AccessibilityExample.js +++ b/packages/rn-tester/js/examples/Accessibility/AccessibilityExample.js @@ -161,6 +161,18 @@ class AccessibilityExample extends React.Component<{}> { + + Alert.alert('Disabled Button has been pressed!')} + accessibilityLabel={'You are pressing Disabled TouchableOpacity'} + accessibilityState={{disabled: true}}> + + + I am disabled. Clicking me will not trigger any action. + + + +