11import { useEffect , useState } from 'react'
22import { AccessibilityInfo , AccessibilityChangeEventName } from 'react-native'
33
4+ const SUPPORTS_RN60_ACCESSIBILITY_INFO_API = ! ! (
5+ AccessibilityInfo . isGrayscaleEnabled &&
6+ AccessibilityInfo . isInvertColorsEnabled &&
7+ AccessibilityInfo . isReduceMotionEnabled &&
8+ AccessibilityInfo . isReduceTransparencyEnabled
9+ )
10+
411type AccessibilityInfoStaticInitializers =
512 | 'isBoldTextEnabled'
613 | 'isScreenReaderEnabled'
@@ -35,27 +42,36 @@ function useAccessibilityStateListener(
3542 }
3643
3744 AccessibilityInfo [ initializerKey ] ( ) . then ( setIsEnabled )
38- AccessibilityInfo . addEventListener (
39- eventName ,
40- setIsEnabled ,
41- )
45+ AccessibilityInfo . addEventListener ( eventName , setIsEnabled )
4246
43- return ( ) =>
44- AccessibilityInfo . removeEventListener (
45- eventName ,
46- setIsEnabled ,
47- )
47+ return ( ) => AccessibilityInfo . removeEventListener ( eventName , setIsEnabled )
4848 } , [ eventName ] )
4949
5050 return isEnabled
5151}
5252
53- export function useAccessibilityInfo ( ) {
53+ export function useAccessibilityInfo ( ) : {
54+ screenReaderEnabled : Boolean
55+ boldTextEnabled : Boolean
56+ grayscaleEnabled ?: Boolean
57+ invertColorsEnabled ?: Boolean
58+ reduceMotionEnabled ?: Boolean
59+ reduceTransparencyEnabled ?: Boolean
60+ } {
5461 const screenReaderEnabled = useAccessibilityStateListener (
5562 'screenReaderChanged' ,
5663 )
57- const grayscaleEnabled = useAccessibilityStateListener ( 'grayscaleChanged' )
5864 const boldTextEnabled = useAccessibilityStateListener ( 'boldTextChanged' )
65+
66+ if ( ! SUPPORTS_RN60_ACCESSIBILITY_INFO_API ) {
67+ return {
68+ screenReaderEnabled,
69+ boldTextEnabled,
70+ }
71+ }
72+
73+ /* eslint-disable react-hooks/rules-of-hooks */
74+ const grayscaleEnabled = useAccessibilityStateListener ( 'grayscaleChanged' )
5975 const invertColorsEnabled = useAccessibilityStateListener (
6076 'invertColorsChanged' ,
6177 )
@@ -65,6 +81,7 @@ export function useAccessibilityInfo() {
6581 const reduceTransparencyEnabled = useAccessibilityStateListener (
6682 'reduceTransparencyChanged' ,
6783 )
84+ /* eslint-enable react-hooks/rules-of-hooks */
6885
6986 return {
7087 screenReaderEnabled,
0 commit comments