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.
@@ -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
- var _Dimensions$get = _reactNative.Dimensions.get('window'),
29
- width = _Dimensions$get.width;
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',
@@ -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: _reactNative.Dimensions.get('window').width,
1327
- aspectRatio: 9 / 16,
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 || _reactNative.Dimensions.get('window').width;
1417
- var wrapperHeight = commonWrapperLayout.current.height || _reactNative.Dimensions.get('window').width * 16 / 9;
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-expo-cropper",
3
- "version": "1.2.45",
3
+ "version": "1.2.46",
4
4
  "description": "Recadrage polygonal d'images.",
5
5
  "main": "index.js",
6
6
  "author": "PCS AGRI",
@@ -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'}