apps-sdk 2.0.0 → 2.0.2
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/package.json +1 -1
- package/src/libraries/Storage.js +19 -4
- package/src/libraries/Voice.js +11 -0
package/package.json
CHANGED
package/src/libraries/Storage.js
CHANGED
|
@@ -309,8 +309,12 @@ class Storage {
|
|
|
309
309
|
});
|
|
310
310
|
}
|
|
311
311
|
|
|
312
|
-
async selectImageFromGallery(galleryNotGrantedTitle, galleryNotGrantedMessage, cancelText, openSettingsText) {
|
|
312
|
+
async selectImageFromGallery(galleryNotGrantedTitle, galleryNotGrantedMessage, cancelText, openSettingsText, maxPerPick = 1) {
|
|
313
313
|
try {
|
|
314
|
+
// enforce minimum of 1
|
|
315
|
+
const safeMaxPerPick = Math.max(1, maxPerPick);
|
|
316
|
+
const isMultiple = safeMaxPerPick > 1;
|
|
317
|
+
|
|
314
318
|
const permissionResult = await ImagePicker.requestMediaLibraryPermissionsAsync();
|
|
315
319
|
|
|
316
320
|
if (permissionResult.granted === false) {
|
|
@@ -328,16 +332,27 @@ class Storage {
|
|
|
328
332
|
|
|
329
333
|
const pickerResult = await ImagePicker.launchImageLibraryAsync({
|
|
330
334
|
mediaTypes: ['images'],
|
|
331
|
-
|
|
335
|
+
allowsMultipleSelection: isMultiple,
|
|
336
|
+
allowsEditing: !isMultiple,
|
|
332
337
|
quality: 1,
|
|
338
|
+
...(isMultiple ? { selectionLimit: safeMaxPerPick } : {}),
|
|
333
339
|
});
|
|
334
340
|
|
|
335
341
|
if (pickerResult.canceled) {
|
|
336
342
|
config.DEBUG_MODE && console.debug('Image selection canceled');
|
|
337
343
|
return { canceled: true, uri: null };
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
if (isMultiple) {
|
|
347
|
+
const uris = pickerResult.assets.map(asset => asset.uri);
|
|
348
|
+
config.DEBUG_MODE && console.debug('Selected images:', uris);
|
|
349
|
+
|
|
350
|
+
return { canceled: false, uris };
|
|
338
351
|
} else {
|
|
339
|
-
|
|
340
|
-
|
|
352
|
+
const uri = pickerResult.assets[0].uri;
|
|
353
|
+
config.DEBUG_MODE && console.debug('Selected image:', uri);
|
|
354
|
+
|
|
355
|
+
return { canceled: false, uri };
|
|
341
356
|
}
|
|
342
357
|
} catch (error) {
|
|
343
358
|
config.DEBUG_MODE && console.debug('Error selecting image from gallery:', error);
|
package/src/libraries/Voice.js
CHANGED
|
@@ -3,6 +3,8 @@ import { ExpoSpeechRecognitionModule } from 'expo-speech-recognition';
|
|
|
3
3
|
import Session from "./Session";
|
|
4
4
|
import * as Speech from 'expo-speech';
|
|
5
5
|
import { franc } from 'franc-min';
|
|
6
|
+
import Networking from './Networking';
|
|
7
|
+
import MixPanel from './MixPanel';
|
|
6
8
|
|
|
7
9
|
class VoiceService {
|
|
8
10
|
constructor() {
|
|
@@ -15,9 +17,18 @@ class VoiceService {
|
|
|
15
17
|
try {
|
|
16
18
|
const { status } = await ExpoSpeechRecognitionModule.requestPermissionsAsync();
|
|
17
19
|
if (status !== 'granted') {
|
|
20
|
+
Networking.sendEvent('other', 'speech_permission_denied');
|
|
21
|
+
MixPanel.trackEvent('speech_permission_denied');
|
|
22
|
+
Networking.sendEvent('other', 'microphone_permission_denied');
|
|
23
|
+
MixPanel.trackEvent('microphone_permission_denied');
|
|
18
24
|
throw new Error('Speech recognition permission not granted');
|
|
19
25
|
}
|
|
20
26
|
|
|
27
|
+
Networking.sendEvent('other', 'speech_permission_granted');
|
|
28
|
+
MixPanel.trackEvent('speech_permission_granted');
|
|
29
|
+
Networking.sendEvent('other', 'microphone_permission_granted');
|
|
30
|
+
MixPanel.trackEvent('microphone_permission_granted');
|
|
31
|
+
|
|
21
32
|
let language = Session.getDeviceLanguageAndRegion();
|
|
22
33
|
language = this.normalizeLocale(language);
|
|
23
34
|
|