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,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":";;;;;;;;;;;;;AAEA,IAAAA,YAAA,GAAAC,OAAA;AACA,IAAAC,MAAA,GAAAC,sBAAA,CAAAF,OAAA;AACA,IAAAG,uBAAA,GAAAH,OAAA;AAAgF,SAAAE,uBAAAE,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAJhF;;AAMA,IAAIG,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;AAE1B,SAASC,2BAA2BA,CAACC,MAAM,EAAEC,MAAM,EAAE;EAC1DJ,sBAAsB,GAAGG,MAAM;EAC/BF,sBAAsB,GAAGG,MAAM;AACjC;;AAEA;AACO,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,CAACW,cAAK,EAAE;MACVC,OAAO,CAACC,KAAK,CAAC,+BAA+B,CAAC;MAC9C,OAAO,KAAK;IACd;;IAEA;IACA,MAAMC,WAAW,GAAG,MAAMH,cAAK,CAACG,WAAW,CAAC,CAAC;IAC7C,IAAI,CAACA,WAAW,EAAE;MAChBF,OAAO,CAACC,KAAK,CAAC,oDAAoD,CAAC;MACnE,OAAO,KAAK;IACd;;IAEA;IACAF,cAAK,CAACI,kBAAkB,CAAC,CAAC;;IAE1B;IACAJ,cAAK,CAACK,aAAa,GAAGvB,CAAC,IAAI;MACzBmB,OAAO,CAACK,GAAG,CAAC,iBAAiB,EAAExB,CAAC,CAAC;MACjCM,oBAAoB,GAAG,IAAI;MAC3BC,WAAW,GAAG,EAAE;;MAEhB;MACAkB,sBAAsB,CAAC,CAAC;IAC1B,CAAC;IAEDP,cAAK,CAACQ,kBAAkB,GAAG1B,CAAC,IAAI;MAC9BmB,OAAO,CAACK,GAAG,CAAC,sBAAsB,EAAExB,CAAC,CAAC;MACtC,IAAIA,CAAC,CAAC2B,OAAO,EAAE;QACbR,OAAO,CAACK,GAAG,CAAC,0BAA0B,CAAC;QACvCI,iBAAiB,CAAC,CAAC;MACrB;IACF,CAAC;IAEDV,cAAK,CAACW,WAAW,GAAG,MAAM7B,CAAC,IAAI;MAC7BmB,OAAO,CAACK,GAAG,CAAC,eAAe,EAAExB,CAAC,CAAC;MAE/B,IAAIK,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;IAEDV,cAAK,CAACa,aAAa,GAAG,MAAM/B,CAAC,IAAI;MAAA,IAAAgC,QAAA,EAAAC,SAAA;MAC/Bd,OAAO,CAACK,GAAG,CAAC,iBAAiB,EAAExB,CAAC,CAAC;MAEjC,IAAIK,YAAY,EAAE;QAChByB,YAAY,CAACzB,YAAY,CAAC;QAC1BA,YAAY,GAAG,IAAI;MACrB;MAEA,MAAM6B,IAAI,IAAAF,QAAA,GAAGhC,CAAC,CAACoB,KAAK,cAAAY,QAAA,gBAAAA,QAAA,GAAPA,QAAA,CAASE,IAAI,cAAAF,QAAA,uBAAbA,QAAA,CAAeG,QAAQ,CAAC,CAAC;MACtC,MAAMC,GAAG,GAAG,EAAAH,SAAA,GAAAjC,CAAC,CAACoB,KAAK,cAAAa,SAAA,uBAAPA,SAAA,CAASI,OAAO,KAAI,EAAE;;MAElC;MACA,IAAIC,qBAAQ,CAACC,EAAE,KAAK,SAAS,KAAKL,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,CAACI,QAAQ,CAAC,oBAAoB,CAAC,IAAIrC,cAAc,EAAE;QAChEA,cAAc,CAAC,IAAI,EAAEiC,GAAG,CAAC;MAC3B;MAEA,MAAMK,mBAAmB,CAAC,CAAC;IAC7B,CAAC;IAEDvB,cAAK,CAACwB,eAAe,GAAG1C,CAAC,IAAI;MAC3BmB,OAAO,CAACK,GAAG,CAAC,mBAAmB,EAAExB,CAAC,CAAC;MACnC,IAAIA,CAAC,CAAC2C,KAAK,IAAI3C,CAAC,CAAC2C,KAAK,CAACC,MAAM,GAAG,CAAC,EAAE;QACjCrC,WAAW,GAAGP,CAAC,CAAC2C,KAAK,CAAC,CAAC,CAAC;QACxBlB,sBAAsB,CAAC,CAAC;MAC1B;IACF,CAAC;IAEDP,cAAK,CAAC2B,sBAAsB,GAAG7C,CAAC,IAAI;MAClCmB,OAAO,CAACK,GAAG,CAAC,0BAA0B,EAAExB,CAAC,CAAC;MAE1C,IAAIK,YAAY,EAAE;QAChByB,YAAY,CAACzB,YAAY,CAAC;MAC5B;;MAEA;MACA,IAAIL,CAAC,CAAC2C,KAAK,IAAI3C,CAAC,CAAC2C,KAAK,CAACC,MAAM,GAAG,CAAC,IAAItC,oBAAoB,EAAE;QACzDC,WAAW,GAAGP,CAAC,CAAC2C,KAAK,CAAC,CAAC,CAAC;;QAExB;QACA,IAAIvC,qBAAqB,EAAE;UACzBA,qBAAqB,CAACG,WAAW,CAAC;QACpC;QAEAkB,sBAAsB,CAAC,CAAC;MAC1B;IACF,CAAC;IAED,IAAIa,qBAAQ,CAACC,EAAE,KAAK,SAAS,EAAE;MAC7BrB,cAAK,CAAC4B,qBAAqB,GAAG9C,CAAC,IAAI;QACjCmB,OAAO,CAACK,GAAG,CAAC,yBAAyB,EAAExB,CAAC,CAAC;MAC3C,CAAC;IACH;IAEA,OAAO,IAAI;EACb,CAAC,CAAC,OAAOoB,KAAK,EAAE;IACdD,OAAO,CAACC,KAAK,CAAC,2BAA2B,EAAEA,KAAK,CAAC;IACjD,OAAO,KAAK;EACd;AACF;AAEA,MAAMK,sBAAsB,GAAGA,CAAA,KAAM;EACnC,IAAIpB,YAAY,EAAE;IAChByB,YAAY,CAACzB,YAAY,CAAC;EAC5B;EAEAA,YAAY,GAAG0C,UAAU,CAAC,YAAY;IACpC,IAAIzC,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;EAE3Ba,OAAO,CAACK,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,MAAMyC,aAAa,CAAC,CAAC;AACvB,CAAC;AAED,MAAMP,mBAAmB,GAAG,MAAAA,CAAA,KAAY;EACtCtB,OAAO,CAACK,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,CAACa,cAAK,EAAE;MACVC,OAAO,CAACK,GAAG,CAAC,2CAA2C,CAAC;MACxD;IACF;;IAEA;IACA,MAAMyB,aAAa,GAAG,MAAM/B,cAAK,CAAC+B,aAAa,CAAC,CAAC;IACjD9B,OAAO,CAACK,GAAG,CAAC,mCAAmC,EAAEyB,aAAa,CAAC;IAE/D,IAAIA,aAAa,EAAE;MACjB,IAAI;QACF;QACA,IAAIX,qBAAQ,CAACC,EAAE,KAAK,KAAK,EAAE;UACzB,MAAMrB,cAAK,CAACgC,MAAM,CAAC,CAAC;UACpB/B,OAAO,CAACK,GAAG,CAAC,kCAAkC,CAAC;QACjD,CAAC,MAAM;UACL,MAAMN,cAAK,CAACiC,IAAI,CAAC,CAAC;UAClBhC,OAAO,CAACK,GAAG,CAAC,oCAAoC,CAAC;QACnD;QACA,MAAM,IAAI4B,OAAO,CAACC,OAAO,IAAIN,UAAU,CAACM,OAAO,EAAE,GAAG,CAAC,CAAC;MACxD,CAAC,CAAC,OAAOrD,CAAC,EAAE;QACVmB,OAAO,CAACK,GAAG,CAAC,sCAAsC,EAAExB,CAAC,CAAC;MACxD;IACF;;IAEA;IACA,IAAI;MACF,MAAMkB,cAAK,CAACoC,OAAO,CAAC,CAAC;MACrBnC,OAAO,CAACK,GAAG,CAAC,2BAA2B,CAAC;MACxC,MAAM,IAAI4B,OAAO,CAACC,OAAO,IAAIN,UAAU,CAACM,OAAO,EAAE,GAAG,CAAC,CAAC;IACxD,CAAC,CAAC,OAAOrD,CAAC,EAAE;MACVmB,OAAO,CAACK,GAAG,CAAC,8BAA8B,EAAExB,CAAC,CAAC;IAChD;EACF,CAAC,CAAC,OAAOoB,KAAK,EAAE;IACdD,OAAO,CAACC,KAAK,CAAC,+BAA+B,EAAEA,KAAK,CAAC;EACvD;EAEAb,WAAW,GAAG,EAAE;AAClB,CAAC;AAEM,eAAegD,cAAcA,CAAA,EAAG;EACrC,IAAI;IACFpC,OAAO,CAACK,GAAG,CAAC,uBAAuB,CAAC;;IAEpC;IACA,IAAI,CAACN,cAAK,EAAE;MACVC,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,MAAML,SAAS,CAACZ,cAAc,EAAEC,qBAAqB,CAAC;;IAEtD;IACA,MAAMc,cAAK,CAACwC,KAAK,CAAC,OAAO,CAAC;IAC1BvC,OAAO,CAACK,GAAG,CAAC,yBAAyB,CAAC;IACtClB,oBAAoB,GAAG,IAAI;;IAE3B;IACA;IACAmB,sBAAsB,CAAC,CAAC;IAExB,OAAO,IAAI;EACb,CAAC,CAAC,OAAOL,KAAK,EAAE;IACdD,OAAO,CAACC,KAAK,CAAC,mCAAmC,EAAEA,KAAK,CAAC;IACzD,MAAMqB,mBAAmB,CAAC,CAAC;IAC3B,OAAO,KAAK;EACd;AACF;AAEO,eAAeO,aAAaA,CAAA,EAAG;EACpC,IAAI;IACF7B,OAAO,CAACK,GAAG,CAAC,sBAAsB,CAAC;IAEnC,IAAI,CAAClB,oBAAoB,IAAI,CAACY,cAAK,EAAE;MACnCC,OAAO,CAACK,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,IAAIiC,qBAAQ,CAACC,EAAE,KAAK,KAAK,EAAE;QACzB;QACA,MAAM,IAAIa,OAAO,CAACC,OAAO,IAAIN,UAAU,CAACM,OAAO,EAAE,IAAI,CAAC,CAAC;QACvD,MAAMnC,cAAK,CAACgC,MAAM,CAAC,CAAC;QACpB/B,OAAO,CAACK,GAAG,CAAC,kCAAkC,CAAC;MACjD,CAAC,MAAM;QACL;QACA,MAAM,IAAI4B,OAAO,CAACC,OAAO,IAAIN,UAAU,CAACM,OAAO,EAAE,IAAI,CAAC,CAAC;QACvD,MAAMnC,cAAK,CAACiC,IAAI,CAAC,CAAC;QAClBhC,OAAO,CAACK,GAAG,CAAC,oCAAoC,CAAC;MACnD;;MAEA;MACA,MAAM,IAAI4B,OAAO,CAACC,OAAO,IAAIN,UAAU,CAACM,OAAO,EAAE,GAAG,CAAC,CAAC;IACxD,CAAC,CAAC,OAAOjC,KAAK,EAAE;MACdD,OAAO,CAACK,GAAG,CAAC,iCAAiC,EAAEJ,KAAK,CAAC;IACvD;;IAEA;IACA,IAAI;MACF,MAAMF,cAAK,CAACoC,OAAO,CAAC,CAAC;MACrBnC,OAAO,CAACK,GAAG,CAAC,2BAA2B,CAAC;MACxC,MAAM,IAAI4B,OAAO,CAACC,OAAO,IAAIN,UAAU,CAACM,OAAO,EAAE,GAAG,CAAC,CAAC;IACxD,CAAC,CAAC,OAAOjC,KAAK,EAAE;MACdD,OAAO,CAACK,GAAG,CAAC,yBAAyB,EAAEJ,KAAK,CAAC;IAC/C;;IAEA;IACAb,WAAW,GAAG,EAAE;EAClB,CAAC,CAAC,OAAOa,KAAK,EAAE;IACdD,OAAO,CAACC,KAAK,CAAC,yBAAyB,EAAEA,KAAK,CAAC;IAC/C,MAAMqB,mBAAmB,CAAC,CAAC;EAC7B;AACF;AAEO,eAAekB,eAAeA,CAAA,EAAG;EACtC,IAAI;IACF,IAAI,CAACzC,cAAK,EAAE;IACZ,MAAMA,cAAK,CAACgC,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;AAEO,eAAegB,sBAAsBA,CAAA,EAAG;EAC7C,IAAI;IACF;IACA,MAAMG,gBAAgB,GAAGlD,sBAAsB,GAC3CA,sBAAsB,CAAC,CAAC,GACxB,IAAI;IAER,IAAIkD,gBAAgB,KAAK,QAAQ,EAAE;MACjCzC,OAAO,CAACK,GAAG,CAAC,sCAAsC,CAAC;MACnD,OAAO,KAAK;IACd;IAEA,IAAIqC,gBAAgB,GAAG,KAAK;IAC5B,IAAIvB,qBAAQ,CAACC,EAAE,KAAK,SAAS,EAAE;MAC7BsB,gBAAgB,GAAG,MAAMC,wBAAwB,CAAC,CAAC;IACrD,CAAC,MAAM,IAAIxB,qBAAQ,CAACC,EAAE,KAAK,KAAK,EAAE;MAChCsB,gBAAgB,GAAG,MAAME,oBAAoB,CAAC,CAAC;IACjD;;IAEA;IACA,IAAIpD,sBAAsB,EAAE;MAC1BA,sBAAsB,CAACkD,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,MAAM,IAAAC,+BAAO,EAACC,mCAAW,CAACC,OAAO,CAACC,YAAY,CAAC;IACrE,IAAIJ,aAAa,KAAKK,+BAAO,CAACC,OAAO,EAAE;MACrCnD,OAAO,CAACK,GAAG,CAAC,8BAA8B,CAAC;MAC3C,OAAO,KAAK;IACd;;IAEA;IACA,IAAI;MACF,MAAM+C,QAAQ,GAAG,MAAMrD,cAAK,CAACsD,4BAA4B,CAAC,CAAC;MAC3D,IAAI,CAACD,QAAQ,IAAIA,QAAQ,CAAC3B,MAAM,KAAK,CAAC,EAAE;QACtCzB,OAAO,CAACC,KAAK,CAAC,0CAA0C,CAAC;QACzD,OAAO,KAAK;MACd;IACF,CAAC,CAAC,OAAOpB,CAAC,EAAE;MACVmB,OAAO,CAACK,GAAG,CAAC,iCAAiC,EAAExB,CAAC,CAAC;MACjD;IACF;IAEA,OAAO,IAAI;EACb,CAAC,CAAC,OAAOoB,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,MAAM,IAAAC,+BAAO,EAACC,mCAAW,CAACO,GAAG,CAACC,UAAU,CAAC;IAC/D,IAAIV,aAAa,KAAKK,+BAAO,CAACC,OAAO,EAAE;MACrCnD,OAAO,CAACK,GAAG,CAAC,8BAA8B,CAAC;MAC3C,OAAO,KAAK;IACd;;IAEA;IACA,MAAMmD,gBAAgB,GAAG,MAAM,IAAAV,+BAAO,EAACC,mCAAW,CAACO,GAAG,CAACG,kBAAkB,CAAC;IAC1E,IAAID,gBAAgB,KAAKN,+BAAO,CAACC,OAAO,EAAE;MACxCnD,OAAO,CAACK,GAAG,CAAC,sCAAsC,CAAC;MACnD,OAAO,KAAK;IACd;IAEA,OAAO,IAAI;EACb,CAAC,CAAC,OAAOJ,KAAK,EAAE;IACdD,OAAO,CAACC,KAAK,CAAC,mCAAmC,EAAEA,KAAK,CAAC;IACzD,OAAO,KAAK;EACd;AACF;AAEO,SAASyD,qBAAqBA,CAAA,EAAG;EACtC,IAAIlE,sBAAsB,EAAE;IAC1BA,sBAAsB,CAAC,IAAI,CAAC;IAC5B,OAAO,IAAI;EACb;EACA,OAAO,KAAK;AACd;AAEO,SAASmE,OAAOA,CAAA,EAAG;EACxB,IAAI,CAAC5D,cAAK,EAAE;IACVC,OAAO,CAACK,GAAG,CAAC,2CAA2C,CAAC;IACxD;EACF;EAEAN,cAAK,CAACoC,OAAO,CAAC,CAAC,CACZyB,IAAI,CAAC,MAAM;IACV7D,cAAK,CAACI,kBAAkB,CAAC,CAAC;IAC1BmB,mBAAmB,CAAC,CAAC;EACvB,CAAC,CAAC,CACDuC,KAAK,CAAC5D,KAAK,IAAI;IACdD,OAAO,CAACC,KAAK,CAAC,mBAAmB,EAAEA,KAAK,CAAC;IACzC;IACA,IAAIF,cAAK,EAAE;MACTA,cAAK,CAACoC,OAAO,CAAC,CAAC,CAAC0B,KAAK,CAAChF,CAAC,IACrBmB,OAAO,CAACC,KAAK,CAAC,+BAA+B,EAAEpB,CAAC,CAClD,CAAC;IACH;EACF,CAAC,CAAC;AACN","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":"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","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
|