diff --git a/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm b/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm index 09bc95cb33d57d..c6503a635e912a 100644 --- a/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm +++ b/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm @@ -228,11 +228,23 @@ - (void)updateProps:(Props::Shared const &)props oldProps:(Props::Shared const & self.accessibilityElement.accessibilityElementsHidden = newViewProps.accessibilityElementsHidden; } + // `accessibilityTraits` if (oldViewProps.accessibilityTraits != newViewProps.accessibilityTraits) { self.accessibilityElement.accessibilityTraits = RCTUIAccessibilityTraitsFromAccessibilityTraits(newViewProps.accessibilityTraits); } + // `accessibilityState` + if (oldViewProps.accessibilityState != newViewProps.accessibilityState) { + self.accessibilityTraits &= ~(UIAccessibilityTraitNotEnabled | UIAccessibilityTraitSelected); + if (newViewProps.accessibilityState.selected) { + self.accessibilityTraits |= UIAccessibilityTraitSelected; + } + if (newViewProps.accessibilityState.disabled) { + self.accessibilityTraits |= UIAccessibilityTraitNotEnabled; + } + } + // `accessibilityIgnoresInvertColors` if (oldViewProps.accessibilityIgnoresInvertColors != newViewProps.accessibilityIgnoresInvertColors) { #if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 110000 /* __IPHONE_11_0 */ diff --git a/ReactCommon/fabric/components/view/accessibility/AccessibilityPrimitives.h b/ReactCommon/fabric/components/view/accessibility/AccessibilityPrimitives.h index a87cd35c53df81..a17b9aa44f7a0a 100644 --- a/ReactCommon/fabric/components/view/accessibility/AccessibilityPrimitives.h +++ b/ReactCommon/fabric/components/view/accessibility/AccessibilityPrimitives.h @@ -44,5 +44,22 @@ constexpr enum AccessibilityTraits operator&( return (enum AccessibilityTraits)((uint32_t)lhs & (uint32_t)rhs); } +struct AccessibilityState { + bool disabled{false}; + bool selected{false}; +}; + +constexpr bool operator==( + AccessibilityState const &lhs, + AccessibilityState const &rhs) { + return lhs.disabled == rhs.disabled && lhs.selected == rhs.selected; +} + +constexpr bool operator!=( + AccessibilityState const &lhs, + AccessibilityState const &rhs) { + return !(rhs == lhs); +} + } // namespace react } // namespace facebook diff --git a/ReactCommon/fabric/components/view/accessibility/AccessibilityProps.cpp b/ReactCommon/fabric/components/view/accessibility/AccessibilityProps.cpp index b7f9bd7bfde62d..417eccd656524b 100644 --- a/ReactCommon/fabric/components/view/accessibility/AccessibilityProps.cpp +++ b/ReactCommon/fabric/components/view/accessibility/AccessibilityProps.cpp @@ -28,6 +28,11 @@ AccessibilityProps::AccessibilityProps( "accessibilityRole", sourceProps.accessibilityTraits, AccessibilityTraits::None)), + accessibilityState(convertRawProp( + rawProps, + "accessibilityState", + sourceProps.accessibilityState, + {})), accessibilityLabel(convertRawProp( rawProps, "accessibilityLabel", diff --git a/ReactCommon/fabric/components/view/accessibility/AccessibilityProps.h b/ReactCommon/fabric/components/view/accessibility/AccessibilityProps.h index b3994c99f8eed4..fc6088dbf0a149 100644 --- a/ReactCommon/fabric/components/view/accessibility/AccessibilityProps.h +++ b/ReactCommon/fabric/components/view/accessibility/AccessibilityProps.h @@ -26,6 +26,7 @@ class AccessibilityProps { bool accessible{false}; AccessibilityTraits accessibilityTraits{AccessibilityTraits::None}; + AccessibilityState accessibilityState; std::string accessibilityLabel{""}; std::string accessibilityHint{""}; std::vector accessibilityActions{}; diff --git a/ReactCommon/fabric/components/view/accessibility/accessibilityPropsConversions.h b/ReactCommon/fabric/components/view/accessibility/accessibilityPropsConversions.h index a6b6b4e919d5e5..c0239600a8646d 100644 --- a/ReactCommon/fabric/components/view/accessibility/accessibilityPropsConversions.h +++ b/ReactCommon/fabric/components/view/accessibility/accessibilityPropsConversions.h @@ -9,6 +9,7 @@ #include #include +#include namespace facebook { namespace react { @@ -109,5 +110,17 @@ inline void fromRawValue(const RawValue &value, AccessibilityTraits &result) { abort(); } +inline void fromRawValue(const RawValue &value, AccessibilityState &result) { + auto map = (better::map)value; + auto selected = map.find("selected"); + if (selected != map.end()) { + fromRawValue(selected->second, result.selected); + } + auto disabled = map.find("disabled"); + if (disabled != map.end()) { + fromRawValue(disabled->second, result.disabled); + } +} + } // namespace react } // namespace facebook