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.
- package/LICENSE +20 -0
- package/README.md +194 -0
- package/lib/commonjs/assets/chat-icon-mobile.svg +1 -0
- package/lib/commonjs/assets/heritage.png +0 -0
- package/lib/commonjs/assets/posiden.svg +51 -0
- package/lib/commonjs/components/LoadingTips.js +104 -0
- package/lib/commonjs/components/LoadingTips.js.map +1 -0
- package/lib/commonjs/components/email.js +461 -0
- package/lib/commonjs/components/email.js.map +1 -0
- package/lib/commonjs/components/feedback.js +114 -0
- package/lib/commonjs/components/feedback.js.map +1 -0
- package/lib/commonjs/components/header.js +126 -0
- package/lib/commonjs/components/header.js.map +1 -0
- package/lib/commonjs/components/input.js +144 -0
- package/lib/commonjs/components/input.js.map +1 -0
- package/lib/commonjs/components/productCard.js +688 -0
- package/lib/commonjs/components/productCard.js.map +1 -0
- package/lib/commonjs/components/progressCircle.js +99 -0
- package/lib/commonjs/components/progressCircle.js.map +1 -0
- package/lib/commonjs/components/testing.js +74 -0
- package/lib/commonjs/components/testing.js.map +1 -0
- package/lib/commonjs/components/voice.js +184 -0
- package/lib/commonjs/components/voice.js.map +1 -0
- package/lib/commonjs/components/welcomeButton.js +149 -0
- package/lib/commonjs/components/welcomeButton.js.map +1 -0
- package/lib/commonjs/components/welcomeInput.js +137 -0
- package/lib/commonjs/components/welcomeInput.js.map +1 -0
- package/lib/commonjs/contexts/AppContext.js +552 -0
- package/lib/commonjs/contexts/AppContext.js.map +1 -0
- package/lib/commonjs/hooks/Stream.js +599 -0
- package/lib/commonjs/hooks/Stream.js.map +1 -0
- package/lib/commonjs/hooks/useAsyncStorage.js +36 -0
- package/lib/commonjs/hooks/useAsyncStorage.js.map +1 -0
- package/lib/commonjs/index.js +44 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/layout/disclaimer.js +208 -0
- package/lib/commonjs/layout/disclaimer.js.map +1 -0
- package/lib/commonjs/layout/ex.js +254 -0
- package/lib/commonjs/layout/ex.js.map +1 -0
- package/lib/commonjs/layout/icon.js +118 -0
- package/lib/commonjs/layout/icon.js.map +1 -0
- package/lib/commonjs/layout/layout.js +168 -0
- package/lib/commonjs/layout/layout.js.map +1 -0
- package/lib/commonjs/layout/welcome.js +160 -0
- package/lib/commonjs/layout/welcome.js.map +1 -0
- package/lib/commonjs/layout/window.js +396 -0
- package/lib/commonjs/layout/window.js.map +1 -0
- package/lib/commonjs/utils/audioRecorder.js +412 -0
- package/lib/commonjs/utils/audioRecorder.js.map +1 -0
- package/lib/commonjs/utils/cloudinary.js +69 -0
- package/lib/commonjs/utils/cloudinary.js.map +1 -0
- package/lib/commonjs/utils/storage.js +76 -0
- package/lib/commonjs/utils/storage.js.map +1 -0
- package/lib/commonjs/utils/textToSpeech.js +53 -0
- package/lib/commonjs/utils/textToSpeech.js.map +1 -0
- package/lib/module/assets/chat-icon-mobile.svg +1 -0
- package/lib/module/assets/heritage.png +0 -0
- package/lib/module/assets/posiden.svg +51 -0
- package/lib/module/components/LoadingTips.js +95 -0
- package/lib/module/components/LoadingTips.js.map +1 -0
- package/lib/module/components/email.js +452 -0
- package/lib/module/components/email.js.map +1 -0
- package/lib/module/components/feedback.js +105 -0
- package/lib/module/components/feedback.js.map +1 -0
- package/lib/module/components/header.js +117 -0
- package/lib/module/components/header.js.map +1 -0
- package/lib/module/components/input.js +135 -0
- package/lib/module/components/input.js.map +1 -0
- package/lib/module/components/productCard.js +679 -0
- package/lib/module/components/productCard.js.map +1 -0
- package/lib/module/components/progressCircle.js +91 -0
- package/lib/module/components/progressCircle.js.map +1 -0
- package/lib/module/components/testing.js +66 -0
- package/lib/module/components/testing.js.map +1 -0
- package/lib/module/components/voice.js +175 -0
- package/lib/module/components/voice.js.map +1 -0
- package/lib/module/components/welcomeButton.js +140 -0
- package/lib/module/components/welcomeButton.js.map +1 -0
- package/lib/module/components/welcomeInput.js +128 -0
- package/lib/module/components/welcomeInput.js.map +1 -0
- package/lib/module/contexts/AppContext.js +542 -0
- package/lib/module/contexts/AppContext.js.map +1 -0
- package/lib/module/hooks/Stream.js +592 -0
- package/lib/module/hooks/Stream.js.map +1 -0
- package/lib/module/hooks/useAsyncStorage.js +29 -0
- package/lib/module/hooks/useAsyncStorage.js.map +1 -0
- package/lib/module/index.js +36 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/layout/disclaimer.js +199 -0
- package/lib/module/layout/disclaimer.js.map +1 -0
- package/lib/module/layout/ex.js +253 -0
- package/lib/module/layout/ex.js.map +1 -0
- package/lib/module/layout/icon.js +108 -0
- package/lib/module/layout/icon.js.map +1 -0
- package/lib/module/layout/layout.js +160 -0
- package/lib/module/layout/layout.js.map +1 -0
- package/lib/module/layout/welcome.js +150 -0
- package/lib/module/layout/welcome.js.map +1 -0
- package/lib/module/layout/window.js +387 -0
- package/lib/module/layout/window.js.map +1 -0
- package/lib/module/utils/audioRecorder.js +398 -0
- package/lib/module/utils/audioRecorder.js.map +1 -0
- package/lib/module/utils/cloudinary.js +61 -0
- package/lib/module/utils/cloudinary.js.map +1 -0
- package/lib/module/utils/storage.js +67 -0
- package/lib/module/utils/storage.js.map +1 -0
- package/lib/module/utils/textToSpeech.js +43 -0
- package/lib/module/utils/textToSpeech.js.map +1 -0
- package/lib/typescript/components/LoadingTips.d.ts +3 -0
- package/lib/typescript/components/LoadingTips.d.ts.map +1 -0
- package/lib/typescript/components/email.d.ts +6 -0
- package/lib/typescript/components/email.d.ts.map +1 -0
- package/lib/typescript/components/feedback.d.ts +6 -0
- package/lib/typescript/components/feedback.d.ts.map +1 -0
- package/lib/typescript/components/header.d.ts +3 -0
- package/lib/typescript/components/header.d.ts.map +1 -0
- package/lib/typescript/components/input.d.ts +6 -0
- package/lib/typescript/components/input.d.ts.map +1 -0
- package/lib/typescript/components/productCard.d.ts +7 -0
- package/lib/typescript/components/productCard.d.ts.map +1 -0
- package/lib/typescript/components/progressCircle.d.ts +3 -0
- package/lib/typescript/components/progressCircle.d.ts.map +1 -0
- package/lib/typescript/components/testing.d.ts +6 -0
- package/lib/typescript/components/testing.d.ts.map +1 -0
- package/lib/typescript/components/voice.d.ts +5 -0
- package/lib/typescript/components/voice.d.ts.map +1 -0
- package/lib/typescript/components/welcomeButton.d.ts +4 -0
- package/lib/typescript/components/welcomeButton.d.ts.map +1 -0
- package/lib/typescript/components/welcomeInput.d.ts +6 -0
- package/lib/typescript/components/welcomeInput.d.ts.map +1 -0
- package/lib/typescript/contexts/AppContext.d.ts +10 -0
- package/lib/typescript/contexts/AppContext.d.ts.map +1 -0
- package/lib/typescript/hooks/Stream.d.ts +2 -0
- package/lib/typescript/hooks/Stream.d.ts.map +1 -0
- package/lib/typescript/hooks/useAsyncStorage.d.ts +2 -0
- package/lib/typescript/hooks/useAsyncStorage.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +8 -0
- package/lib/typescript/index.d.ts.map +1 -0
- package/lib/typescript/layout/disclaimer.d.ts +5 -0
- package/lib/typescript/layout/disclaimer.d.ts.map +1 -0
- package/lib/typescript/layout/ex.d.ts +1 -0
- package/lib/typescript/layout/ex.d.ts.map +1 -0
- package/lib/typescript/layout/icon.d.ts +3 -0
- package/lib/typescript/layout/icon.d.ts.map +1 -0
- package/lib/typescript/layout/layout.d.ts +3 -0
- package/lib/typescript/layout/layout.d.ts.map +1 -0
- package/lib/typescript/layout/welcome.d.ts +6 -0
- package/lib/typescript/layout/welcome.d.ts.map +1 -0
- package/lib/typescript/layout/window.d.ts +5 -0
- package/lib/typescript/layout/window.d.ts.map +1 -0
- package/lib/typescript/utils/audioRecorder.d.ts +9 -0
- package/lib/typescript/utils/audioRecorder.d.ts.map +1 -0
- package/lib/typescript/utils/cloudinary.d.ts +17 -0
- package/lib/typescript/utils/cloudinary.d.ts.map +1 -0
- package/lib/typescript/utils/storage.d.ts +29 -0
- package/lib/typescript/utils/storage.d.ts.map +1 -0
- package/lib/typescript/utils/textToSpeech.d.ts +2 -0
- package/lib/typescript/utils/textToSpeech.d.ts.map +1 -0
- package/package.json +109 -0
- package/src/assets/chat-icon-mobile.svg +1 -0
- package/src/assets/heritage.png +0 -0
- package/src/assets/posiden.svg +51 -0
- package/src/components/LoadingTips.js +99 -0
- package/src/components/email.js +467 -0
- package/src/components/feedback.js +114 -0
- package/src/components/header.js +119 -0
- package/src/components/input.js +133 -0
- package/src/components/productCard.js +815 -0
- package/src/components/progressCircle.js +88 -0
- package/src/components/testing.js +60 -0
- package/src/components/voice.js +228 -0
- package/src/components/welcomeButton.js +161 -0
- package/src/components/welcomeInput.js +133 -0
- package/src/contexts/AppContext.js +678 -0
- package/src/hooks/Stream.js +655 -0
- package/src/hooks/useAsyncStorage.js +33 -0
- package/src/index.js +30 -0
- package/src/layout/disclaimer.js +231 -0
- package/src/layout/ex.js +252 -0
- package/src/layout/icon.js +105 -0
- package/src/layout/layout.js +160 -0
- package/src/layout/welcome.js +172 -0
- package/src/layout/window.js +476 -0
- package/src/utils/audioRecorder.js +445 -0
- package/src/utils/cloudinary.js +61 -0
- package/src/utils/storage.ts +89 -0
- 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":"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","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 @@
|
|
|
1
|
+
{"version":3,"file":"LoadingTips.d.ts","sourceRoot":"","sources":["../../../src/components/LoadingTips.js"],"names":[],"mappings":"AAmBO,iDAyDN;kBA5EkD,OAAO"}
|
|
@@ -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 @@
|
|
|
1
|
+
{"version":3,"file":"feedback.d.ts","sourceRoot":"","sources":["../../../src/components/feedback.js"],"names":[],"mappings":"AAMO;;;sBA8DN;kBApEiC,OAAO"}
|
|
@@ -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 @@
|
|
|
1
|
+
{"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../../src/components/input.js"],"names":[],"mappings":"AAgBO;;;sBA8DN;kBA9E8D,OAAO"}
|