react-native-picture-selector 1.0.12 → 1.0.15

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.
@@ -10,6 +10,15 @@ add_library(${CMAKE_PROJECT_NAME} SHARED)
10
10
  # Autolinking cmake handles: find_package, target_sources, target_link_libraries
11
11
  include(${CMAKE_SOURCE_DIR}/../nitrogen/generated/android/NitroPictureSelector+autolinking.cmake)
12
12
 
13
+ # cpp-adapter.cpp defines JNI_OnLoad — the entry point called by the JVM when
14
+ # System.loadLibrary("NitroPictureSelector") is invoked from Kotlin.
15
+ # It calls facebook::jni::initialize(vm, ...) and then registerAllNatives(),
16
+ # which inserts "PictureSelector" into Nitro's HybridObjectRegistry.
17
+ # Without this file the library loads silently but nothing gets registered.
18
+ target_sources(${CMAKE_PROJECT_NAME} PRIVATE
19
+ src/main/cpp/cpp-adapter.cpp
20
+ )
21
+
13
22
  # Directly link libNitroModules.so from its stable cmake build output path.
14
23
  # The prefab for react-native-nitro-modules is header-only at CMake configure
15
24
  # time (fix-prefab.gradle updates it only after native build), so we link
@@ -0,0 +1,26 @@
1
+ ///
2
+ /// cpp-adapter.cpp
3
+ /// Entry point for the NitroPictureSelector shared library.
4
+ ///
5
+ /// Defines JNI_OnLoad so that when Kotlin calls
6
+ /// System.loadLibrary("NitroPictureSelector")
7
+ /// the JVM invokes this function with the JavaVM*, which:
8
+ /// 1. Initialises fbjni (facebook::jni::initialize)
9
+ /// 2. Calls registerAllNatives() — which registers JNI methods and
10
+ /// inserts "PictureSelector" into Nitro's HybridObjectRegistry.
11
+ ///
12
+ /// Without this entry point System.loadLibrary succeeds silently but
13
+ /// nothing ever gets registered, so every call to
14
+ /// NitroModules.createHybridObject("PictureSelector")
15
+ /// throws "It has not yet been registered in the HybridObjectRegistry".
16
+ ///
17
+
18
+ #include <jni.h>
19
+ #include <fbjni/fbjni.h>
20
+ #include "NitroPictureSelectorOnLoad.hpp"
21
+
22
+ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void*) {
23
+ return facebook::jni::initialize(vm, []() {
24
+ margelo::pictureselector::registerAllNatives();
25
+ });
26
+ }
@@ -28,6 +28,21 @@ const defaultOptions = {
28
28
  enableCamera: true
29
29
  };
30
30
 
31
+ // ─────────────────────────────────────────────────────────────────────────────
32
+ // Shared native call helper
33
+ // ─────────────────────────────────────────────────────────────────────────────
34
+
35
+ async function callNative(method, options) {
36
+ try {
37
+ return await getNative()[method]({
38
+ ...defaultOptions,
39
+ ...options
40
+ });
41
+ } catch (err) {
42
+ throw (0, _types.toPickerError)(err);
43
+ }
44
+ }
45
+
31
46
  // ─────────────────────────────────────────────────────────────────────────────
32
47
  // Static API
33
48
  // ─────────────────────────────────────────────────────────────────────────────
@@ -42,15 +57,8 @@ const PictureSelector = exports.PictureSelector = {
42
57
  * @throws PickerError with code CANCELLED when the user dismisses
43
58
  * @throws PickerError with code PERMISSION_DENIED on permission failure
44
59
  */
45
- async openPicker(options = {}) {
46
- try {
47
- return await getNative().openPicker({
48
- ...defaultOptions,
49
- ...options
50
- });
51
- } catch (err) {
52
- throw (0, _types.toPickerError)(err);
53
- }
60
+ openPicker(options = {}) {
61
+ return callNative('openPicker', options);
54
62
  },
55
63
  /**
56
64
  * Open the camera for capture.
@@ -60,15 +68,8 @@ const PictureSelector = exports.PictureSelector = {
60
68
  *
61
69
  * @throws PickerError with code CANCELLED when the user dismisses
62
70
  */
63
- async openCamera(options = {}) {
64
- try {
65
- return await getNative().openCamera({
66
- ...defaultOptions,
67
- ...options
68
- });
69
- } catch (err) {
70
- throw (0, _types.toPickerError)(err);
71
- }
71
+ openCamera(options = {}) {
72
+ return callNative('openCamera', options);
72
73
  }
73
74
  };
74
75
  //# sourceMappingURL=PictureSelector.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_reactNativeNitroModules","require","_types","_native","getNative","NitroModules","createHybridObject","defaultOptions","mediaType","MediaType","IMAGE","maxCount","enableCamera","PictureSelector","exports","openPicker","options","err","toPickerError","openCamera"],"sourceRoot":"..\\..\\src","sources":["PictureSelector.ts"],"mappings":";;;;;;AAAA,IAAAA,wBAAA,GAAAC,OAAA;AAGA,IAAAC,MAAA,GAAAD,OAAA;AAEA;AACA;AACA;;AAEA,IAAIE,OAAqC,GAAG,IAAI;AAEhD,SAASC,SAASA,CAAA,EAA0B;EAC1C,IAAID,OAAO,IAAI,IAAI,EAAE;IACnBA,OAAO,GAAGE,qCAAY,CAACC,kBAAkB,CACvC,iBACF,CAAC;EACH;EACA,OAAOH,OAAO;AAChB;;AAEA;AACA;AACA;;AAEA,MAAMI,cAAsC,GAAG;EAC7CC,SAAS,EAAEC,gBAAS,CAACC,KAAK;EAC1BC,QAAQ,EAAE,CAAC;EACXC,YAAY,EAAE;AAChB,CAAC;;AAED;AACA;AACA;;AAEO,MAAMC,eAAe,GAAAC,OAAA,CAAAD,eAAA,GAAG;EAC7B;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,MAAME,UAAUA,CACdC,OAA+B,GAAG,CAAC,CAAC,EACb;IACvB,IAAI;MACF,OAAO,MAAMZ,SAAS,CAAC,CAAC,CAACW,UAAU,CAAC;QAAE,GAAGR,cAAc;QAAE,GAAGS;MAAQ,CAAC,CAAC;IACxE,CAAC,CAAC,OAAOC,GAAG,EAAE;MACZ,MAAM,IAAAC,oBAAa,EAACD,GAAG,CAAC;IAC1B;EACF,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EACE,MAAME,UAAUA,CACdH,OAA+B,GAAG,CAAC,CAAC,EACb;IACvB,IAAI;MACF,OAAO,MAAMZ,SAAS,CAAC,CAAC,CAACe,UAAU,CAAC;QAAE,GAAGZ,cAAc;QAAE,GAAGS;MAAQ,CAAC,CAAC;IACxE,CAAC,CAAC,OAAOC,GAAG,EAAE;MACZ,MAAM,IAAAC,oBAAa,EAACD,GAAG,CAAC;IAC1B;EACF;AACF,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["_reactNativeNitroModules","require","_types","_native","getNative","NitroModules","createHybridObject","defaultOptions","mediaType","MediaType","IMAGE","maxCount","enableCamera","callNative","method","options","err","toPickerError","PictureSelector","exports","openPicker","openCamera"],"sourceRoot":"..\\..\\src","sources":["PictureSelector.ts"],"mappings":";;;;;;AAAA,IAAAA,wBAAA,GAAAC,OAAA;AAGA,IAAAC,MAAA,GAAAD,OAAA;AAEA;AACA;AACA;;AAEA,IAAIE,OAAqC,GAAG,IAAI;AAEhD,SAASC,SAASA,CAAA,EAA0B;EAC1C,IAAID,OAAO,IAAI,IAAI,EAAE;IACnBA,OAAO,GAAGE,qCAAY,CAACC,kBAAkB,CACvC,iBACF,CAAC;EACH;EACA,OAAOH,OAAO;AAChB;;AAEA;AACA;AACA;;AAEA,MAAMI,cAAsC,GAAG;EAC7CC,SAAS,EAAEC,gBAAS,CAACC,KAAK;EAC1BC,QAAQ,EAAE,CAAC;EACXC,YAAY,EAAE;AAChB,CAAC;;AAED;AACA;AACA;;AAEA,eAAeC,UAAUA,CACvBC,MAAmC,EACnCC,OAA+B,EACR;EACvB,IAAI;IACF,OAAO,MAAMX,SAAS,CAAC,CAAC,CAACU,MAAM,CAAC,CAAC;MAAE,GAAGP,cAAc;MAAE,GAAGQ;IAAQ,CAAC,CAAC;EACrE,CAAC,CAAC,OAAOC,GAAG,EAAE;IACZ,MAAM,IAAAC,oBAAa,EAACD,GAAG,CAAC;EAC1B;AACF;;AAEA;AACA;AACA;;AAEO,MAAME,eAAe,GAAAC,OAAA,CAAAD,eAAA,GAAG;EAC7B;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEE,UAAUA,CAACL,OAA+B,GAAG,CAAC,CAAC,EAAyB;IACtE,OAAOF,UAAU,CAAC,YAAY,EAAEE,OAAO,CAAC;EAC1C,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EACEM,UAAUA,CAACN,OAA+B,GAAG,CAAC,CAAC,EAAyB;IACtE,OAAOF,UAAU,CAAC,YAAY,EAAEE,OAAO,CAAC;EAC1C;AACF,CAAC","ignoreList":[]}
@@ -34,9 +34,11 @@ var _PictureSelector = require("./specs/PictureSelector.nitro");
34
34
  /** Normalise a raw native error to a typed PickerError. */
35
35
  function toPickerError(err) {
36
36
  const base = err instanceof Error ? err : new Error(String(err));
37
- const msg = base.message ?? '';
37
+ // Nitro serialises Kotlin exceptions as "<ClassName>: <message>", so the
38
+ // raw code ("CANCELLED") never appears verbatim — match case-insensitively.
39
+ const msg = (base.message ?? '').toLowerCase();
38
40
  let code = 'UNKNOWN';
39
- if (msg.includes('CANCELLED')) code = 'CANCELLED';else if (msg.includes('PERMISSION_DENIED')) code = 'PERMISSION_DENIED';
41
+ if (msg.includes('cancelled')) code = 'CANCELLED';else if (msg.includes('permission_denied') || msg.includes('permission denied')) code = 'PERMISSION_DENIED';
40
42
  return Object.assign(base, {
41
43
  code
42
44
  });
@@ -1 +1 @@
1
- {"version":3,"names":["_PictureSelector","require","toPickerError","err","base","Error","String","msg","message","code","includes","Object","assign"],"sourceRoot":"..\\..\\src","sources":["types.ts"],"mappings":";;;;;;;;;;;;;;;;;;AAQA,IAAAA,gBAAA,GAAAC,OAAA;AARA;;AAUA;AACA;AACA;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;;AAKA;AACO,SAASC,aAAaA,CAACC,GAAY,EAAe;EACvD,MAAMC,IAAI,GAAGD,GAAG,YAAYE,KAAK,GAAGF,GAAG,GAAG,IAAIE,KAAK,CAACC,MAAM,CAACH,GAAG,CAAC,CAAC;EAChE,MAAMI,GAAG,GAAGH,IAAI,CAACI,OAAO,IAAI,EAAE;EAE9B,IAAIC,IAAyB,GAAG,SAAS;EACzC,IAAIF,GAAG,CAACG,QAAQ,CAAC,WAAW,CAAC,EAAED,IAAI,GAAG,WAAW,MAC5C,IAAIF,GAAG,CAACG,QAAQ,CAAC,mBAAmB,CAAC,EAAED,IAAI,GAAG,mBAAmB;EAEtE,OAAOE,MAAM,CAACC,MAAM,CAACR,IAAI,EAAE;IAAEK;EAAK,CAAC,CAAC;AACtC","ignoreList":[]}
1
+ {"version":3,"names":["_PictureSelector","require","toPickerError","err","base","Error","String","msg","message","toLowerCase","code","includes","Object","assign"],"sourceRoot":"..\\..\\src","sources":["types.ts"],"mappings":";;;;;;;;;;;;;;;;;;AAQA,IAAAA,gBAAA,GAAAC,OAAA;AARA;;AAUA;AACA;AACA;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;;AAKA;AACO,SAASC,aAAaA,CAACC,GAAY,EAAe;EACvD,MAAMC,IAAI,GAAGD,GAAG,YAAYE,KAAK,GAAGF,GAAG,GAAG,IAAIE,KAAK,CAACC,MAAM,CAACH,GAAG,CAAC,CAAC;EAChE;EACA;EACA,MAAMI,GAAG,GAAG,CAACH,IAAI,CAACI,OAAO,IAAI,EAAE,EAAEC,WAAW,CAAC,CAAC;EAE9C,IAAIC,IAAyB,GAAG,SAAS;EACzC,IAAIH,GAAG,CAACI,QAAQ,CAAC,WAAW,CAAC,EAAED,IAAI,GAAG,WAAW,MAC5C,IAAIH,GAAG,CAACI,QAAQ,CAAC,mBAAmB,CAAC,IAAIJ,GAAG,CAACI,QAAQ,CAAC,mBAAmB,CAAC,EAC7ED,IAAI,GAAG,mBAAmB;EAE5B,OAAOE,MAAM,CAACC,MAAM,CAACT,IAAI,EAAE;IAAEM;EAAK,CAAC,CAAC;AACtC","ignoreList":[]}
@@ -34,7 +34,11 @@ function usePictureSelector(defaultOptions) {
34
34
  // Stable ref to avoid re-creating callbacks when defaultOptions changes
35
35
  const defaultOptionsRef = (0, _react.useRef)(defaultOptions);
36
36
  defaultOptionsRef.current = defaultOptions;
37
- const pick = (0, _react.useCallback)(async options => {
37
+
38
+ // ─── Shared runner ────────────────────────────────────────────────────────
39
+ // Handles loading state, CANCELLED swallowing and error propagation for
40
+ // both pick() and shoot() to avoid duplicating the try/catch/setState logic.
41
+ const runPickerCall = (0, _react.useCallback)(async (nativeFn, options) => {
38
42
  setState(s => ({
39
43
  ...s,
40
44
  loading: true,
@@ -45,7 +49,7 @@ function usePictureSelector(defaultOptions) {
45
49
  ...defaultOptionsRef.current,
46
50
  ...options
47
51
  };
48
- const results = await _PictureSelector.PictureSelector.openPicker(merged);
52
+ const results = await nativeFn(merged);
49
53
  setState({
50
54
  assets: results,
51
55
  loading: false,
@@ -70,41 +74,8 @@ function usePictureSelector(defaultOptions) {
70
74
  throw pickerErr;
71
75
  }
72
76
  }, []);
73
- const shoot = (0, _react.useCallback)(async options => {
74
- setState(s => ({
75
- ...s,
76
- loading: true,
77
- error: null
78
- }));
79
- try {
80
- const merged = {
81
- ...defaultOptionsRef.current,
82
- ...options
83
- };
84
- const results = await _PictureSelector.PictureSelector.openCamera(merged);
85
- setState({
86
- assets: results,
87
- loading: false,
88
- error: null
89
- });
90
- return results;
91
- } catch (err) {
92
- const pickerErr = (0, _types.toPickerError)(err);
93
- if (pickerErr.code === 'CANCELLED') {
94
- setState(s => ({
95
- ...s,
96
- loading: false
97
- }));
98
- return [];
99
- }
100
- setState(s => ({
101
- ...s,
102
- loading: false,
103
- error: pickerErr
104
- }));
105
- throw pickerErr;
106
- }
107
- }, []);
77
+ const pick = (0, _react.useCallback)(options => runPickerCall(_PictureSelector.PictureSelector.openPicker, options), [runPickerCall]);
78
+ const shoot = (0, _react.useCallback)(options => runPickerCall(_PictureSelector.PictureSelector.openCamera, options), [runPickerCall]);
108
79
  const clear = (0, _react.useCallback)(() => {
109
80
  setState({
110
81
  assets: [],
@@ -1 +1 @@
1
- {"version":3,"names":["_react","require","_PictureSelector","_types","usePictureSelector","defaultOptions","state","setState","useState","assets","loading","error","defaultOptionsRef","useRef","current","pick","useCallback","options","s","merged","results","PictureSelector","openPicker","err","pickerErr","toPickerError","code","shoot","openCamera","clear"],"sourceRoot":"..\\..\\src","sources":["usePictureSelector.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_react","require","_PictureSelector","_types","usePictureSelector","defaultOptions","state","setState","useState","assets","loading","error","defaultOptionsRef","useRef","current","runPickerCall","useCallback","nativeFn","options","s","merged","results","err","pickerErr","toPickerError","code","pick","PictureSelector","openPicker","shoot","openCamera","clear"],"sourceRoot":"..\\..\\src","sources":["usePictureSelector.ts"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,gBAAA,GAAAD,OAAA;AAEA,IAAAE,MAAA,GAAAF,OAAA;AAEA;AACA;AACA;;AAoBA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASG,kBAAkBA,CAChCC,cAAuC,EACb;EAC1B,MAAM,CAACC,KAAK,EAAEC,QAAQ,CAAC,GAAG,IAAAC,eAAQ,EAAuB;IACvDC,MAAM,EAAE,EAAE;IACVC,OAAO,EAAE,KAAK;IACdC,KAAK,EAAE;EACT,CAAC,CAAC;;EAEF;EACA,MAAMC,iBAAiB,GAAG,IAAAC,aAAM,EAACR,cAAc,CAAC;EAChDO,iBAAiB,CAACE,OAAO,GAAGT,cAAc;;EAE1C;EACA;EACA;EACA,MAAMU,aAAa,GAAG,IAAAC,kBAAW,EAC/B,OACEC,QAAiE,EACjEC,OAAgC,KACN;IAC1BX,QAAQ,CAAEY,CAAC,KAAM;MAAE,GAAGA,CAAC;MAAET,OAAO,EAAE,IAAI;MAAEC,KAAK,EAAE;IAAK,CAAC,CAAC,CAAC;IACvD,IAAI;MACF,MAAMS,MAAM,GAAG;QAAE,GAAGR,iBAAiB,CAACE,OAAO;QAAE,GAAGI;MAAQ,CAAC;MAC3D,MAAMG,OAAO,GAAG,MAAMJ,QAAQ,CAACG,MAAM,CAAC;MACtCb,QAAQ,CAAC;QAAEE,MAAM,EAAEY,OAAO;QAAEX,OAAO,EAAE,KAAK;QAAEC,KAAK,EAAE;MAAK,CAAC,CAAC;MAC1D,OAAOU,OAAO;IAChB,CAAC,CAAC,OAAOC,GAAG,EAAE;MACZ,MAAMC,SAAS,GAAG,IAAAC,oBAAa,EAACF,GAAG,CAAC;MACpC;MACA,IAAIC,SAAS,CAACE,IAAI,KAAK,WAAW,EAAE;QAClClB,QAAQ,CAAEY,CAAC,KAAM;UAAE,GAAGA,CAAC;UAAET,OAAO,EAAE;QAAM,CAAC,CAAC,CAAC;QAC3C,OAAO,EAAE;MACX;MACAH,QAAQ,CAAEY,CAAC,KAAM;QAAE,GAAGA,CAAC;QAAET,OAAO,EAAE,KAAK;QAAEC,KAAK,EAAEY;MAAU,CAAC,CAAC,CAAC;MAC7D,MAAMA,SAAS;IACjB;EACF,CAAC,EACD,EACF,CAAC;EAED,MAAMG,IAAI,GAAG,IAAAV,kBAAW,EACrBE,OAAgC,IAC/BH,aAAa,CAACY,gCAAe,CAACC,UAAU,EAAEV,OAAO,CAAC,EACpD,CAACH,aAAa,CAChB,CAAC;EAED,MAAMc,KAAK,GAAG,IAAAb,kBAAW,EACtBE,OAAgC,IAC/BH,aAAa,CAACY,gCAAe,CAACG,UAAU,EAAEZ,OAAO,CAAC,EACpD,CAACH,aAAa,CAChB,CAAC;EAED,MAAMgB,KAAK,GAAG,IAAAf,kBAAW,EAAC,MAAM;IAC9BT,QAAQ,CAAC;MAAEE,MAAM,EAAE,EAAE;MAAEC,OAAO,EAAE,KAAK;MAAEC,KAAK,EAAE;IAAK,CAAC,CAAC;EACvD,CAAC,EAAE,EAAE,CAAC;EAEN,OAAO;IAAE,GAAGL,KAAK;IAAEoB,IAAI;IAAEG,KAAK;IAAEE;EAAM,CAAC;AACzC","ignoreList":[]}
@@ -25,6 +25,21 @@ const defaultOptions = {
25
25
  enableCamera: true
26
26
  };
27
27
 
28
+ // ─────────────────────────────────────────────────────────────────────────────
29
+ // Shared native call helper
30
+ // ─────────────────────────────────────────────────────────────────────────────
31
+
32
+ async function callNative(method, options) {
33
+ try {
34
+ return await getNative()[method]({
35
+ ...defaultOptions,
36
+ ...options
37
+ });
38
+ } catch (err) {
39
+ throw toPickerError(err);
40
+ }
41
+ }
42
+
28
43
  // ─────────────────────────────────────────────────────────────────────────────
29
44
  // Static API
30
45
  // ─────────────────────────────────────────────────────────────────────────────
@@ -39,15 +54,8 @@ export const PictureSelector = {
39
54
  * @throws PickerError with code CANCELLED when the user dismisses
40
55
  * @throws PickerError with code PERMISSION_DENIED on permission failure
41
56
  */
42
- async openPicker(options = {}) {
43
- try {
44
- return await getNative().openPicker({
45
- ...defaultOptions,
46
- ...options
47
- });
48
- } catch (err) {
49
- throw toPickerError(err);
50
- }
57
+ openPicker(options = {}) {
58
+ return callNative('openPicker', options);
51
59
  },
52
60
  /**
53
61
  * Open the camera for capture.
@@ -57,15 +65,8 @@ export const PictureSelector = {
57
65
  *
58
66
  * @throws PickerError with code CANCELLED when the user dismisses
59
67
  */
60
- async openCamera(options = {}) {
61
- try {
62
- return await getNative().openCamera({
63
- ...defaultOptions,
64
- ...options
65
- });
66
- } catch (err) {
67
- throw toPickerError(err);
68
- }
68
+ openCamera(options = {}) {
69
+ return callNative('openCamera', options);
69
70
  }
70
71
  };
71
72
  //# sourceMappingURL=PictureSelector.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["NitroModules","MediaType","toPickerError","_native","getNative","createHybridObject","defaultOptions","mediaType","IMAGE","maxCount","enableCamera","PictureSelector","openPicker","options","err","openCamera"],"sourceRoot":"..\\..\\src","sources":["PictureSelector.ts"],"mappings":";;AAAA,SAASA,YAAY,QAAQ,4BAA4B;AAGzD,SAASC,SAAS,EAAEC,aAAa,QAAQ,SAAS;;AAElD;AACA;AACA;;AAEA,IAAIC,OAAqC,GAAG,IAAI;AAEhD,SAASC,SAASA,CAAA,EAA0B;EAC1C,IAAID,OAAO,IAAI,IAAI,EAAE;IACnBA,OAAO,GAAGH,YAAY,CAACK,kBAAkB,CACvC,iBACF,CAAC;EACH;EACA,OAAOF,OAAO;AAChB;;AAEA;AACA;AACA;;AAEA,MAAMG,cAAsC,GAAG;EAC7CC,SAAS,EAAEN,SAAS,CAACO,KAAK;EAC1BC,QAAQ,EAAE,CAAC;EACXC,YAAY,EAAE;AAChB,CAAC;;AAED;AACA;AACA;;AAEA,OAAO,MAAMC,eAAe,GAAG;EAC7B;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,MAAMC,UAAUA,CACdC,OAA+B,GAAG,CAAC,CAAC,EACb;IACvB,IAAI;MACF,OAAO,MAAMT,SAAS,CAAC,CAAC,CAACQ,UAAU,CAAC;QAAE,GAAGN,cAAc;QAAE,GAAGO;MAAQ,CAAC,CAAC;IACxE,CAAC,CAAC,OAAOC,GAAG,EAAE;MACZ,MAAMZ,aAAa,CAACY,GAAG,CAAC;IAC1B;EACF,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EACE,MAAMC,UAAUA,CACdF,OAA+B,GAAG,CAAC,CAAC,EACb;IACvB,IAAI;MACF,OAAO,MAAMT,SAAS,CAAC,CAAC,CAACW,UAAU,CAAC;QAAE,GAAGT,cAAc;QAAE,GAAGO;MAAQ,CAAC,CAAC;IACxE,CAAC,CAAC,OAAOC,GAAG,EAAE;MACZ,MAAMZ,aAAa,CAACY,GAAG,CAAC;IAC1B;EACF;AACF,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["NitroModules","MediaType","toPickerError","_native","getNative","createHybridObject","defaultOptions","mediaType","IMAGE","maxCount","enableCamera","callNative","method","options","err","PictureSelector","openPicker","openCamera"],"sourceRoot":"..\\..\\src","sources":["PictureSelector.ts"],"mappings":";;AAAA,SAASA,YAAY,QAAQ,4BAA4B;AAGzD,SAASC,SAAS,EAAEC,aAAa,QAAQ,SAAS;;AAElD;AACA;AACA;;AAEA,IAAIC,OAAqC,GAAG,IAAI;AAEhD,SAASC,SAASA,CAAA,EAA0B;EAC1C,IAAID,OAAO,IAAI,IAAI,EAAE;IACnBA,OAAO,GAAGH,YAAY,CAACK,kBAAkB,CACvC,iBACF,CAAC;EACH;EACA,OAAOF,OAAO;AAChB;;AAEA;AACA;AACA;;AAEA,MAAMG,cAAsC,GAAG;EAC7CC,SAAS,EAAEN,SAAS,CAACO,KAAK;EAC1BC,QAAQ,EAAE,CAAC;EACXC,YAAY,EAAE;AAChB,CAAC;;AAED;AACA;AACA;;AAEA,eAAeC,UAAUA,CACvBC,MAAmC,EACnCC,OAA+B,EACR;EACvB,IAAI;IACF,OAAO,MAAMT,SAAS,CAAC,CAAC,CAACQ,MAAM,CAAC,CAAC;MAAE,GAAGN,cAAc;MAAE,GAAGO;IAAQ,CAAC,CAAC;EACrE,CAAC,CAAC,OAAOC,GAAG,EAAE;IACZ,MAAMZ,aAAa,CAACY,GAAG,CAAC;EAC1B;AACF;;AAEA;AACA;AACA;;AAEA,OAAO,MAAMC,eAAe,GAAG;EAC7B;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEC,UAAUA,CAACH,OAA+B,GAAG,CAAC,CAAC,EAAyB;IACtE,OAAOF,UAAU,CAAC,YAAY,EAAEE,OAAO,CAAC;EAC1C,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EACEI,UAAUA,CAACJ,OAA+B,GAAG,CAAC,CAAC,EAAyB;IACtE,OAAOF,UAAU,CAAC,YAAY,EAAEE,OAAO,CAAC;EAC1C;AACF,CAAC","ignoreList":[]}
@@ -19,9 +19,11 @@ export { MediaType, PickerTheme } from './specs/PictureSelector.nitro';
19
19
  /** Normalise a raw native error to a typed PickerError. */
20
20
  export function toPickerError(err) {
21
21
  const base = err instanceof Error ? err : new Error(String(err));
22
- const msg = base.message ?? '';
22
+ // Nitro serialises Kotlin exceptions as "<ClassName>: <message>", so the
23
+ // raw code ("CANCELLED") never appears verbatim — match case-insensitively.
24
+ const msg = (base.message ?? '').toLowerCase();
23
25
  let code = 'UNKNOWN';
24
- if (msg.includes('CANCELLED')) code = 'CANCELLED';else if (msg.includes('PERMISSION_DENIED')) code = 'PERMISSION_DENIED';
26
+ if (msg.includes('cancelled')) code = 'CANCELLED';else if (msg.includes('permission_denied') || msg.includes('permission denied')) code = 'PERMISSION_DENIED';
25
27
  return Object.assign(base, {
26
28
  code
27
29
  });
@@ -1 +1 @@
1
- {"version":3,"names":["MediaType","PickerTheme","toPickerError","err","base","Error","String","msg","message","code","includes","Object","assign"],"sourceRoot":"..\\..\\src","sources":["types.ts"],"mappings":";;AAAA;;AAQA,SAASA,SAAS,EAAEC,WAAW,QAAQ,+BAA+B;;AAEtE;AACA;AACA;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;;AAKA;AACA,OAAO,SAASC,aAAaA,CAACC,GAAY,EAAe;EACvD,MAAMC,IAAI,GAAGD,GAAG,YAAYE,KAAK,GAAGF,GAAG,GAAG,IAAIE,KAAK,CAACC,MAAM,CAACH,GAAG,CAAC,CAAC;EAChE,MAAMI,GAAG,GAAGH,IAAI,CAACI,OAAO,IAAI,EAAE;EAE9B,IAAIC,IAAyB,GAAG,SAAS;EACzC,IAAIF,GAAG,CAACG,QAAQ,CAAC,WAAW,CAAC,EAAED,IAAI,GAAG,WAAW,MAC5C,IAAIF,GAAG,CAACG,QAAQ,CAAC,mBAAmB,CAAC,EAAED,IAAI,GAAG,mBAAmB;EAEtE,OAAOE,MAAM,CAACC,MAAM,CAACR,IAAI,EAAE;IAAEK;EAAK,CAAC,CAAC;AACtC","ignoreList":[]}
1
+ {"version":3,"names":["MediaType","PickerTheme","toPickerError","err","base","Error","String","msg","message","toLowerCase","code","includes","Object","assign"],"sourceRoot":"..\\..\\src","sources":["types.ts"],"mappings":";;AAAA;;AAQA,SAASA,SAAS,EAAEC,WAAW,QAAQ,+BAA+B;;AAEtE;AACA;AACA;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;;AAKA;AACA,OAAO,SAASC,aAAaA,CAACC,GAAY,EAAe;EACvD,MAAMC,IAAI,GAAGD,GAAG,YAAYE,KAAK,GAAGF,GAAG,GAAG,IAAIE,KAAK,CAACC,MAAM,CAACH,GAAG,CAAC,CAAC;EAChE;EACA;EACA,MAAMI,GAAG,GAAG,CAACH,IAAI,CAACI,OAAO,IAAI,EAAE,EAAEC,WAAW,CAAC,CAAC;EAE9C,IAAIC,IAAyB,GAAG,SAAS;EACzC,IAAIH,GAAG,CAACI,QAAQ,CAAC,WAAW,CAAC,EAAED,IAAI,GAAG,WAAW,MAC5C,IAAIH,GAAG,CAACI,QAAQ,CAAC,mBAAmB,CAAC,IAAIJ,GAAG,CAACI,QAAQ,CAAC,mBAAmB,CAAC,EAC7ED,IAAI,GAAG,mBAAmB;EAE5B,OAAOE,MAAM,CAACC,MAAM,CAACT,IAAI,EAAE;IAAEM;EAAK,CAAC,CAAC;AACtC","ignoreList":[]}
@@ -31,7 +31,11 @@ export function usePictureSelector(defaultOptions) {
31
31
  // Stable ref to avoid re-creating callbacks when defaultOptions changes
32
32
  const defaultOptionsRef = useRef(defaultOptions);
33
33
  defaultOptionsRef.current = defaultOptions;
34
- const pick = useCallback(async options => {
34
+
35
+ // ─── Shared runner ────────────────────────────────────────────────────────
36
+ // Handles loading state, CANCELLED swallowing and error propagation for
37
+ // both pick() and shoot() to avoid duplicating the try/catch/setState logic.
38
+ const runPickerCall = useCallback(async (nativeFn, options) => {
35
39
  setState(s => ({
36
40
  ...s,
37
41
  loading: true,
@@ -42,7 +46,7 @@ export function usePictureSelector(defaultOptions) {
42
46
  ...defaultOptionsRef.current,
43
47
  ...options
44
48
  };
45
- const results = await PictureSelector.openPicker(merged);
49
+ const results = await nativeFn(merged);
46
50
  setState({
47
51
  assets: results,
48
52
  loading: false,
@@ -67,41 +71,8 @@ export function usePictureSelector(defaultOptions) {
67
71
  throw pickerErr;
68
72
  }
69
73
  }, []);
70
- const shoot = useCallback(async options => {
71
- setState(s => ({
72
- ...s,
73
- loading: true,
74
- error: null
75
- }));
76
- try {
77
- const merged = {
78
- ...defaultOptionsRef.current,
79
- ...options
80
- };
81
- const results = await PictureSelector.openCamera(merged);
82
- setState({
83
- assets: results,
84
- loading: false,
85
- error: null
86
- });
87
- return results;
88
- } catch (err) {
89
- const pickerErr = toPickerError(err);
90
- if (pickerErr.code === 'CANCELLED') {
91
- setState(s => ({
92
- ...s,
93
- loading: false
94
- }));
95
- return [];
96
- }
97
- setState(s => ({
98
- ...s,
99
- loading: false,
100
- error: pickerErr
101
- }));
102
- throw pickerErr;
103
- }
104
- }, []);
74
+ const pick = useCallback(options => runPickerCall(PictureSelector.openPicker, options), [runPickerCall]);
75
+ const shoot = useCallback(options => runPickerCall(PictureSelector.openCamera, options), [runPickerCall]);
105
76
  const clear = useCallback(() => {
106
77
  setState({
107
78
  assets: [],
@@ -1 +1 @@
1
- {"version":3,"names":["useState","useCallback","useRef","PictureSelector","toPickerError","usePictureSelector","defaultOptions","state","setState","assets","loading","error","defaultOptionsRef","current","pick","options","s","merged","results","openPicker","err","pickerErr","code","shoot","openCamera","clear"],"sourceRoot":"..\\..\\src","sources":["usePictureSelector.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["useState","useCallback","useRef","PictureSelector","toPickerError","usePictureSelector","defaultOptions","state","setState","assets","loading","error","defaultOptionsRef","current","runPickerCall","nativeFn","options","s","merged","results","err","pickerErr","code","pick","openPicker","shoot","openCamera","clear"],"sourceRoot":"..\\..\\src","sources":["usePictureSelector.ts"],"mappings":";;AAAA,SAASA,QAAQ,EAAEC,WAAW,EAAEC,MAAM,QAAQ,OAAO;AACrD,SAASC,eAAe,QAAQ,mBAAmB;AAEnD,SAASC,aAAa,QAAQ,SAAS;;AAEvC;AACA;AACA;;AAoBA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,kBAAkBA,CAChCC,cAAuC,EACb;EAC1B,MAAM,CAACC,KAAK,EAAEC,QAAQ,CAAC,GAAGR,QAAQ,CAAuB;IACvDS,MAAM,EAAE,EAAE;IACVC,OAAO,EAAE,KAAK;IACdC,KAAK,EAAE;EACT,CAAC,CAAC;;EAEF;EACA,MAAMC,iBAAiB,GAAGV,MAAM,CAACI,cAAc,CAAC;EAChDM,iBAAiB,CAACC,OAAO,GAAGP,cAAc;;EAE1C;EACA;EACA;EACA,MAAMQ,aAAa,GAAGb,WAAW,CAC/B,OACEc,QAAiE,EACjEC,OAAgC,KACN;IAC1BR,QAAQ,CAAES,CAAC,KAAM;MAAE,GAAGA,CAAC;MAAEP,OAAO,EAAE,IAAI;MAAEC,KAAK,EAAE;IAAK,CAAC,CAAC,CAAC;IACvD,IAAI;MACF,MAAMO,MAAM,GAAG;QAAE,GAAGN,iBAAiB,CAACC,OAAO;QAAE,GAAGG;MAAQ,CAAC;MAC3D,MAAMG,OAAO,GAAG,MAAMJ,QAAQ,CAACG,MAAM,CAAC;MACtCV,QAAQ,CAAC;QAAEC,MAAM,EAAEU,OAAO;QAAET,OAAO,EAAE,KAAK;QAAEC,KAAK,EAAE;MAAK,CAAC,CAAC;MAC1D,OAAOQ,OAAO;IAChB,CAAC,CAAC,OAAOC,GAAG,EAAE;MACZ,MAAMC,SAAS,GAAGjB,aAAa,CAACgB,GAAG,CAAC;MACpC;MACA,IAAIC,SAAS,CAACC,IAAI,KAAK,WAAW,EAAE;QAClCd,QAAQ,CAAES,CAAC,KAAM;UAAE,GAAGA,CAAC;UAAEP,OAAO,EAAE;QAAM,CAAC,CAAC,CAAC;QAC3C,OAAO,EAAE;MACX;MACAF,QAAQ,CAAES,CAAC,KAAM;QAAE,GAAGA,CAAC;QAAEP,OAAO,EAAE,KAAK;QAAEC,KAAK,EAAEU;MAAU,CAAC,CAAC,CAAC;MAC7D,MAAMA,SAAS;IACjB;EACF,CAAC,EACD,EACF,CAAC;EAED,MAAME,IAAI,GAAGtB,WAAW,CACrBe,OAAgC,IAC/BF,aAAa,CAACX,eAAe,CAACqB,UAAU,EAAER,OAAO,CAAC,EACpD,CAACF,aAAa,CAChB,CAAC;EAED,MAAMW,KAAK,GAAGxB,WAAW,CACtBe,OAAgC,IAC/BF,aAAa,CAACX,eAAe,CAACuB,UAAU,EAAEV,OAAO,CAAC,EACpD,CAACF,aAAa,CAChB,CAAC;EAED,MAAMa,KAAK,GAAG1B,WAAW,CAAC,MAAM;IAC9BO,QAAQ,CAAC;MAAEC,MAAM,EAAE,EAAE;MAAEC,OAAO,EAAE,KAAK;MAAEC,KAAK,EAAE;IAAK,CAAC,CAAC;EACvD,CAAC,EAAE,EAAE,CAAC;EAEN,OAAO;IAAE,GAAGJ,KAAK;IAAEgB,IAAI;IAAEE,KAAK;IAAEE;EAAM,CAAC;AACzC","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"PictureSelector.d.ts","sourceRoot":"","sources":["../../src/PictureSelector.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAA;AAgCjE,eAAO,MAAM,eAAe;IAC1B;;;;;;;;OAQG;yBAEQ,sBAAsB,GAC9B,OAAO,CAAC,UAAU,EAAE,CAAC;IAQxB;;;;;;;OAOG;yBAEQ,sBAAsB,GAC9B,OAAO,CAAC,UAAU,EAAE,CAAC;CAOzB,CAAA"}
1
+ {"version":3,"file":"PictureSelector.d.ts","sourceRoot":"","sources":["../../src/PictureSelector.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAA;AA+CjE,eAAO,MAAM,eAAe;IAC1B;;;;;;;;OAQG;yBACiB,sBAAsB,GAAQ,OAAO,CAAC,UAAU,EAAE,CAAC;IAIvE;;;;;;;OAOG;yBACiB,sBAAsB,GAAQ,OAAO,CAAC,UAAU,EAAE,CAAC;CAGxE,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AACA,YAAY,EACV,UAAU,EACV,sBAAsB,EACtB,WAAW,EACX,eAAe,GAChB,MAAM,+BAA+B,CAAA;AAEtC,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAA;AAMtE,MAAM,MAAM,YAAY,GAAG,OAAO,+BAA+B,EAAE,UAAU,EAAE,CAAA;AAE/E;;;;;;GAMG;AACH,MAAM,WAAW,WAAY,SAAQ,KAAK;IACxC,IAAI,EAAE,WAAW,GAAG,mBAAmB,GAAG,SAAS,CAAA;CACpD;AAED,2DAA2D;AAC3D,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,WAAW,CASvD"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AACA,YAAY,EACV,UAAU,EACV,sBAAsB,EACtB,WAAW,EACX,eAAe,GAChB,MAAM,+BAA+B,CAAA;AAEtC,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAA;AAMtE,MAAM,MAAM,YAAY,GAAG,OAAO,+BAA+B,EAAE,UAAU,EAAE,CAAA;AAE/E;;;;;;GAMG;AACH,MAAM,WAAW,WAAY,SAAQ,KAAK;IACxC,IAAI,EAAE,WAAW,GAAG,mBAAmB,GAAG,SAAS,CAAA;CACpD;AAED,2DAA2D;AAC3D,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,WAAW,CAYvD"}
@@ -1 +1 @@
1
- {"version":3,"file":"usePictureSelector.d.ts","sourceRoot":"","sources":["../../src/usePictureSelector.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,sBAAsB,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAO9E,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,UAAU,EAAE,CAAA;IACpB,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,WAAW,GAAG,IAAI,CAAA;CAC1B;AAED,MAAM,WAAW,sBAAsB;IACrC,0BAA0B;IAC1B,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE,sBAAsB,KAAK,OAAO,CAAC,UAAU,EAAE,CAAC,CAAA;IACjE,kBAAkB;IAClB,KAAK,EAAE,CAAC,OAAO,CAAC,EAAE,sBAAsB,KAAK,OAAO,CAAC,UAAU,EAAE,CAAC,CAAA;IAClE,4CAA4C;IAC5C,KAAK,EAAE,MAAM,IAAI,CAAA;CAClB;AAED,MAAM,MAAM,wBAAwB,GAAG,oBAAoB,GACzD,sBAAsB,CAAA;AAMxB;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,cAAc,CAAC,EAAE,sBAAsB,GACtC,wBAAwB,CA2D1B"}
1
+ {"version":3,"file":"usePictureSelector.d.ts","sourceRoot":"","sources":["../../src/usePictureSelector.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,sBAAsB,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAO9E,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,UAAU,EAAE,CAAA;IACpB,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,WAAW,GAAG,IAAI,CAAA;CAC1B;AAED,MAAM,WAAW,sBAAsB;IACrC,0BAA0B;IAC1B,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE,sBAAsB,KAAK,OAAO,CAAC,UAAU,EAAE,CAAC,CAAA;IACjE,kBAAkB;IAClB,KAAK,EAAE,CAAC,OAAO,CAAC,EAAE,sBAAsB,KAAK,OAAO,CAAC,UAAU,EAAE,CAAC,CAAA;IAClE,4CAA4C;IAC5C,KAAK,EAAE,MAAM,IAAI,CAAA;CAClB;AAED,MAAM,MAAM,wBAAwB,GAAG,oBAAoB,GACzD,sBAAsB,CAAA;AAMxB;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,cAAc,CAAC,EAAE,sBAAsB,GACtC,wBAAwB,CAwD1B"}
@@ -62,8 +62,9 @@ namespace margelo::pictureselector {
62
62
  void loadHybridMethods() override;
63
63
 
64
64
  protected:
65
- // Tag for logging
66
- static constexpr auto TAG = "HybridPictureSelector";
65
+ // Tag for logging — must match the key used in registerHybridObjectConstructor()
66
+ // and in NitroModules.createHybridObject() on the JS side ("PictureSelector").
67
+ static constexpr auto TAG = "PictureSelector";
67
68
  };
68
69
 
69
70
  } // namespace margelo::pictureselector
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-picture-selector",
3
- "version": "1.0.12",
3
+ "version": "1.0.15",
4
4
  "description": "High-performance photo/video picker for React Native using Nitro Modules",
5
5
  "main": "lib/commonjs/index.js",
6
6
  "module": "lib/module/index.js",
@@ -28,6 +28,21 @@ const defaultOptions: PictureSelectorOptions = {
28
28
  enableCamera: true,
29
29
  }
30
30
 
31
+ // ─────────────────────────────────────────────────────────────────────────────
32
+ // Shared native call helper
33
+ // ─────────────────────────────────────────────────────────────────────────────
34
+
35
+ async function callNative(
36
+ method: 'openPicker' | 'openCamera',
37
+ options: PictureSelectorOptions
38
+ ): Promise<MediaAsset[]> {
39
+ try {
40
+ return await getNative()[method]({ ...defaultOptions, ...options })
41
+ } catch (err) {
42
+ throw toPickerError(err)
43
+ }
44
+ }
45
+
31
46
  // ─────────────────────────────────────────────────────────────────────────────
32
47
  // Static API
33
48
  // ─────────────────────────────────────────────────────────────────────────────
@@ -42,14 +57,8 @@ export const PictureSelector = {
42
57
  * @throws PickerError with code CANCELLED when the user dismisses
43
58
  * @throws PickerError with code PERMISSION_DENIED on permission failure
44
59
  */
45
- async openPicker(
46
- options: PictureSelectorOptions = {}
47
- ): Promise<MediaAsset[]> {
48
- try {
49
- return await getNative().openPicker({ ...defaultOptions, ...options })
50
- } catch (err) {
51
- throw toPickerError(err)
52
- }
60
+ openPicker(options: PictureSelectorOptions = {}): Promise<MediaAsset[]> {
61
+ return callNative('openPicker', options)
53
62
  },
54
63
 
55
64
  /**
@@ -60,13 +69,7 @@ export const PictureSelector = {
60
69
  *
61
70
  * @throws PickerError with code CANCELLED when the user dismisses
62
71
  */
63
- async openCamera(
64
- options: PictureSelectorOptions = {}
65
- ): Promise<MediaAsset[]> {
66
- try {
67
- return await getNative().openCamera({ ...defaultOptions, ...options })
68
- } catch (err) {
69
- throw toPickerError(err)
70
- }
72
+ openCamera(options: PictureSelectorOptions = {}): Promise<MediaAsset[]> {
73
+ return callNative('openCamera', options)
71
74
  },
72
75
  }
package/src/types.ts CHANGED
@@ -28,11 +28,14 @@ export interface PickerError extends Error {
28
28
  /** Normalise a raw native error to a typed PickerError. */
29
29
  export function toPickerError(err: unknown): PickerError {
30
30
  const base = err instanceof Error ? err : new Error(String(err))
31
- const msg = base.message ?? ''
31
+ // Nitro serialises Kotlin exceptions as "<ClassName>: <message>", so the
32
+ // raw code ("CANCELLED") never appears verbatim — match case-insensitively.
33
+ const msg = (base.message ?? '').toLowerCase()
32
34
 
33
35
  let code: PickerError['code'] = 'UNKNOWN'
34
- if (msg.includes('CANCELLED')) code = 'CANCELLED'
35
- else if (msg.includes('PERMISSION_DENIED')) code = 'PERMISSION_DENIED'
36
+ if (msg.includes('cancelled')) code = 'CANCELLED'
37
+ else if (msg.includes('permission_denied') || msg.includes('permission denied'))
38
+ code = 'PERMISSION_DENIED'
36
39
 
37
40
  return Object.assign(base, { code }) as PickerError
38
41
  }
@@ -51,12 +51,18 @@ export function usePictureSelector(
51
51
  const defaultOptionsRef = useRef(defaultOptions)
52
52
  defaultOptionsRef.current = defaultOptions
53
53
 
54
- const pick = useCallback(
55
- async (options?: PictureSelectorOptions): Promise<MediaAsset[]> => {
54
+ // ─── Shared runner ────────────────────────────────────────────────────────
55
+ // Handles loading state, CANCELLED swallowing and error propagation for
56
+ // both pick() and shoot() to avoid duplicating the try/catch/setState logic.
57
+ const runPickerCall = useCallback(
58
+ async (
59
+ nativeFn: (opts: PictureSelectorOptions) => Promise<MediaAsset[]>,
60
+ options?: PictureSelectorOptions
61
+ ): Promise<MediaAsset[]> => {
56
62
  setState((s) => ({ ...s, loading: true, error: null }))
57
63
  try {
58
64
  const merged = { ...defaultOptionsRef.current, ...options }
59
- const results = await PictureSelector.openPicker(merged)
65
+ const results = await nativeFn(merged)
60
66
  setState({ assets: results, loading: false, error: null })
61
67
  return results
62
68
  } catch (err) {
@@ -73,25 +79,16 @@ export function usePictureSelector(
73
79
  []
74
80
  )
75
81
 
82
+ const pick = useCallback(
83
+ (options?: PictureSelectorOptions) =>
84
+ runPickerCall(PictureSelector.openPicker, options),
85
+ [runPickerCall]
86
+ )
87
+
76
88
  const shoot = useCallback(
77
- async (options?: PictureSelectorOptions): Promise<MediaAsset[]> => {
78
- setState((s) => ({ ...s, loading: true, error: null }))
79
- try {
80
- const merged = { ...defaultOptionsRef.current, ...options }
81
- const results = await PictureSelector.openCamera(merged)
82
- setState({ assets: results, loading: false, error: null })
83
- return results
84
- } catch (err) {
85
- const pickerErr = toPickerError(err)
86
- if (pickerErr.code === 'CANCELLED') {
87
- setState((s) => ({ ...s, loading: false }))
88
- return []
89
- }
90
- setState((s) => ({ ...s, loading: false, error: pickerErr }))
91
- throw pickerErr
92
- }
93
- },
94
- []
89
+ (options?: PictureSelectorOptions) =>
90
+ runPickerCall(PictureSelector.openCamera, options),
91
+ [runPickerCall]
95
92
  )
96
93
 
97
94
  const clear = useCallback(() => {