diff --git a/packages/react-native/Libraries/Components/View/View.js b/packages/react-native/Libraries/Components/View/View.js index 5e1cb146902..77e44899ede 100644 --- a/packages/react-native/Libraries/Components/View/View.js +++ b/packages/react-native/Libraries/Components/View/View.js @@ -23,108 +23,97 @@ export type Props = ViewProps; * * @see https://reactnative.dev/docs/view */ -const View: component( +function View({ + accessibilityElementsHidden, + accessibilityLabel, + accessibilityLabelledBy, + accessibilityLiveRegion, + accessibilityState, + accessibilityValue, + 'aria-busy': ariaBusy, + 'aria-checked': ariaChecked, + 'aria-disabled': ariaDisabled, + 'aria-expanded': ariaExpanded, + 'aria-hidden': ariaHidden, + 'aria-label': ariaLabel, + 'aria-labelledby': ariaLabelledBy, + 'aria-live': ariaLive, + 'aria-selected': ariaSelected, + 'aria-valuemax': ariaValueMax, + 'aria-valuemin': ariaValueMin, + 'aria-valuenow': ariaValueNow, + 'aria-valuetext': ariaValueText, + focusable, + id, + importantForAccessibility, + nativeID, + tabIndex, + ...otherProps +}: $ReadOnly<{ + ref?: React.RefSetter>, + ...ViewProps, +}>): React.Node { + const hasTextAncestor = React.use(TextAncestor); + const _accessibilityLabelledBy = + ariaLabelledBy?.split(/\s*,\s*/g) ?? accessibilityLabelledBy; + + const _accessibilityState = + accessibilityState != null || + ariaBusy != null || + ariaChecked != null || + ariaDisabled != null || + ariaExpanded != null || + ariaSelected != null + ? { + busy: ariaBusy ?? accessibilityState?.busy, + checked: ariaChecked ?? accessibilityState?.checked, + disabled: ariaDisabled ?? accessibilityState?.disabled, + expanded: ariaExpanded ?? accessibilityState?.expanded, + selected: ariaSelected ?? accessibilityState?.selected, + } + : undefined; + + const _accessibilityValue = + accessibilityValue != null || + ariaValueMax != null || + ariaValueMin != null || + ariaValueNow != null || + ariaValueText != null + ? { + max: ariaValueMax ?? accessibilityValue?.max, + min: ariaValueMin ?? accessibilityValue?.min, + now: ariaValueNow ?? accessibilityValue?.now, + text: ariaValueText ?? accessibilityValue?.text, + } + : undefined; + + const actualView = ( + + ); + + if (hasTextAncestor) { + return {actualView}; + } + + return actualView; +} + +export default View as component( ref?: React.RefSetter>, ...props: ViewProps -) = React.forwardRef( - ( - { - accessibilityElementsHidden, - accessibilityLabel, - accessibilityLabelledBy, - accessibilityLiveRegion, - accessibilityState, - accessibilityValue, - 'aria-busy': ariaBusy, - 'aria-checked': ariaChecked, - 'aria-disabled': ariaDisabled, - 'aria-expanded': ariaExpanded, - 'aria-hidden': ariaHidden, - 'aria-label': ariaLabel, - 'aria-labelledby': ariaLabelledBy, - 'aria-live': ariaLive, - 'aria-selected': ariaSelected, - 'aria-valuemax': ariaValueMax, - 'aria-valuemin': ariaValueMin, - 'aria-valuenow': ariaValueNow, - 'aria-valuetext': ariaValueText, - focusable, - id, - importantForAccessibility, - nativeID, - tabIndex, - ...otherProps - }: ViewProps, - forwardedRef, - ) => { - const hasTextAncestor = React.useContext(TextAncestor); - const _accessibilityLabelledBy = - ariaLabelledBy?.split(/\s*,\s*/g) ?? accessibilityLabelledBy; - - const _accessibilityState = - accessibilityState != null || - ariaBusy != null || - ariaChecked != null || - ariaDisabled != null || - ariaExpanded != null || - ariaSelected != null - ? { - busy: ariaBusy ?? accessibilityState?.busy, - checked: ariaChecked ?? accessibilityState?.checked, - disabled: ariaDisabled ?? accessibilityState?.disabled, - expanded: ariaExpanded ?? accessibilityState?.expanded, - selected: ariaSelected ?? accessibilityState?.selected, - } - : undefined; - - const _accessibilityValue = - accessibilityValue != null || - ariaValueMax != null || - ariaValueMin != null || - ariaValueNow != null || - ariaValueText != null - ? { - max: ariaValueMax ?? accessibilityValue?.max, - min: ariaValueMin ?? accessibilityValue?.min, - now: ariaValueNow ?? accessibilityValue?.now, - text: ariaValueText ?? accessibilityValue?.text, - } - : undefined; - - const actualView = ( - - ); - - if (hasTextAncestor) { - return ( - - {actualView} - - ); - } - - return actualView; - }, ); - -View.displayName = 'View'; - -export default View; diff --git a/packages/react-native/Libraries/Components/View/__tests__/View-test.js b/packages/react-native/Libraries/Components/View/__tests__/View-test.js index 39db27fc342..fc112d5fe60 100644 --- a/packages/react-native/Libraries/Components/View/__tests__/View-test.js +++ b/packages/react-native/Libraries/Components/View/__tests__/View-test.js @@ -25,7 +25,7 @@ describe('View', () => { }); it('has displayName', () => { - expect(View.displayName).toEqual('View'); + expect(View.displayName ?? View.name).toEqual('View'); }); }); diff --git a/packages/react-native/Libraries/__tests__/__snapshots__/public-api-test.js.snap b/packages/react-native/Libraries/__tests__/__snapshots__/public-api-test.js.snap index 00fadb6de21..8313e30dd17 100644 --- a/packages/react-native/Libraries/__tests__/__snapshots__/public-api-test.js.snap +++ b/packages/react-native/Libraries/__tests__/__snapshots__/public-api-test.js.snap @@ -3496,11 +3496,10 @@ declare export default typeof ReactNativeViewAttributes; exports[`public API should not change unintentionally Libraries/Components/View/View.js 1`] = ` "export type Props = ViewProps; -declare const View: component( +declare export default component( ref?: React.RefSetter>, ...props: ViewProps ); -declare export default typeof View; " `;