react-native-expo-cropper 1.2.45 → 1.2.46
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/CustomCamera.js +8 -4
- package/dist/ImageCropper.js +37 -13
- package/dist/ImageCropperStyles.js +11 -0
- package/package.json +1 -1
- package/src/ImageCropper.js +8 -0
package/dist/CustomCamera.js
CHANGED
|
@@ -25,11 +25,14 @@ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r)
|
|
|
25
25
|
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
26
26
|
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
|
|
27
27
|
function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
// Max width for camera preview on large screens (tablets) so it doesn't stretch full width
|
|
29
|
+
var CAMERA_PREVIEW_MAX_WIDTH = 500;
|
|
30
30
|
function CustomCamera(_ref) {
|
|
31
31
|
var onPhotoCaptured = _ref.onPhotoCaptured,
|
|
32
32
|
onFrameCalculated = _ref.onFrameCalculated;
|
|
33
|
+
var _useWindowDimensions = (0, _reactNative.useWindowDimensions)(),
|
|
34
|
+
windowWidth = _useWindowDimensions.width;
|
|
35
|
+
var cameraPreviewWidth = Math.min(windowWidth, CAMERA_PREVIEW_MAX_WIDTH);
|
|
33
36
|
var _useState = (0, _react.useState)(false),
|
|
34
37
|
_useState2 = _slicedToArray(_useState, 2),
|
|
35
38
|
isReady = _useState2[0],
|
|
@@ -249,7 +252,9 @@ function CustomCamera(_ref) {
|
|
|
249
252
|
return /*#__PURE__*/_react["default"].createElement(_reactNative.SafeAreaView, {
|
|
250
253
|
style: styles.outerContainer
|
|
251
254
|
}, /*#__PURE__*/_react["default"].createElement(_reactNative.View, {
|
|
252
|
-
style: styles.cameraWrapper,
|
|
255
|
+
style: [styles.cameraWrapper, {
|
|
256
|
+
width: cameraPreviewWidth
|
|
257
|
+
}],
|
|
253
258
|
ref: cameraWrapperRef,
|
|
254
259
|
onLayout: function onLayout(e) {
|
|
255
260
|
var layout = e.nativeEvent.layout;
|
|
@@ -310,7 +315,6 @@ var styles = _reactNative.StyleSheet.create({
|
|
|
310
315
|
alignItems: 'center'
|
|
311
316
|
},
|
|
312
317
|
cameraWrapper: {
|
|
313
|
-
width: width,
|
|
314
318
|
aspectRatio: 9 / 16,
|
|
315
319
|
borderRadius: 30,
|
|
316
320
|
overflow: 'hidden',
|
package/dist/ImageCropper.js
CHANGED
|
@@ -36,6 +36,9 @@ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length)
|
|
|
36
36
|
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
|
|
37
37
|
function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
|
|
38
38
|
var PRIMARY_GREEN = '#198754';
|
|
39
|
+
|
|
40
|
+
// Max width for crop preview on large screens (tablets) - must match CustomCamera.js
|
|
41
|
+
var CAMERA_PREVIEW_MAX_WIDTH = 500;
|
|
39
42
|
var ImageCropper = function ImageCropper(_ref) {
|
|
40
43
|
var _cameraFrameData$curr3;
|
|
41
44
|
var onConfirm = _ref.onConfirm,
|
|
@@ -43,6 +46,9 @@ var ImageCropper = function ImageCropper(_ref) {
|
|
|
43
46
|
initialImage = _ref.initialImage,
|
|
44
47
|
addheight = _ref.addheight,
|
|
45
48
|
rotationLabel = _ref.rotationLabel;
|
|
49
|
+
var _useWindowDimensions = (0, _reactNative.useWindowDimensions)(),
|
|
50
|
+
windowWidth = _useWindowDimensions.width;
|
|
51
|
+
var cameraPreviewWidth = Math.min(windowWidth, CAMERA_PREVIEW_MAX_WIDTH);
|
|
46
52
|
var _useState = (0, _react.useState)(null),
|
|
47
53
|
_useState2 = _slicedToArray(_useState, 2),
|
|
48
54
|
image = _useState2[0],
|
|
@@ -1299,6 +1305,31 @@ var ImageCropper = function ImageCropper(_ref) {
|
|
|
1299
1305
|
style: _ImageCropperStyles["default"].container
|
|
1300
1306
|
}, showCustomCamera ? /*#__PURE__*/_react["default"].createElement(_CustomCamera["default"], {
|
|
1301
1307
|
onPhotoCaptured: function onPhotoCaptured(uri, frameData) {
|
|
1308
|
+
// ✅ Reset refs for new image so second (and later) photos don't use first image's layout (fixes white screen on some devices)
|
|
1309
|
+
originalImageDimensions.current = {
|
|
1310
|
+
width: 0,
|
|
1311
|
+
height: 0
|
|
1312
|
+
};
|
|
1313
|
+
imageDisplayRect.current = {
|
|
1314
|
+
x: 0,
|
|
1315
|
+
y: 0,
|
|
1316
|
+
width: 0,
|
|
1317
|
+
height: 0
|
|
1318
|
+
};
|
|
1319
|
+
displayedImageLayout.current = {
|
|
1320
|
+
x: 0,
|
|
1321
|
+
y: 0,
|
|
1322
|
+
width: 0,
|
|
1323
|
+
height: 0
|
|
1324
|
+
};
|
|
1325
|
+
imageMeasure.current = {
|
|
1326
|
+
x: 0,
|
|
1327
|
+
y: 0,
|
|
1328
|
+
width: 0,
|
|
1329
|
+
height: 0
|
|
1330
|
+
};
|
|
1331
|
+
sourceImageUri.current = uri;
|
|
1332
|
+
|
|
1302
1333
|
// ✅ CRITICAL FIX: Store green frame coordinates for coordinate conversion
|
|
1303
1334
|
if (frameData && frameData.greenFrame) {
|
|
1304
1335
|
cameraFrameData.current = {
|
|
@@ -1322,17 +1353,9 @@ var ImageCropper = function ImageCropper(_ref) {
|
|
|
1322
1353
|
return setShowCustomCamera(false);
|
|
1323
1354
|
}
|
|
1324
1355
|
}) : /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, image && /*#__PURE__*/_react["default"].createElement(_reactNative.View, {
|
|
1325
|
-
style: {
|
|
1326
|
-
width:
|
|
1327
|
-
|
|
1328
|
-
borderRadius: 30,
|
|
1329
|
-
overflow: 'hidden',
|
|
1330
|
-
alignItems: 'center',
|
|
1331
|
-
justifyContent: 'center',
|
|
1332
|
-
position: 'relative',
|
|
1333
|
-
backgroundColor: 'black',
|
|
1334
|
-
marginBottom: 0 // ✅ Les boutons sont maintenant en position absolue en bas
|
|
1335
|
-
},
|
|
1356
|
+
style: [_ImageCropperStyles["default"].commonWrapper, {
|
|
1357
|
+
width: cameraPreviewWidth
|
|
1358
|
+
}],
|
|
1336
1359
|
ref: commonWrapperRef,
|
|
1337
1360
|
onLayout: onCommonWrapperLayout
|
|
1338
1361
|
}, /*#__PURE__*/_react["default"].createElement(_reactNative.View, {
|
|
@@ -1402,6 +1425,7 @@ var ImageCropper = function ImageCropper(_ref) {
|
|
|
1402
1425
|
return hasMovement;
|
|
1403
1426
|
}
|
|
1404
1427
|
}, /*#__PURE__*/_react["default"].createElement(_reactNative.Image, {
|
|
1428
|
+
key: image,
|
|
1405
1429
|
source: {
|
|
1406
1430
|
uri: image
|
|
1407
1431
|
},
|
|
@@ -1413,8 +1437,8 @@ var ImageCropper = function ImageCropper(_ref) {
|
|
|
1413
1437
|
pointerEvents: "none"
|
|
1414
1438
|
}, function () {
|
|
1415
1439
|
// ✅ Use wrapper dimensions for SVG path (wrapper coordinates)
|
|
1416
|
-
var wrapperWidth = commonWrapperLayout.current.width ||
|
|
1417
|
-
var wrapperHeight = commonWrapperLayout.current.height ||
|
|
1440
|
+
var wrapperWidth = commonWrapperLayout.current.width || cameraPreviewWidth;
|
|
1441
|
+
var wrapperHeight = commonWrapperLayout.current.height || cameraPreviewWidth * 16 / 9;
|
|
1418
1442
|
return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(_reactNativeSvg.Path, {
|
|
1419
1443
|
d: "M 0 0 H ".concat(wrapperWidth, " V ").concat(wrapperHeight, " H 0 Z ").concat(createPath()),
|
|
1420
1444
|
fill: showResult ? 'white' : 'rgba(0, 0, 0, 0.8)',
|
|
@@ -21,6 +21,17 @@ var styles = _reactNative.StyleSheet.create({
|
|
|
21
21
|
// ✅ Start from top, allow content to flow down
|
|
22
22
|
backgroundColor: DEEP_BLACK
|
|
23
23
|
},
|
|
24
|
+
// Wrapper for crop preview (9/16, same as CustomCamera); width set dynamically for tablet
|
|
25
|
+
commonWrapper: {
|
|
26
|
+
aspectRatio: 9 / 16,
|
|
27
|
+
borderRadius: 30,
|
|
28
|
+
overflow: 'hidden',
|
|
29
|
+
alignItems: 'center',
|
|
30
|
+
justifyContent: 'center',
|
|
31
|
+
position: 'relative',
|
|
32
|
+
backgroundColor: 'black',
|
|
33
|
+
marginBottom: 0
|
|
34
|
+
},
|
|
24
35
|
buttonContainer: {
|
|
25
36
|
position: 'absolute',
|
|
26
37
|
bottom: 50,
|
package/package.json
CHANGED
package/src/ImageCropper.js
CHANGED
|
@@ -1100,6 +1100,13 @@ const rotatePreviewImage = async (degrees) => {
|
|
|
1100
1100
|
{showCustomCamera ? (
|
|
1101
1101
|
<CustomCamera
|
|
1102
1102
|
onPhotoCaptured={(uri, frameData) => {
|
|
1103
|
+
// ✅ Reset refs for new image so second (and later) photos don't use first image's layout (fixes white screen on some devices)
|
|
1104
|
+
originalImageDimensions.current = { width: 0, height: 0 };
|
|
1105
|
+
imageDisplayRect.current = { x: 0, y: 0, width: 0, height: 0 };
|
|
1106
|
+
displayedImageLayout.current = { x: 0, y: 0, width: 0, height: 0 };
|
|
1107
|
+
imageMeasure.current = { x: 0, y: 0, width: 0, height: 0 };
|
|
1108
|
+
sourceImageUri.current = uri;
|
|
1109
|
+
|
|
1103
1110
|
// ✅ CRITICAL FIX: Store green frame coordinates for coordinate conversion
|
|
1104
1111
|
if (frameData && frameData.greenFrame) {
|
|
1105
1112
|
cameraFrameData.current = {
|
|
@@ -1197,6 +1204,7 @@ const rotatePreviewImage = async (degrees) => {
|
|
|
1197
1204
|
}}
|
|
1198
1205
|
>
|
|
1199
1206
|
<Image
|
|
1207
|
+
key={image}
|
|
1200
1208
|
source={{ uri: image }}
|
|
1201
1209
|
style={styles.image}
|
|
1202
1210
|
resizeMode={cameraFrameData.current?.greenFrame ? 'cover' : 'contain'}
|