srs-heritage-chatbot 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (187) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +194 -0
  3. package/lib/commonjs/assets/chat-icon-mobile.svg +1 -0
  4. package/lib/commonjs/assets/heritage.png +0 -0
  5. package/lib/commonjs/assets/posiden.svg +51 -0
  6. package/lib/commonjs/components/LoadingTips.js +104 -0
  7. package/lib/commonjs/components/LoadingTips.js.map +1 -0
  8. package/lib/commonjs/components/email.js +461 -0
  9. package/lib/commonjs/components/email.js.map +1 -0
  10. package/lib/commonjs/components/feedback.js +114 -0
  11. package/lib/commonjs/components/feedback.js.map +1 -0
  12. package/lib/commonjs/components/header.js +126 -0
  13. package/lib/commonjs/components/header.js.map +1 -0
  14. package/lib/commonjs/components/input.js +144 -0
  15. package/lib/commonjs/components/input.js.map +1 -0
  16. package/lib/commonjs/components/productCard.js +688 -0
  17. package/lib/commonjs/components/productCard.js.map +1 -0
  18. package/lib/commonjs/components/progressCircle.js +99 -0
  19. package/lib/commonjs/components/progressCircle.js.map +1 -0
  20. package/lib/commonjs/components/testing.js +74 -0
  21. package/lib/commonjs/components/testing.js.map +1 -0
  22. package/lib/commonjs/components/voice.js +184 -0
  23. package/lib/commonjs/components/voice.js.map +1 -0
  24. package/lib/commonjs/components/welcomeButton.js +149 -0
  25. package/lib/commonjs/components/welcomeButton.js.map +1 -0
  26. package/lib/commonjs/components/welcomeInput.js +137 -0
  27. package/lib/commonjs/components/welcomeInput.js.map +1 -0
  28. package/lib/commonjs/contexts/AppContext.js +552 -0
  29. package/lib/commonjs/contexts/AppContext.js.map +1 -0
  30. package/lib/commonjs/hooks/Stream.js +599 -0
  31. package/lib/commonjs/hooks/Stream.js.map +1 -0
  32. package/lib/commonjs/hooks/useAsyncStorage.js +36 -0
  33. package/lib/commonjs/hooks/useAsyncStorage.js.map +1 -0
  34. package/lib/commonjs/index.js +44 -0
  35. package/lib/commonjs/index.js.map +1 -0
  36. package/lib/commonjs/layout/disclaimer.js +208 -0
  37. package/lib/commonjs/layout/disclaimer.js.map +1 -0
  38. package/lib/commonjs/layout/ex.js +254 -0
  39. package/lib/commonjs/layout/ex.js.map +1 -0
  40. package/lib/commonjs/layout/icon.js +118 -0
  41. package/lib/commonjs/layout/icon.js.map +1 -0
  42. package/lib/commonjs/layout/layout.js +168 -0
  43. package/lib/commonjs/layout/layout.js.map +1 -0
  44. package/lib/commonjs/layout/welcome.js +160 -0
  45. package/lib/commonjs/layout/welcome.js.map +1 -0
  46. package/lib/commonjs/layout/window.js +396 -0
  47. package/lib/commonjs/layout/window.js.map +1 -0
  48. package/lib/commonjs/utils/audioRecorder.js +412 -0
  49. package/lib/commonjs/utils/audioRecorder.js.map +1 -0
  50. package/lib/commonjs/utils/cloudinary.js +69 -0
  51. package/lib/commonjs/utils/cloudinary.js.map +1 -0
  52. package/lib/commonjs/utils/storage.js +76 -0
  53. package/lib/commonjs/utils/storage.js.map +1 -0
  54. package/lib/commonjs/utils/textToSpeech.js +53 -0
  55. package/lib/commonjs/utils/textToSpeech.js.map +1 -0
  56. package/lib/module/assets/chat-icon-mobile.svg +1 -0
  57. package/lib/module/assets/heritage.png +0 -0
  58. package/lib/module/assets/posiden.svg +51 -0
  59. package/lib/module/components/LoadingTips.js +95 -0
  60. package/lib/module/components/LoadingTips.js.map +1 -0
  61. package/lib/module/components/email.js +452 -0
  62. package/lib/module/components/email.js.map +1 -0
  63. package/lib/module/components/feedback.js +105 -0
  64. package/lib/module/components/feedback.js.map +1 -0
  65. package/lib/module/components/header.js +117 -0
  66. package/lib/module/components/header.js.map +1 -0
  67. package/lib/module/components/input.js +135 -0
  68. package/lib/module/components/input.js.map +1 -0
  69. package/lib/module/components/productCard.js +679 -0
  70. package/lib/module/components/productCard.js.map +1 -0
  71. package/lib/module/components/progressCircle.js +91 -0
  72. package/lib/module/components/progressCircle.js.map +1 -0
  73. package/lib/module/components/testing.js +66 -0
  74. package/lib/module/components/testing.js.map +1 -0
  75. package/lib/module/components/voice.js +175 -0
  76. package/lib/module/components/voice.js.map +1 -0
  77. package/lib/module/components/welcomeButton.js +140 -0
  78. package/lib/module/components/welcomeButton.js.map +1 -0
  79. package/lib/module/components/welcomeInput.js +128 -0
  80. package/lib/module/components/welcomeInput.js.map +1 -0
  81. package/lib/module/contexts/AppContext.js +542 -0
  82. package/lib/module/contexts/AppContext.js.map +1 -0
  83. package/lib/module/hooks/Stream.js +592 -0
  84. package/lib/module/hooks/Stream.js.map +1 -0
  85. package/lib/module/hooks/useAsyncStorage.js +29 -0
  86. package/lib/module/hooks/useAsyncStorage.js.map +1 -0
  87. package/lib/module/index.js +36 -0
  88. package/lib/module/index.js.map +1 -0
  89. package/lib/module/layout/disclaimer.js +199 -0
  90. package/lib/module/layout/disclaimer.js.map +1 -0
  91. package/lib/module/layout/ex.js +253 -0
  92. package/lib/module/layout/ex.js.map +1 -0
  93. package/lib/module/layout/icon.js +108 -0
  94. package/lib/module/layout/icon.js.map +1 -0
  95. package/lib/module/layout/layout.js +160 -0
  96. package/lib/module/layout/layout.js.map +1 -0
  97. package/lib/module/layout/welcome.js +150 -0
  98. package/lib/module/layout/welcome.js.map +1 -0
  99. package/lib/module/layout/window.js +387 -0
  100. package/lib/module/layout/window.js.map +1 -0
  101. package/lib/module/utils/audioRecorder.js +398 -0
  102. package/lib/module/utils/audioRecorder.js.map +1 -0
  103. package/lib/module/utils/cloudinary.js +61 -0
  104. package/lib/module/utils/cloudinary.js.map +1 -0
  105. package/lib/module/utils/storage.js +67 -0
  106. package/lib/module/utils/storage.js.map +1 -0
  107. package/lib/module/utils/textToSpeech.js +43 -0
  108. package/lib/module/utils/textToSpeech.js.map +1 -0
  109. package/lib/typescript/components/LoadingTips.d.ts +3 -0
  110. package/lib/typescript/components/LoadingTips.d.ts.map +1 -0
  111. package/lib/typescript/components/email.d.ts +6 -0
  112. package/lib/typescript/components/email.d.ts.map +1 -0
  113. package/lib/typescript/components/feedback.d.ts +6 -0
  114. package/lib/typescript/components/feedback.d.ts.map +1 -0
  115. package/lib/typescript/components/header.d.ts +3 -0
  116. package/lib/typescript/components/header.d.ts.map +1 -0
  117. package/lib/typescript/components/input.d.ts +6 -0
  118. package/lib/typescript/components/input.d.ts.map +1 -0
  119. package/lib/typescript/components/productCard.d.ts +7 -0
  120. package/lib/typescript/components/productCard.d.ts.map +1 -0
  121. package/lib/typescript/components/progressCircle.d.ts +3 -0
  122. package/lib/typescript/components/progressCircle.d.ts.map +1 -0
  123. package/lib/typescript/components/testing.d.ts +6 -0
  124. package/lib/typescript/components/testing.d.ts.map +1 -0
  125. package/lib/typescript/components/voice.d.ts +5 -0
  126. package/lib/typescript/components/voice.d.ts.map +1 -0
  127. package/lib/typescript/components/welcomeButton.d.ts +4 -0
  128. package/lib/typescript/components/welcomeButton.d.ts.map +1 -0
  129. package/lib/typescript/components/welcomeInput.d.ts +6 -0
  130. package/lib/typescript/components/welcomeInput.d.ts.map +1 -0
  131. package/lib/typescript/contexts/AppContext.d.ts +10 -0
  132. package/lib/typescript/contexts/AppContext.d.ts.map +1 -0
  133. package/lib/typescript/hooks/Stream.d.ts +2 -0
  134. package/lib/typescript/hooks/Stream.d.ts.map +1 -0
  135. package/lib/typescript/hooks/useAsyncStorage.d.ts +2 -0
  136. package/lib/typescript/hooks/useAsyncStorage.d.ts.map +1 -0
  137. package/lib/typescript/index.d.ts +8 -0
  138. package/lib/typescript/index.d.ts.map +1 -0
  139. package/lib/typescript/layout/disclaimer.d.ts +5 -0
  140. package/lib/typescript/layout/disclaimer.d.ts.map +1 -0
  141. package/lib/typescript/layout/ex.d.ts +1 -0
  142. package/lib/typescript/layout/ex.d.ts.map +1 -0
  143. package/lib/typescript/layout/icon.d.ts +3 -0
  144. package/lib/typescript/layout/icon.d.ts.map +1 -0
  145. package/lib/typescript/layout/layout.d.ts +3 -0
  146. package/lib/typescript/layout/layout.d.ts.map +1 -0
  147. package/lib/typescript/layout/welcome.d.ts +6 -0
  148. package/lib/typescript/layout/welcome.d.ts.map +1 -0
  149. package/lib/typescript/layout/window.d.ts +5 -0
  150. package/lib/typescript/layout/window.d.ts.map +1 -0
  151. package/lib/typescript/utils/audioRecorder.d.ts +9 -0
  152. package/lib/typescript/utils/audioRecorder.d.ts.map +1 -0
  153. package/lib/typescript/utils/cloudinary.d.ts +17 -0
  154. package/lib/typescript/utils/cloudinary.d.ts.map +1 -0
  155. package/lib/typescript/utils/storage.d.ts +29 -0
  156. package/lib/typescript/utils/storage.d.ts.map +1 -0
  157. package/lib/typescript/utils/textToSpeech.d.ts +2 -0
  158. package/lib/typescript/utils/textToSpeech.d.ts.map +1 -0
  159. package/package.json +109 -0
  160. package/src/assets/chat-icon-mobile.svg +1 -0
  161. package/src/assets/heritage.png +0 -0
  162. package/src/assets/posiden.svg +51 -0
  163. package/src/components/LoadingTips.js +99 -0
  164. package/src/components/email.js +467 -0
  165. package/src/components/feedback.js +114 -0
  166. package/src/components/header.js +119 -0
  167. package/src/components/input.js +133 -0
  168. package/src/components/productCard.js +815 -0
  169. package/src/components/progressCircle.js +88 -0
  170. package/src/components/testing.js +60 -0
  171. package/src/components/voice.js +228 -0
  172. package/src/components/welcomeButton.js +161 -0
  173. package/src/components/welcomeInput.js +133 -0
  174. package/src/contexts/AppContext.js +678 -0
  175. package/src/hooks/Stream.js +655 -0
  176. package/src/hooks/useAsyncStorage.js +33 -0
  177. package/src/index.js +30 -0
  178. package/src/layout/disclaimer.js +231 -0
  179. package/src/layout/ex.js +252 -0
  180. package/src/layout/icon.js +105 -0
  181. package/src/layout/layout.js +160 -0
  182. package/src/layout/welcome.js +172 -0
  183. package/src/layout/window.js +476 -0
  184. package/src/utils/audioRecorder.js +445 -0
  185. package/src/utils/cloudinary.js +61 -0
  186. package/src/utils/storage.ts +89 -0
  187. package/src/utils/textToSpeech.js +49 -0
@@ -0,0 +1,412 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.cancelRecording = cancelRecording;
7
+ exports.cleanup = cleanup;
8
+ exports.initVoice = initVoice;
9
+ exports.requestAudioPermission = requestAudioPermission;
10
+ exports.resetStoredPermission = resetStoredPermission;
11
+ exports.setPermissionStatusHandlers = setPermissionStatusHandlers;
12
+ exports.startRecording = startRecording;
13
+ exports.stopRecording = stopRecording;
14
+ var _reactNative = require("react-native");
15
+ var _voice = _interopRequireDefault(require("@react-native-voice/voice"));
16
+ var _reactNativePermissions = require("react-native-permissions");
17
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
18
+ // audioRecorder.js
19
+
20
+ let resultCallback = null;
21
+ let partialResultCallback = null;
22
+ let silenceTimer = null;
23
+ let isCurrentlyRecording = false;
24
+ let finalResult = '';
25
+ const SILENCE_DURATION = 5000; // 5 seconds of silence before stopping
26
+
27
+ // Add this constant for AsyncStorage key
28
+ const PERMISSION_STORAGE_KEY = '@voice_permission_status';
29
+
30
+ // Create a function that can be called to get permission status
31
+ // This needs to be outside the React component lifecycle
32
+ let permissionStatusGetter = null;
33
+ let permissionStatusSetter = null;
34
+ function setPermissionStatusHandlers(getter, setter) {
35
+ permissionStatusGetter = getter;
36
+ permissionStatusSetter = setter;
37
+ }
38
+
39
+ // Initialize Voice handlers - modified to support live transcription
40
+ async function initVoice(onResult, onPartialResult = null) {
41
+ try {
42
+ resultCallback = onResult;
43
+ partialResultCallback = onPartialResult; // Store partial callback
44
+ finalResult = '';
45
+
46
+ // Check if Voice module is available
47
+ if (!_voice.default) {
48
+ console.error('Voice module is not available');
49
+ return false;
50
+ }
51
+
52
+ // First check if speech recognition is available
53
+ const isAvailable = await _voice.default.isAvailable();
54
+ if (!isAvailable) {
55
+ console.error('Speech recognition is not available on this device');
56
+ return false;
57
+ }
58
+
59
+ // Remove any existing listeners
60
+ _voice.default.removeAllListeners();
61
+
62
+ // Set up all event listeners
63
+ _voice.default.onSpeechStart = e => {
64
+ console.log('onSpeechStart: ', e);
65
+ isCurrentlyRecording = true;
66
+ finalResult = '';
67
+
68
+ // Start silence timer immediately when recording begins
69
+ handleSilenceDetection();
70
+ };
71
+ _voice.default.onSpeechRecognized = e => {
72
+ console.log('onSpeechRecognized: ', e);
73
+ if (e.isFinal) {
74
+ console.log('Speech recognition final');
75
+ handleFinalResult();
76
+ }
77
+ };
78
+ _voice.default.onSpeechEnd = async e => {
79
+ console.log('onSpeechEnd: ', e);
80
+ if (silenceTimer) {
81
+ clearTimeout(silenceTimer);
82
+ silenceTimer = null;
83
+ }
84
+
85
+ // Only handle final result if we're still recording
86
+ if (isCurrentlyRecording) {
87
+ await handleFinalResult();
88
+ }
89
+ };
90
+ _voice.default.onSpeechError = async e => {
91
+ var _e$error, _e$error2;
92
+ console.log('onSpeechError: ', e);
93
+ if (silenceTimer) {
94
+ clearTimeout(silenceTimer);
95
+ silenceTimer = null;
96
+ }
97
+ const code = (_e$error = e.error) === null || _e$error === void 0 || (_e$error = _e$error.code) === null || _e$error === void 0 ? void 0 : _e$error.toString();
98
+ const msg = ((_e$error2 = e.error) === null || _e$error2 === void 0 ? void 0 : _e$error2.message) || '';
99
+
100
+ // Handle Android-specific errors
101
+ if (_reactNative.Platform.OS === 'android' && (code === '7' || code === '5')) {
102
+ if (finalResult && resultCallback) {
103
+ resultCallback(finalResult, null);
104
+ }
105
+ } else if (!msg.includes('No speech detected') && resultCallback) {
106
+ resultCallback(null, msg);
107
+ }
108
+ await cleanupVoiceSession();
109
+ };
110
+ _voice.default.onSpeechResults = e => {
111
+ console.log('onSpeechResults: ', e);
112
+ if (e.value && e.value.length > 0) {
113
+ finalResult = e.value[0];
114
+ handleSilenceDetection();
115
+ }
116
+ };
117
+ _voice.default.onSpeechPartialResults = e => {
118
+ console.log('onSpeechPartialResults: ', e);
119
+ if (silenceTimer) {
120
+ clearTimeout(silenceTimer);
121
+ }
122
+
123
+ // Only process partial results if we're still actively recording
124
+ if (e.value && e.value.length > 0 && isCurrentlyRecording) {
125
+ finalResult = e.value[0];
126
+
127
+ // Call partial callback for live transcription
128
+ if (partialResultCallback) {
129
+ partialResultCallback(finalResult);
130
+ }
131
+ handleSilenceDetection();
132
+ }
133
+ };
134
+ if (_reactNative.Platform.OS === 'android') {
135
+ _voice.default.onSpeechVolumeChanged = e => {
136
+ console.log('onSpeechVolumeChanged: ', e);
137
+ };
138
+ }
139
+ return true;
140
+ } catch (error) {
141
+ console.error('Error initializing Voice:', error);
142
+ return false;
143
+ }
144
+ }
145
+ const handleSilenceDetection = () => {
146
+ if (silenceTimer) {
147
+ clearTimeout(silenceTimer);
148
+ }
149
+ silenceTimer = setTimeout(async () => {
150
+ if (isCurrentlyRecording) {
151
+ await handleFinalResult();
152
+ }
153
+ }, SILENCE_DURATION);
154
+ };
155
+ const handleFinalResult = async () => {
156
+ if (!isCurrentlyRecording) return;
157
+ console.log('handleFinalResult called with:', finalResult);
158
+
159
+ // Set this FIRST to prevent any more partial results from being processed
160
+ isCurrentlyRecording = false;
161
+
162
+ // Call the result callback to update UI (button state)
163
+ // Always call callback even if result is empty to prevent UI getting stuck
164
+ if (resultCallback) {
165
+ resultCallback(finalResult || '', null);
166
+ }
167
+
168
+ // Then stop recording
169
+ await stopRecording();
170
+ };
171
+ const cleanupVoiceSession = async () => {
172
+ console.log('cleanupVoiceSession called');
173
+ isCurrentlyRecording = false;
174
+ if (silenceTimer) {
175
+ clearTimeout(silenceTimer);
176
+ silenceTimer = null;
177
+ }
178
+ try {
179
+ // Check if Voice module is available
180
+ if (!_voice.default) {
181
+ console.log('Voice module not available during cleanup');
182
+ return;
183
+ }
184
+
185
+ // Check if still recognizing
186
+ const isRecognizing = await _voice.default.isRecognizing();
187
+ console.log('Voice.isRecognizing() in cleanup:', isRecognizing);
188
+ if (isRecognizing) {
189
+ try {
190
+ // For iOS, use cancel for immediate termination
191
+ if (_reactNative.Platform.OS === 'ios') {
192
+ await _voice.default.cancel();
193
+ console.log('Voice.cancel() completed for iOS');
194
+ } else {
195
+ await _voice.default.stop();
196
+ console.log('Voice.stop() completed for Android');
197
+ }
198
+ await new Promise(resolve => setTimeout(resolve, 100));
199
+ } catch (e) {
200
+ console.log('Error stopping/canceling in cleanup:', e);
201
+ }
202
+ }
203
+
204
+ // Destroy the instance
205
+ try {
206
+ await _voice.default.destroy();
207
+ console.log('Voice.destroy() completed');
208
+ await new Promise(resolve => setTimeout(resolve, 200));
209
+ } catch (e) {
210
+ console.log('Error destroying in cleanup:', e);
211
+ }
212
+ } catch (error) {
213
+ console.error('Error in cleanupVoiceSession:', error);
214
+ }
215
+ finalResult = '';
216
+ };
217
+ async function startRecording() {
218
+ try {
219
+ console.log('startRecording called');
220
+
221
+ // Check if Voice module is available
222
+ if (!_voice.default) {
223
+ console.error('Voice module is not available');
224
+ return false;
225
+ }
226
+
227
+ // Ensure cleanup of any existing session
228
+ await cleanupVoiceSession();
229
+
230
+ // Small delay to ensure cleanup is complete
231
+ await new Promise(resolve => setTimeout(resolve, 200));
232
+ const hasPermission = await requestAudioPermission();
233
+ if (!hasPermission) {
234
+ console.error('No permission to record audio');
235
+ return false;
236
+ }
237
+
238
+ // Re-initialize listeners each time for iOS stability
239
+ await initVoice(resultCallback, partialResultCallback);
240
+
241
+ // Start recognition
242
+ await _voice.default.start('en-US');
243
+ console.log('Voice.start() completed');
244
+ isCurrentlyRecording = true;
245
+
246
+ // Start silence detection timer immediately
247
+ // This ensures recording stops after 3 seconds even if no speech is detected
248
+ handleSilenceDetection();
249
+ return true;
250
+ } catch (error) {
251
+ console.error('Error starting voice recognition:', error);
252
+ await cleanupVoiceSession();
253
+ return false;
254
+ }
255
+ }
256
+ async function stopRecording() {
257
+ try {
258
+ console.log('stopRecording called');
259
+ if (!isCurrentlyRecording || !_voice.default) {
260
+ console.log('Not recording or Voice not available');
261
+ return;
262
+ }
263
+
264
+ // Set this first to prevent race conditions
265
+ isCurrentlyRecording = false;
266
+ if (silenceTimer) {
267
+ clearTimeout(silenceTimer);
268
+ silenceTimer = null;
269
+ }
270
+
271
+ // Platform-specific stop
272
+ try {
273
+ if (_reactNative.Platform.OS === 'ios') {
274
+ // iOS: Use cancel for immediate termination - wait 1 second first
275
+ await new Promise(resolve => setTimeout(resolve, 1000));
276
+ await _voice.default.cancel();
277
+ console.log('Voice.cancel() completed for iOS');
278
+ } else {
279
+ // Android: Use stop - wait 1 second first
280
+ await new Promise(resolve => setTimeout(resolve, 1000));
281
+ await _voice.default.stop();
282
+ console.log('Voice.stop() completed for Android');
283
+ }
284
+
285
+ // Small delay
286
+ await new Promise(resolve => setTimeout(resolve, 100));
287
+ } catch (error) {
288
+ console.log('Error stopping/canceling Voice:', error);
289
+ }
290
+
291
+ // Then destroy
292
+ try {
293
+ await _voice.default.destroy();
294
+ console.log('Voice.destroy() completed');
295
+ await new Promise(resolve => setTimeout(resolve, 200));
296
+ } catch (error) {
297
+ console.log('Error destroying Voice:', error);
298
+ }
299
+
300
+ // Final cleanup
301
+ finalResult = '';
302
+ } catch (error) {
303
+ console.error('Error in stopRecording:', error);
304
+ await cleanupVoiceSession();
305
+ }
306
+ }
307
+ async function cancelRecording() {
308
+ try {
309
+ if (!_voice.default) return;
310
+ await _voice.default.cancel();
311
+ await cleanupVoiceSession();
312
+ } catch (error) {
313
+ console.error('Error canceling voice recognition:', error);
314
+ await cleanupVoiceSession();
315
+ }
316
+ }
317
+ async function requestAudioPermission() {
318
+ try {
319
+ // Get stored permission if available
320
+ const storedPermission = permissionStatusGetter ? permissionStatusGetter() : null;
321
+ if (storedPermission === 'denied') {
322
+ console.log('Permission previously denied by user');
323
+ return false;
324
+ }
325
+ let permissionResult = false;
326
+ if (_reactNative.Platform.OS === 'android') {
327
+ permissionResult = await requestAndroidPermission();
328
+ } else if (_reactNative.Platform.OS === 'ios') {
329
+ permissionResult = await requestIOSPermission();
330
+ }
331
+
332
+ // Store the result
333
+ if (permissionStatusSetter) {
334
+ permissionStatusSetter(permissionResult ? 'granted' : 'denied');
335
+ }
336
+ return permissionResult;
337
+ } catch (error) {
338
+ console.error('Error checking stored permission:', error);
339
+ return false;
340
+ }
341
+ }
342
+ async function requestAndroidPermission() {
343
+ try {
344
+ // Request microphone permission
345
+ const micPermission = await (0, _reactNativePermissions.request)(_reactNativePermissions.PERMISSIONS.ANDROID.RECORD_AUDIO);
346
+ if (micPermission !== _reactNativePermissions.RESULTS.GRANTED) {
347
+ console.log('Microphone permission denied');
348
+ return false;
349
+ }
350
+
351
+ // Check speech recognition services
352
+ try {
353
+ const services = await _voice.default.getSpeechRecognitionServices();
354
+ if (!services || services.length === 0) {
355
+ console.error('No speech recognition services available');
356
+ return false;
357
+ }
358
+ } catch (e) {
359
+ console.log('Error checking speech services:', e);
360
+ // Continue anyway - some devices report error but work fine
361
+ }
362
+ return true;
363
+ } catch (error) {
364
+ console.error('Error requesting Android permission:', error);
365
+ return false;
366
+ }
367
+ }
368
+ async function requestIOSPermission() {
369
+ try {
370
+ // Request microphone permission
371
+ const micPermission = await (0, _reactNativePermissions.request)(_reactNativePermissions.PERMISSIONS.IOS.MICROPHONE);
372
+ if (micPermission !== _reactNativePermissions.RESULTS.GRANTED) {
373
+ console.log('Microphone permission denied');
374
+ return false;
375
+ }
376
+
377
+ // Request speech recognition permission
378
+ const speechPermission = await (0, _reactNativePermissions.request)(_reactNativePermissions.PERMISSIONS.IOS.SPEECH_RECOGNITION);
379
+ if (speechPermission !== _reactNativePermissions.RESULTS.GRANTED) {
380
+ console.log('Speech recognition permission denied');
381
+ return false;
382
+ }
383
+ return true;
384
+ } catch (error) {
385
+ console.error('Error requesting iOS permissions:', error);
386
+ return false;
387
+ }
388
+ }
389
+ function resetStoredPermission() {
390
+ if (permissionStatusSetter) {
391
+ permissionStatusSetter(null);
392
+ return true;
393
+ }
394
+ return false;
395
+ }
396
+ function cleanup() {
397
+ if (!_voice.default) {
398
+ console.log('Voice module not available during cleanup');
399
+ return;
400
+ }
401
+ _voice.default.destroy().then(() => {
402
+ _voice.default.removeAllListeners();
403
+ cleanupVoiceSession();
404
+ }).catch(error => {
405
+ console.error('Error in cleanup:', error);
406
+ // Try one more time
407
+ if (_voice.default) {
408
+ _voice.default.destroy().catch(e => console.error('Final cleanup attempt failed:', e));
409
+ }
410
+ });
411
+ }
412
+ //# sourceMappingURL=audioRecorder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_reactNative","require","_voice","_interopRequireDefault","_reactNativePermissions","e","__esModule","default","resultCallback","partialResultCallback","silenceTimer","isCurrentlyRecording","finalResult","SILENCE_DURATION","PERMISSION_STORAGE_KEY","permissionStatusGetter","permissionStatusSetter","setPermissionStatusHandlers","getter","setter","initVoice","onResult","onPartialResult","Voice","console","error","isAvailable","removeAllListeners","onSpeechStart","log","handleSilenceDetection","onSpeechRecognized","isFinal","handleFinalResult","onSpeechEnd","clearTimeout","onSpeechError","_e$error","_e$error2","code","toString","msg","message","Platform","OS","includes","cleanupVoiceSession","onSpeechResults","value","length","onSpeechPartialResults","onSpeechVolumeChanged","setTimeout","stopRecording","isRecognizing","cancel","stop","Promise","resolve","destroy","startRecording","hasPermission","requestAudioPermission","start","cancelRecording","storedPermission","permissionResult","requestAndroidPermission","requestIOSPermission","micPermission","request","PERMISSIONS","ANDROID","RECORD_AUDIO","RESULTS","GRANTED","services","getSpeechRecognitionServices","IOS","MICROPHONE","speechPermission","SPEECH_RECOGNITION","resetStoredPermission","cleanup","then","catch"],"sourceRoot":"../../../src","sources":["utils/audioRecorder.js"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = exports.CloudinaryBannerImage = void 0;
7
+ var _react = _interopRequireWildcard(require("react"));
8
+ var _urlGen = require("@cloudinary/url-gen");
9
+ var _reactNative = require("react-native");
10
+ var _cloudinaryReactNative = require("cloudinary-react-native");
11
+ var _resize = require("@cloudinary/url-gen/actions/resize");
12
+ var _AppContext = require("../contexts/AppContext");
13
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
14
+ const CloudinaryImage = ({
15
+ cldImg,
16
+ imageStyle,
17
+ accessibilityLabel,
18
+ testID
19
+ }) => {
20
+ const {
21
+ brandCloudName
22
+ } = (0, _react.useContext)(_AppContext.AppContext);
23
+ const cld = new _urlGen.Cloudinary({
24
+ cloud: {
25
+ cloudName: brandCloudName || 'mktg'
26
+ }
27
+ });
28
+ const myImage = _reactNative.Platform.OS === 'ios' ? cld.image(`${cldImg}`) : cld.image(`${cldImg}`).format('png');
29
+ return /*#__PURE__*/_react.default.createElement(_reactNative.View, null, /*#__PURE__*/_react.default.createElement(_cloudinaryReactNative.AdvancedImage, {
30
+ cldImg: myImage,
31
+ accessibilityLabel: accessibilityLabel,
32
+ testID: testID,
33
+ style: [{
34
+ resizeMode: 'contain'
35
+ }, imageStyle]
36
+ }));
37
+ };
38
+ const CloudinaryBannerImage = ({
39
+ cldImg,
40
+ imageStyle,
41
+ accessibilityLabel,
42
+ testID,
43
+ width = 345,
44
+ height = 100
45
+ }) => {
46
+ const {
47
+ brandCloudName
48
+ } = (0, _react.useContext)(_AppContext.AppContext);
49
+ const cld = new _urlGen.Cloudinary({
50
+ cloud: {
51
+ cloudName: brandCloudName || 'mktg'
52
+ }
53
+ });
54
+ const myImage = cld.image(`${cldImg}`);
55
+ myImage.resize((0, _resize.scale)().width(parseInt(width * 3)).height(parseInt(height * 3)));
56
+ return /*#__PURE__*/_react.default.createElement(_reactNative.View, null, /*#__PURE__*/_react.default.createElement(_cloudinaryReactNative.AdvancedImage, {
57
+ cldImg: myImage,
58
+ accessibilityLabel: accessibilityLabel,
59
+ testID: testID,
60
+ style: [{
61
+ resizeMode: 'contain',
62
+ width: width,
63
+ height: height
64
+ }, imageStyle]
65
+ }));
66
+ };
67
+ exports.CloudinaryBannerImage = CloudinaryBannerImage;
68
+ var _default = exports.default = CloudinaryImage;
69
+ //# sourceMappingURL=cloudinary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_react","_interopRequireWildcard","require","_urlGen","_reactNative","_cloudinaryReactNative","_resize","_AppContext","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","CloudinaryImage","cldImg","imageStyle","accessibilityLabel","testID","brandCloudName","useContext","AppContext","cld","Cloudinary","cloud","cloudName","myImage","Platform","OS","image","format","createElement","View","AdvancedImage","style","resizeMode","CloudinaryBannerImage","width","height","resize","scale","parseInt","exports","_default"],"sourceRoot":"../../../src","sources":["utils/cloudinary.js"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,uBAAA,CAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AACA,IAAAE,YAAA,GAAAF,OAAA;AACA,IAAAG,sBAAA,GAAAH,OAAA;AACA,IAAAI,OAAA,GAAAJ,OAAA;AACA,IAAAK,WAAA,GAAAL,OAAA;AAAoD,SAAAD,wBAAAO,CAAA,EAAAC,CAAA,6BAAAC,OAAA,MAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAT,uBAAA,YAAAA,CAAAO,CAAA,EAAAC,CAAA,SAAAA,CAAA,IAAAD,CAAA,IAAAA,CAAA,CAAAK,UAAA,SAAAL,CAAA,MAAAM,CAAA,EAAAC,CAAA,EAAAC,CAAA,KAAAC,SAAA,QAAAC,OAAA,EAAAV,CAAA,iBAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,SAAAQ,CAAA,MAAAF,CAAA,GAAAL,CAAA,GAAAG,CAAA,GAAAD,CAAA,QAAAG,CAAA,CAAAK,GAAA,CAAAX,CAAA,UAAAM,CAAA,CAAAM,GAAA,CAAAZ,CAAA,GAAAM,CAAA,CAAAO,GAAA,CAAAb,CAAA,EAAAQ,CAAA,gBAAAP,CAAA,IAAAD,CAAA,gBAAAC,CAAA,OAAAa,cAAA,CAAAC,IAAA,CAAAf,CAAA,EAAAC,CAAA,OAAAM,CAAA,IAAAD,CAAA,GAAAU,MAAA,CAAAC,cAAA,KAAAD,MAAA,CAAAE,wBAAA,CAAAlB,CAAA,EAAAC,CAAA,OAAAM,CAAA,CAAAK,GAAA,IAAAL,CAAA,CAAAM,GAAA,IAAAP,CAAA,CAAAE,CAAA,EAAAP,CAAA,EAAAM,CAAA,IAAAC,CAAA,CAAAP,CAAA,IAAAD,CAAA,CAAAC,CAAA,WAAAO,CAAA,KAAAR,CAAA,EAAAC,CAAA;AAEpD,MAAMkB,eAAe,GAAGA,CAAC;EAAEC,MAAM;EAAEC,UAAU;EAAEC,kBAAkB;EAAEC;AAAO,CAAC,KAAK;EAC9E,MAAM;IAAEC;EAAe,CAAC,GAAG,IAAAC,iBAAU,EAACC,sBAAU,CAAC;EACjD,MAAMC,GAAG,GAAG,IAAIC,kBAAU,CAAC;IACzBC,KAAK,EAAE;MACLC,SAAS,EAAEN,cAAc,IAAI;IAC/B;EACF,CAAC,CAAC;EAEF,MAAMO,OAAO,GAAGC,qBAAQ,CAACC,EAAE,KAAK,KAAK,GAAGN,GAAG,CAACO,KAAK,CAAC,GAAGd,MAAM,EAAE,CAAC,GAAGO,GAAG,CAACO,KAAK,CAAC,GAAGd,MAAM,EAAE,CAAC,CAACe,MAAM,CAAC,KAAK,CAAC;EACrG,oBACE3C,MAAA,CAAAkB,OAAA,CAAA0B,aAAA,CAACxC,YAAA,CAAAyC,IAAI,qBACH7C,MAAA,CAAAkB,OAAA,CAAA0B,aAAA,CAACvC,sBAAA,CAAAyC,aAAa;IACZlB,MAAM,EAAEW,OAAQ;IAChBT,kBAAkB,EAAEA,kBAAmB;IACvCC,MAAM,EAAEA,MAAO;IACfgB,KAAK,EAAE,CAAC;MAAEC,UAAU,EAAE;IAAU,CAAC,EAAEnB,UAAU;EAAE,CAChD,CACG,CAAC;AAEX,CAAC;AAEM,MAAMoB,qBAAqB,GAAGA,CAAC;EACpCrB,MAAM;EACNC,UAAU;EACVC,kBAAkB;EAClBC,MAAM;EACNmB,KAAK,GAAG,GAAG;EACXC,MAAM,GAAG;AACX,CAAC,KAAK;EACJ,MAAM;IAAEnB;EAAe,CAAC,GAAG,IAAAC,iBAAU,EAACC,sBAAU,CAAC;EACjD,MAAMC,GAAG,GAAG,IAAIC,kBAAU,CAAC;IACzBC,KAAK,EAAE;MACLC,SAAS,EAAEN,cAAc,IAAI;IAC/B;EACF,CAAC,CAAC;EACF,MAAMO,OAAO,GAAGJ,GAAG,CAACO,KAAK,CAAC,GAAGd,MAAM,EAAE,CAAC;EACtCW,OAAO,CAACa,MAAM,CACZ,IAAAC,aAAK,EAAC,CAAC,CACJH,KAAK,CAACI,QAAQ,CAACJ,KAAK,GAAG,CAAC,CAAC,CAAC,CAC1BC,MAAM,CAACG,QAAQ,CAACH,MAAM,GAAG,CAAC,CAAC,CAChC,CAAC;EACD,oBACEnD,MAAA,CAAAkB,OAAA,CAAA0B,aAAA,CAACxC,YAAA,CAAAyC,IAAI,qBACH7C,MAAA,CAAAkB,OAAA,CAAA0B,aAAA,CAACvC,sBAAA,CAAAyC,aAAa;IACZlB,MAAM,EAAEW,OAAQ;IAChBT,kBAAkB,EAAEA,kBAAmB;IACvCC,MAAM,EAAEA,MAAO;IACfgB,KAAK,EAAE,CAAC;MAAEC,UAAU,EAAE,SAAS;MAAEE,KAAK,EAAEA,KAAK;MAAEC,MAAM,EAAEA;IAAO,CAAC,EAAEtB,UAAU;EAAE,CAC9E,CACG,CAAC;AAEX,CAAC;AAAC0B,OAAA,CAAAN,qBAAA,GAAAA,qBAAA;AAAA,IAAAO,QAAA,GAAAD,OAAA,CAAArC,OAAA,GAEaS,eAAe","ignoreList":[]}
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.updateChat = exports.loadChat = exports.defaultState = void 0;
7
+ var _asyncStorage = _interopRequireDefault(require("@react-native-async-storage/async-storage"));
8
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
9
+ // Module-level singleton to cache chat states by token
10
+ const chatStore = {};
11
+ const getStorageKey = token => `srschat_${token}`;
12
+ const defaultState = exports.defaultState = {
13
+ typingIndicator: false,
14
+ ghostMessage: false,
15
+ ghostCard: false,
16
+ stopActivated: false,
17
+ disclaimer: false,
18
+ startStreaming: false,
19
+ messages: [{
20
+ type: "ai",
21
+ text: "Hi there 👋 Hi there 👋 I'm your Heritage+ AI Assistant. I'm here to help you with Product and Account information during your online visit. I'm still learning and growing - the more we interact and the more feedback you share, the better I can assist you. How can I help you today?"
22
+ }],
23
+ showIcon: true,
24
+ toggleChat: false,
25
+ showModal: "Icon"
26
+ };
27
+
28
+ /**
29
+ * Loads chat state for a specific customer token
30
+ * Returns cached state if available, otherwise loads from AsyncStorage
31
+ */
32
+ const loadChat = async token => {
33
+ // Return from in-memory cache if available
34
+ const cachedState = chatStore[token];
35
+ if (cachedState !== undefined) {
36
+ return cachedState;
37
+ }
38
+
39
+ // Otherwise load from AsyncStorage
40
+ try {
41
+ const key = getStorageKey(token);
42
+ const storedData = await _asyncStorage.default.getItem(key);
43
+ if (storedData) {
44
+ const parsedData = JSON.parse(storedData);
45
+ // Cache in memory for future access
46
+ chatStore[token] = parsedData;
47
+ return parsedData;
48
+ }
49
+ } catch (error) {
50
+ console.error('Error loading chat state:', error);
51
+ }
52
+
53
+ // Return default state if nothing found
54
+ return defaultState;
55
+ };
56
+
57
+ /**
58
+ * Updates chat state for a specific customer token
59
+ * Updates both in-memory cache and persists to AsyncStorage
60
+ */
61
+ exports.loadChat = loadChat;
62
+ const updateChat = async (token, next) => {
63
+ try {
64
+ const key = getStorageKey(token);
65
+
66
+ // Update in-memory cache
67
+ chatStore[token] = next;
68
+
69
+ // Persist to AsyncStorage
70
+ await _asyncStorage.default.setItem(key, JSON.stringify(next));
71
+ } catch (error) {
72
+ console.error('Error updating chat state:', error);
73
+ }
74
+ };
75
+ exports.updateChat = updateChat;
76
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_asyncStorage","_interopRequireDefault","require","e","__esModule","default","chatStore","getStorageKey","token","defaultState","exports","typingIndicator","ghostMessage","ghostCard","stopActivated","disclaimer","startStreaming","messages","type","text","showIcon","toggleChat","showModal","loadChat","cachedState","undefined","key","storedData","AsyncStorage","getItem","parsedData","JSON","parse","error","console","updateChat","next","setItem","stringify"],"sourceRoot":"../../../src","sources":["utils/storage.ts"],"mappings":";;;;;;AAAA,IAAAA,aAAA,GAAAC,sBAAA,CAAAC,OAAA;AAAqE,SAAAD,uBAAAE,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAqBrE;AACA,MAAMG,SAAoC,GAAG,CAAC,CAAC;AAE/C,MAAMC,aAAa,GAAIC,KAAa,IAAK,WAAWA,KAAK,EAAE;AAEpD,MAAMC,YAAuB,GAAAC,OAAA,CAAAD,YAAA,GAAG;EACrCE,eAAe,EAAE,KAAK;EACtBC,YAAY,EAAE,KAAK;EACnBC,SAAS,EAAE,KAAK;EAChBC,aAAa,EAAE,KAAK;EACpBC,UAAU,EAAE,KAAK;EACjBC,cAAc,EAAE,KAAK;EACrBC,QAAQ,EAAE,CAAC;IACTC,IAAI,EAAE,IAAI;IACVC,IAAI,EAAE;EACR,CAAC,CAAC;EACFC,QAAQ,EAAE,IAAI;EACdC,UAAU,EAAE,KAAK;EACjBC,SAAS,EAAE;AACb,CAAC;;AAED;AACA;AACA;AACA;AACO,MAAMC,QAAQ,GAAG,MAAOf,KAAa,IAAyB;EACnE;EACA,MAAMgB,WAAW,GAAGlB,SAAS,CAACE,KAAK,CAAC;EACpC,IAAIgB,WAAW,KAAKC,SAAS,EAAE;IAC7B,OAAOD,WAAW;EACpB;;EAEA;EACA,IAAI;IACF,MAAME,GAAG,GAAGnB,aAAa,CAACC,KAAK,CAAC;IAChC,MAAMmB,UAAU,GAAG,MAAMC,qBAAY,CAACC,OAAO,CAACH,GAAG,CAAC;IAElD,IAAIC,UAAU,EAAE;MACd,MAAMG,UAAU,GAAGC,IAAI,CAACC,KAAK,CAACL,UAAU,CAAc;MACtD;MACArB,SAAS,CAACE,KAAK,CAAC,GAAGsB,UAAU;MAC7B,OAAOA,UAAU;IACnB;EACF,CAAC,CAAC,OAAOG,KAAK,EAAE;IACdC,OAAO,CAACD,KAAK,CAAC,2BAA2B,EAAEA,KAAK,CAAC;EACnD;;EAEA;EACA,OAAOxB,YAAY;AACrB,CAAC;;AAED;AACA;AACA;AACA;AAHAC,OAAA,CAAAa,QAAA,GAAAA,QAAA;AAIO,MAAMY,UAAU,GAAG,MAAAA,CAAO3B,KAAa,EAAE4B,IAAe,KAAoB;EACjF,IAAI;IACF,MAAMV,GAAG,GAAGnB,aAAa,CAACC,KAAK,CAAC;;IAEhC;IACAF,SAAS,CAACE,KAAK,CAAC,GAAG4B,IAAI;;IAEvB;IACA,MAAMR,qBAAY,CAACS,OAAO,CAACX,GAAG,EAAEK,IAAI,CAACO,SAAS,CAACF,IAAI,CAAC,CAAC;EACvD,CAAC,CAAC,OAAOH,KAAK,EAAE;IACdC,OAAO,CAACD,KAAK,CAAC,4BAA4B,EAAEA,KAAK,CAAC;EACpD;AACF,CAAC;AAACvB,OAAA,CAAAyB,UAAA,GAAAA,UAAA","ignoreList":[]}
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.TextToSpeech = void 0;
7
+ var _react = _interopRequireWildcard(require("react"));
8
+ var _reactNativeSound = _interopRequireDefault(require("react-native-sound"));
9
+ var _AppContext = require("../contexts/AppContext");
10
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
11
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
12
+ // textToSpeech.js
13
+
14
+ const TextToSpeech = async inputText => {
15
+ const {
16
+ data
17
+ } = (0, _react.useContext)(_AppContext.AppContext);
18
+ try {
19
+ const response = await fetch('https://api.openai.com/v1/audio/speech', {
20
+ method: 'POST',
21
+ headers: {
22
+ Authorization: `Bearer ${data.openai_key}`,
23
+ 'Content-Type': 'application/json'
24
+ },
25
+ body: JSON.stringify({
26
+ model: 'tts-1',
27
+ voice: 'alloy',
28
+ input: inputText
29
+ })
30
+ });
31
+ if (!response.ok) {
32
+ throw new Error(`HTTP error! status: ${response.status}`);
33
+ }
34
+ const blob = await response.blob();
35
+ const reader = new FileReader();
36
+ reader.onloadend = () => {
37
+ const base64data = reader.result.split(',')[1];
38
+ const audioFile = `data:audio/mp3;base64,${base64data}`;
39
+ const sound = new _reactNativeSound.default(audioFile, null, error => {
40
+ if (error) {
41
+ console.error('Error playing sound:', error);
42
+ } else {
43
+ sound.play();
44
+ }
45
+ });
46
+ };
47
+ reader.readAsDataURL(blob);
48
+ } catch (error) {
49
+ console.error('Error generating TTS:', error);
50
+ }
51
+ };
52
+ exports.TextToSpeech = TextToSpeech;
53
+ //# sourceMappingURL=textToSpeech.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_react","_interopRequireWildcard","require","_reactNativeSound","_interopRequireDefault","_AppContext","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","TextToSpeech","inputText","data","useContext","AppContext","response","fetch","method","headers","Authorization","openai_key","body","JSON","stringify","model","voice","input","ok","Error","status","blob","reader","FileReader","onloadend","base64data","result","split","audioFile","sound","Sound","error","console","play","readAsDataURL","exports"],"sourceRoot":"../../../src","sources":["utils/textToSpeech.js"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="44" height="44" fill="#ffffff" viewBox="0 0 256 256"><path d="M132,24A100.11,100.11,0,0,0,32,124v84.33A15.69,15.69,0,0,0,47.67,224H132a100,100,0,0,0,0-200Zm28,128H96a8,8,0,0,1,0-16h64a8,8,0,0,1,0,16Zm0-32H96a8,8,0,0,1,0-16h64a8,8,0,0,1,0,16Z"></path></svg>
Binary file