Skip to content

Commit 7ea54a4

Browse files
mayank-96facebook-github-bot
authored andcommitted
feat: added aria-live as a alias for accessibility-live-region (#34555)
Summary: This adds `aria-live` alias for `accessibilityLiveRegion`, it unifies aria-live and accessibilityLiveRegion and also maps `aria-live='off'` to `accessibilityLiveRegion='none'` as requested on #34424 ## Changelog <!-- Help reviewers and the release process by writing your own changelog entry. For an example, see: https://reactnative.dev/contributing/changelogs-in-pull-requests --> [General][Added] - Added aria-live alias for accessibilityLiveRegion. Pull Request resolved: #34555 Test Plan: ```js <View aria-live="polite"> <Text>Clicked {this.state.count} times</Text> </View> <View aria-live="off"> <Text>Clicked {this.state.count} times</Text> </View> ``` Reviewed By: cipolleschi Differential Revision: D39206291 Pulled By: jacdebug fbshipit-source-id: fd2019e7047ff7ff6133fed39f1a70b5a9396f89
1 parent 0e8050d commit 7ea54a4

File tree

8 files changed

+53
-7
lines changed

8 files changed

+53
-7
lines changed

Libraries/Components/Pressable/Pressable.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ type Props = $ReadOnly<{|
6868
* this accessibility element are hidden.
6969
*/
7070
'aria-hidden'?: ?boolean,
71+
'aria-live'?: ?('polite' | 'assertive' | 'off'),
7172
focusable?: ?boolean,
7273
importantForAccessibility?: ?('auto' | 'yes' | 'no' | 'no-hide-descendants'),
7374
onAccessibilityAction?: ?(event: AccessibilityActionEvent) => mixed,
@@ -190,10 +191,11 @@ type Props = $ReadOnly<{|
190191
* LTI update could not be added via codemod */
191192
function Pressable(props: Props, forwardedRef): React.Node {
192193
const {
194+
accessible,
193195
accessibilityState,
196+
'aria-live': ariaLive,
194197
android_disableSound,
195198
android_ripple,
196-
accessible,
197199
'aria-busy': ariaBusy,
198200
'aria-checked': ariaChecked,
199201
'aria-disabled': ariaDisabled,
@@ -238,10 +240,14 @@ function Pressable(props: Props, forwardedRef): React.Node {
238240
_accessibilityState =
239241
disabled != null ? {..._accessibilityState, disabled} : _accessibilityState;
240242

243+
const accessibilityLiveRegion =
244+
ariaLive === 'off' ? 'none' : ariaLive ?? props.accessibilityLiveRegion;
245+
241246
const restPropsWithDefaults: React.ElementConfig<typeof View> = {
242247
...restProps,
243248
...android_rippleConfig?.viewProps,
244249
accessible: accessible !== false,
250+
accessibilityLiveRegion,
245251
accessibilityState: _accessibilityState,
246252
focusable: focusable !== false,
247253
hitSlop,

Libraries/Components/Touchable/TouchableBounce.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,10 @@ class TouchableBounce extends React.Component<Props, State> {
130130
// adopting `Pressability`, so preserve that behavior.
131131
const {onBlur, onFocus, ...eventHandlersWithoutBlurAndFocus} =
132132
this.state.pressability.getEventHandlers();
133-
133+
const accessibilityLiveRegion =
134+
this.props['aria-live'] === 'off'
135+
? 'none'
136+
: this.props['aria-live'] ?? this.props.accessibilityLiveRegion;
134137
const _accessibilityState = {
135138
busy: this.props['aria-busy'] ?? this.props.accessibilityState?.busy,
136139
checked:
@@ -155,12 +158,12 @@ class TouchableBounce extends React.Component<Props, State> {
155158
accessibilityActions={this.props.accessibilityActions}
156159
onAccessibilityAction={this.props.onAccessibilityAction}
157160
accessibilityValue={this.props.accessibilityValue}
161+
accessibilityLiveRegion={accessibilityLiveRegion}
158162
importantForAccessibility={
159163
this.props['aria-hidden'] === true
160164
? 'no-hide-descendants'
161165
: this.props.importantForAccessibility
162166
}
163-
accessibilityLiveRegion={this.props.accessibilityLiveRegion}
164167
accessibilityViewIsModal={this.props.accessibilityViewIsModal}
165168
accessibilityElementsHidden={
166169
this.props['aria-hidden'] ?? this.props.accessibilityElementsHidden

Libraries/Components/Touchable/TouchableHighlight.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,10 @@ class TouchableHighlight extends React.Component<Props, State> {
290290
disabled: this.props.disabled,
291291
}
292292
: this.props.accessibilityState;
293-
293+
const accessibilityLiveRegion =
294+
this.props['aria-live'] === 'off'
295+
? 'none'
296+
: this.props['aria-live'] ?? this.props.accessibilityLiveRegion;
294297
return (
295298
<View
296299
accessible={this.props.accessible !== false}
@@ -307,7 +310,7 @@ class TouchableHighlight extends React.Component<Props, State> {
307310
? 'no-hide-descendants'
308311
: this.props.importantForAccessibility
309312
}
310-
accessibilityLiveRegion={this.props.accessibilityLiveRegion}
313+
accessibilityLiveRegion={accessibilityLiveRegion}
311314
accessibilityViewIsModal={this.props.accessibilityViewIsModal}
312315
accessibilityElementsHidden={
313316
this.props['aria-hidden'] ?? this.props.accessibilityElementsHidden

Libraries/Components/Touchable/TouchableNativeFeedback.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,11 @@ class TouchableNativeFeedback extends React.Component<Props, State> {
273273
}
274274
: _accessibilityState;
275275

276+
const accessibilityLiveRegion =
277+
this.props['aria-live'] === 'off'
278+
? 'none'
279+
: this.props['aria-live'] ?? this.props.accessibilityLiveRegion;
280+
276281
return React.cloneElement(
277282
element,
278283
{
@@ -296,7 +301,7 @@ class TouchableNativeFeedback extends React.Component<Props, State> {
296301
this.props['aria-hidden'] === true
297302
? 'no-hide-descendants'
298303
: this.props.importantForAccessibility,
299-
accessibilityLiveRegion: this.props.accessibilityLiveRegion,
304+
accessibilityLiveRegion: accessibilityLiveRegion,
300305
accessibilityViewIsModal: this.props.accessibilityViewIsModal,
301306
accessibilityElementsHidden:
302307
this.props['aria-hidden'] ?? this.props.accessibilityElementsHidden,

Libraries/Components/Touchable/TouchableOpacity.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,11 @@ class TouchableOpacity extends React.Component<Props, State> {
235235
}
236236
: _accessibilityState;
237237

238+
const accessibilityLiveRegion =
239+
this.props['aria-live'] === 'off'
240+
? 'none'
241+
: this.props['aria-live'] ?? this.props.accessibilityLiveRegion;
242+
238243
return (
239244
<Animated.View
240245
accessible={this.props.accessible !== false}
@@ -251,7 +256,7 @@ class TouchableOpacity extends React.Component<Props, State> {
251256
? 'no-hide-descendants'
252257
: this.props.importantForAccessibility
253258
}
254-
accessibilityLiveRegion={this.props.accessibilityLiveRegion}
259+
accessibilityLiveRegion={accessibilityLiveRegion}
255260
accessibilityViewIsModal={this.props.accessibilityViewIsModal}
256261
accessibilityElementsHidden={
257262
this.props['aria-hidden'] ?? this.props.accessibilityElementsHidden

Libraries/Components/Touchable/TouchableWithoutFeedback.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ type Props = $ReadOnly<{|
5353
'aria-expanded'?: ?boolean,
5454
'aria-selected'?: ?boolean,
5555
'aria-hidden'?: ?boolean,
56+
'aria-live'?: ?('polite' | 'assertive' | 'off'),
5657
children?: ?React.Node,
5758
delayLongPress?: ?number,
5859
delayPressIn?: ?number,
@@ -82,6 +83,7 @@ type State = $ReadOnly<{|
8283

8384
const PASSTHROUGH_PROPS = [
8485
'accessibilityActions',
86+
'accessibilityElementsHidden',
8587
'accessibilityHint',
8688
'accessibilityLanguage',
8789
'accessibilityIgnoresInvertColors',
@@ -91,6 +93,7 @@ const PASSTHROUGH_PROPS = [
9193
'accessibilityValue',
9294
'accessibilityViewIsModal',
9395
'hitSlop',
96+
'importantForAccessibility',
9497
'nativeID',
9598
'onAccessibilityAction',
9699
'onBlur',
@@ -107,6 +110,8 @@ class TouchableWithoutFeedback extends React.Component<Props, State> {
107110
render(): React.Node {
108111
const element = React.Children.only(this.props.children);
109112
const children = [element.props.children];
113+
const ariaLive = this.props['aria-live'];
114+
110115
if (__DEV__) {
111116
if (element.type === View) {
112117
children.push(
@@ -151,6 +156,10 @@ class TouchableWithoutFeedback extends React.Component<Props, State> {
151156
this.props['aria-hidden'] === true
152157
? 'no-hide-descendants'
153158
: this.props.importantForAccessibility,
159+
accessibilityLiveRegion:
160+
ariaLive === 'off'
161+
? 'none'
162+
: ariaLive ?? this.props.accessibilityLiveRegion,
154163
};
155164
for (const prop of PASSTHROUGH_PROPS) {
156165
if (this.props[prop] !== undefined) {

Libraries/Components/View/View.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ const View: React.AbstractComponent<
3131
(
3232
{
3333
accessibilityElementsHidden,
34+
accessibilityLiveRegion,
35+
'aria-live': ariaLive,
3436
accessibilityRole,
3537
'aria-hidden': ariaHidden,
3638
focusable,
@@ -135,6 +137,9 @@ const View: React.AbstractComponent<
135137
return (
136138
<TextAncestor.Provider value={false}>
137139
<ViewNativeComponent
140+
accessibilityLiveRegion={
141+
ariaLive === 'off' ? 'none' : ariaLive ?? accessibilityLiveRegion
142+
}
138143
focusable={tabIndex !== undefined ? !tabIndex : focusable}
139144
accessibilityState={_accessibilityState}
140145
accessibilityRole={

Libraries/Components/View/ViewPropTypes.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,16 @@ type AndroidViewProps = $ReadOnly<{|
293293
*/
294294
accessibilityLiveRegion?: ?('none' | 'polite' | 'assertive'),
295295

296+
/**
297+
* Indicates to accessibility services whether the user should be notified
298+
* when this view changes. Works for Android API >= 19 only.
299+
*
300+
* @platform android
301+
*
302+
* See https://reactnative.dev/docs/view#accessibilityliveregion
303+
*/
304+
'aria-live'?: ?('polite' | 'assertive' | 'off'),
305+
296306
/**
297307
* Controls how view is important for accessibility which is if it
298308
* fires accessibility events and if it is reported to accessibility services

0 commit comments

Comments
 (0)