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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "apps-sdk",
3
- "version": "2.0.0",
3
+ "version": "2.0.2",
4
4
  "description": "Apps SDK - Compatible with Expo SDK 54 + React 19",
5
5
  "main": "index.js",
6
6
  "author": "ASD",
@@ -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
- allowsEditing: true,
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
- config.DEBUG_MODE && console.debug('Selected image:', pickerResult.assets[0].uri);
340
- return { canceled: false, uri: pickerResult.assets[0].uri };
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);
@@ -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