react-native-picture-selector 1.0.13 → 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.
- package/lib/commonjs/PictureSelector.js +19 -18
- package/lib/commonjs/PictureSelector.js.map +1 -1
- package/lib/commonjs/types.js +4 -2
- package/lib/commonjs/types.js.map +1 -1
- package/lib/commonjs/usePictureSelector.js +8 -37
- package/lib/commonjs/usePictureSelector.js.map +1 -1
- package/lib/module/PictureSelector.js +19 -18
- package/lib/module/PictureSelector.js.map +1 -1
- package/lib/module/types.js +4 -2
- package/lib/module/types.js.map +1 -1
- package/lib/module/usePictureSelector.js +8 -37
- package/lib/module/usePictureSelector.js.map +1 -1
- package/lib/typescript/PictureSelector.d.ts.map +1 -1
- package/lib/typescript/types.d.ts.map +1 -1
- package/lib/typescript/usePictureSelector.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/PictureSelector.ts +19 -16
- package/src/types.ts +6 -3
- package/src/usePictureSelector.ts +18 -21
|
@@ -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
|
-
|
|
46
|
-
|
|
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
|
-
|
|
64
|
-
|
|
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","
|
|
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":[]}
|
package/lib/commonjs/types.js
CHANGED
|
@@ -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
|
-
|
|
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('
|
|
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,
|
|
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
|
-
|
|
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
|
|
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
|
|
74
|
-
|
|
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","
|
|
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
|
-
|
|
43
|
-
|
|
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
|
-
|
|
61
|
-
|
|
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","
|
|
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":[]}
|
package/lib/module/types.js
CHANGED
|
@@ -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
|
-
|
|
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('
|
|
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
|
});
|
package/lib/module/types.js.map
CHANGED
|
@@ -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,
|
|
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
|
-
|
|
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
|
|
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
|
|
71
|
-
|
|
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","
|
|
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;
|
|
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,
|
|
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,
|
|
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"}
|
package/package.json
CHANGED
package/src/PictureSelector.ts
CHANGED
|
@@ -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
|
-
|
|
46
|
-
|
|
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
|
-
|
|
64
|
-
|
|
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
|
-
|
|
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('
|
|
35
|
-
else if (msg.includes('
|
|
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
|
-
|
|
55
|
-
|
|
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
|
|
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
|
-
|
|
78
|
-
|
|
79
|
-
|
|
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(() => {
|