react-native-srschat 0.1.62 → 0.1.64

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 (37) hide show
  1. package/lib/commonjs/components/input.js +14 -19
  2. package/lib/commonjs/components/input.js.map +1 -1
  3. package/lib/commonjs/components/productCard.js +11 -3
  4. package/lib/commonjs/components/productCard.js.map +1 -1
  5. package/lib/commonjs/components/voice.js +3 -2
  6. package/lib/commonjs/components/voice.js.map +1 -1
  7. package/lib/commonjs/components/welcomeInput.js +14 -19
  8. package/lib/commonjs/components/welcomeInput.js.map +1 -1
  9. package/lib/commonjs/contexts/AppContext.js +4 -1
  10. package/lib/commonjs/contexts/AppContext.js.map +1 -1
  11. package/lib/commonjs/utils/audioRecorder.js +168 -164
  12. package/lib/commonjs/utils/audioRecorder.js.map +1 -1
  13. package/lib/module/components/input.js +14 -19
  14. package/lib/module/components/input.js.map +1 -1
  15. package/lib/module/components/productCard.js +11 -3
  16. package/lib/module/components/productCard.js.map +1 -1
  17. package/lib/module/components/voice.js +3 -2
  18. package/lib/module/components/voice.js.map +1 -1
  19. package/lib/module/components/welcomeInput.js +14 -19
  20. package/lib/module/components/welcomeInput.js.map +1 -1
  21. package/lib/module/contexts/AppContext.js +4 -1
  22. package/lib/module/contexts/AppContext.js.map +1 -1
  23. package/lib/module/utils/audioRecorder.js +168 -164
  24. package/lib/module/utils/audioRecorder.js.map +1 -1
  25. package/lib/typescript/components/input.d.ts.map +1 -1
  26. package/lib/typescript/components/productCard.d.ts.map +1 -1
  27. package/lib/typescript/components/voice.d.ts.map +1 -1
  28. package/lib/typescript/components/welcomeInput.d.ts.map +1 -1
  29. package/lib/typescript/contexts/AppContext.d.ts.map +1 -1
  30. package/lib/typescript/utils/audioRecorder.d.ts.map +1 -1
  31. package/package.json +1 -1
  32. package/src/components/input.js +13 -19
  33. package/src/components/productCard.js +11 -3
  34. package/src/components/voice.js +1 -2
  35. package/src/components/welcomeInput.js +13 -19
  36. package/src/contexts/AppContext.js +2 -1
  37. package/src/utils/audioRecorder.js +184 -167
@@ -6,15 +6,9 @@ import { check, PERMISSIONS, request, RESULTS } from 'react-native-permissions';
6
6
  let resultCallback = null;
7
7
  let partialResultCallback = null;
8
8
  let silenceTimer = null;
9
+ let isCurrentlyRecording = false;
9
10
  let finalResult = '';
10
- const SILENCE_DURATION = 1500;
11
- const State = {
12
- IDLE: 'IDLE',
13
- LISTENING: 'LISTENING',
14
- FINALIZING: 'FINALIZING'
15
- };
16
- let state = State.IDLE;
17
- let listenersBound = false;
11
+ const SILENCE_DURATION = 1500; // 1.5 seconds of silence before stopping
18
12
 
19
13
  // Add this constant for AsyncStorage key
20
14
  const PERMISSION_STORAGE_KEY = '@voice_permission_status';
@@ -34,7 +28,6 @@ export async function initVoice(onResult, onPartialResult = null) {
34
28
  resultCallback = onResult;
35
29
  partialResultCallback = onPartialResult; // Store partial callback
36
30
  finalResult = '';
37
- if (listenersBound) return true;
38
31
 
39
32
  // Check if Voice module is available
40
33
  if (!Voice) {
@@ -48,103 +41,86 @@ export async function initVoice(onResult, onPartialResult = null) {
48
41
  console.error('Speech recognition is not available on this device');
49
42
  return false;
50
43
  }
44
+
45
+ // Remove any existing listeners
51
46
  Voice.removeAllListeners();
52
47
 
53
48
  // Set up all event listeners
54
- Voice.onSpeechStart = () => {
55
- console.log('[onSpeechStart] Setting state to LISTENING');
56
- state = State.LISTENING;
49
+ Voice.onSpeechStart = e => {
50
+ console.log('onSpeechStart: ', e);
51
+ isCurrentlyRecording = true;
57
52
  finalResult = '';
58
- clearSilenceTimer();
53
+ if (silenceTimer) {
54
+ clearTimeout(silenceTimer);
55
+ silenceTimer = null;
56
+ }
59
57
  };
58
+ Voice.onSpeechRecognized = e => {
59
+ console.log('onSpeechRecognized: ', e);
60
+ if (e.isFinal) {
61
+ console.log('Speech recognition final');
62
+ handleFinalResult();
63
+ }
64
+ };
65
+ Voice.onSpeechEnd = async e => {
66
+ console.log('onSpeechEnd: ', e);
67
+ if (silenceTimer) {
68
+ clearTimeout(silenceTimer);
69
+ silenceTimer = null;
70
+ }
60
71
 
61
- // Optional: ignore onSpeechRecognized or just log
62
- Voice.onSpeechRecognized = () => {};
63
- Voice.onSpeechEnd = () => {
64
- console.log('[onSpeechEnd] Speech ended, current state:', state);
65
- clearSilenceTimer();
66
- // Always reset to IDLE when speech ends (sessions should be considered over)
67
- console.log('[onSpeechEnd] Scheduling IDLE reset');
68
- if (Platform.OS === 'android') {
69
- setTimeout(() => {
70
- console.log('[onSpeechEnd] Android timeout - setting state to IDLE');
71
- state = State.IDLE;
72
- }, 800); // Increased delay
73
- } else {
74
- console.log('[onSpeechEnd] iOS - setting state to IDLE immediately');
75
- state = State.IDLE;
72
+ // Only handle final result if we're still recording
73
+ if (isCurrentlyRecording) {
74
+ await handleFinalResult();
76
75
  }
77
76
  };
78
- Voice.onSpeechError = e => {
77
+ Voice.onSpeechError = async e => {
79
78
  var _e$error, _e$error2;
80
- console.log('[onSpeechError] Error occurred, current state:', state, 'error:', e);
81
- clearSilenceTimer();
79
+ console.log('onSpeechError: ', e);
80
+ if (silenceTimer) {
81
+ clearTimeout(silenceTimer);
82
+ silenceTimer = null;
83
+ }
82
84
  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();
83
85
  const msg = ((_e$error2 = e.error) === null || _e$error2 === void 0 ? void 0 : _e$error2.message) || '';
84
86
 
85
- // Handle callback first
87
+ // Handle Android-specific errors
86
88
  if (Platform.OS === 'android' && (code === '7' || code === '5')) {
87
- if (finalResult && resultCallback) resultCallback(finalResult, null);else if (resultCallback) resultCallback(null, null);
89
+ if (finalResult && resultCallback) {
90
+ resultCallback(finalResult, null);
91
+ }
88
92
  } else if (!msg.includes('No speech detected') && resultCallback) {
89
93
  resultCallback(null, msg);
90
- } else if (resultCallback) {
91
- resultCallback(null, null);
92
- }
93
-
94
- // Errors end the session immediately, reset to IDLE with delay
95
- console.log('[onSpeechError] Scheduling IDLE reset');
96
- if (Platform.OS === 'android') {
97
- setTimeout(() => {
98
- console.log('[onSpeechError] Android timeout - setting state to IDLE');
99
- state = State.IDLE;
100
- }, 800); // Increased delay to match onSpeechEnd
101
- } else {
102
- console.log('[onSpeechError] iOS - setting state to IDLE immediately');
103
- state = State.IDLE;
104
94
  }
95
+ await cleanupVoiceSession();
105
96
  };
106
97
  Voice.onSpeechResults = e => {
107
- console.log('[onSpeechResults] Results received, current state:', state, 'results:', e);
108
- clearSilenceTimer();
98
+ console.log('onSpeechResults: ', e);
109
99
  if (e.value && e.value.length > 0) {
110
100
  finalResult = e.value[0];
111
- }
112
-
113
- // Only call callback if we haven't already (avoid double-calling)
114
- if (state === State.LISTENING && resultCallback) {
115
- console.log('[onSpeechResults] Calling callback with results');
116
- resultCallback(finalResult, null);
117
- } else {
118
- console.log('[onSpeechResults] Not calling callback - state:', state);
119
- }
120
-
121
- // On Android, we must explicitly stop to avoid session corruption
122
- if (Platform.OS === 'android') {
123
- console.log('[onSpeechResults] Android: Explicitly calling stopRecording()');
124
- stopRecording();
125
- }
126
-
127
- // Results end the session, reset to IDLE with delay
128
- console.log('[onSpeechResults] Scheduling IDLE reset');
129
- if (Platform.OS === 'android') {
130
- setTimeout(() => {
131
- console.log('[onSpeechResults] Android timeout - setting state to IDLE');
132
- state = State.IDLE;
133
- }, 800); // Increased delay
134
- } else {
135
- console.log('[onSpeechResults] iOS - setting state to IDLE immediately');
136
- state = State.IDLE;
101
+ handleSilenceDetection();
137
102
  }
138
103
  };
139
104
  Voice.onSpeechPartialResults = e => {
105
+ console.log('onSpeechPartialResults: ', e);
106
+ if (silenceTimer) {
107
+ clearTimeout(silenceTimer);
108
+ }
140
109
  if (e.value && e.value.length > 0) {
141
110
  finalResult = e.value[0];
142
- if (partialResultCallback) partialResultCallback(finalResult);
111
+
112
+ // Call partial callback for live transcription
113
+ if (partialResultCallback) {
114
+ partialResultCallback(finalResult);
115
+ }
143
116
  handleSilenceDetection();
144
117
  }
145
118
  };
146
- if (Platform.OS === 'android') Voice.onSpeechVolumeChanged = () => {};
147
- listenersBound = true;
119
+ if (Platform.OS === 'android') {
120
+ Voice.onSpeechVolumeChanged = e => {
121
+ console.log('onSpeechVolumeChanged: ', e);
122
+ };
123
+ }
148
124
  return true;
149
125
  } catch (error) {
150
126
  console.error('Error initializing Voice:', error);
@@ -156,144 +132,159 @@ const handleSilenceDetection = () => {
156
132
  clearTimeout(silenceTimer);
157
133
  }
158
134
  silenceTimer = setTimeout(async () => {
159
- if (state === State.LISTENING) {
135
+ if (isCurrentlyRecording) {
160
136
  await handleFinalResult();
161
137
  }
162
138
  }, SILENCE_DURATION);
163
139
  };
164
140
  const handleFinalResult = async () => {
165
- console.log('[handleFinalResult] Called, current state:', state);
166
- if (state !== State.LISTENING) {
167
- console.log('[handleFinalResult] State not LISTENING, returning');
168
- return;
169
- }
170
-
171
- // Set to FINALIZING first to prevent double callbacks
172
- console.log('[handleFinalResult] Setting state to FINALIZING');
173
- state = State.FINALIZING;
174
-
175
- // Call the callback with results
141
+ if (!isCurrentlyRecording) return;
142
+ console.log('handleFinalResult called with:', finalResult);
176
143
  if (finalResult && resultCallback) {
177
- console.log('[handleFinalResult] Calling callback with result:', finalResult);
178
144
  resultCallback(finalResult, null);
179
145
  }
180
146
 
181
- // Now stop recording (this will call Voice.stop())
182
- console.log('[handleFinalResult] Calling stopRecording');
147
+ // Stop recording first
183
148
  await stopRecording();
184
149
  };
185
- const cleanupVoiceSession = () => {
186
- console.log('[cleanupVoiceSession] Called, current state:', state);
187
- finalResult = '';
188
- clearSilenceTimer();
189
-
190
- // Add delay before allowing next session on Android
191
- if (Platform.OS === 'android') {
192
- setTimeout(() => {
193
- console.log('[cleanupVoiceSession] Android timeout - setting state to IDLE');
194
- state = State.IDLE;
195
- }, 800);
196
- } else {
197
- console.log('[cleanupVoiceSession] iOS - setting state to IDLE immediately');
198
- state = State.IDLE;
199
- }
200
- };
201
- const clearSilenceTimer = () => {
150
+ const cleanupVoiceSession = async () => {
151
+ console.log('cleanupVoiceSession called');
152
+ isCurrentlyRecording = false;
202
153
  if (silenceTimer) {
203
154
  clearTimeout(silenceTimer);
204
155
  silenceTimer = null;
205
156
  }
206
- };
207
- export async function startRecording() {
208
157
  try {
209
- console.log('[startRecording] Called, current state:', state);
158
+ // Check if Voice module is available
159
+ if (!Voice) {
160
+ console.log('Voice module not available during cleanup');
161
+ return;
162
+ }
210
163
 
211
- // On Android, destroy any lingering instance before starting
212
- if (Platform.OS === 'android') {
164
+ // Check if still recognizing
165
+ const isRecognizing = await Voice.isRecognizing();
166
+ console.log('Voice.isRecognizing() in cleanup:', isRecognizing);
167
+ if (isRecognizing) {
213
168
  try {
214
- console.log('[startRecording] Android: Proactively destroying Voice instance');
215
- await Voice.destroy();
216
- await new Promise(r => setTimeout(r, 100)); // Short delay for destroy to complete
169
+ // For iOS, use cancel for immediate termination
170
+ if (Platform.OS === 'ios') {
171
+ await Voice.cancel();
172
+ console.log('Voice.cancel() completed for iOS');
173
+ } else {
174
+ await Voice.stop();
175
+ console.log('Voice.stop() completed for Android');
176
+ }
177
+ await new Promise(resolve => setTimeout(resolve, 100));
217
178
  } catch (e) {
218
- console.log('[startRecording] Proactive destroy failed, may be okay:', e);
179
+ console.log('Error stopping/canceling in cleanup:', e);
219
180
  }
220
181
  }
221
- if (!Voice) {
222
- console.log('[startRecording] Voice not available');
223
- return false;
182
+
183
+ // Destroy the instance
184
+ try {
185
+ await Voice.destroy();
186
+ console.log('Voice.destroy() completed');
187
+ await new Promise(resolve => setTimeout(resolve, 200));
188
+ } catch (e) {
189
+ console.log('Error destroying in cleanup:', e);
224
190
  }
225
- if (state !== State.IDLE) {
226
- console.log('[startRecording] State not IDLE, returning false');
191
+ } catch (error) {
192
+ console.error('Error in cleanupVoiceSession:', error);
193
+ }
194
+ finalResult = '';
195
+ };
196
+ export async function startRecording() {
197
+ try {
198
+ console.log('startRecording called');
199
+
200
+ // Check if Voice module is available
201
+ if (!Voice) {
202
+ console.error('Voice module is not available');
227
203
  return false;
228
204
  }
205
+
206
+ // Ensure cleanup of any existing session
207
+ await cleanupVoiceSession();
208
+
209
+ // Small delay to ensure cleanup is complete
210
+ await new Promise(resolve => setTimeout(resolve, 200));
229
211
  const hasPermission = await requestAudioPermission();
230
212
  if (!hasPermission) {
231
213
  console.error('No permission to record audio');
232
214
  return false;
233
215
  }
234
- const recognizing = await Voice.isRecognizing();
235
- console.log('[startRecording] Voice.isRecognizing():', recognizing);
236
- if (recognizing) {
237
- console.log('[startRecording] Already recognizing, canceling first');
238
- await Voice.cancel();
239
- // Wait longer for cancel to take effect
240
- await new Promise(r => setTimeout(r, 500));
241
216
 
242
- // Double-check if still recognizing after cancel
243
- const stillRecognizing = await Voice.isRecognizing();
244
- console.log('[startRecording] After cancel, still recognizing:', stillRecognizing);
245
- if (stillRecognizing) {
246
- console.log('[startRecording] Still recognizing after cancel, stopping');
247
- try {
248
- await Voice.stop();
249
- await new Promise(r => setTimeout(r, 300));
250
- } catch (e) {
251
- console.log('[startRecording] Error stopping:', e);
252
- }
253
- }
254
- }
255
- console.log('[startRecording] Calling Voice.start()');
217
+ // Re-initialize listeners each time for iOS stability
218
+ await initVoice(resultCallback, partialResultCallback);
219
+
220
+ // Start recognition
256
221
  await Voice.start('en-US');
257
- console.log('[startRecording] Voice.start() completed, setting state to LISTENING');
258
- state = State.LISTENING;
222
+ console.log('Voice.start() completed');
223
+ isCurrentlyRecording = true;
259
224
  return true;
260
225
  } catch (error) {
261
226
  console.error('Error starting voice recognition:', error);
262
- cleanupVoiceSession();
227
+ await cleanupVoiceSession();
263
228
  return false;
264
229
  }
265
230
  }
266
231
  export async function stopRecording() {
267
232
  try {
268
- console.log('[stopRecording] Called, current state:', state);
269
- // Can be called from LISTENING or FINALIZING state
270
- if (state !== State.LISTENING && state !== State.FINALIZING || !Voice) {
271
- console.log('[stopRecording] Invalid state or no Voice, returning');
233
+ console.log('stopRecording called');
234
+ if (!isCurrentlyRecording || !Voice) {
235
+ console.log('Not recording or Voice not available');
272
236
  return;
273
237
  }
274
238
 
275
- // Only set to FINALIZING if not already there
276
- if (state === State.LISTENING) {
277
- console.log('[stopRecording] Setting state to FINALIZING');
278
- state = State.FINALIZING;
239
+ // Set this first to prevent race conditions
240
+ isCurrentlyRecording = false;
241
+ if (silenceTimer) {
242
+ clearTimeout(silenceTimer);
243
+ silenceTimer = null;
244
+ }
245
+
246
+ // Platform-specific stop
247
+ try {
248
+ if (Platform.OS === 'ios') {
249
+ // iOS: Use cancel for immediate termination
250
+ await Voice.cancel();
251
+ console.log('Voice.cancel() completed for iOS');
252
+ } else {
253
+ // Android: Use stop
254
+ await Voice.stop();
255
+ console.log('Voice.stop() completed for Android');
256
+ }
257
+
258
+ // Small delay
259
+ await new Promise(resolve => setTimeout(resolve, 100));
260
+ } catch (error) {
261
+ console.log('Error stopping/canceling Voice:', error);
262
+ }
263
+
264
+ // Then destroy
265
+ try {
266
+ await Voice.destroy();
267
+ console.log('Voice.destroy() completed');
268
+ await new Promise(resolve => setTimeout(resolve, 200));
269
+ } catch (error) {
270
+ console.log('Error destroying Voice:', error);
279
271
  }
280
- clearSilenceTimer();
281
- console.log('[stopRecording] Calling Voice.stop()');
282
- await Voice.stop();
283
- console.log('[stopRecording] Voice.stop() completed');
272
+
273
+ // Final cleanup
274
+ finalResult = '';
284
275
  } catch (error) {
285
276
  console.error('Error in stopRecording:', error);
286
- cleanupVoiceSession();
277
+ await cleanupVoiceSession();
287
278
  }
288
279
  }
289
280
  export async function cancelRecording() {
290
281
  try {
291
282
  if (!Voice) return;
292
283
  await Voice.cancel();
293
- cleanupVoiceSession();
284
+ await cleanupVoiceSession();
294
285
  } catch (error) {
295
286
  console.error('Error canceling voice recognition:', error);
296
- cleanupVoiceSession();
287
+ await cleanupVoiceSession();
297
288
  }
298
289
  }
299
290
  export async function requestAudioPermission() {
@@ -376,6 +367,19 @@ export function resetStoredPermission() {
376
367
  return false;
377
368
  }
378
369
  export function cleanup() {
379
- cleanupVoiceSession();
370
+ if (!Voice) {
371
+ console.log('Voice module not available during cleanup');
372
+ return;
373
+ }
374
+ Voice.destroy().then(() => {
375
+ Voice.removeAllListeners();
376
+ cleanupVoiceSession();
377
+ }).catch(error => {
378
+ console.error('Error in cleanup:', error);
379
+ // Try one more time
380
+ if (Voice) {
381
+ Voice.destroy().catch(e => console.error('Final cleanup attempt failed:', e));
382
+ }
383
+ });
380
384
  }
381
385
  //# sourceMappingURL=audioRecorder.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["Platform","Voice","check","PERMISSIONS","request","RESULTS","resultCallback","partialResultCallback","silenceTimer","finalResult","SILENCE_DURATION","State","IDLE","LISTENING","FINALIZING","state","listenersBound","PERMISSION_STORAGE_KEY","permissionStatusGetter","permissionStatusSetter","setPermissionStatusHandlers","getter","setter","initVoice","onResult","onPartialResult","console","error","isAvailable","removeAllListeners","onSpeechStart","log","clearSilenceTimer","onSpeechRecognized","onSpeechEnd","OS","setTimeout","onSpeechError","e","_e$error","_e$error2","code","toString","msg","message","includes","onSpeechResults","value","length","stopRecording","onSpeechPartialResults","handleSilenceDetection","onSpeechVolumeChanged","clearTimeout","handleFinalResult","cleanupVoiceSession","startRecording","destroy","Promise","r","hasPermission","requestAudioPermission","recognizing","isRecognizing","cancel","stillRecognizing","stop","start","cancelRecording","storedPermission","permissionResult","requestAndroidPermission","requestIOSPermission","micPermission","ANDROID","RECORD_AUDIO","GRANTED","services","getSpeechRecognitionServices","IOS","MICROPHONE","speechPermission","SPEECH_RECOGNITION","resetStoredPermission","cleanup"],"sourceRoot":"../../../src","sources":["utils/audioRecorder.js"],"mappings":"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","ignoreList":[]}
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","clearTimeout","onSpeechRecognized","isFinal","handleFinalResult","onSpeechEnd","onSpeechError","_e$error","_e$error2","code","toString","msg","message","OS","includes","cleanupVoiceSession","onSpeechResults","value","length","handleSilenceDetection","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":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../../src/components/input.js"],"names":[],"mappings":"AAgBO;;;sBAoEN;kBApF8D,OAAO"}
1
+ {"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../../src/components/input.js"],"names":[],"mappings":"AAgBO;;;sBA8DN;kBA9E8D,OAAO"}
@@ -1 +1 @@
1
- {"version":3,"file":"productCard.d.ts","sourceRoot":"","sources":["../../../src/components/productCard.js"],"names":[],"mappings":"AAOO;;;;sBAmdN;kBA1dsD,OAAO"}
1
+ {"version":3,"file":"productCard.d.ts","sourceRoot":"","sources":["../../../src/components/productCard.js"],"names":[],"mappings":"AAOO;;;;sBA2dN;kBAlesD,OAAO"}
@@ -1 +1 @@
1
- {"version":3,"file":"voice.d.ts","sourceRoot":"","sources":["../../../src/components/voice.js"],"names":[],"mappings":"AAqBO;;sBAuLN;kBA1MsD,OAAO"}
1
+ {"version":3,"file":"voice.d.ts","sourceRoot":"","sources":["../../../src/components/voice.js"],"names":[],"mappings":"AAqBO;;sBAsLN;kBAzMsD,OAAO"}
@@ -1 +1 @@
1
- {"version":3,"file":"welcomeInput.d.ts","sourceRoot":"","sources":["../../../src/components/welcomeInput.js"],"names":[],"mappings":"AAgBO;;;sBAwEN;kBAxF8D,OAAO"}
1
+ {"version":3,"file":"welcomeInput.d.ts","sourceRoot":"","sources":["../../../src/components/welcomeInput.js"],"names":[],"mappings":"AAgBO;;;sBAkEN;kBAlF8D,OAAO"}
@@ -1 +1 @@
1
- {"version":3,"file":"AppContext.d.ts","sourceRoot":"","sources":["../../../src/contexts/AppContext.js"],"names":[],"mappings":"AAMA,4CAA0C;AAEnC;;;;;;sBAsXN;kBA9X6E,OAAO"}
1
+ {"version":3,"file":"AppContext.d.ts","sourceRoot":"","sources":["../../../src/contexts/AppContext.js"],"names":[],"mappings":"AAMA,4CAA0C;AAEnC;;;;;;sBAuXN;kBA/X6E,OAAO"}
@@ -1 +1 @@
1
- {"version":3,"file":"audioRecorder.d.ts","sourceRoot":"","sources":["../../../src/utils/audioRecorder.js"],"names":[],"mappings":"AAyBA,4EAGC;AAGD,mFAiIC;AA4DD,mDA8DC;AAED,+CAuBC;AAED,iDASC;AAED,2DA2BC;AAqDD,iDAMC;AAED,gCAEC"}
1
+ {"version":3,"file":"audioRecorder.d.ts","sourceRoot":"","sources":["../../../src/utils/audioRecorder.js"],"names":[],"mappings":"AAqBA,4EAGC;AAGD,mFAqHC;AA+ED,mDAmCC;AAED,+CAkDC;AAED,iDASC;AAED,2DA2BC;AAqDD,iDAMC;AAED,gCAgBC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-srschat",
3
- "version": "0.1.62",
3
+ "version": "0.1.64",
4
4
  "private": false,
5
5
  "description": "A modern, sophisticated chat interface for React Native",
6
6
  "main": "lib/commonjs/index",
@@ -15,7 +15,7 @@ import Ionicons from 'react-native-vector-icons/Ionicons';
15
15
  import { VoiceButton } from './voice';
16
16
 
17
17
  export const ChatInput = ({ onProductCardClick, onAddToCartClick }) => {
18
- const { handleSend, input, setInput, showModal, data } = useContext(AppContext);
18
+ const { handleSend, input, setInput, showModal, data, isListening } = useContext(AppContext);
19
19
  const inputRef = useRef(null);
20
20
 
21
21
  const handleKeyPress = ({ nativeEvent }) => {
@@ -42,8 +42,11 @@ export const ChatInput = ({ onProductCardClick, onAddToCartClick }) => {
42
42
  style={styles.input}
43
43
  value={input}
44
44
  onChangeText={setInput}
45
- placeholder="Ask a question..."
45
+ placeholder={isListening && !input ? "Listening..." : "Ask a question..."}
46
46
  placeholderTextColor="#999"
47
+ editable={!isListening}
48
+ caretHidden={isListening}
49
+ showSoftInputOnFocus={!isListening}
47
50
  multiline={false}
48
51
  returnKeyType="send"
49
52
  enablesReturnKeyAutomatically={true}
@@ -54,25 +57,16 @@ export const ChatInput = ({ onProductCardClick, onAddToCartClick }) => {
54
57
  />
55
58
  <VoiceButton setInput={(text) => {
56
59
  setInput(text);
57
- // Auto-scroll to end
58
- if (inputRef.current) {
59
- // For iOS and Android, blur and refocus to ensure scroll
60
- inputRef.current.blur();
61
- setTimeout(() => {
62
- if (inputRef.current) {
63
- inputRef.current.focus();
64
- // Set selection to end - Android sometimes needs a slight delay
65
- if (Platform.OS === 'android') {
66
- setTimeout(() => {
67
- if (inputRef.current) {
68
- inputRef.current.setSelection(text.length, text.length);
69
- }
70
- }, 10);
71
- } else {
60
+ if (!isListening && inputRef.current) {
61
+ if (Platform.OS === 'android') {
62
+ setTimeout(() => {
63
+ if (inputRef.current) {
72
64
  inputRef.current.setSelection(text.length, text.length);
73
65
  }
74
- }
75
- }, 50);
66
+ }, 10);
67
+ } else {
68
+ inputRef.current.setSelection(text.length, text.length);
69
+ }
76
70
  }
77
71
  }}/>
78
72
  <TouchableOpacity style={styles.sendButton} onPress={() => handleSend(input)} >
@@ -248,9 +248,17 @@ export const ProductCard = ({ prod, onFocusQuantityInput, messageId }) => {
248
248
  });
249
249
  };
250
250
 
251
+ // If user hasn't changed the default quantity (0), default to 1 for add-to-cart
252
+ let requestedQty = quantity;
253
+ if (requestedQty <= 0) {
254
+ requestedQty = 1;
255
+ setQuantity(1);
256
+ setQuantityText("1");
257
+ }
258
+
251
259
  // Check if quantity is valid for min pack requirements
252
- if (currentMinPackQtyForSelectedUom > 1 && Math.abs(quantity % currentMinPackQtyForSelectedUom) > 0.01) {
253
- const roundedResult = Math.round(Math.ceil(quantity / currentMinPackQtyForSelectedUom) * currentMinPackQtyForSelectedUom * 100) / 100;
260
+ if (currentMinPackQtyForSelectedUom > 1 && Math.abs(requestedQty % currentMinPackQtyForSelectedUom) > 0.01) {
261
+ const roundedResult = Math.round(Math.ceil(requestedQty / currentMinPackQtyForSelectedUom) * currentMinPackQtyForSelectedUom * 100) / 100;
254
262
 
255
263
  Alert.alert(
256
264
  `Item #${prod.part_number} is sold in multiples of ${currentMinPackQtyForSelectedUom} ${selectedUom}`,
@@ -276,7 +284,7 @@ export const ProductCard = ({ prod, onFocusQuantityInput, messageId }) => {
276
284
  } else {
277
285
  // No rounding needed, or item is sold individually (min pack <= 1)
278
286
  // Proceed with the current quantity (which is > 0 at this point)
279
- executeAddToCartLogic(quantity);
287
+ executeAddToCartLogic(requestedQty);
280
288
  }
281
289
  };
282
290
 
@@ -20,8 +20,7 @@ import { AppContext } from '../contexts/AppContext';
20
20
  const PERMISSION_STORAGE_KEY = '@voice_permission_status';
21
21
 
22
22
  export const VoiceButton = ({ setInput }) => {
23
- const { handleVoiceSend } = useContext(AppContext);
24
- const [isListening, setIsListening] = useState(false);
23
+ const { handleVoiceSend, isListening, setIsListening } = useContext(AppContext);
25
24
  const [loading, setLoading] = useState(false);
26
25
  const [permissionChecked, setPermissionChecked] = useState(false);
27
26
  const [hasPermission, setHasPermission] = useState(null);