@shopify/shop-minis-react 0.4.0 → 0.4.1
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/dist/_virtual/index3.js +2 -5
- package/dist/_virtual/index3.js.map +1 -1
- package/dist/_virtual/index4.js +5 -2
- package/dist/_virtual/index4.js.map +1 -1
- package/dist/hooks/util/useImagePicker.js +13 -6
- package/dist/hooks/util/useImagePicker.js.map +1 -1
- package/dist/internal/utils/resizeImage.js +61 -0
- package/dist/internal/utils/resizeImage.js.map +1 -0
- package/dist/providers/ImagePickerProvider.js +123 -102
- package/dist/providers/ImagePickerProvider.js.map +1 -1
- package/dist/shop-minis-react/node_modules/.pnpm/querystringify@2.2.0/node_modules/querystringify/index.js +1 -1
- package/dist/shop-minis-react/node_modules/.pnpm/video.js@8.23.3/node_modules/video.js/dist/video.es.js +1 -1
- package/package.json +1 -1
- package/src/hooks/util/useImagePicker.test.tsx +193 -0
- package/src/hooks/util/useImagePicker.ts +24 -5
- package/src/internal/utils/resizeImage.test.ts +314 -0
- package/src/internal/utils/resizeImage.ts +108 -0
- package/src/providers/ImagePickerProvider.test.tsx +32 -1
- package/src/providers/ImagePickerProvider.tsx +108 -65
package/dist/_virtual/index3.js
CHANGED
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
import { __require as o } from "../shop-minis-react/node_modules/.pnpm/@videojs_xhr@2.7.0/node_modules/@videojs/xhr/lib/index.js";
|
|
3
|
-
var t = o();
|
|
4
|
-
const a = /* @__PURE__ */ r(t);
|
|
1
|
+
var r = {};
|
|
5
2
|
export {
|
|
6
|
-
|
|
3
|
+
r as __exports
|
|
7
4
|
};
|
|
8
5
|
//# sourceMappingURL=index3.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index3.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index3.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
package/dist/_virtual/index4.js
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
|
|
1
|
+
import { getDefaultExportFromCjs as r } from "./_commonjsHelpers.js";
|
|
2
|
+
import { __require as o } from "../shop-minis-react/node_modules/.pnpm/@videojs_xhr@2.7.0/node_modules/@videojs/xhr/lib/index.js";
|
|
3
|
+
var t = o();
|
|
4
|
+
const a = /* @__PURE__ */ r(t);
|
|
2
5
|
export {
|
|
3
|
-
|
|
6
|
+
a as default
|
|
4
7
|
};
|
|
5
8
|
//# sourceMappingURL=index4.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index4.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index4.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
|
|
@@ -1,12 +1,19 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { useCallback as o } from "react";
|
|
2
|
+
import { useImagePickerContext as c } from "../../providers/ImagePickerProvider.js";
|
|
3
|
+
function u() {
|
|
4
|
+
const { openCamera: t, openGallery: n } = c(), i = o(
|
|
5
|
+
async ({ cameraFacing: e, quality: a, customQuality: r } = {}) => await t({ cameraFacing: e, quality: a, customQuality: r }),
|
|
6
|
+
[t]
|
|
7
|
+
), l = o(
|
|
8
|
+
async ({ quality: e, customQuality: a } = {}) => await n({ quality: e, customQuality: a }),
|
|
9
|
+
[n]
|
|
10
|
+
);
|
|
4
11
|
return {
|
|
5
|
-
openCamera:
|
|
6
|
-
openGallery:
|
|
12
|
+
openCamera: i,
|
|
13
|
+
openGallery: l
|
|
7
14
|
};
|
|
8
15
|
}
|
|
9
16
|
export {
|
|
10
|
-
|
|
17
|
+
u as useImagePicker
|
|
11
18
|
};
|
|
12
19
|
//# sourceMappingURL=useImagePicker.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useImagePicker.js","sources":["../../../src/hooks/util/useImagePicker.ts"],"sourcesContent":["import {\n
|
|
1
|
+
{"version":3,"file":"useImagePicker.js","sources":["../../../src/hooks/util/useImagePicker.ts"],"sourcesContent":["import {useCallback} from 'react'\n\nimport {\n useImagePickerContext,\n OpenCameraParams,\n OpenGalleryParams,\n} from '../../providers/ImagePickerProvider'\n\ninterface UseImagePickerReturns {\n /**\n * Opens the camera to take a photo.\n */\n openCamera: (params?: OpenCameraParams) => Promise<File>\n /**\n * Opens the gallery to select an image.\n */\n openGallery: (params?: OpenGalleryParams) => Promise<File>\n}\n\nexport function useImagePicker(): UseImagePickerReturns {\n const {openCamera, openGallery} = useImagePickerContext()\n\n const openCameraWithQuality = useCallback(\n async ({cameraFacing, quality, customQuality}: OpenCameraParams = {}) => {\n const file = await openCamera({cameraFacing, quality, customQuality})\n return file\n },\n [openCamera]\n )\n\n const openGalleryWithQuality = useCallback(\n async ({quality, customQuality}: OpenGalleryParams = {}) => {\n const file = await openGallery({quality, customQuality})\n return file\n },\n [openGallery]\n )\n\n return {\n openCamera: openCameraWithQuality,\n openGallery: openGalleryWithQuality,\n }\n}\n"],"names":["useImagePicker","openCamera","openGallery","useImagePickerContext","openCameraWithQuality","useCallback","cameraFacing","quality","customQuality","openGalleryWithQuality"],"mappings":";;AAmBO,SAASA,IAAwC;AACtD,QAAM,EAAC,YAAAC,GAAY,aAAAC,EAAW,IAAIC,EAAsB,GAElDC,IAAwBC;AAAA,IAC5B,OAAO,EAAC,cAAAC,GAAc,SAAAC,GAAS,eAAAC,EAAa,IAAsB,CAAA,MACnD,MAAMP,EAAW,EAAC,cAAAK,GAAc,SAAAC,GAAS,eAAAC,GAAc;AAAA,IAGtE,CAACP,CAAU;AAAA,EACb,GAEMQ,IAAyBJ;AAAA,IAC7B,OAAO,EAAC,SAAAE,GAAS,eAAAC,EAAa,IAAuB,OACtC,MAAMN,EAAY,EAAC,SAAAK,GAAS,eAAAC,GAAc;AAAA,IAGzD,CAACN,CAAW;AAAA,EACd;AAEO,SAAA;AAAA,IACL,YAAYE;AAAA,IACZ,aAAaK;AAAA,EACf;AACF;"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
const z = {
|
|
2
|
+
low: {
|
|
3
|
+
size: 1080,
|
|
4
|
+
compression: 0.7
|
|
5
|
+
},
|
|
6
|
+
medium: {
|
|
7
|
+
size: 1600,
|
|
8
|
+
compression: 0.85
|
|
9
|
+
},
|
|
10
|
+
high: {
|
|
11
|
+
size: 2048,
|
|
12
|
+
compression: 0.92
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
function f({
|
|
16
|
+
file: s,
|
|
17
|
+
quality: g,
|
|
18
|
+
customQuality: r
|
|
19
|
+
}) {
|
|
20
|
+
if (g === "original")
|
|
21
|
+
return Promise.resolve(s);
|
|
22
|
+
const c = z[g], d = r ? {
|
|
23
|
+
size: r.size ?? c.size,
|
|
24
|
+
compression: r.compression ?? c.compression
|
|
25
|
+
} : c, i = d.size;
|
|
26
|
+
return new Promise((h, a) => {
|
|
27
|
+
const t = new Image(), m = URL.createObjectURL(s);
|
|
28
|
+
t.onerror = () => {
|
|
29
|
+
URL.revokeObjectURL(m), a(new Error("Failed to load image"));
|
|
30
|
+
}, t.onload = () => {
|
|
31
|
+
URL.revokeObjectURL(m);
|
|
32
|
+
const n = document.createElement("canvas");
|
|
33
|
+
let e = t.width, o = t.height;
|
|
34
|
+
e > o ? e > i && (o *= i / e, e = i) : o > i && (e *= i / o, o = i), n.width = e, n.height = o;
|
|
35
|
+
const l = n.getContext("2d");
|
|
36
|
+
if (!l) {
|
|
37
|
+
a(new Error("Failed to get canvas context"));
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
l.drawImage(t, 0, 0, e, o), n.toBlob(
|
|
41
|
+
(w) => {
|
|
42
|
+
if (!w) {
|
|
43
|
+
a(new Error("Failed to create blob"));
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
const p = new File([w], s.name, {
|
|
47
|
+
type: "image/jpeg",
|
|
48
|
+
lastModified: Date.now()
|
|
49
|
+
});
|
|
50
|
+
h(p);
|
|
51
|
+
},
|
|
52
|
+
"image/jpeg",
|
|
53
|
+
d.compression
|
|
54
|
+
);
|
|
55
|
+
}, t.src = m;
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
export {
|
|
59
|
+
f as resizeImage
|
|
60
|
+
};
|
|
61
|
+
//# sourceMappingURL=resizeImage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resizeImage.js","sources":["../../../src/internal/utils/resizeImage.ts"],"sourcesContent":["import type {\n ImageQuality,\n CustomImageQuality,\n} from '../../providers/ImagePickerProvider'\n\ninterface ResizeSettings {\n size: number\n compression: number\n}\n\nexport interface ResizeImageParams {\n file: File\n quality: ImageQuality\n customQuality?: CustomImageQuality\n}\n\nconst QUALITY_SETTINGS: {\n [key in Exclude<ImageQuality, 'original'>]: ResizeSettings\n} = {\n low: {\n size: 1080,\n compression: 0.7,\n },\n medium: {\n size: 1600,\n compression: 0.85,\n },\n high: {\n size: 2048,\n compression: 0.92,\n },\n} as const\n\nexport function resizeImage({\n file,\n quality,\n customQuality,\n}: ResizeImageParams): Promise<File> {\n if (quality === 'original') {\n return Promise.resolve(file)\n }\n\n const defaultSettings = QUALITY_SETTINGS[quality]\n const settings: ResizeSettings = customQuality\n ? {\n size: customQuality.size ?? defaultSettings.size,\n compression: customQuality.compression ?? defaultSettings.compression,\n }\n : defaultSettings\n const maxSize = settings.size\n\n return new Promise((resolve, reject) => {\n const img = new Image()\n const url = URL.createObjectURL(file)\n\n img.onerror = () => {\n URL.revokeObjectURL(url)\n reject(new Error('Failed to load image'))\n }\n\n img.onload = () => {\n URL.revokeObjectURL(url)\n\n const canvas = document.createElement('canvas')\n let width = img.width\n let height = img.height\n\n // Resize image dimensions maintaining aspect ratio\n if (width > height) {\n if (width > maxSize) {\n height *= maxSize / width\n width = maxSize\n }\n } else if (height > maxSize) {\n width *= maxSize / height\n height = maxSize\n }\n\n canvas.width = width\n canvas.height = height\n\n const ctx = canvas.getContext('2d')\n if (!ctx) {\n reject(new Error('Failed to get canvas context'))\n return\n }\n ctx.drawImage(img, 0, 0, width, height)\n\n canvas.toBlob(\n blob => {\n if (!blob) {\n reject(new Error('Failed to create blob'))\n return\n }\n const resizedFile = new File([blob], file.name, {\n type: 'image/jpeg',\n lastModified: Date.now(),\n })\n resolve(resizedFile)\n },\n 'image/jpeg',\n settings.compression\n )\n }\n\n img.src = url\n })\n}\n"],"names":["QUALITY_SETTINGS","resizeImage","file","quality","customQuality","defaultSettings","settings","maxSize","resolve","reject","img","url","canvas","width","height","ctx","blob","resizedFile"],"mappings":"AAgBA,MAAMA,IAEF;AAAA,EACF,KAAK;AAAA,IACH,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EAAA;AAEjB;AAEO,SAASC,EAAY;AAAA,EAC1B,MAAAC;AAAA,EACA,SAAAC;AAAA,EACA,eAAAC;AACF,GAAqC;AACnC,MAAID,MAAY;AACP,WAAA,QAAQ,QAAQD,CAAI;AAGvB,QAAAG,IAAkBL,EAAiBG,CAAO,GAC1CG,IAA2BF,IAC7B;AAAA,IACE,MAAMA,EAAc,QAAQC,EAAgB;AAAA,IAC5C,aAAaD,EAAc,eAAeC,EAAgB;AAAA,EAAA,IAE5DA,GACEE,IAAUD,EAAS;AAEzB,SAAO,IAAI,QAAQ,CAACE,GAASC,MAAW;AAChC,UAAAC,IAAM,IAAI,MAAM,GAChBC,IAAM,IAAI,gBAAgBT,CAAI;AAEpC,IAAAQ,EAAI,UAAU,MAAM;AAClB,UAAI,gBAAgBC,CAAG,GAChBF,EAAA,IAAI,MAAM,sBAAsB,CAAC;AAAA,IAC1C,GAEAC,EAAI,SAAS,MAAM;AACjB,UAAI,gBAAgBC,CAAG;AAEjB,YAAAC,IAAS,SAAS,cAAc,QAAQ;AAC9C,UAAIC,IAAQH,EAAI,OACZI,IAASJ,EAAI;AAGjB,MAAIG,IAAQC,IACND,IAAQN,MACVO,KAAUP,IAAUM,GACZA,IAAAN,KAEDO,IAASP,MAClBM,KAASN,IAAUO,GACVA,IAAAP,IAGXK,EAAO,QAAQC,GACfD,EAAO,SAASE;AAEV,YAAAC,IAAMH,EAAO,WAAW,IAAI;AAClC,UAAI,CAACG,GAAK;AACD,QAAAN,EAAA,IAAI,MAAM,8BAA8B,CAAC;AAChD;AAAA,MAAA;AAEF,MAAAM,EAAI,UAAUL,GAAK,GAAG,GAAGG,GAAOC,CAAM,GAE/BF,EAAA;AAAA,QACL,CAAQI,MAAA;AACN,cAAI,CAACA,GAAM;AACF,YAAAP,EAAA,IAAI,MAAM,uBAAuB,CAAC;AACzC;AAAA,UAAA;AAEF,gBAAMQ,IAAc,IAAI,KAAK,CAACD,CAAI,GAAGd,EAAK,MAAM;AAAA,YAC9C,MAAM;AAAA,YACN,cAAc,KAAK,IAAI;AAAA,UAAA,CACxB;AACD,UAAAM,EAAQS,CAAW;AAAA,QACrB;AAAA,QACA;AAAA,QACAX,EAAS;AAAA,MACX;AAAA,IACF,GAEAI,EAAI,MAAMC;AAAA,EAAA,CACX;AACH;"}
|
|
@@ -1,167 +1,188 @@
|
|
|
1
|
-
import { jsxs as
|
|
2
|
-
import { useRef as
|
|
3
|
-
import { useRequestPermissions as
|
|
4
|
-
import { useReportInteraction as
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
import { jsxs as q, jsx as w } from "react/jsx-runtime";
|
|
2
|
+
import { useRef as o, useCallback as y, useEffect as A, useMemo as z, createContext as L, useContext as M } from "react";
|
|
3
|
+
import { useRequestPermissions as F } from "../hooks/util/useRequestPermissions.js";
|
|
4
|
+
import { useReportInteraction as G } from "../internal/useReportInteraction.js";
|
|
5
|
+
import { resizeImage as H } from "../internal/utils/resizeImage.js";
|
|
6
|
+
const V = L(null);
|
|
7
|
+
function B() {
|
|
8
|
+
const C = M(V);
|
|
9
|
+
if (!C)
|
|
9
10
|
throw new Error(
|
|
10
11
|
"useImagePickerContext must be used within an ImagePickerProvider"
|
|
11
12
|
);
|
|
12
|
-
return
|
|
13
|
+
return C;
|
|
13
14
|
}
|
|
14
|
-
function
|
|
15
|
-
const
|
|
16
|
-
if (
|
|
17
|
-
const { input: c, handler:
|
|
18
|
-
c.removeEventListener("cancel",
|
|
15
|
+
function D({ children: C }) {
|
|
16
|
+
const E = o(null), P = o(null), R = o(null), n = o(null), e = o(null), g = o(null), t = o(null), h = o("medium"), k = o(void 0), { requestPermission: v } = F(), { reportInteraction: r } = G(), u = y(() => {
|
|
17
|
+
if (g.current) {
|
|
18
|
+
const { input: c, handler: l } = g.current;
|
|
19
|
+
c.removeEventListener("cancel", l), g.current = null;
|
|
19
20
|
}
|
|
20
|
-
}, []),
|
|
21
|
+
}, []), d = y(() => {
|
|
21
22
|
if (e.current) {
|
|
22
23
|
const c = new Error(
|
|
23
24
|
"New file picker opened before previous completed"
|
|
24
25
|
);
|
|
25
|
-
|
|
26
|
+
t.current === "gallery" ? r({
|
|
26
27
|
interactionType: "image_picker_error",
|
|
27
28
|
interactionValue: c.message
|
|
28
|
-
}) :
|
|
29
|
+
}) : t.current === "camera" && r({
|
|
29
30
|
interactionType: "camera_error",
|
|
30
31
|
interactionValue: c.message
|
|
31
|
-
}), e.current(c),
|
|
32
|
+
}), e.current(c), n.current = null, e.current = null, t.current = null, h.current = "medium", k.current = void 0;
|
|
32
33
|
}
|
|
33
|
-
}, [r]),
|
|
34
|
-
(c) => {
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
34
|
+
}, [r]), _ = y(
|
|
35
|
+
async (c) => {
|
|
36
|
+
const { target: l } = c, p = l.files?.[0];
|
|
37
|
+
if (p && n.current) {
|
|
38
|
+
try {
|
|
39
|
+
const s = await H({
|
|
40
|
+
file: p,
|
|
41
|
+
quality: h.current,
|
|
42
|
+
customQuality: k.current
|
|
43
|
+
});
|
|
44
|
+
t.current === "gallery" ? r({
|
|
45
|
+
interactionType: "image_picker_success"
|
|
46
|
+
}) : t.current === "camera" && r({
|
|
47
|
+
interactionType: "camera_success"
|
|
48
|
+
}), n.current(s);
|
|
49
|
+
} catch (s) {
|
|
50
|
+
console.warn("Image resize failed, using original:", s), n.current && n.current(p);
|
|
51
|
+
}
|
|
52
|
+
n.current = null, e.current = null, t.current = null, u();
|
|
53
|
+
}
|
|
54
|
+
l.value = "";
|
|
41
55
|
},
|
|
42
|
-
[
|
|
43
|
-
),
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
interactionType: "image_picker_error",
|
|
50
|
-
interactionValue: o.message
|
|
51
|
-
}), i(o), t.current = null, e.current = null, n.current = null;
|
|
52
|
-
return;
|
|
53
|
-
}
|
|
54
|
-
const s = () => {
|
|
55
|
-
if (e.current) {
|
|
56
|
-
const o = new Error("User cancelled file selection");
|
|
56
|
+
[u, r]
|
|
57
|
+
), I = y(
|
|
58
|
+
({ quality: c = "medium", customQuality: l } = {}) => new Promise((p, s) => {
|
|
59
|
+
d(), u(), h.current = c, k.current = l, n.current = p, e.current = s, t.current = "gallery";
|
|
60
|
+
const i = E.current;
|
|
61
|
+
if (!i) {
|
|
62
|
+
const m = new Error("Gallery input not found");
|
|
57
63
|
r({
|
|
58
64
|
interactionType: "image_picker_error",
|
|
59
|
-
interactionValue:
|
|
60
|
-
}),
|
|
65
|
+
interactionValue: m.message
|
|
66
|
+
}), s(m), n.current = null, e.current = null, t.current = null;
|
|
67
|
+
return;
|
|
61
68
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
69
|
+
const f = () => {
|
|
70
|
+
if (e.current) {
|
|
71
|
+
const m = new Error("User cancelled file selection");
|
|
72
|
+
r({
|
|
73
|
+
interactionType: "image_picker_error",
|
|
74
|
+
interactionValue: m.message
|
|
75
|
+
}), e.current(m), n.current = null, e.current = null, t.current = null;
|
|
76
|
+
}
|
|
77
|
+
u();
|
|
78
|
+
};
|
|
79
|
+
i.addEventListener("cancel", f), g.current = { input: i, handler: f }, r({
|
|
80
|
+
interactionType: "image_picker_open"
|
|
81
|
+
}), v({ permission: "CAMERA" }).then(() => {
|
|
82
|
+
i.click();
|
|
83
|
+
}).catch(() => {
|
|
84
|
+
i.click();
|
|
85
|
+
});
|
|
86
|
+
}),
|
|
87
|
+
[
|
|
88
|
+
d,
|
|
89
|
+
u,
|
|
90
|
+
v,
|
|
91
|
+
r
|
|
92
|
+
]
|
|
93
|
+
), T = y(
|
|
94
|
+
({
|
|
95
|
+
cameraFacing: c = "back",
|
|
96
|
+
quality: l = "medium",
|
|
97
|
+
customQuality: p
|
|
98
|
+
} = {}) => new Promise((s, i) => {
|
|
99
|
+
d(), u(), h.current = l, k.current = p, n.current = s, e.current = i, t.current = "camera";
|
|
100
|
+
const f = c === "front" ? P.current : R.current;
|
|
101
|
+
if (!f) {
|
|
102
|
+
const a = new Error("Camera input not found");
|
|
82
103
|
r({
|
|
83
104
|
interactionType: "camera_error",
|
|
84
|
-
interactionValue:
|
|
85
|
-
}),
|
|
105
|
+
interactionValue: a.message
|
|
106
|
+
}), i(a), n.current = null, e.current = null, t.current = null;
|
|
86
107
|
return;
|
|
87
108
|
}
|
|
88
|
-
const
|
|
109
|
+
const m = () => {
|
|
89
110
|
if (e.current) {
|
|
90
|
-
const
|
|
111
|
+
const a = new Error("User cancelled camera");
|
|
91
112
|
r({
|
|
92
113
|
interactionType: "camera_error",
|
|
93
|
-
interactionValue:
|
|
94
|
-
}), e.current(
|
|
114
|
+
interactionValue: a.message
|
|
115
|
+
}), e.current(a), n.current = null, e.current = null, t.current = null;
|
|
95
116
|
}
|
|
96
|
-
|
|
117
|
+
u();
|
|
97
118
|
};
|
|
98
|
-
|
|
119
|
+
f.addEventListener("cancel", m), g.current = { input: f, handler: m }, r({
|
|
99
120
|
interactionType: "camera_open"
|
|
100
|
-
}),
|
|
101
|
-
if (
|
|
102
|
-
|
|
121
|
+
}), v({ permission: "CAMERA" }).then(({ granted: a }) => {
|
|
122
|
+
if (a)
|
|
123
|
+
f.click();
|
|
103
124
|
else {
|
|
104
|
-
const
|
|
125
|
+
const x = new Error("Camera permission not granted");
|
|
105
126
|
r({
|
|
106
127
|
interactionType: "camera_error",
|
|
107
|
-
interactionValue:
|
|
108
|
-
}),
|
|
128
|
+
interactionValue: x.message
|
|
129
|
+
}), i(x), n.current = null, e.current = null, t.current = null;
|
|
109
130
|
}
|
|
110
131
|
}).catch(() => {
|
|
111
|
-
const
|
|
112
|
-
|
|
132
|
+
const a = new Error("Camera permission not granted");
|
|
133
|
+
i(a), n.current = null, e.current = null, t.current = null;
|
|
113
134
|
});
|
|
114
135
|
}),
|
|
115
136
|
[
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
137
|
+
d,
|
|
138
|
+
u,
|
|
139
|
+
v,
|
|
119
140
|
r
|
|
120
141
|
]
|
|
121
142
|
);
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
}, [
|
|
125
|
-
const
|
|
143
|
+
A(() => () => {
|
|
144
|
+
d(), u();
|
|
145
|
+
}, [d, u]);
|
|
146
|
+
const b = z(
|
|
126
147
|
() => ({
|
|
127
|
-
openCamera:
|
|
128
|
-
openGallery:
|
|
148
|
+
openCamera: T,
|
|
149
|
+
openGallery: I
|
|
129
150
|
}),
|
|
130
|
-
[
|
|
151
|
+
[T, I]
|
|
131
152
|
);
|
|
132
|
-
return /* @__PURE__ */
|
|
133
|
-
|
|
134
|
-
/* @__PURE__ */
|
|
153
|
+
return /* @__PURE__ */ q(V.Provider, { value: b, children: [
|
|
154
|
+
C,
|
|
155
|
+
/* @__PURE__ */ w(
|
|
135
156
|
"input",
|
|
136
157
|
{
|
|
137
|
-
ref:
|
|
158
|
+
ref: E,
|
|
138
159
|
type: "file",
|
|
139
160
|
accept: "image/*",
|
|
140
|
-
onChange:
|
|
161
|
+
onChange: _,
|
|
141
162
|
style: { display: "none" },
|
|
142
163
|
"aria-hidden": "true"
|
|
143
164
|
}
|
|
144
165
|
),
|
|
145
|
-
/* @__PURE__ */
|
|
166
|
+
/* @__PURE__ */ w(
|
|
146
167
|
"input",
|
|
147
168
|
{
|
|
148
|
-
ref:
|
|
169
|
+
ref: P,
|
|
149
170
|
type: "file",
|
|
150
171
|
accept: "image/*",
|
|
151
172
|
capture: "user",
|
|
152
|
-
onChange:
|
|
173
|
+
onChange: _,
|
|
153
174
|
style: { display: "none" },
|
|
154
175
|
"aria-hidden": "true"
|
|
155
176
|
}
|
|
156
177
|
),
|
|
157
|
-
/* @__PURE__ */
|
|
178
|
+
/* @__PURE__ */ w(
|
|
158
179
|
"input",
|
|
159
180
|
{
|
|
160
|
-
ref:
|
|
181
|
+
ref: R,
|
|
161
182
|
type: "file",
|
|
162
183
|
accept: "image/*",
|
|
163
184
|
capture: "environment",
|
|
164
|
-
onChange:
|
|
185
|
+
onChange: _,
|
|
165
186
|
style: { display: "none" },
|
|
166
187
|
"aria-hidden": "true"
|
|
167
188
|
}
|
|
@@ -169,7 +190,7 @@ function N({ children: g }) {
|
|
|
169
190
|
] });
|
|
170
191
|
}
|
|
171
192
|
export {
|
|
172
|
-
|
|
173
|
-
|
|
193
|
+
D as ImagePickerProvider,
|
|
194
|
+
B as useImagePickerContext
|
|
174
195
|
};
|
|
175
196
|
//# sourceMappingURL=ImagePickerProvider.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ImagePickerProvider.js","sources":["../../src/providers/ImagePickerProvider.tsx"],"sourcesContent":["import React, {\n createContext,\n useContext,\n useRef,\n useCallback,\n useEffect,\n useMemo,\n} from 'react'\n\nimport {useRequestPermissions} from '../hooks/util/useRequestPermissions'\nimport {useReportInteraction} from '../internal/useReportInteraction'\n\nexport type CameraFacing = 'front' | 'back'\n\ninterface ImagePickerContextValue {\n openCamera: (cameraFacing?: CameraFacing) => Promise<File>\n openGallery: () => Promise<File>\n}\n\nconst ImagePickerContext = createContext<ImagePickerContextValue | null>(null)\n\nexport function useImagePickerContext() {\n const context = useContext(ImagePickerContext)\n if (!context) {\n throw new Error(\n 'useImagePickerContext must be used within an ImagePickerProvider'\n )\n }\n return context\n}\n\ninterface ImagePickerProviderProps {\n children: React.ReactNode\n}\n\nexport function ImagePickerProvider({children}: ImagePickerProviderProps) {\n const galleryInputRef = useRef<HTMLInputElement>(null)\n const frontCameraInputRef = useRef<HTMLInputElement>(null)\n const backCameraInputRef = useRef<HTMLInputElement>(null)\n const resolveRef = useRef<((file: File) => void) | null>(null)\n const rejectRef = useRef<((reason: Error) => void) | null>(null)\n const activeCancelHandlerRef = useRef<{\n input: HTMLInputElement\n handler: () => void\n } | null>(null)\n const activeOperationRef = useRef<'gallery' | 'camera' | null>(null)\n\n const {requestPermission} = useRequestPermissions()\n const {reportInteraction} = useReportInteraction()\n\n const cleanupCancelHandler = useCallback(() => {\n if (activeCancelHandlerRef.current) {\n const {input, handler} = activeCancelHandlerRef.current\n input.removeEventListener('cancel', handler)\n activeCancelHandlerRef.current = null\n }\n }, [])\n\n const rejectPendingPromise = useCallback(() => {\n if (rejectRef.current) {\n const error = new Error(\n 'New file picker opened before previous completed'\n )\n if (activeOperationRef.current === 'gallery') {\n reportInteraction({\n interactionType: 'image_picker_error',\n interactionValue: error.message,\n })\n } else if (activeOperationRef.current === 'camera') {\n reportInteraction({\n interactionType: 'camera_error',\n interactionValue: error.message,\n })\n }\n\n rejectRef.current(error)\n resolveRef.current = null\n rejectRef.current = null\n activeOperationRef.current = null\n }\n }, [reportInteraction])\n\n const handleFileChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const file = event.target.files?.[0]\n\n if (file && resolveRef.current) {\n // Report success based on the active operation\n if (activeOperationRef.current === 'gallery') {\n reportInteraction({\n interactionType: 'image_picker_success',\n })\n } else if (activeOperationRef.current === 'camera') {\n reportInteraction({\n interactionType: 'camera_success',\n })\n }\n\n resolveRef.current(file)\n\n resolveRef.current = null\n rejectRef.current = null\n activeOperationRef.current = null\n\n cleanupCancelHandler()\n }\n\n event.target.value = ''\n },\n [cleanupCancelHandler, reportInteraction]\n )\n\n const openGallery = useCallback(() => {\n return new Promise<File>((resolve, reject) => {\n rejectPendingPromise()\n cleanupCancelHandler()\n\n resolveRef.current = resolve\n rejectRef.current = reject\n activeOperationRef.current = 'gallery'\n\n const input = galleryInputRef.current\n\n if (!input) {\n const error = new Error('Gallery input not found')\n reportInteraction({\n interactionType: 'image_picker_error',\n interactionValue: error.message,\n })\n reject(error)\n resolveRef.current = null\n rejectRef.current = null\n activeOperationRef.current = null\n return\n }\n\n const handleCancel = () => {\n if (rejectRef.current) {\n const error = new Error('User cancelled file selection')\n reportInteraction({\n interactionType: 'image_picker_error',\n interactionValue: error.message,\n })\n rejectRef.current(error)\n resolveRef.current = null\n rejectRef.current = null\n activeOperationRef.current = null\n }\n cleanupCancelHandler()\n }\n\n input.addEventListener('cancel', handleCancel)\n activeCancelHandlerRef.current = {input, handler: handleCancel}\n\n reportInteraction({\n interactionType: 'image_picker_open',\n })\n\n requestPermission({permission: 'CAMERA'})\n .then(() => {\n // This will show both Camera and Gallery\n input.click()\n })\n .catch(() => {\n // Show only Gallery\n input.click()\n })\n })\n }, [\n rejectPendingPromise,\n cleanupCancelHandler,\n requestPermission,\n reportInteraction,\n ])\n\n const openCamera = useCallback(\n (cameraFacing: CameraFacing = 'back') => {\n return new Promise<File>((resolve, reject) => {\n rejectPendingPromise()\n cleanupCancelHandler()\n\n resolveRef.current = resolve\n rejectRef.current = reject\n activeOperationRef.current = 'camera'\n\n const input =\n cameraFacing === 'front'\n ? frontCameraInputRef.current\n : backCameraInputRef.current\n\n if (!input) {\n const error = new Error('Camera input not found')\n reportInteraction({\n interactionType: 'camera_error',\n interactionValue: error.message,\n })\n reject(error)\n resolveRef.current = null\n rejectRef.current = null\n activeOperationRef.current = null\n return\n }\n\n const handleCancel = () => {\n if (rejectRef.current) {\n const error = new Error('User cancelled camera')\n reportInteraction({\n interactionType: 'camera_error',\n interactionValue: error.message,\n })\n rejectRef.current(error)\n resolveRef.current = null\n rejectRef.current = null\n activeOperationRef.current = null\n }\n cleanupCancelHandler()\n }\n\n input.addEventListener('cancel', handleCancel)\n activeCancelHandlerRef.current = {input, handler: handleCancel}\n\n reportInteraction({\n interactionType: 'camera_open',\n })\n\n requestPermission({permission: 'CAMERA'})\n .then(({granted}) => {\n if (granted) {\n input.click()\n } else {\n const error = new Error('Camera permission not granted')\n reportInteraction({\n interactionType: 'camera_error',\n interactionValue: error.message,\n })\n reject(error)\n resolveRef.current = null\n rejectRef.current = null\n activeOperationRef.current = null\n }\n })\n .catch(() => {\n const error = new Error('Camera permission not granted')\n reject(error)\n resolveRef.current = null\n rejectRef.current = null\n activeOperationRef.current = null\n })\n })\n },\n [\n rejectPendingPromise,\n cleanupCancelHandler,\n requestPermission,\n reportInteraction,\n ]\n )\n\n useEffect(() => {\n return () => {\n rejectPendingPromise()\n cleanupCancelHandler()\n }\n }, [rejectPendingPromise, cleanupCancelHandler])\n\n const contextValue: ImagePickerContextValue = useMemo(\n () => ({\n openCamera,\n openGallery,\n }),\n [openCamera, openGallery]\n )\n\n return (\n <ImagePickerContext.Provider value={contextValue}>\n {children}\n <input\n ref={galleryInputRef}\n type=\"file\"\n accept=\"image/*\"\n onChange={handleFileChange}\n style={{display: 'none'}}\n aria-hidden=\"true\"\n />\n <input\n ref={frontCameraInputRef}\n type=\"file\"\n accept=\"image/*\"\n capture=\"user\"\n onChange={handleFileChange}\n style={{display: 'none'}}\n aria-hidden=\"true\"\n />\n <input\n ref={backCameraInputRef}\n type=\"file\"\n accept=\"image/*\"\n capture=\"environment\"\n onChange={handleFileChange}\n style={{display: 'none'}}\n aria-hidden=\"true\"\n />\n </ImagePickerContext.Provider>\n )\n}\n"],"names":["ImagePickerContext","createContext","useImagePickerContext","context","useContext","ImagePickerProvider","children","galleryInputRef","useRef","frontCameraInputRef","backCameraInputRef","resolveRef","rejectRef","activeCancelHandlerRef","activeOperationRef","requestPermission","useRequestPermissions","reportInteraction","useReportInteraction","cleanupCancelHandler","useCallback","input","handler","rejectPendingPromise","error","handleFileChange","event","file","openGallery","resolve","reject","handleCancel","openCamera","cameraFacing","granted","useEffect","contextValue","useMemo","jsxs","jsx"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ImagePickerProvider.js","sources":["../../src/providers/ImagePickerProvider.tsx"],"sourcesContent":["import React, {\n createContext,\n useContext,\n useRef,\n useCallback,\n useEffect,\n useMemo,\n} from 'react'\n\nimport {useRequestPermissions} from '../hooks/util/useRequestPermissions'\nimport {useReportInteraction} from '../internal/useReportInteraction'\nimport {resizeImage} from '../internal/utils/resizeImage'\n\nexport type ImageQuality = 'low' | 'medium' | 'high' | 'original'\nexport type CameraFacing = 'front' | 'back'\nexport interface CustomImageQuality {\n size?: number\n compression?: number\n}\n\nexport interface OpenCameraParams {\n cameraFacing?: CameraFacing\n quality?: ImageQuality\n customQuality?: CustomImageQuality\n}\n\nexport interface OpenGalleryParams {\n quality?: ImageQuality\n customQuality?: CustomImageQuality\n}\n\ninterface ImagePickerContextValue {\n openCamera: (params?: OpenCameraParams) => Promise<File>\n openGallery: (params?: OpenGalleryParams) => Promise<File>\n}\n\nconst ImagePickerContext = createContext<ImagePickerContextValue | null>(null)\n\nexport function useImagePickerContext() {\n const context = useContext(ImagePickerContext)\n if (!context) {\n throw new Error(\n 'useImagePickerContext must be used within an ImagePickerProvider'\n )\n }\n return context\n}\n\ninterface ImagePickerProviderProps {\n children: React.ReactNode\n}\n\nexport function ImagePickerProvider({children}: ImagePickerProviderProps) {\n const galleryInputRef = useRef<HTMLInputElement>(null)\n const frontCameraInputRef = useRef<HTMLInputElement>(null)\n const backCameraInputRef = useRef<HTMLInputElement>(null)\n const resolveRef = useRef<((file: File) => void) | null>(null)\n const rejectRef = useRef<((reason: Error) => void) | null>(null)\n const activeCancelHandlerRef = useRef<{\n input: HTMLInputElement\n handler: () => void\n } | null>(null)\n const activeOperationRef = useRef<'gallery' | 'camera' | null>(null)\n const qualityRef = useRef<ImageQuality>('medium')\n const customQualityRef = useRef<CustomImageQuality>(undefined)\n const {requestPermission} = useRequestPermissions()\n const {reportInteraction} = useReportInteraction()\n\n const cleanupCancelHandler = useCallback(() => {\n if (activeCancelHandlerRef.current) {\n const {input, handler} = activeCancelHandlerRef.current\n input.removeEventListener('cancel', handler)\n activeCancelHandlerRef.current = null\n }\n }, [])\n\n const rejectPendingPromise = useCallback(() => {\n if (rejectRef.current) {\n const error = new Error(\n 'New file picker opened before previous completed'\n )\n if (activeOperationRef.current === 'gallery') {\n reportInteraction({\n interactionType: 'image_picker_error',\n interactionValue: error.message,\n })\n } else if (activeOperationRef.current === 'camera') {\n reportInteraction({\n interactionType: 'camera_error',\n interactionValue: error.message,\n })\n }\n\n rejectRef.current(error)\n resolveRef.current = null\n rejectRef.current = null\n activeOperationRef.current = null\n qualityRef.current = 'medium'\n customQualityRef.current = undefined\n }\n }, [reportInteraction])\n\n const handleFileChange = useCallback(\n async (event: React.ChangeEvent<HTMLInputElement>) => {\n const {target} = event\n const file = target.files?.[0]\n\n if (file && resolveRef.current) {\n try {\n const resizedFile = await resizeImage({\n file,\n quality: qualityRef.current,\n customQuality: customQualityRef.current,\n })\n\n if (activeOperationRef.current === 'gallery') {\n reportInteraction({\n interactionType: 'image_picker_success',\n })\n } else if (activeOperationRef.current === 'camera') {\n reportInteraction({\n interactionType: 'camera_success',\n })\n }\n\n resolveRef.current(resizedFile)\n } catch (error) {\n console.warn('Image resize failed, using original:', error)\n if (resolveRef.current) {\n resolveRef.current(file)\n }\n }\n\n resolveRef.current = null\n rejectRef.current = null\n activeOperationRef.current = null\n\n cleanupCancelHandler()\n }\n\n target.value = ''\n },\n [cleanupCancelHandler, reportInteraction]\n )\n\n const openGallery = useCallback(\n ({quality = 'medium', customQuality}: OpenGalleryParams = {}) => {\n return new Promise<File>((resolve, reject) => {\n rejectPendingPromise()\n cleanupCancelHandler()\n\n qualityRef.current = quality\n customQualityRef.current = customQuality\n resolveRef.current = resolve\n rejectRef.current = reject\n activeOperationRef.current = 'gallery'\n const input = galleryInputRef.current\n\n if (!input) {\n const error = new Error('Gallery input not found')\n reportInteraction({\n interactionType: 'image_picker_error',\n interactionValue: error.message,\n })\n reject(error)\n resolveRef.current = null\n rejectRef.current = null\n activeOperationRef.current = null\n return\n }\n\n const handleCancel = () => {\n if (rejectRef.current) {\n const error = new Error('User cancelled file selection')\n reportInteraction({\n interactionType: 'image_picker_error',\n interactionValue: error.message,\n })\n rejectRef.current(error)\n resolveRef.current = null\n rejectRef.current = null\n activeOperationRef.current = null\n }\n cleanupCancelHandler()\n }\n\n input.addEventListener('cancel', handleCancel)\n activeCancelHandlerRef.current = {input, handler: handleCancel}\n\n reportInteraction({\n interactionType: 'image_picker_open',\n })\n\n requestPermission({permission: 'CAMERA'})\n .then(() => {\n // This will show both Camera and Gallery\n input.click()\n })\n .catch(() => {\n // Show only Gallery\n input.click()\n })\n })\n },\n [\n rejectPendingPromise,\n cleanupCancelHandler,\n requestPermission,\n reportInteraction,\n ]\n )\n\n const openCamera = useCallback(\n ({\n cameraFacing = 'back',\n quality = 'medium',\n customQuality,\n }: OpenCameraParams = {}) => {\n return new Promise<File>((resolve, reject) => {\n rejectPendingPromise()\n cleanupCancelHandler()\n\n qualityRef.current = quality\n customQualityRef.current = customQuality\n resolveRef.current = resolve\n rejectRef.current = reject\n activeOperationRef.current = 'camera'\n\n const input =\n cameraFacing === 'front'\n ? frontCameraInputRef.current\n : backCameraInputRef.current\n\n if (!input) {\n const error = new Error('Camera input not found')\n reportInteraction({\n interactionType: 'camera_error',\n interactionValue: error.message,\n })\n reject(error)\n resolveRef.current = null\n rejectRef.current = null\n activeOperationRef.current = null\n return\n }\n\n const handleCancel = () => {\n if (rejectRef.current) {\n const error = new Error('User cancelled camera')\n reportInteraction({\n interactionType: 'camera_error',\n interactionValue: error.message,\n })\n rejectRef.current(error)\n resolveRef.current = null\n rejectRef.current = null\n activeOperationRef.current = null\n }\n cleanupCancelHandler()\n }\n\n input.addEventListener('cancel', handleCancel)\n activeCancelHandlerRef.current = {input, handler: handleCancel}\n\n reportInteraction({\n interactionType: 'camera_open',\n })\n\n requestPermission({permission: 'CAMERA'})\n .then(({granted}) => {\n if (granted) {\n input.click()\n } else {\n const error = new Error('Camera permission not granted')\n reportInteraction({\n interactionType: 'camera_error',\n interactionValue: error.message,\n })\n reject(error)\n resolveRef.current = null\n rejectRef.current = null\n activeOperationRef.current = null\n }\n })\n .catch(() => {\n const error = new Error('Camera permission not granted')\n reject(error)\n resolveRef.current = null\n rejectRef.current = null\n activeOperationRef.current = null\n })\n })\n },\n [\n rejectPendingPromise,\n cleanupCancelHandler,\n requestPermission,\n reportInteraction,\n ]\n )\n\n useEffect(() => {\n return () => {\n rejectPendingPromise()\n cleanupCancelHandler()\n }\n }, [rejectPendingPromise, cleanupCancelHandler])\n\n const contextValue: ImagePickerContextValue = useMemo(\n () => ({\n openCamera,\n openGallery,\n }),\n [openCamera, openGallery]\n )\n\n return (\n <ImagePickerContext.Provider value={contextValue}>\n {children}\n <input\n ref={galleryInputRef}\n type=\"file\"\n accept=\"image/*\"\n onChange={handleFileChange}\n style={{display: 'none'}}\n aria-hidden=\"true\"\n />\n <input\n ref={frontCameraInputRef}\n type=\"file\"\n accept=\"image/*\"\n capture=\"user\"\n onChange={handleFileChange}\n style={{display: 'none'}}\n aria-hidden=\"true\"\n />\n <input\n ref={backCameraInputRef}\n type=\"file\"\n accept=\"image/*\"\n capture=\"environment\"\n onChange={handleFileChange}\n style={{display: 'none'}}\n aria-hidden=\"true\"\n />\n </ImagePickerContext.Provider>\n )\n}\n"],"names":["ImagePickerContext","createContext","useImagePickerContext","context","useContext","ImagePickerProvider","children","galleryInputRef","useRef","frontCameraInputRef","backCameraInputRef","resolveRef","rejectRef","activeCancelHandlerRef","activeOperationRef","qualityRef","customQualityRef","requestPermission","useRequestPermissions","reportInteraction","useReportInteraction","cleanupCancelHandler","useCallback","input","handler","rejectPendingPromise","error","handleFileChange","event","target","file","resizedFile","resizeImage","openGallery","quality","customQuality","resolve","reject","handleCancel","openCamera","cameraFacing","granted","useEffect","contextValue","useMemo","jsxs","jsx"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import S from "../../../../../../../_virtual/window.js";
|
|
2
2
|
import B from "../../../../../../../_virtual/document.js";
|
|
3
|
-
import il from "../../../../../../../_virtual/
|
|
3
|
+
import il from "../../../../../../../_virtual/index4.js";
|
|
4
4
|
import ao from "../../../../../../../_virtual/browser-index.js";
|
|
5
5
|
import xe from "../../../../@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/extends.js";
|
|
6
6
|
import Kc from "../../../../@videojs_vhs-utils@4.1.1/node_modules/@videojs/vhs-utils/es/resolve-url.js";
|