UNPKG

2.85 kBJavaScriptView Raw
1import { NativeModules, NativeEventEmitter, Platform } from 'react-native';
2const { ExponentSpeech } = NativeModules;
3const SpeechEventEmitter = new NativeEventEmitter(ExponentSpeech);
4const _CALLBACKS = {};
5let _nextCallbackId = 1;
6let _didSetListeners = false;
7function _unregisterListenersIfNeeded() {
8 if (Object.keys(_CALLBACKS).length === 0) {
9 removeSpeakingListener('Exponent.speakingStarted');
10 removeSpeakingListener('Exponent.speakingDone');
11 removeSpeakingListener('Exponent.speakingStopped');
12 removeSpeakingListener('Exponent.speakingError');
13 _didSetListeners = false;
14 }
15}
16function _registerListenersIfNeeded() {
17 if (_didSetListeners)
18 return;
19 _didSetListeners = true;
20 setSpeakingListener('Exponent.speakingStarted', ({ id }) => {
21 const options = _CALLBACKS[id];
22 if (options && options.onStart) {
23 options.onStart();
24 }
25 });
26 setSpeakingListener('Exponent.speakingDone', ({ id }) => {
27 const options = _CALLBACKS[id];
28 if (options && options.onDone) {
29 options.onDone();
30 }
31 delete _CALLBACKS[id];
32 _unregisterListenersIfNeeded();
33 });
34 setSpeakingListener('Exponent.speakingStopped', ({ id }) => {
35 const options = _CALLBACKS[id];
36 if (options && options.onStopped) {
37 options.onStopped();
38 }
39 delete _CALLBACKS[id];
40 _unregisterListenersIfNeeded();
41 });
42 setSpeakingListener('Exponent.speakingError', ({ id, error }) => {
43 const options = _CALLBACKS[id];
44 if (options && options.onError) {
45 options.onError(new Error(error));
46 }
47 delete _CALLBACKS[id];
48 _unregisterListenersIfNeeded();
49 });
50}
51export function speak(text, options = {}) {
52 const id = _nextCallbackId++;
53 _CALLBACKS[id] = options;
54 _registerListenersIfNeeded();
55 ExponentSpeech.speak(String(id), text, options);
56}
57export async function isSpeakingAsync() {
58 return await ExponentSpeech.isSpeaking();
59}
60export function stop() {
61 ExponentSpeech.stop();
62}
63export function pause() {
64 if (Platform.OS === 'ios') {
65 ExponentSpeech.pause();
66 }
67 else {
68 throw new Error('Speech.pause is not available on Android');
69 }
70}
71export function resume() {
72 if (Platform.OS === 'ios') {
73 ExponentSpeech.resume();
74 }
75 else {
76 throw new Error('Speech.resume is not available on Android');
77 }
78}
79function setSpeakingListener(eventName, callback) {
80 if (SpeechEventEmitter.listeners(eventName).length > 0) {
81 SpeechEventEmitter.removeAllListeners(eventName);
82 }
83 SpeechEventEmitter.addListener(eventName, callback);
84}
85function removeSpeakingListener(eventName) {
86 SpeechEventEmitter.removeAllListeners(eventName);
87}
88//# sourceMappingURL=Speech.js.map
\No newline at end of file