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,398 @@
1
+ // audioRecorder.js
2
+
3
+ import { Platform } from 'react-native';
4
+ import Voice from '@react-native-voice/voice';
5
+ import { check, PERMISSIONS, request, RESULTS } from 'react-native-permissions';
6
+ let resultCallback = null;
7
+ let partialResultCallback = null;
8
+ let silenceTimer = null;
9
+ let isCurrentlyRecording = false;
10
+ let finalResult = '';
11
+ const SILENCE_DURATION = 5000; // 5 seconds of silence before stopping
12
+
13
+ // Add this constant for AsyncStorage key
14
+ const PERMISSION_STORAGE_KEY = '@voice_permission_status';
15
+
16
+ // Create a function that can be called to get permission status
17
+ // This needs to be outside the React component lifecycle
18
+ let permissionStatusGetter = null;
19
+ let permissionStatusSetter = null;
20
+ export function setPermissionStatusHandlers(getter, setter) {
21
+ permissionStatusGetter = getter;
22
+ permissionStatusSetter = setter;
23
+ }
24
+
25
+ // Initialize Voice handlers - modified to support live transcription
26
+ export async function initVoice(onResult, onPartialResult = null) {
27
+ try {
28
+ resultCallback = onResult;
29
+ partialResultCallback = onPartialResult; // Store partial callback
30
+ finalResult = '';
31
+
32
+ // Check if Voice module is available
33
+ if (!Voice) {
34
+ console.error('Voice module is not available');
35
+ return false;
36
+ }
37
+
38
+ // First check if speech recognition is available
39
+ const isAvailable = await Voice.isAvailable();
40
+ if (!isAvailable) {
41
+ console.error('Speech recognition is not available on this device');
42
+ return false;
43
+ }
44
+
45
+ // Remove any existing listeners
46
+ Voice.removeAllListeners();
47
+
48
+ // Set up all event listeners
49
+ Voice.onSpeechStart = e => {
50
+ console.log('onSpeechStart: ', e);
51
+ isCurrentlyRecording = true;
52
+ finalResult = '';
53
+
54
+ // Start silence timer immediately when recording begins
55
+ handleSilenceDetection();
56
+ };
57
+ Voice.onSpeechRecognized = e => {
58
+ console.log('onSpeechRecognized: ', e);
59
+ if (e.isFinal) {
60
+ console.log('Speech recognition final');
61
+ handleFinalResult();
62
+ }
63
+ };
64
+ Voice.onSpeechEnd = async e => {
65
+ console.log('onSpeechEnd: ', e);
66
+ if (silenceTimer) {
67
+ clearTimeout(silenceTimer);
68
+ silenceTimer = null;
69
+ }
70
+
71
+ // Only handle final result if we're still recording
72
+ if (isCurrentlyRecording) {
73
+ await handleFinalResult();
74
+ }
75
+ };
76
+ Voice.onSpeechError = async e => {
77
+ var _e$error, _e$error2;
78
+ console.log('onSpeechError: ', e);
79
+ if (silenceTimer) {
80
+ clearTimeout(silenceTimer);
81
+ silenceTimer = null;
82
+ }
83
+ 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();
84
+ const msg = ((_e$error2 = e.error) === null || _e$error2 === void 0 ? void 0 : _e$error2.message) || '';
85
+
86
+ // Handle Android-specific errors
87
+ if (Platform.OS === 'android' && (code === '7' || code === '5')) {
88
+ if (finalResult && resultCallback) {
89
+ resultCallback(finalResult, null);
90
+ }
91
+ } else if (!msg.includes('No speech detected') && resultCallback) {
92
+ resultCallback(null, msg);
93
+ }
94
+ await cleanupVoiceSession();
95
+ };
96
+ Voice.onSpeechResults = e => {
97
+ console.log('onSpeechResults: ', e);
98
+ if (e.value && e.value.length > 0) {
99
+ finalResult = e.value[0];
100
+ handleSilenceDetection();
101
+ }
102
+ };
103
+ Voice.onSpeechPartialResults = e => {
104
+ console.log('onSpeechPartialResults: ', e);
105
+ if (silenceTimer) {
106
+ clearTimeout(silenceTimer);
107
+ }
108
+
109
+ // Only process partial results if we're still actively recording
110
+ if (e.value && e.value.length > 0 && isCurrentlyRecording) {
111
+ finalResult = e.value[0];
112
+
113
+ // Call partial callback for live transcription
114
+ if (partialResultCallback) {
115
+ partialResultCallback(finalResult);
116
+ }
117
+ handleSilenceDetection();
118
+ }
119
+ };
120
+ if (Platform.OS === 'android') {
121
+ Voice.onSpeechVolumeChanged = e => {
122
+ console.log('onSpeechVolumeChanged: ', e);
123
+ };
124
+ }
125
+ return true;
126
+ } catch (error) {
127
+ console.error('Error initializing Voice:', error);
128
+ return false;
129
+ }
130
+ }
131
+ const handleSilenceDetection = () => {
132
+ if (silenceTimer) {
133
+ clearTimeout(silenceTimer);
134
+ }
135
+ silenceTimer = setTimeout(async () => {
136
+ if (isCurrentlyRecording) {
137
+ await handleFinalResult();
138
+ }
139
+ }, SILENCE_DURATION);
140
+ };
141
+ const handleFinalResult = async () => {
142
+ if (!isCurrentlyRecording) return;
143
+ console.log('handleFinalResult called with:', finalResult);
144
+
145
+ // Set this FIRST to prevent any more partial results from being processed
146
+ isCurrentlyRecording = false;
147
+
148
+ // Call the result callback to update UI (button state)
149
+ // Always call callback even if result is empty to prevent UI getting stuck
150
+ if (resultCallback) {
151
+ resultCallback(finalResult || '', null);
152
+ }
153
+
154
+ // Then stop recording
155
+ await stopRecording();
156
+ };
157
+ const cleanupVoiceSession = async () => {
158
+ console.log('cleanupVoiceSession called');
159
+ isCurrentlyRecording = false;
160
+ if (silenceTimer) {
161
+ clearTimeout(silenceTimer);
162
+ silenceTimer = null;
163
+ }
164
+ try {
165
+ // Check if Voice module is available
166
+ if (!Voice) {
167
+ console.log('Voice module not available during cleanup');
168
+ return;
169
+ }
170
+
171
+ // Check if still recognizing
172
+ const isRecognizing = await Voice.isRecognizing();
173
+ console.log('Voice.isRecognizing() in cleanup:', isRecognizing);
174
+ if (isRecognizing) {
175
+ try {
176
+ // For iOS, use cancel for immediate termination
177
+ if (Platform.OS === 'ios') {
178
+ await Voice.cancel();
179
+ console.log('Voice.cancel() completed for iOS');
180
+ } else {
181
+ await Voice.stop();
182
+ console.log('Voice.stop() completed for Android');
183
+ }
184
+ await new Promise(resolve => setTimeout(resolve, 100));
185
+ } catch (e) {
186
+ console.log('Error stopping/canceling in cleanup:', e);
187
+ }
188
+ }
189
+
190
+ // Destroy the instance
191
+ try {
192
+ await Voice.destroy();
193
+ console.log('Voice.destroy() completed');
194
+ await new Promise(resolve => setTimeout(resolve, 200));
195
+ } catch (e) {
196
+ console.log('Error destroying in cleanup:', e);
197
+ }
198
+ } catch (error) {
199
+ console.error('Error in cleanupVoiceSession:', error);
200
+ }
201
+ finalResult = '';
202
+ };
203
+ export async function startRecording() {
204
+ try {
205
+ console.log('startRecording called');
206
+
207
+ // Check if Voice module is available
208
+ if (!Voice) {
209
+ console.error('Voice module is not available');
210
+ return false;
211
+ }
212
+
213
+ // Ensure cleanup of any existing session
214
+ await cleanupVoiceSession();
215
+
216
+ // Small delay to ensure cleanup is complete
217
+ await new Promise(resolve => setTimeout(resolve, 200));
218
+ const hasPermission = await requestAudioPermission();
219
+ if (!hasPermission) {
220
+ console.error('No permission to record audio');
221
+ return false;
222
+ }
223
+
224
+ // Re-initialize listeners each time for iOS stability
225
+ await initVoice(resultCallback, partialResultCallback);
226
+
227
+ // Start recognition
228
+ await Voice.start('en-US');
229
+ console.log('Voice.start() completed');
230
+ isCurrentlyRecording = true;
231
+
232
+ // Start silence detection timer immediately
233
+ // This ensures recording stops after 3 seconds even if no speech is detected
234
+ handleSilenceDetection();
235
+ return true;
236
+ } catch (error) {
237
+ console.error('Error starting voice recognition:', error);
238
+ await cleanupVoiceSession();
239
+ return false;
240
+ }
241
+ }
242
+ export async function stopRecording() {
243
+ try {
244
+ console.log('stopRecording called');
245
+ if (!isCurrentlyRecording || !Voice) {
246
+ console.log('Not recording or Voice not available');
247
+ return;
248
+ }
249
+
250
+ // Set this first to prevent race conditions
251
+ isCurrentlyRecording = false;
252
+ if (silenceTimer) {
253
+ clearTimeout(silenceTimer);
254
+ silenceTimer = null;
255
+ }
256
+
257
+ // Platform-specific stop
258
+ try {
259
+ if (Platform.OS === 'ios') {
260
+ // iOS: Use cancel for immediate termination - wait 1 second first
261
+ await new Promise(resolve => setTimeout(resolve, 1000));
262
+ await Voice.cancel();
263
+ console.log('Voice.cancel() completed for iOS');
264
+ } else {
265
+ // Android: Use stop - wait 1 second first
266
+ await new Promise(resolve => setTimeout(resolve, 1000));
267
+ await Voice.stop();
268
+ console.log('Voice.stop() completed for Android');
269
+ }
270
+
271
+ // Small delay
272
+ await new Promise(resolve => setTimeout(resolve, 100));
273
+ } catch (error) {
274
+ console.log('Error stopping/canceling Voice:', error);
275
+ }
276
+
277
+ // Then destroy
278
+ try {
279
+ await Voice.destroy();
280
+ console.log('Voice.destroy() completed');
281
+ await new Promise(resolve => setTimeout(resolve, 200));
282
+ } catch (error) {
283
+ console.log('Error destroying Voice:', error);
284
+ }
285
+
286
+ // Final cleanup
287
+ finalResult = '';
288
+ } catch (error) {
289
+ console.error('Error in stopRecording:', error);
290
+ await cleanupVoiceSession();
291
+ }
292
+ }
293
+ export async function cancelRecording() {
294
+ try {
295
+ if (!Voice) return;
296
+ await Voice.cancel();
297
+ await cleanupVoiceSession();
298
+ } catch (error) {
299
+ console.error('Error canceling voice recognition:', error);
300
+ await cleanupVoiceSession();
301
+ }
302
+ }
303
+ export async function requestAudioPermission() {
304
+ try {
305
+ // Get stored permission if available
306
+ const storedPermission = permissionStatusGetter ? permissionStatusGetter() : null;
307
+ if (storedPermission === 'denied') {
308
+ console.log('Permission previously denied by user');
309
+ return false;
310
+ }
311
+ let permissionResult = false;
312
+ if (Platform.OS === 'android') {
313
+ permissionResult = await requestAndroidPermission();
314
+ } else if (Platform.OS === 'ios') {
315
+ permissionResult = await requestIOSPermission();
316
+ }
317
+
318
+ // Store the result
319
+ if (permissionStatusSetter) {
320
+ permissionStatusSetter(permissionResult ? 'granted' : 'denied');
321
+ }
322
+ return permissionResult;
323
+ } catch (error) {
324
+ console.error('Error checking stored permission:', error);
325
+ return false;
326
+ }
327
+ }
328
+ async function requestAndroidPermission() {
329
+ try {
330
+ // Request microphone permission
331
+ const micPermission = await request(PERMISSIONS.ANDROID.RECORD_AUDIO);
332
+ if (micPermission !== RESULTS.GRANTED) {
333
+ console.log('Microphone permission denied');
334
+ return false;
335
+ }
336
+
337
+ // Check speech recognition services
338
+ try {
339
+ const services = await Voice.getSpeechRecognitionServices();
340
+ if (!services || services.length === 0) {
341
+ console.error('No speech recognition services available');
342
+ return false;
343
+ }
344
+ } catch (e) {
345
+ console.log('Error checking speech services:', e);
346
+ // Continue anyway - some devices report error but work fine
347
+ }
348
+ return true;
349
+ } catch (error) {
350
+ console.error('Error requesting Android permission:', error);
351
+ return false;
352
+ }
353
+ }
354
+ async function requestIOSPermission() {
355
+ try {
356
+ // Request microphone permission
357
+ const micPermission = await request(PERMISSIONS.IOS.MICROPHONE);
358
+ if (micPermission !== RESULTS.GRANTED) {
359
+ console.log('Microphone permission denied');
360
+ return false;
361
+ }
362
+
363
+ // Request speech recognition permission
364
+ const speechPermission = await request(PERMISSIONS.IOS.SPEECH_RECOGNITION);
365
+ if (speechPermission !== RESULTS.GRANTED) {
366
+ console.log('Speech recognition permission denied');
367
+ return false;
368
+ }
369
+ return true;
370
+ } catch (error) {
371
+ console.error('Error requesting iOS permissions:', error);
372
+ return false;
373
+ }
374
+ }
375
+ export function resetStoredPermission() {
376
+ if (permissionStatusSetter) {
377
+ permissionStatusSetter(null);
378
+ return true;
379
+ }
380
+ return false;
381
+ }
382
+ export function cleanup() {
383
+ if (!Voice) {
384
+ console.log('Voice module not available during cleanup');
385
+ return;
386
+ }
387
+ Voice.destroy().then(() => {
388
+ Voice.removeAllListeners();
389
+ cleanupVoiceSession();
390
+ }).catch(error => {
391
+ console.error('Error in cleanup:', error);
392
+ // Try one more time
393
+ if (Voice) {
394
+ Voice.destroy().catch(e => console.error('Final cleanup attempt failed:', e));
395
+ }
396
+ });
397
+ }
398
+ //# sourceMappingURL=audioRecorder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Platform","Voice","check","PERMISSIONS","request","RESULTS","resultCallback","partialResultCallback","silenceTimer","isCurrentlyRecording","finalResult","SILENCE_DURATION","PERMISSION_STORAGE_KEY","permissionStatusGetter","permissionStatusSetter","setPermissionStatusHandlers","getter","setter","initVoice","onResult","onPartialResult","console","error","isAvailable","removeAllListeners","onSpeechStart","e","log","handleSilenceDetection","onSpeechRecognized","isFinal","handleFinalResult","onSpeechEnd","clearTimeout","onSpeechError","_e$error","_e$error2","code","toString","msg","message","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","ANDROID","RECORD_AUDIO","GRANTED","services","getSpeechRecognitionServices","IOS","MICROPHONE","speechPermission","SPEECH_RECOGNITION","resetStoredPermission","cleanup","then","catch"],"sourceRoot":"../../../src","sources":["utils/audioRecorder.js"],"mappings":"AAAA;;AAEA,SAASA,QAAQ,QAAQ,cAAc;AACvC,OAAOC,KAAK,MAAM,2BAA2B;AAC7C,SAASC,KAAK,EAAEC,WAAW,EAAEC,OAAO,EAAEC,OAAO,QAAQ,0BAA0B;AAE/E,IAAIC,cAAc,GAAG,IAAI;AACzB,IAAIC,qBAAqB,GAAG,IAAI;AAChC,IAAIC,YAAY,GAAG,IAAI;AACvB,IAAIC,oBAAoB,GAAG,KAAK;AAChC,IAAIC,WAAW,GAAG,EAAE;AACpB,MAAMC,gBAAgB,GAAG,IAAI,CAAC,CAAC;;AAE/B;AACA,MAAMC,sBAAsB,GAAG,0BAA0B;;AAEzD;AACA;AACA,IAAIC,sBAAsB,GAAG,IAAI;AACjC,IAAIC,sBAAsB,GAAG,IAAI;AAEjC,OAAO,SAASC,2BAA2BA,CAACC,MAAM,EAAEC,MAAM,EAAE;EAC1DJ,sBAAsB,GAAGG,MAAM;EAC/BF,sBAAsB,GAAGG,MAAM;AACjC;;AAEA;AACA,OAAO,eAAeC,SAASA,CAACC,QAAQ,EAAEC,eAAe,GAAG,IAAI,EAAE;EAChE,IAAI;IACFd,cAAc,GAAGa,QAAQ;IACzBZ,qBAAqB,GAAGa,eAAe,CAAC,CAAC;IACzCV,WAAW,GAAG,EAAE;;IAEhB;IACA,IAAI,CAACT,KAAK,EAAE;MACVoB,OAAO,CAACC,KAAK,CAAC,+BAA+B,CAAC;MAC9C,OAAO,KAAK;IACd;;IAEA;IACA,MAAMC,WAAW,GAAG,MAAMtB,KAAK,CAACsB,WAAW,CAAC,CAAC;IAC7C,IAAI,CAACA,WAAW,EAAE;MAChBF,OAAO,CAACC,KAAK,CAAC,oDAAoD,CAAC;MACnE,OAAO,KAAK;IACd;;IAEA;IACArB,KAAK,CAACuB,kBAAkB,CAAC,CAAC;;IAE1B;IACAvB,KAAK,CAACwB,aAAa,GAAGC,CAAC,IAAI;MACzBL,OAAO,CAACM,GAAG,CAAC,iBAAiB,EAAED,CAAC,CAAC;MACjCjB,oBAAoB,GAAG,IAAI;MAC3BC,WAAW,GAAG,EAAE;;MAEhB;MACAkB,sBAAsB,CAAC,CAAC;IAC1B,CAAC;IAED3B,KAAK,CAAC4B,kBAAkB,GAAGH,CAAC,IAAI;MAC9BL,OAAO,CAACM,GAAG,CAAC,sBAAsB,EAAED,CAAC,CAAC;MACtC,IAAIA,CAAC,CAACI,OAAO,EAAE;QACbT,OAAO,CAACM,GAAG,CAAC,0BAA0B,CAAC;QACvCI,iBAAiB,CAAC,CAAC;MACrB;IACF,CAAC;IAED9B,KAAK,CAAC+B,WAAW,GAAG,MAAMN,CAAC,IAAI;MAC7BL,OAAO,CAACM,GAAG,CAAC,eAAe,EAAED,CAAC,CAAC;MAE/B,IAAIlB,YAAY,EAAE;QAChByB,YAAY,CAACzB,YAAY,CAAC;QAC1BA,YAAY,GAAG,IAAI;MACrB;;MAEA;MACA,IAAIC,oBAAoB,EAAE;QACxB,MAAMsB,iBAAiB,CAAC,CAAC;MAC3B;IACF,CAAC;IAED9B,KAAK,CAACiC,aAAa,GAAG,MAAMR,CAAC,IAAI;MAAA,IAAAS,QAAA,EAAAC,SAAA;MAC/Bf,OAAO,CAACM,GAAG,CAAC,iBAAiB,EAAED,CAAC,CAAC;MAEjC,IAAIlB,YAAY,EAAE;QAChByB,YAAY,CAACzB,YAAY,CAAC;QAC1BA,YAAY,GAAG,IAAI;MACrB;MAEA,MAAM6B,IAAI,IAAAF,QAAA,GAAGT,CAAC,CAACJ,KAAK,cAAAa,QAAA,gBAAAA,QAAA,GAAPA,QAAA,CAASE,IAAI,cAAAF,QAAA,uBAAbA,QAAA,CAAeG,QAAQ,CAAC,CAAC;MACtC,MAAMC,GAAG,GAAG,EAAAH,SAAA,GAAAV,CAAC,CAACJ,KAAK,cAAAc,SAAA,uBAAPA,SAAA,CAASI,OAAO,KAAI,EAAE;;MAElC;MACA,IAAIxC,QAAQ,CAACyC,EAAE,KAAK,SAAS,KAAKJ,IAAI,KAAK,GAAG,IAAIA,IAAI,KAAK,GAAG,CAAC,EAAE;QAC/D,IAAI3B,WAAW,IAAIJ,cAAc,EAAE;UACjCA,cAAc,CAACI,WAAW,EAAE,IAAI,CAAC;QACnC;MACF,CAAC,MAAM,IAAI,CAAC6B,GAAG,CAACG,QAAQ,CAAC,oBAAoB,CAAC,IAAIpC,cAAc,EAAE;QAChEA,cAAc,CAAC,IAAI,EAAEiC,GAAG,CAAC;MAC3B;MAEA,MAAMI,mBAAmB,CAAC,CAAC;IAC7B,CAAC;IAED1C,KAAK,CAAC2C,eAAe,GAAGlB,CAAC,IAAI;MAC3BL,OAAO,CAACM,GAAG,CAAC,mBAAmB,EAAED,CAAC,CAAC;MACnC,IAAIA,CAAC,CAACmB,KAAK,IAAInB,CAAC,CAACmB,KAAK,CAACC,MAAM,GAAG,CAAC,EAAE;QACjCpC,WAAW,GAAGgB,CAAC,CAACmB,KAAK,CAAC,CAAC,CAAC;QACxBjB,sBAAsB,CAAC,CAAC;MAC1B;IACF,CAAC;IAED3B,KAAK,CAAC8C,sBAAsB,GAAGrB,CAAC,IAAI;MAClCL,OAAO,CAACM,GAAG,CAAC,0BAA0B,EAAED,CAAC,CAAC;MAE1C,IAAIlB,YAAY,EAAE;QAChByB,YAAY,CAACzB,YAAY,CAAC;MAC5B;;MAEA;MACA,IAAIkB,CAAC,CAACmB,KAAK,IAAInB,CAAC,CAACmB,KAAK,CAACC,MAAM,GAAG,CAAC,IAAIrC,oBAAoB,EAAE;QACzDC,WAAW,GAAGgB,CAAC,CAACmB,KAAK,CAAC,CAAC,CAAC;;QAExB;QACA,IAAItC,qBAAqB,EAAE;UACzBA,qBAAqB,CAACG,WAAW,CAAC;QACpC;QAEAkB,sBAAsB,CAAC,CAAC;MAC1B;IACF,CAAC;IAED,IAAI5B,QAAQ,CAACyC,EAAE,KAAK,SAAS,EAAE;MAC7BxC,KAAK,CAAC+C,qBAAqB,GAAGtB,CAAC,IAAI;QACjCL,OAAO,CAACM,GAAG,CAAC,yBAAyB,EAAED,CAAC,CAAC;MAC3C,CAAC;IACH;IAEA,OAAO,IAAI;EACb,CAAC,CAAC,OAAOJ,KAAK,EAAE;IACdD,OAAO,CAACC,KAAK,CAAC,2BAA2B,EAAEA,KAAK,CAAC;IACjD,OAAO,KAAK;EACd;AACF;AAEA,MAAMM,sBAAsB,GAAGA,CAAA,KAAM;EACnC,IAAIpB,YAAY,EAAE;IAChByB,YAAY,CAACzB,YAAY,CAAC;EAC5B;EAEAA,YAAY,GAAGyC,UAAU,CAAC,YAAY;IACpC,IAAIxC,oBAAoB,EAAE;MACxB,MAAMsB,iBAAiB,CAAC,CAAC;IAC3B;EACF,CAAC,EAAEpB,gBAAgB,CAAC;AACtB,CAAC;AAED,MAAMoB,iBAAiB,GAAG,MAAAA,CAAA,KAAY;EACpC,IAAI,CAACtB,oBAAoB,EAAE;EAE3BY,OAAO,CAACM,GAAG,CAAC,gCAAgC,EAAEjB,WAAW,CAAC;;EAE1D;EACAD,oBAAoB,GAAG,KAAK;;EAE5B;EACA;EACA,IAAIH,cAAc,EAAE;IAClBA,cAAc,CAACI,WAAW,IAAI,EAAE,EAAE,IAAI,CAAC;EACzC;;EAEA;EACA,MAAMwC,aAAa,CAAC,CAAC;AACvB,CAAC;AAED,MAAMP,mBAAmB,GAAG,MAAAA,CAAA,KAAY;EACtCtB,OAAO,CAACM,GAAG,CAAC,4BAA4B,CAAC;EACzClB,oBAAoB,GAAG,KAAK;EAE5B,IAAID,YAAY,EAAE;IAChByB,YAAY,CAACzB,YAAY,CAAC;IAC1BA,YAAY,GAAG,IAAI;EACrB;EAEA,IAAI;IACF;IACA,IAAI,CAACP,KAAK,EAAE;MACVoB,OAAO,CAACM,GAAG,CAAC,2CAA2C,CAAC;MACxD;IACF;;IAEA;IACA,MAAMwB,aAAa,GAAG,MAAMlD,KAAK,CAACkD,aAAa,CAAC,CAAC;IACjD9B,OAAO,CAACM,GAAG,CAAC,mCAAmC,EAAEwB,aAAa,CAAC;IAE/D,IAAIA,aAAa,EAAE;MACjB,IAAI;QACF;QACA,IAAInD,QAAQ,CAACyC,EAAE,KAAK,KAAK,EAAE;UACzB,MAAMxC,KAAK,CAACmD,MAAM,CAAC,CAAC;UACpB/B,OAAO,CAACM,GAAG,CAAC,kCAAkC,CAAC;QACjD,CAAC,MAAM;UACL,MAAM1B,KAAK,CAACoD,IAAI,CAAC,CAAC;UAClBhC,OAAO,CAACM,GAAG,CAAC,oCAAoC,CAAC;QACnD;QACA,MAAM,IAAI2B,OAAO,CAACC,OAAO,IAAIN,UAAU,CAACM,OAAO,EAAE,GAAG,CAAC,CAAC;MACxD,CAAC,CAAC,OAAO7B,CAAC,EAAE;QACVL,OAAO,CAACM,GAAG,CAAC,sCAAsC,EAAED,CAAC,CAAC;MACxD;IACF;;IAEA;IACA,IAAI;MACF,MAAMzB,KAAK,CAACuD,OAAO,CAAC,CAAC;MACrBnC,OAAO,CAACM,GAAG,CAAC,2BAA2B,CAAC;MACxC,MAAM,IAAI2B,OAAO,CAACC,OAAO,IAAIN,UAAU,CAACM,OAAO,EAAE,GAAG,CAAC,CAAC;IACxD,CAAC,CAAC,OAAO7B,CAAC,EAAE;MACVL,OAAO,CAACM,GAAG,CAAC,8BAA8B,EAAED,CAAC,CAAC;IAChD;EACF,CAAC,CAAC,OAAOJ,KAAK,EAAE;IACdD,OAAO,CAACC,KAAK,CAAC,+BAA+B,EAAEA,KAAK,CAAC;EACvD;EAEAZ,WAAW,GAAG,EAAE;AAClB,CAAC;AAED,OAAO,eAAe+C,cAAcA,CAAA,EAAG;EACrC,IAAI;IACFpC,OAAO,CAACM,GAAG,CAAC,uBAAuB,CAAC;;IAEpC;IACA,IAAI,CAAC1B,KAAK,EAAE;MACVoB,OAAO,CAACC,KAAK,CAAC,+BAA+B,CAAC;MAC9C,OAAO,KAAK;IACd;;IAEA;IACA,MAAMqB,mBAAmB,CAAC,CAAC;;IAE3B;IACA,MAAM,IAAIW,OAAO,CAACC,OAAO,IAAIN,UAAU,CAACM,OAAO,EAAE,GAAG,CAAC,CAAC;IAEtD,MAAMG,aAAa,GAAG,MAAMC,sBAAsB,CAAC,CAAC;IACpD,IAAI,CAACD,aAAa,EAAE;MAClBrC,OAAO,CAACC,KAAK,CAAC,+BAA+B,CAAC;MAC9C,OAAO,KAAK;IACd;;IAEA;IACA,MAAMJ,SAAS,CAACZ,cAAc,EAAEC,qBAAqB,CAAC;;IAEtD;IACA,MAAMN,KAAK,CAAC2D,KAAK,CAAC,OAAO,CAAC;IAC1BvC,OAAO,CAACM,GAAG,CAAC,yBAAyB,CAAC;IACtClB,oBAAoB,GAAG,IAAI;;IAE3B;IACA;IACAmB,sBAAsB,CAAC,CAAC;IAExB,OAAO,IAAI;EACb,CAAC,CAAC,OAAON,KAAK,EAAE;IACdD,OAAO,CAACC,KAAK,CAAC,mCAAmC,EAAEA,KAAK,CAAC;IACzD,MAAMqB,mBAAmB,CAAC,CAAC;IAC3B,OAAO,KAAK;EACd;AACF;AAEA,OAAO,eAAeO,aAAaA,CAAA,EAAG;EACpC,IAAI;IACF7B,OAAO,CAACM,GAAG,CAAC,sBAAsB,CAAC;IAEnC,IAAI,CAAClB,oBAAoB,IAAI,CAACR,KAAK,EAAE;MACnCoB,OAAO,CAACM,GAAG,CAAC,sCAAsC,CAAC;MACnD;IACF;;IAEA;IACAlB,oBAAoB,GAAG,KAAK;IAE5B,IAAID,YAAY,EAAE;MAChByB,YAAY,CAACzB,YAAY,CAAC;MAC1BA,YAAY,GAAG,IAAI;IACrB;;IAEA;IACA,IAAI;MACF,IAAIR,QAAQ,CAACyC,EAAE,KAAK,KAAK,EAAE;QACzB;QACA,MAAM,IAAIa,OAAO,CAACC,OAAO,IAAIN,UAAU,CAACM,OAAO,EAAE,IAAI,CAAC,CAAC;QACvD,MAAMtD,KAAK,CAACmD,MAAM,CAAC,CAAC;QACpB/B,OAAO,CAACM,GAAG,CAAC,kCAAkC,CAAC;MACjD,CAAC,MAAM;QACL;QACA,MAAM,IAAI2B,OAAO,CAACC,OAAO,IAAIN,UAAU,CAACM,OAAO,EAAE,IAAI,CAAC,CAAC;QACvD,MAAMtD,KAAK,CAACoD,IAAI,CAAC,CAAC;QAClBhC,OAAO,CAACM,GAAG,CAAC,oCAAoC,CAAC;MACnD;;MAEA;MACA,MAAM,IAAI2B,OAAO,CAACC,OAAO,IAAIN,UAAU,CAACM,OAAO,EAAE,GAAG,CAAC,CAAC;IACxD,CAAC,CAAC,OAAOjC,KAAK,EAAE;MACdD,OAAO,CAACM,GAAG,CAAC,iCAAiC,EAAEL,KAAK,CAAC;IACvD;;IAEA;IACA,IAAI;MACF,MAAMrB,KAAK,CAACuD,OAAO,CAAC,CAAC;MACrBnC,OAAO,CAACM,GAAG,CAAC,2BAA2B,CAAC;MACxC,MAAM,IAAI2B,OAAO,CAACC,OAAO,IAAIN,UAAU,CAACM,OAAO,EAAE,GAAG,CAAC,CAAC;IACxD,CAAC,CAAC,OAAOjC,KAAK,EAAE;MACdD,OAAO,CAACM,GAAG,CAAC,yBAAyB,EAAEL,KAAK,CAAC;IAC/C;;IAEA;IACAZ,WAAW,GAAG,EAAE;EAClB,CAAC,CAAC,OAAOY,KAAK,EAAE;IACdD,OAAO,CAACC,KAAK,CAAC,yBAAyB,EAAEA,KAAK,CAAC;IAC/C,MAAMqB,mBAAmB,CAAC,CAAC;EAC7B;AACF;AAEA,OAAO,eAAekB,eAAeA,CAAA,EAAG;EACtC,IAAI;IACF,IAAI,CAAC5D,KAAK,EAAE;IACZ,MAAMA,KAAK,CAACmD,MAAM,CAAC,CAAC;IACpB,MAAMT,mBAAmB,CAAC,CAAC;EAC7B,CAAC,CAAC,OAAOrB,KAAK,EAAE;IACdD,OAAO,CAACC,KAAK,CAAC,oCAAoC,EAAEA,KAAK,CAAC;IAC1D,MAAMqB,mBAAmB,CAAC,CAAC;EAC7B;AACF;AAEA,OAAO,eAAegB,sBAAsBA,CAAA,EAAG;EAC7C,IAAI;IACF;IACA,MAAMG,gBAAgB,GAAGjD,sBAAsB,GAC3CA,sBAAsB,CAAC,CAAC,GACxB,IAAI;IAER,IAAIiD,gBAAgB,KAAK,QAAQ,EAAE;MACjCzC,OAAO,CAACM,GAAG,CAAC,sCAAsC,CAAC;MACnD,OAAO,KAAK;IACd;IAEA,IAAIoC,gBAAgB,GAAG,KAAK;IAC5B,IAAI/D,QAAQ,CAACyC,EAAE,KAAK,SAAS,EAAE;MAC7BsB,gBAAgB,GAAG,MAAMC,wBAAwB,CAAC,CAAC;IACrD,CAAC,MAAM,IAAIhE,QAAQ,CAACyC,EAAE,KAAK,KAAK,EAAE;MAChCsB,gBAAgB,GAAG,MAAME,oBAAoB,CAAC,CAAC;IACjD;;IAEA;IACA,IAAInD,sBAAsB,EAAE;MAC1BA,sBAAsB,CAACiD,gBAAgB,GAAG,SAAS,GAAG,QAAQ,CAAC;IACjE;IAEA,OAAOA,gBAAgB;EACzB,CAAC,CAAC,OAAOzC,KAAK,EAAE;IACdD,OAAO,CAACC,KAAK,CAAC,mCAAmC,EAAEA,KAAK,CAAC;IACzD,OAAO,KAAK;EACd;AACF;AAEA,eAAe0C,wBAAwBA,CAAA,EAAG;EACxC,IAAI;IACF;IACA,MAAME,aAAa,GAAG,MAAM9D,OAAO,CAACD,WAAW,CAACgE,OAAO,CAACC,YAAY,CAAC;IACrE,IAAIF,aAAa,KAAK7D,OAAO,CAACgE,OAAO,EAAE;MACrChD,OAAO,CAACM,GAAG,CAAC,8BAA8B,CAAC;MAC3C,OAAO,KAAK;IACd;;IAEA;IACA,IAAI;MACF,MAAM2C,QAAQ,GAAG,MAAMrE,KAAK,CAACsE,4BAA4B,CAAC,CAAC;MAC3D,IAAI,CAACD,QAAQ,IAAIA,QAAQ,CAACxB,MAAM,KAAK,CAAC,EAAE;QACtCzB,OAAO,CAACC,KAAK,CAAC,0CAA0C,CAAC;QACzD,OAAO,KAAK;MACd;IACF,CAAC,CAAC,OAAOI,CAAC,EAAE;MACVL,OAAO,CAACM,GAAG,CAAC,iCAAiC,EAAED,CAAC,CAAC;MACjD;IACF;IAEA,OAAO,IAAI;EACb,CAAC,CAAC,OAAOJ,KAAK,EAAE;IACdD,OAAO,CAACC,KAAK,CAAC,sCAAsC,EAAEA,KAAK,CAAC;IAC5D,OAAO,KAAK;EACd;AACF;AAEA,eAAe2C,oBAAoBA,CAAA,EAAG;EACpC,IAAI;IACF;IACA,MAAMC,aAAa,GAAG,MAAM9D,OAAO,CAACD,WAAW,CAACqE,GAAG,CAACC,UAAU,CAAC;IAC/D,IAAIP,aAAa,KAAK7D,OAAO,CAACgE,OAAO,EAAE;MACrChD,OAAO,CAACM,GAAG,CAAC,8BAA8B,CAAC;MAC3C,OAAO,KAAK;IACd;;IAEA;IACA,MAAM+C,gBAAgB,GAAG,MAAMtE,OAAO,CAACD,WAAW,CAACqE,GAAG,CAACG,kBAAkB,CAAC;IAC1E,IAAID,gBAAgB,KAAKrE,OAAO,CAACgE,OAAO,EAAE;MACxChD,OAAO,CAACM,GAAG,CAAC,sCAAsC,CAAC;MACnD,OAAO,KAAK;IACd;IAEA,OAAO,IAAI;EACb,CAAC,CAAC,OAAOL,KAAK,EAAE;IACdD,OAAO,CAACC,KAAK,CAAC,mCAAmC,EAAEA,KAAK,CAAC;IACzD,OAAO,KAAK;EACd;AACF;AAEA,OAAO,SAASsD,qBAAqBA,CAAA,EAAG;EACtC,IAAI9D,sBAAsB,EAAE;IAC1BA,sBAAsB,CAAC,IAAI,CAAC;IAC5B,OAAO,IAAI;EACb;EACA,OAAO,KAAK;AACd;AAEA,OAAO,SAAS+D,OAAOA,CAAA,EAAG;EACxB,IAAI,CAAC5E,KAAK,EAAE;IACVoB,OAAO,CAACM,GAAG,CAAC,2CAA2C,CAAC;IACxD;EACF;EAEA1B,KAAK,CAACuD,OAAO,CAAC,CAAC,CACZsB,IAAI,CAAC,MAAM;IACV7E,KAAK,CAACuB,kBAAkB,CAAC,CAAC;IAC1BmB,mBAAmB,CAAC,CAAC;EACvB,CAAC,CAAC,CACDoC,KAAK,CAACzD,KAAK,IAAI;IACdD,OAAO,CAACC,KAAK,CAAC,mBAAmB,EAAEA,KAAK,CAAC;IACzC;IACA,IAAIrB,KAAK,EAAE;MACTA,KAAK,CAACuD,OAAO,CAAC,CAAC,CAACuB,KAAK,CAACrD,CAAC,IACrBL,OAAO,CAACC,KAAK,CAAC,+BAA+B,EAAEI,CAAC,CAClD,CAAC;IACH;EACF,CAAC,CAAC;AACN","ignoreList":[]}
@@ -0,0 +1,61 @@
1
+ import React, { useContext } from 'react';
2
+ import { Cloudinary } from '@cloudinary/url-gen';
3
+ import { Platform, View } from 'react-native';
4
+ import { AdvancedImage } from 'cloudinary-react-native';
5
+ import { scale } from '@cloudinary/url-gen/actions/resize';
6
+ import { AppContext } from '../contexts/AppContext';
7
+ const CloudinaryImage = ({
8
+ cldImg,
9
+ imageStyle,
10
+ accessibilityLabel,
11
+ testID
12
+ }) => {
13
+ const {
14
+ brandCloudName
15
+ } = useContext(AppContext);
16
+ const cld = new Cloudinary({
17
+ cloud: {
18
+ cloudName: brandCloudName || 'mktg'
19
+ }
20
+ });
21
+ const myImage = Platform.OS === 'ios' ? cld.image(`${cldImg}`) : cld.image(`${cldImg}`).format('png');
22
+ return /*#__PURE__*/React.createElement(View, null, /*#__PURE__*/React.createElement(AdvancedImage, {
23
+ cldImg: myImage,
24
+ accessibilityLabel: accessibilityLabel,
25
+ testID: testID,
26
+ style: [{
27
+ resizeMode: 'contain'
28
+ }, imageStyle]
29
+ }));
30
+ };
31
+ export const CloudinaryBannerImage = ({
32
+ cldImg,
33
+ imageStyle,
34
+ accessibilityLabel,
35
+ testID,
36
+ width = 345,
37
+ height = 100
38
+ }) => {
39
+ const {
40
+ brandCloudName
41
+ } = useContext(AppContext);
42
+ const cld = new Cloudinary({
43
+ cloud: {
44
+ cloudName: brandCloudName || 'mktg'
45
+ }
46
+ });
47
+ const myImage = cld.image(`${cldImg}`);
48
+ myImage.resize(scale().width(parseInt(width * 3)).height(parseInt(height * 3)));
49
+ return /*#__PURE__*/React.createElement(View, null, /*#__PURE__*/React.createElement(AdvancedImage, {
50
+ cldImg: myImage,
51
+ accessibilityLabel: accessibilityLabel,
52
+ testID: testID,
53
+ style: [{
54
+ resizeMode: 'contain',
55
+ width: width,
56
+ height: height
57
+ }, imageStyle]
58
+ }));
59
+ };
60
+ export default CloudinaryImage;
61
+ //# sourceMappingURL=cloudinary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","useContext","Cloudinary","Platform","View","AdvancedImage","scale","AppContext","CloudinaryImage","cldImg","imageStyle","accessibilityLabel","testID","brandCloudName","cld","cloud","cloudName","myImage","OS","image","format","createElement","style","resizeMode","CloudinaryBannerImage","width","height","resize","parseInt"],"sourceRoot":"../../../src","sources":["utils/cloudinary.js"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,UAAU,QAAQ,OAAO;AACzC,SAASC,UAAU,QAAQ,qBAAqB;AAChD,SAASC,QAAQ,EAAEC,IAAI,QAAQ,cAAc;AAC7C,SAASC,aAAa,QAAQ,yBAAyB;AACvD,SAASC,KAAK,QAAQ,oCAAoC;AAC1D,SAASC,UAAU,QAAQ,wBAAwB;AAEnD,MAAMC,eAAe,GAAGA,CAAC;EAAEC,MAAM;EAAEC,UAAU;EAAEC,kBAAkB;EAAEC;AAAO,CAAC,KAAK;EAC9E,MAAM;IAAEC;EAAe,CAAC,GAAGZ,UAAU,CAACM,UAAU,CAAC;EACjD,MAAMO,GAAG,GAAG,IAAIZ,UAAU,CAAC;IACzBa,KAAK,EAAE;MACLC,SAAS,EAAEH,cAAc,IAAI;IAC/B;EACF,CAAC,CAAC;EAEF,MAAMI,OAAO,GAAGd,QAAQ,CAACe,EAAE,KAAK,KAAK,GAAGJ,GAAG,CAACK,KAAK,CAAC,GAAGV,MAAM,EAAE,CAAC,GAAGK,GAAG,CAACK,KAAK,CAAC,GAAGV,MAAM,EAAE,CAAC,CAACW,MAAM,CAAC,KAAK,CAAC;EACrG,oBACEpB,KAAA,CAAAqB,aAAA,CAACjB,IAAI,qBACHJ,KAAA,CAAAqB,aAAA,CAAChB,aAAa;IACZI,MAAM,EAAEQ,OAAQ;IAChBN,kBAAkB,EAAEA,kBAAmB;IACvCC,MAAM,EAAEA,MAAO;IACfU,KAAK,EAAE,CAAC;MAAEC,UAAU,EAAE;IAAU,CAAC,EAAEb,UAAU;EAAE,CAChD,CACG,CAAC;AAEX,CAAC;AAED,OAAO,MAAMc,qBAAqB,GAAGA,CAAC;EACpCf,MAAM;EACNC,UAAU;EACVC,kBAAkB;EAClBC,MAAM;EACNa,KAAK,GAAG,GAAG;EACXC,MAAM,GAAG;AACX,CAAC,KAAK;EACJ,MAAM;IAAEb;EAAe,CAAC,GAAGZ,UAAU,CAACM,UAAU,CAAC;EACjD,MAAMO,GAAG,GAAG,IAAIZ,UAAU,CAAC;IACzBa,KAAK,EAAE;MACLC,SAAS,EAAEH,cAAc,IAAI;IAC/B;EACF,CAAC,CAAC;EACF,MAAMI,OAAO,GAAGH,GAAG,CAACK,KAAK,CAAC,GAAGV,MAAM,EAAE,CAAC;EACtCQ,OAAO,CAACU,MAAM,CACZrB,KAAK,CAAC,CAAC,CACJmB,KAAK,CAACG,QAAQ,CAACH,KAAK,GAAG,CAAC,CAAC,CAAC,CAC1BC,MAAM,CAACE,QAAQ,CAACF,MAAM,GAAG,CAAC,CAAC,CAChC,CAAC;EACD,oBACE1B,KAAA,CAAAqB,aAAA,CAACjB,IAAI,qBACHJ,KAAA,CAAAqB,aAAA,CAAChB,aAAa;IACZI,MAAM,EAAEQ,OAAQ;IAChBN,kBAAkB,EAAEA,kBAAmB;IACvCC,MAAM,EAAEA,MAAO;IACfU,KAAK,EAAE,CAAC;MAAEC,UAAU,EAAE,SAAS;MAAEE,KAAK,EAAEA,KAAK;MAAEC,MAAM,EAAEA;IAAO,CAAC,EAAEhB,UAAU;EAAE,CAC9E,CACG,CAAC;AAEX,CAAC;AAED,eAAeF,eAAe","ignoreList":[]}
@@ -0,0 +1,67 @@
1
+ import AsyncStorage from '@react-native-async-storage/async-storage';
2
+ // Module-level singleton to cache chat states by token
3
+ const chatStore = {};
4
+ const getStorageKey = token => `srschat_${token}`;
5
+ export const defaultState = {
6
+ typingIndicator: false,
7
+ ghostMessage: false,
8
+ ghostCard: false,
9
+ stopActivated: false,
10
+ disclaimer: false,
11
+ startStreaming: false,
12
+ messages: [{
13
+ type: "ai",
14
+ 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?"
15
+ }],
16
+ showIcon: true,
17
+ toggleChat: false,
18
+ showModal: "Icon"
19
+ };
20
+
21
+ /**
22
+ * Loads chat state for a specific customer token
23
+ * Returns cached state if available, otherwise loads from AsyncStorage
24
+ */
25
+ export const loadChat = async token => {
26
+ // Return from in-memory cache if available
27
+ const cachedState = chatStore[token];
28
+ if (cachedState !== undefined) {
29
+ return cachedState;
30
+ }
31
+
32
+ // Otherwise load from AsyncStorage
33
+ try {
34
+ const key = getStorageKey(token);
35
+ const storedData = await AsyncStorage.getItem(key);
36
+ if (storedData) {
37
+ const parsedData = JSON.parse(storedData);
38
+ // Cache in memory for future access
39
+ chatStore[token] = parsedData;
40
+ return parsedData;
41
+ }
42
+ } catch (error) {
43
+ console.error('Error loading chat state:', error);
44
+ }
45
+
46
+ // Return default state if nothing found
47
+ return defaultState;
48
+ };
49
+
50
+ /**
51
+ * Updates chat state for a specific customer token
52
+ * Updates both in-memory cache and persists to AsyncStorage
53
+ */
54
+ export const updateChat = async (token, next) => {
55
+ try {
56
+ const key = getStorageKey(token);
57
+
58
+ // Update in-memory cache
59
+ chatStore[token] = next;
60
+
61
+ // Persist to AsyncStorage
62
+ await AsyncStorage.setItem(key, JSON.stringify(next));
63
+ } catch (error) {
64
+ console.error('Error updating chat state:', error);
65
+ }
66
+ };
67
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["AsyncStorage","chatStore","getStorageKey","token","defaultState","typingIndicator","ghostMessage","ghostCard","stopActivated","disclaimer","startStreaming","messages","type","text","showIcon","toggleChat","showModal","loadChat","cachedState","undefined","key","storedData","getItem","parsedData","JSON","parse","error","console","updateChat","next","setItem","stringify"],"sourceRoot":"../../../src","sources":["utils/storage.ts"],"mappings":"AAAA,OAAOA,YAAY,MAAM,2CAA2C;AAqBpE;AACA,MAAMC,SAAoC,GAAG,CAAC,CAAC;AAE/C,MAAMC,aAAa,GAAIC,KAAa,IAAK,WAAWA,KAAK,EAAE;AAE3D,OAAO,MAAMC,YAAuB,GAAG;EACrCC,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;AACA,OAAO,MAAMC,QAAQ,GAAG,MAAOd,KAAa,IAAyB;EACnE;EACA,MAAMe,WAAW,GAAGjB,SAAS,CAACE,KAAK,CAAC;EACpC,IAAIe,WAAW,KAAKC,SAAS,EAAE;IAC7B,OAAOD,WAAW;EACpB;;EAEA;EACA,IAAI;IACF,MAAME,GAAG,GAAGlB,aAAa,CAACC,KAAK,CAAC;IAChC,MAAMkB,UAAU,GAAG,MAAMrB,YAAY,CAACsB,OAAO,CAACF,GAAG,CAAC;IAElD,IAAIC,UAAU,EAAE;MACd,MAAME,UAAU,GAAGC,IAAI,CAACC,KAAK,CAACJ,UAAU,CAAc;MACtD;MACApB,SAAS,CAACE,KAAK,CAAC,GAAGoB,UAAU;MAC7B,OAAOA,UAAU;IACnB;EACF,CAAC,CAAC,OAAOG,KAAK,EAAE;IACdC,OAAO,CAACD,KAAK,CAAC,2BAA2B,EAAEA,KAAK,CAAC;EACnD;;EAEA;EACA,OAAOtB,YAAY;AACrB,CAAC;;AAED;AACA;AACA;AACA;AACA,OAAO,MAAMwB,UAAU,GAAG,MAAAA,CAAOzB,KAAa,EAAE0B,IAAe,KAAoB;EACjF,IAAI;IACF,MAAMT,GAAG,GAAGlB,aAAa,CAACC,KAAK,CAAC;;IAEhC;IACAF,SAAS,CAACE,KAAK,CAAC,GAAG0B,IAAI;;IAEvB;IACA,MAAM7B,YAAY,CAAC8B,OAAO,CAACV,GAAG,EAAEI,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","ignoreList":[]}
@@ -0,0 +1,43 @@
1
+ // textToSpeech.js
2
+ import React, { useState, useContext } from 'react';
3
+ import Sound from 'react-native-sound';
4
+ import { AppContext } from '../contexts/AppContext';
5
+ export const TextToSpeech = async inputText => {
6
+ const {
7
+ data
8
+ } = useContext(AppContext);
9
+ try {
10
+ const response = await fetch('https://api.openai.com/v1/audio/speech', {
11
+ method: 'POST',
12
+ headers: {
13
+ Authorization: `Bearer ${data.openai_key}`,
14
+ 'Content-Type': 'application/json'
15
+ },
16
+ body: JSON.stringify({
17
+ model: 'tts-1',
18
+ voice: 'alloy',
19
+ input: inputText
20
+ })
21
+ });
22
+ if (!response.ok) {
23
+ throw new Error(`HTTP error! status: ${response.status}`);
24
+ }
25
+ const blob = await response.blob();
26
+ const reader = new FileReader();
27
+ reader.onloadend = () => {
28
+ const base64data = reader.result.split(',')[1];
29
+ const audioFile = `data:audio/mp3;base64,${base64data}`;
30
+ const sound = new Sound(audioFile, null, error => {
31
+ if (error) {
32
+ console.error('Error playing sound:', error);
33
+ } else {
34
+ sound.play();
35
+ }
36
+ });
37
+ };
38
+ reader.readAsDataURL(blob);
39
+ } catch (error) {
40
+ console.error('Error generating TTS:', error);
41
+ }
42
+ };
43
+ //# sourceMappingURL=textToSpeech.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","useState","useContext","Sound","AppContext","TextToSpeech","inputText","data","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","error","console","play","readAsDataURL"],"sourceRoot":"../../../src","sources":["utils/textToSpeech.js"],"mappings":"AAAA;AACA,OAAOA,KAAK,IAAGC,QAAQ,EAAEC,UAAU,QAAO,OAAO;AACjD,OAAOC,KAAK,MAAM,oBAAoB;AACtC,SAASC,UAAU,QAAQ,wBAAwB;AAEnD,OAAO,MAAMC,YAAY,GAAG,MAAOC,SAAS,IAAK;EAC/C,MAAM;IAAEC;EAAK,CAAC,GAAGL,UAAU,CAACE,UAAU,CAAC;EACvC,IAAI;IACF,MAAMI,QAAQ,GAAG,MAAMC,KAAK,CAC1B,wCAAwC,EACxC;MACEC,MAAM,EAAE,MAAM;MACdC,OAAO,EAAE;QACPC,aAAa,EAAE,UAAUL,IAAI,CAACM,UAAU,EAAE;QAC1C,cAAc,EAAE;MAClB,CAAC;MACDC,IAAI,EAAEC,IAAI,CAACC,SAAS,CAAC;QACnBC,KAAK,EAAE,OAAO;QACdC,KAAK,EAAE,OAAO;QACdC,KAAK,EAAEb;MACT,CAAC;IACH,CACF,CAAC;IAED,IAAI,CAACE,QAAQ,CAACY,EAAE,EAAE;MAChB,MAAM,IAAIC,KAAK,CAAC,uBAAuBb,QAAQ,CAACc,MAAM,EAAE,CAAC;IAC3D;IAEA,MAAMC,IAAI,GAAG,MAAMf,QAAQ,CAACe,IAAI,CAAC,CAAC;IAClC,MAAMC,MAAM,GAAG,IAAIC,UAAU,CAAC,CAAC;IAE/BD,MAAM,CAACE,SAAS,GAAG,MAAM;MACvB,MAAMC,UAAU,GAAGH,MAAM,CAACI,MAAM,CAACC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;MAC9C,MAAMC,SAAS,GAAG,yBAAyBH,UAAU,EAAE;MAEvD,MAAMI,KAAK,GAAG,IAAI5B,KAAK,CAAC2B,SAAS,EAAE,IAAI,EAAGE,KAAK,IAAK;QAClD,IAAIA,KAAK,EAAE;UACTC,OAAO,CAACD,KAAK,CAAC,sBAAsB,EAAEA,KAAK,CAAC;QAC9C,CAAC,MAAM;UACLD,KAAK,CAACG,IAAI,CAAC,CAAC;QACd;MACF,CAAC,CAAC;IACJ,CAAC;IAEDV,MAAM,CAACW,aAAa,CAACZ,IAAI,CAAC;EAC5B,CAAC,CAAC,OAAOS,KAAK,EAAE;IACdC,OAAO,CAACD,KAAK,CAAC,uBAAuB,EAAEA,KAAK,CAAC;EAC/C;AACF,CAAC","ignoreList":[]}
@@ -0,0 +1,3 @@
1
+ export function LoadingTips(): React.JSX.Element;
2
+ import React from 'react';
3
+ //# sourceMappingURL=LoadingTips.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LoadingTips.d.ts","sourceRoot":"","sources":["../../../src/components/LoadingTips.js"],"names":[],"mappings":"AAmBO,iDAyDN;kBA5EkD,OAAO"}
@@ -0,0 +1,6 @@
1
+ export function EmailForm({ panHandlers }: {
2
+ panHandlers: any;
3
+ }): React.JSX.Element;
4
+ export default EmailForm;
5
+ import React from "react";
6
+ //# sourceMappingURL=email.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email.d.ts","sourceRoot":"","sources":["../../../src/components/email.js"],"names":[],"mappings":"AAgBO;;sBA0WN;;kBA1X8D,OAAO"}
@@ -0,0 +1,6 @@
1
+ export function Feedback({ message, messageId }: {
2
+ message: any;
3
+ messageId: any;
4
+ }): React.JSX.Element;
5
+ import React from "react";
6
+ //# sourceMappingURL=feedback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback.d.ts","sourceRoot":"","sources":["../../../src/components/feedback.js"],"names":[],"mappings":"AAMO;;;sBA8DN;kBApEiC,OAAO"}
@@ -0,0 +1,3 @@
1
+ export function Header(): React.JSX.Element;
2
+ import React from 'react';
3
+ //# sourceMappingURL=header.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"header.d.ts","sourceRoot":"","sources":["../../../src/components/header.js"],"names":[],"mappings":"AAOO,4CAyDN;kBAhEiC,OAAO"}
@@ -0,0 +1,6 @@
1
+ export function ChatInput({ onProductCardClick, onAddToCartClick }: {
2
+ onProductCardClick: any;
3
+ onAddToCartClick: any;
4
+ }): React.JSX.Element;
5
+ import React from 'react';
6
+ //# sourceMappingURL=input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../../src/components/input.js"],"names":[],"mappings":"AAgBO;;;sBA8DN;kBA9E8D,OAAO"}
@@ -0,0 +1,7 @@
1
+ export function ProductCard({ prod, onFocusQuantityInput, messageId }: {
2
+ prod: any;
3
+ onFocusQuantityInput: any;
4
+ messageId: any;
5
+ }): React.JSX.Element | null;
6
+ import React from 'react';
7
+ //# sourceMappingURL=productCard.d.ts.map