Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat/accessibility state alias #34524

Closed
Closed
Show file tree
Hide file tree
Changes from 11 commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
9b93788
feat: typing for accessibilit state alias
ankit-tailor Aug 29, 2022
374ea18
feat: mapping for accssibility state alias
ankit-tailor Aug 29, 2022
b65c50d
fix: add aria-busy
ankit-tailor Aug 29, 2022
3adb318
fix: remove log
ankit-tailor Aug 29, 2022
c28ca60
feat: accessibility state typings for pressable
ankit-tailor Aug 29, 2022
5686e1e
feat: accessibility state alias for text
ankit-tailor Aug 29, 2022
b5a03ff
feat: accessibility state alias typing for text
ankit-tailor Aug 29, 2022
e58b762
fix: remove undefined keys
ankit-tailor Aug 30, 2022
14af27f
Merge remote-tracking branch 'upstream/main' into feat/accessibility-…
ankit-tailor Aug 30, 2022
1ab9b3b
fix: alpha sorted props
ankit-tailor Aug 30, 2022
885543f
fix: object dot notation
ankit-tailor Aug 30, 2022
2ed706e
feat: alias for accessibilit state
ankit-tailor Aug 31, 2022
2bd848f
feat: alias for accessibilit state
ankit-tailor Aug 31, 2022
c5ea82d
feat: alias accessibility state for TextInput
ankit-tailor Aug 31, 2022
73778b5
feat: accessibility state alias
ankit-tailor Aug 31, 2022
4f628a7
fix: remove undefined key logic
ankit-tailor Aug 31, 2022
2848bf5
feat: update snapshot
ankit-tailor Aug 31, 2022
4b543bf
fix: undefined check
ankit-tailor Sep 1, 2022
190a8b0
fix: remove trailing space
ankit-tailor Sep 1, 2022
89f7de9
fix: accessibility state assignment
ankit-tailor Sep 1, 2022
0e123bc
fix: resolve conflicts
ankit-tailor Sep 5, 2022
7ee1978
Merge remote-tracking branch 'upstream/main' into feat/accessibility-…
ankit-tailor Sep 5, 2022
4c4955c
fix: const variables
ankit-tailor Sep 5, 2022
a4bb35c
Merge remote-tracking branch 'upstream/main' into feat/accessibility-…
ankit-tailor Sep 7, 2022
bd8dec6
feat: accessibility state example
ankit-tailor Sep 7, 2022
377ec76
Merge remote-tracking branch 'upstream/main' into feat/accessibility-…
ankit-tailor Sep 8, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 46 additions & 7 deletions Libraries/Components/Pressable/Pressable.js
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,17 @@ type Props = $ReadOnly<{|
accessibilityValue?: ?AccessibilityValue,
accessibilityViewIsModal?: ?boolean,
accessible?: ?boolean,

/**
* alias for accessibilityState
*
* see https://reactnative.dev/docs/accessibility#accessibilitystate
*/
'aria-busy'?: ?boolean,
'aria-checked'?: ?boolean,
'aria-disabled'?: ?boolean,
'aria-expanded'?: ?boolean,
'aria-selected'?: ?boolean,
focusable?: ?boolean,
importantForAccessibility?: ?('auto' | 'yes' | 'no' | 'no-hide-descendants'),
onAccessibilityAction?: ?(event: AccessibilityActionEvent) => mixed,
Expand Down Expand Up @@ -174,9 +185,15 @@ type Props = $ReadOnly<{|
* LTI update could not be added via codemod */
function Pressable(props: Props, forwardedRef): React.Node {
const {
accessible,
accessibilityState,
android_disableSound,
android_ripple,
accessible,
'aria-busy': ariaBusy,
'aria-checked': ariaChecked,
'aria-disabled': ariaDisabled,
'aria-expanded': ariaExpanded,
'aria-selected': ariaSelected,
cancelable,
children,
delayHoverIn,
Expand Down Expand Up @@ -205,20 +222,42 @@ function Pressable(props: Props, forwardedRef): React.Node {

const [pressed, setPressed] = usePressState(testOnly_pressed === true);

const accessibilityState =
disabled != null
? {...props.accessibilityState, disabled}
: props.accessibilityState;
let _accessibilityState = {
busy: ariaBusy ?? accessibilityState?.busy,
checked: ariaChecked ?? accessibilityState?.checked,
disabled: ariaDisabled ?? accessibilityState?.disabled,
expanded: ariaExpanded ?? accessibilityState?.expanded,
selected: ariaSelected ?? accessibilityState?.selected,
};

/**
* Removing undefined keys from _accessibilityState
*/

Object.keys(_accessibilityState).forEach(key => {
if (_accessibilityState[key] === undefined) {
delete _accessibilityState[key];
}
});

const restPropsWithDefaults: React.ElementConfig<typeof View> = {
_accessibilityState =
disabled != null ? {..._accessibilityState, disabled} : _accessibilityState;

let restPropsWithDefaults: React.ElementConfig<typeof View> = {
...restProps,
...android_rippleConfig?.viewProps,
accessible: accessible !== false,
accessibilityState,
focusable: focusable !== false,
hitSlop,
};

if (Object.keys(_accessibilityState).length !== 0) {
restPropsWithDefaults = {
...restPropsWithDefaults,
accessibilityState: _accessibilityState,
};
}

const config = useMemo(
() => ({
cancelable,
Expand Down
38 changes: 37 additions & 1 deletion Libraries/Components/View/View.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,47 @@ const View: React.AbstractComponent<
React.ElementRef<typeof ViewNativeComponent>,
> = React.forwardRef(
({tabIndex, focusable, ...otherProps}: ViewProps, forwardedRef) => {
const {
'aria-busy': ariaBusy,
'aria-checked': ariaChecked,
'aria-disabled': ariaDisabled,
'aria-expanded': ariaExpanded,
'aria-selected': ariaSelected,
...restProps
} = otherProps;

const _accessibilityState = {
busy: ariaBusy ?? otherProps.accessibilityState?.busy,
checked: ariaChecked ?? otherProps.accessibilityState?.checked,
disabled: ariaDisabled ?? otherProps.accessibilityState?.disabled,
expanded: ariaExpanded ?? otherProps.accessibilityState?.expanded,
selected: ariaSelected ?? otherProps.accessibilityState?.selected,
};

/**
* Removing undefined keys from _accessibilityState
*/

Object.keys(_accessibilityState).forEach(key => {
if (_accessibilityState[key] === undefined) {
delete _accessibilityState[key];
}
});

let restWithDefaultProps = {...restProps};

if (Object.keys(_accessibilityState).length !== 0) {
restWithDefaultProps = {
...restWithDefaultProps,
accessibilityState: _accessibilityState,
};
}

return (
<TextAncestor.Provider value={false}>
<ViewNativeComponent
focusable={tabIndex !== undefined ? !tabIndex : focusable}
{...otherProps}
{...restWithDefaultProps}
ref={forwardedRef}
/>
</TextAncestor.Provider>
Expand Down
11 changes: 11 additions & 0 deletions Libraries/Components/View/ViewPropTypes.js
Original file line number Diff line number Diff line change
Expand Up @@ -485,6 +485,17 @@ export type ViewProps = $ReadOnly<{|
*/
accessibilityLabelledBy?: ?string | ?Array<string>,

/**
* alias for accessibilityState
*
* see https://reactnative.dev/docs/accessibility#accessibilitystate
*/
'aria-busy'?: ?boolean,
'aria-checked'?: ?boolean,
'aria-disabled'?: ?boolean,
'aria-expanded'?: ?boolean,
'aria-selected'?: ?boolean,

/**
* Views that are only used to layout their children or otherwise don't draw
* anything may be automatically removed from the native hierarchy as an
Expand Down
46 changes: 38 additions & 8 deletions Libraries/Text/Text.js
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,11 @@ const Text: React.AbstractComponent<
const {
accessible,
allowFontScaling,
'aria-busy': ariaBusy,
'aria-checked': ariaChecked,
'aria-disabled': ariaDisabled,
'aria-expanded': ariaExpanded,
'aria-selected': ariaSelected,
ellipsizeMode,
onLongPress,
onPress,
Expand All @@ -51,14 +56,33 @@ const Text: React.AbstractComponent<

const [isHighlighted, setHighlighted] = useState(false);

const _accessibilityState = {
busy: ariaBusy ?? props.accessibilityState?.busy,
checked: ariaChecked ?? props.accessibilityState?.checked,
disabled: ariaDisabled ?? props.accessibilityState?.disabled,
expanded: ariaExpanded ?? props.accessibilityState?.expanded,
selected: ariaSelected ?? props.accessibilityState?.selected,
};

/**
* Removing undefined keys from _accessibilityState
*/

Object.keys(_accessibilityState).forEach(key => {
if (_accessibilityState[key] === undefined) {
delete _accessibilityState[key];
}
});

const _disabled =
restProps.disabled != null
? restProps.disabled
: props.accessibilityState?.disabled;
const _accessibilityState =
_disabled !== props.accessibilityState?.disabled
? {...props.accessibilityState, disabled: _disabled}
: props.accessibilityState;
: _accessibilityState?.disabled;

const nativeTextAccessibilityState =
_disabled !== _accessibilityState?.disabled
? {..._accessibilityState, disabled: _disabled}
: _accessibilityState;

const isPressable =
(onPress != null ||
Expand Down Expand Up @@ -176,9 +200,15 @@ const Text: React.AbstractComponent<
default: accessible,
});

let restWithDefaultProps = {...restProps};

if (Object.keys(_accessibilityState).length !== 0) {
restWithDefaultProps.accessibilityState = _accessibilityState;
}

return hasTextAncestor ? (
<NativeVirtualText
{...restProps}
{...restWithDefaultProps}
{...eventHandlersForText}
isHighlighted={isHighlighted}
isPressable={isPressable}
Expand All @@ -190,11 +220,11 @@ const Text: React.AbstractComponent<
) : (
<TextAncestor.Provider value={true}>
<NativeText
{...restProps}
{...restWithDefaultProps}
{...eventHandlersForText}
disabled={_disabled}
accessible={_accessible}
accessibilityState={_accessibilityState}
accessibilityState={nativeTextAccessibilityState}
allowFontScaling={allowFontScaling !== false}
ellipsizeMode={ellipsizeMode ?? 'tail'}
isHighlighted={isHighlighted}
Expand Down
11 changes: 11 additions & 0 deletions Libraries/Text/TextProps.js
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,17 @@ export type TextProps = $ReadOnly<{|
*
*/
android_hyphenationFrequency?: ?('normal' | 'none' | 'full'),

/**
* alias for accessibilityState
*
* see https://reactnative.dev/docs/accessibility#accessibilitystate
*/
'aria-busy'?: ?boolean,
'aria-checked'?: ?boolean,
'aria-disabled'?: ?boolean,
'aria-expanded'?: ?boolean,
'aria-selected'?: ?boolean,
children?: ?Node,

/**
Expand Down