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-
114type AccessibilityInfoStaticInitializers =
125 | 'isBoldTextEnabled'
136 | 'isScreenReaderEnabled'
@@ -16,72 +9,58 @@ type AccessibilityInfoStaticInitializers =
169 | 'isReduceMotionEnabled'
1710 | 'isReduceTransparencyEnabled'
1811
19- type AccessibilityEventToInfoStaticKeyMap = {
20- [ K in AccessibilityChangeEventName ] ?: AccessibilityInfoStaticInitializers
21- }
22-
23- const EVENT_NAME_TO_INITIALIZER : AccessibilityEventToInfoStaticKeyMap = {
24- boldTextChanged : 'isBoldTextEnabled' ,
25- screenReaderChanged : 'isScreenReaderEnabled' ,
26- grayscaleChanged : 'isGrayscaleEnabled' ,
27- invertColorsChanged : 'isInvertColorsEnabled' ,
28- reduceMotionChanged : 'isReduceMotionEnabled' ,
29- reduceTransparencyChanged : 'isReduceTransparencyEnabled' ,
30- }
31-
3212function useAccessibilityStateListener (
3313 eventName : AccessibilityChangeEventName ,
34- ) : boolean {
35- const [ isEnabled , setIsEnabled ] = useState ( false )
14+ initializerName : AccessibilityInfoStaticInitializers ,
15+ ) : boolean | undefined {
16+ const [ isEnabled , setIsEnabled ] = useState < boolean | undefined > ( undefined )
3617
3718 useEffect ( ( ) => {
38- const initializerKey = EVENT_NAME_TO_INITIALIZER [ eventName ]
39-
40- if ( ! initializerKey ) {
19+ if ( ! AccessibilityInfo [ initializerName ] ) {
4120 return
4221 }
4322
44- AccessibilityInfo [ initializerKey ] ( ) . then ( setIsEnabled )
23+ AccessibilityInfo [ initializerName ] ( ) . then ( setIsEnabled )
4524 AccessibilityInfo . addEventListener ( eventName , setIsEnabled )
4625
4726 return ( ) => AccessibilityInfo . removeEventListener ( eventName , setIsEnabled )
48- } , [ eventName ] )
27+ } , [ eventName , initializerName ] )
4928
5029 return isEnabled
5130}
5231
5332export function useAccessibilityInfo ( ) : {
54- screenReaderEnabled : boolean
55- boldTextEnabled : boolean
56- grayscaleEnabled ? : boolean
57- invertColorsEnabled ? : boolean
58- reduceMotionEnabled ? : boolean
59- reduceTransparencyEnabled ? : boolean
33+ screenReaderEnabled : boolean | undefined
34+ boldTextEnabled : boolean | undefined
35+ grayscaleEnabled : boolean | undefined
36+ invertColorsEnabled : boolean | undefined
37+ reduceMotionEnabled : boolean | undefined
38+ reduceTransparencyEnabled : boolean | undefined
6039} {
61- const screenReaderEnabled = useAccessibilityStateListener (
62- 'screenReaderChanged' ,
40+ const boldTextEnabled = useAccessibilityStateListener (
41+ 'boldTextChanged' ,
42+ 'isBoldTextEnabled' ,
43+ )
44+ const grayscaleEnabled = useAccessibilityStateListener (
45+ 'grayscaleChanged' ,
46+ 'isGrayscaleEnabled' ,
6347 )
64- 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' )
7548 const invertColorsEnabled = useAccessibilityStateListener (
7649 'invertColorsChanged' ,
50+ 'isInvertColorsEnabled' ,
7751 )
7852 const reduceMotionEnabled = useAccessibilityStateListener (
7953 'reduceMotionChanged' ,
54+ 'isReduceMotionEnabled' ,
8055 )
8156 const reduceTransparencyEnabled = useAccessibilityStateListener (
8257 'reduceTransparencyChanged' ,
58+ 'isReduceTransparencyEnabled' ,
59+ )
60+ const screenReaderEnabled = useAccessibilityStateListener (
61+ 'screenReaderChanged' ,
62+ 'isScreenReaderEnabled' ,
8363 )
84- /* eslint-enable react-hooks/rules-of-hooks */
8564
8665 return {
8766 screenReaderEnabled,
0 commit comments