diff --git a/Libraries/Text/Text.js b/Libraries/Text/Text.js index eba66e2027793f..29d9510077081a 100644 --- a/Libraries/Text/Text.js +++ b/Libraries/Text/Text.js @@ -231,6 +231,49 @@ const Text: React.AbstractComponent< const _hasOnPressOrOnLongPress = props.onPress != null || props.onLongPress != null; + let retryAnnouncement; + // the event listener detects if VoiceOver announcement fails + AccessibilityInfo.addEventListener( + 'announcementFinished', + ({announcement, success}) => { + if (!success && retryAnnouncement == null) { + retryAnnouncement = announcement; + console.log('retry announcement'); + console.log('announcement:', announcement); + AccessibilityInfo.announceForAccessibility(announcement); + } + if (success && retryAnnouncement === announcement) { + console.log('announcement succed, clear retryAnnouncement'); + console.log('announcement:', announcement); + retryAnnouncement = null; + } + + if (!success && retryAnnouncement !== announcement) { + console.log( + 'skip retry announcement for ' + + announcement + + 'as another announcement failed and we try only 1 per time', + ); + } + }, + ); + + // trigger voiceover announcement when text changes + React.useEffect(() => { + if ( + Platform.OS === 'ios' && + restProps.accessibilityLiveRegion != null && + restProps.accessibilityLiveRegion !== 'none' && + typeof restProps.children === 'string' + ) { + const queue = restProps.accessibilityLiveRegion === 'polite'; + AccessibilityInfo.announceForAccessibilityWithOptions( + restProps.children, + {queue}, + ); + } + }, [restProps.children]); + return hasTextAncestor ? (