react-native-picture-selector 1.0.13 → 1.0.16

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.
@@ -31,10 +31,7 @@ object MediaAssetMapper {
31
31
  val finalUri = if (finalPath.startsWith("content://")) finalPath
32
32
  else "file://$finalPath"
33
33
 
34
- val editedPath = when {
35
- media.isCut && media.cutPath != null -> "file://${media.cutPath}"
36
- else -> null
37
- }
34
+ val editedPath: String? = if (media.isCut) finalUri else null
38
35
 
39
36
  val type = if (media.mimeType?.startsWith("video") == true) "video" else "image"
40
37
  val fileName = File(finalPath).name.takeIf { it.isNotEmpty() } ?: "unknown"
@@ -117,7 +117,7 @@ final class HybridPictureSelector: HybridHybridPictureSelectorSpec_base, HybridH
117
117
  ) { [weak self] result, _ in
118
118
  guard let self = self else { return }
119
119
  guard let photoAsset = result?.photoAsset else {
120
- resolver.resolve([])
120
+ resolver.reject(PictureSelectorError.cancelled)
121
121
  return
122
122
  }
123
123
  Task {
@@ -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":[]}
@@ -6,7 +6,6 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.usePictureSelector = usePictureSelector;
7
7
  var _react = require("react");
8
8
  var _PictureSelector = require("./PictureSelector");
9
- var _types = require("./types");
10
9
  // ─────────────────────────────────────────────────────────────────────────────
11
10
  // Hook state shape
12
11
  // ─────────────────────────────────────────────────────────────────────────────
@@ -34,7 +33,11 @@ function usePictureSelector(defaultOptions) {
34
33
  // Stable ref to avoid re-creating callbacks when defaultOptions changes
35
34
  const defaultOptionsRef = (0, _react.useRef)(defaultOptions);
36
35
  defaultOptionsRef.current = defaultOptions;
37
- const pick = (0, _react.useCallback)(async options => {
36
+
37
+ // ─── Shared runner ────────────────────────────────────────────────────────
38
+ // Handles loading state, CANCELLED swallowing and error propagation for
39
+ // both pick() and shoot() to avoid duplicating the try/catch/setState logic.
40
+ const runPickerCall = (0, _react.useCallback)(async (nativeFn, options) => {
38
41
  setState(s => ({
39
42
  ...s,
40
43
  loading: true,
@@ -45,7 +48,7 @@ function usePictureSelector(defaultOptions) {
45
48
  ...defaultOptionsRef.current,
46
49
  ...options
47
50
  };
48
- const results = await _PictureSelector.PictureSelector.openPicker(merged);
51
+ const results = await nativeFn(merged);
49
52
  setState({
50
53
  assets: results,
51
54
  loading: false,
@@ -53,7 +56,7 @@ function usePictureSelector(defaultOptions) {
53
56
  });
54
57
  return results;
55
58
  } catch (err) {
56
- const pickerErr = (0, _types.toPickerError)(err);
59
+ const pickerErr = err;
57
60
  // Do not surface CANCELLED as an error — just restore loading state
58
61
  if (pickerErr.code === 'CANCELLED') {
59
62
  setState(s => ({
@@ -70,41 +73,8 @@ function usePictureSelector(defaultOptions) {
70
73
  throw pickerErr;
71
74
  }
72
75
  }, []);
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
- }, []);
76
+ const pick = (0, _react.useCallback)(options => runPickerCall(_PictureSelector.PictureSelector.openPicker, options), [runPickerCall]);
77
+ const shoot = (0, _react.useCallback)(options => runPickerCall(_PictureSelector.PictureSelector.openCamera, options), [runPickerCall]);
108
78
  const clear = (0, _react.useCallback)(() => {
109
79
  setState({
110
80
  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","usePictureSelector","defaultOptions","state","setState","useState","assets","loading","error","defaultOptionsRef","useRef","current","runPickerCall","useCallback","nativeFn","options","s","merged","results","err","pickerErr","code","pick","PictureSelector","openPicker","shoot","openCamera","clear"],"sourceRoot":"..\\..\\src","sources":["usePictureSelector.ts"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,gBAAA,GAAAD,OAAA;AAGA;AACA;AACA;;AAoBA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASE,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,GAAGD,GAAkB;MACpC;MACA,IAAIC,SAAS,CAACC,IAAI,KAAK,WAAW,EAAE;QAClCjB,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,MAAME,IAAI,GAAG,IAAAT,kBAAW,EACrBE,OAAgC,IAC/BH,aAAa,CAACW,gCAAe,CAACC,UAAU,EAAET,OAAO,CAAC,EACpD,CAACH,aAAa,CAChB,CAAC;EAED,MAAMa,KAAK,GAAG,IAAAZ,kBAAW,EACtBE,OAAgC,IAC/BH,aAAa,CAACW,gCAAe,CAACG,UAAU,EAAEX,OAAO,CAAC,EACpD,CAACH,aAAa,CAChB,CAAC;EAED,MAAMe,KAAK,GAAG,IAAAd,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;IAAEmB,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":[]}
@@ -2,7 +2,6 @@
2
2
 
3
3
  import { useState, useCallback, useRef } from 'react';
4
4
  import { PictureSelector } from './PictureSelector';
5
- import { toPickerError } from './types';
6
5
 
7
6
  // ─────────────────────────────────────────────────────────────────────────────
8
7
  // Hook state shape
@@ -31,7 +30,11 @@ export function usePictureSelector(defaultOptions) {
31
30
  // Stable ref to avoid re-creating callbacks when defaultOptions changes
32
31
  const defaultOptionsRef = useRef(defaultOptions);
33
32
  defaultOptionsRef.current = defaultOptions;
34
- const pick = useCallback(async options => {
33
+
34
+ // ─── Shared runner ────────────────────────────────────────────────────────
35
+ // Handles loading state, CANCELLED swallowing and error propagation for
36
+ // both pick() and shoot() to avoid duplicating the try/catch/setState logic.
37
+ const runPickerCall = useCallback(async (nativeFn, options) => {
35
38
  setState(s => ({
36
39
  ...s,
37
40
  loading: true,
@@ -42,7 +45,7 @@ export function usePictureSelector(defaultOptions) {
42
45
  ...defaultOptionsRef.current,
43
46
  ...options
44
47
  };
45
- const results = await PictureSelector.openPicker(merged);
48
+ const results = await nativeFn(merged);
46
49
  setState({
47
50
  assets: results,
48
51
  loading: false,
@@ -50,7 +53,7 @@ export function usePictureSelector(defaultOptions) {
50
53
  });
51
54
  return results;
52
55
  } catch (err) {
53
- const pickerErr = toPickerError(err);
56
+ const pickerErr = err;
54
57
  // Do not surface CANCELLED as an error — just restore loading state
55
58
  if (pickerErr.code === 'CANCELLED') {
56
59
  setState(s => ({
@@ -67,41 +70,8 @@ export function usePictureSelector(defaultOptions) {
67
70
  throw pickerErr;
68
71
  }
69
72
  }, []);
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
- }, []);
73
+ const pick = useCallback(options => runPickerCall(PictureSelector.openPicker, options), [runPickerCall]);
74
+ const shoot = useCallback(options => runPickerCall(PictureSelector.openCamera, options), [runPickerCall]);
105
75
  const clear = useCallback(() => {
106
76
  setState({
107
77
  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","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;;AAGnD;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,GAAGP,QAAQ,CAAuB;IACvDQ,MAAM,EAAE,EAAE;IACVC,OAAO,EAAE,KAAK;IACdC,KAAK,EAAE;EACT,CAAC,CAAC;;EAEF;EACA,MAAMC,iBAAiB,GAAGT,MAAM,CAACG,cAAc,CAAC;EAChDM,iBAAiB,CAACC,OAAO,GAAGP,cAAc;;EAE1C;EACA;EACA;EACA,MAAMQ,aAAa,GAAGZ,WAAW,CAC/B,OACEa,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,GAAGD,GAAkB;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,GAAGrB,WAAW,CACrBc,OAAgC,IAC/BF,aAAa,CAACV,eAAe,CAACoB,UAAU,EAAER,OAAO,CAAC,EACpD,CAACF,aAAa,CAChB,CAAC;EAED,MAAMW,KAAK,GAAGvB,WAAW,CACtBc,OAAgC,IAC/BF,aAAa,CAACV,eAAe,CAACsB,UAAU,EAAEV,OAAO,CAAC,EACpD,CAACF,aAAa,CAChB,CAAC;EAED,MAAMa,KAAK,GAAGzB,WAAW,CAAC,MAAM;IAC9BM,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;AAM9E,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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-picture-selector",
3
- "version": "1.0.13",
3
+ "version": "1.0.16",
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
  }
@@ -1,7 +1,6 @@
1
1
  import { useState, useCallback, useRef } from 'react'
2
2
  import { PictureSelector } from './PictureSelector'
3
3
  import type { MediaAsset, PictureSelectorOptions, PickerError } from './types'
4
- import { toPickerError } from './types'
5
4
 
6
5
  // ─────────────────────────────────────────────────────────────────────────────
7
6
  // Hook state shape
@@ -51,16 +50,22 @@ export function usePictureSelector(
51
50
  const defaultOptionsRef = useRef(defaultOptions)
52
51
  defaultOptionsRef.current = defaultOptions
53
52
 
54
- const pick = useCallback(
55
- async (options?: PictureSelectorOptions): Promise<MediaAsset[]> => {
53
+ // ─── Shared runner ────────────────────────────────────────────────────────
54
+ // Handles loading state, CANCELLED swallowing and error propagation for
55
+ // both pick() and shoot() to avoid duplicating the try/catch/setState logic.
56
+ const runPickerCall = useCallback(
57
+ async (
58
+ nativeFn: (opts: PictureSelectorOptions) => Promise<MediaAsset[]>,
59
+ options?: PictureSelectorOptions
60
+ ): Promise<MediaAsset[]> => {
56
61
  setState((s) => ({ ...s, loading: true, error: null }))
57
62
  try {
58
63
  const merged = { ...defaultOptionsRef.current, ...options }
59
- const results = await PictureSelector.openPicker(merged)
64
+ const results = await nativeFn(merged)
60
65
  setState({ assets: results, loading: false, error: null })
61
66
  return results
62
67
  } catch (err) {
63
- const pickerErr = toPickerError(err)
68
+ const pickerErr = err as PickerError
64
69
  // Do not surface CANCELLED as an error — just restore loading state
65
70
  if (pickerErr.code === 'CANCELLED') {
66
71
  setState((s) => ({ ...s, loading: false }))
@@ -73,25 +78,16 @@ export function usePictureSelector(
73
78
  []
74
79
  )
75
80
 
81
+ const pick = useCallback(
82
+ (options?: PictureSelectorOptions) =>
83
+ runPickerCall(PictureSelector.openPicker, options),
84
+ [runPickerCall]
85
+ )
86
+
76
87
  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
- []
88
+ (options?: PictureSelectorOptions) =>
89
+ runPickerCall(PictureSelector.openCamera, options),
90
+ [runPickerCall]
95
91
  )
96
92
 
97
93
  const clear = useCallback(() => {