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.
- package/android/src/main/kotlin/com/margelo/pictureselector/MediaAssetMapper.kt +1 -4
- package/ios/HybridPictureSelector.swift +1 -1
- 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 +9 -39
- 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 +9 -39
- 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 +19 -23
|
@@ -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 =
|
|
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.
|
|
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
|
-
|
|
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":[]}
|
|
@@ -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
|
-
|
|
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
|
|
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 =
|
|
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
|
|
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
|
-
}, []);
|
|
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","
|
|
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
|
-
|
|
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":[]}
|
|
@@ -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
|
-
|
|
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
|
|
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 =
|
|
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
|
|
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
|
-
}, []);
|
|
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","
|
|
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;
|
|
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;
|
|
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
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
|
}
|
|
@@ -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
|
-
|
|
55
|
-
|
|
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
|
|
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 =
|
|
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
|
-
|
|
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
|
-
[]
|
|
88
|
+
(options?: PictureSelectorOptions) =>
|
|
89
|
+
runPickerCall(PictureSelector.openCamera, options),
|
|
90
|
+
[runPickerCall]
|
|
95
91
|
)
|
|
96
92
|
|
|
97
93
|
const clear = useCallback(() => {
|