/** * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * * @format * @flow */ 'use strict'; const RCTDeviceEventEmitter = require('../../EventEmitter/RCTDeviceEventEmitter'); const UIManager = require('../../ReactNative/UIManager'); import NativeAccessibilityInfo from './NativeAccessibilityInfo'; const REDUCE_MOTION_EVENT = 'reduceMotionDidChange'; const TOUCH_EXPLORATION_EVENT = 'touchExplorationDidChange'; type ChangeEventName = $Keys<{ change: string, reduceMotionChanged: string, screenReaderChanged: string, ... }>; const _subscriptions = new Map(); /** * Sometimes it's useful to know whether or not the device has a screen reader * that is currently active. The `AccessibilityInfo` API is designed for this * purpose. You can use it to query the current state of the screen reader as * well as to register to be notified when the state of the screen reader * changes. * * See https://reactnative.dev/docs/accessibilityinfo.html */ const AccessibilityInfo = { /** * iOS only */ isBoldTextEnabled: function(): Promise { return Promise.resolve(false); }, /** * iOS only */ isGrayscaleEnabled: function(): Promise { return Promise.resolve(false); }, /** * iOS only */ isInvertColorsEnabled: function(): Promise { return Promise.resolve(false); }, isReduceMotionEnabled: function(): Promise { return new Promise((resolve, reject) => { if (NativeAccessibilityInfo) { NativeAccessibilityInfo.isReduceMotionEnabled(resolve); } else { reject(false); } }); }, /** * iOS only */ isReduceTransparencyEnabled: function(): Promise { return Promise.resolve(false); }, isScreenReaderEnabled: function(): Promise { return new Promise((resolve, reject) => { if (NativeAccessibilityInfo) { NativeAccessibilityInfo.isTouchExplorationEnabled(resolve); } else { reject(false); } }); }, /** * Deprecated * * Same as `isScreenReaderEnabled` */ get fetch(): () => Promise { console.warn( 'AccessibilityInfo.fetch is deprecated, call AccessibilityInfo.isScreenReaderEnabled instead', ); return this.isScreenReaderEnabled; }, addEventListener: function( eventName: ChangeEventName, handler: Function, ): void { let listener; if (eventName === 'change' || eventName === 'screenReaderChanged') { listener = RCTDeviceEventEmitter.addListener( TOUCH_EXPLORATION_EVENT, enabled => { handler(enabled); }, ); } else if (eventName === 'reduceMotionChanged') { listener = RCTDeviceEventEmitter.addListener( REDUCE_MOTION_EVENT, enabled => { handler(enabled); }, ); } _subscriptions.set(handler, listener); }, removeEventListener: function( eventName: ChangeEventName, handler: Function, ): void { const listener = _subscriptions.get(handler); if (!listener) { return; } listener.remove(); _subscriptions.delete(handler); }, /** * Set accessibility focus to a react component. * * See https://reactnative.dev/docs/accessibilityinfo.html#setaccessibilityfocus */ setAccessibilityFocus: function(reactTag: number): void { UIManager.sendAccessibilityEvent( reactTag, UIManager.getConstants().AccessibilityEventTypes.typeViewFocused, ); }, /** * Post a string to be announced by the screen reader. * * See https://reactnative.dev/docs/accessibilityinfo.html#announceforaccessibility */ announceForAccessibility: function(announcement: string): void { if (NativeAccessibilityInfo) { NativeAccessibilityInfo.announceForAccessibility(announcement); } }, }; module.exports = AccessibilityInfo;