react-native-expo-cropper 1.2.36 → 1.2.37

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.
@@ -0,0 +1,6 @@
1
+ module.exports = {
2
+ presets: [
3
+ '@babel/preset-env',
4
+ '@babel/preset-react'
5
+ ]
6
+ };
@@ -1,246 +1,344 @@
1
- "use strict";
2
-
3
- function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
- exports["default"] = CustomCamera;
8
- var _react = _interopRequireWildcard(require("react"));
9
- var _reactNative = require("react-native");
10
- var _reactNativeSafeAreaContext = require("react-native-safe-area-context");
11
- var _expoCamera = require("expo-camera");
12
- function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t2 in e) "default" !== _t2 && {}.hasOwnProperty.call(e, _t2) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t2)) && (i.get || i.set) ? o(f, _t2, i) : f[_t2] = e[_t2]); return f; })(e, t); }
13
- function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
14
- function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
15
- function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
16
- function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
17
- function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
18
- function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
19
- function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); }
20
- function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
21
- function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
22
- function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
23
- function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
24
- function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
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
- 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
- function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
28
- var _Dimensions$get = _reactNative.Dimensions.get('window'),
29
- width = _Dimensions$get.width;
30
- function CustomCamera(_ref) {
31
- var onPhotoCaptured = _ref.onPhotoCaptured;
32
- var _useState = (0, _react.useState)(false),
33
- _useState2 = _slicedToArray(_useState, 2),
34
- isReady = _useState2[0],
35
- setIsReady = _useState2[1];
36
- var _useState3 = (0, _react.useState)(false),
37
- _useState4 = _slicedToArray(_useState3, 2),
38
- loadingBeforeCapture = _useState4[0],
39
- setLoadingBeforeCapture = _useState4[1];
40
- var _useState5 = (0, _react.useState)(null),
41
- _useState6 = _slicedToArray(_useState5, 1),
42
- setHasPermission = _useState6[0];
43
- var cameraRef = (0, _react.useRef)(null);
44
- var insets = (0, _reactNativeSafeAreaContext.useSafeAreaInsets)();
45
- (0, _react.useEffect)(function () {
46
- _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
47
- var _yield$Camera$request, status;
48
- return _regenerator().w(function (_context) {
49
- while (1) switch (_context.n) {
50
- case 0:
51
- _context.n = 1;
52
- return _expoCamera.Camera.requestCameraPermissionsAsync();
53
- case 1:
54
- _yield$Camera$request = _context.v;
55
- status = _yield$Camera$request.status;
56
- setHasPermission(status === 'granted');
57
- case 2:
58
- return _context.a(2);
59
- }
60
- }, _callee);
61
- }))();
62
- }, []);
63
-
64
- // Helper function to wait for multiple render cycles (works on iOS)
65
- var waitForRender = function waitForRender() {
66
- var cycles = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 5;
67
- return new Promise(function (resolve) {
68
- var count = 0;
69
- var _tick = function tick() {
70
- count++;
71
- if (count >= cycles) {
72
- resolve();
73
- } else {
74
- setImmediate(_tick);
75
- }
76
- };
77
- setImmediate(_tick);
78
- });
79
- };
80
- var takePicture = /*#__PURE__*/function () {
81
- var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2() {
82
- var photo, fixedUri, _t;
83
- return _regenerator().w(function (_context2) {
84
- while (1) switch (_context2.p = _context2.n) {
85
- case 0:
86
- if (!cameraRef.current) {
87
- _context2.n = 5;
88
- break;
89
- }
90
- _context2.p = 1;
91
- // Show loading after a delay (using setImmediate for iOS compatibility)
92
- waitForRender(5).then(function () {
93
- setLoadingBeforeCapture(true);
94
- });
95
-
96
- // Wait a bit before taking picture (works on iOS)
97
- _context2.n = 2;
98
- return waitForRender(2);
99
- case 2:
100
- _context2.n = 3;
101
- return cameraRef.current.takePictureAsync({
102
- quality: 1,
103
- shutterSound: false,
104
- skipProcessing: false,
105
- exif: true // Include EXIF data for orientation
106
- });
107
- case 3:
108
- photo = _context2.v;
109
- // Fix orientation on Android (iOS handles it automatically)
110
- fixedUri = photo.uri; // Go directly to ImageCropper (preview will be shown there on Android)
111
- onPhotoCaptured(fixedUri);
112
- setLoadingBeforeCapture(false);
113
- _context2.n = 5;
114
- break;
115
- case 4:
116
- _context2.p = 4;
117
- _t = _context2.v;
118
- setLoadingBeforeCapture(false);
119
- _reactNative.Alert.alert("Erreur");
120
- case 5:
121
- return _context2.a(2);
122
- }
123
- }, _callee2, null, [[1, 4]]);
124
- }));
125
- return function takePicture() {
126
- return _ref3.apply(this, arguments);
127
- };
128
- }();
129
- return /*#__PURE__*/_react["default"].createElement(_reactNative.SafeAreaView, {
130
- style: styles.outerContainer
131
- }, /*#__PURE__*/_react["default"].createElement(_reactNative.View, {
132
- style: styles.cameraWrapper
133
- }, /*#__PURE__*/_react["default"].createElement(_expoCamera.CameraView, {
134
- style: styles.camera,
135
- facing: "back",
136
- ref: cameraRef,
137
- onCameraReady: function onCameraReady() {
138
- return setIsReady(true);
139
- }
140
- }), loadingBeforeCapture && /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(_reactNative.View, {
141
- style: styles.loadingOverlay
142
- }, /*#__PURE__*/_react["default"].createElement(_reactNative.Image, {
143
- source: require('../src/assets/loadingCamera.gif'),
144
- style: styles.loadingGif,
145
- resizeMode: "contain"
146
- })), /*#__PURE__*/_react["default"].createElement(_reactNative.View, {
147
- style: styles.touchBlocker,
148
- pointerEvents: "auto"
149
- })), /*#__PURE__*/_react["default"].createElement(_reactNative.View, {
150
- style: styles.scanFrame
151
- })), /*#__PURE__*/_react["default"].createElement(_reactNative.View, {
152
- style: [styles.buttonContainer, {
153
- bottom: ((insets === null || insets === void 0 ? void 0 : insets.bottom) || 0) + 16,
154
- marginBottom: 0
155
- }]
156
- }, /*#__PURE__*/_react["default"].createElement(_reactNative.TouchableOpacity, {
157
- style: styles.button,
158
- onPress: takePicture,
159
- disabled: !isReady || loadingBeforeCapture
160
- })));
161
- }
162
- var PRIMARY_GREEN = '#198754';
163
- var DEEP_BLACK = '#0B0B0B';
164
- var GLOW_WHITE = 'rgba(255, 255, 255, 0.85)';
165
- var styles = _reactNative.StyleSheet.create({
166
- outerContainer: {
167
- flex: 1,
168
- backgroundColor: DEEP_BLACK,
169
- justifyContent: 'center',
170
- alignItems: 'center'
171
- },
172
- cameraWrapper: {
173
- width: width,
174
- aspectRatio: 9 / 16,
175
- borderRadius: 30,
176
- overflow: 'hidden',
177
- alignItems: 'center',
178
- justifyContent: 'center',
179
- position: 'relative'
180
- },
181
- camera: _objectSpread({}, _reactNative.StyleSheet.absoluteFillObject),
182
- scanFrame: {
183
- position: 'absolute',
184
- width: '95%',
185
- height: '80%',
186
- borderWidth: 4,
187
- borderColor: PRIMARY_GREEN,
188
- borderRadius: 5,
189
- backgroundColor: 'rgba(0, 0, 0, 0.1)'
190
- },
191
- loadingOverlay: _objectSpread(_objectSpread({}, _reactNative.StyleSheet.absoluteFillObject), {}, {
192
- backgroundColor: 'rgba(0, 0, 0, 0.5)',
193
- zIndex: 20,
194
- justifyContent: 'center',
195
- alignItems: 'center'
196
- }),
197
- loadingGif: {
198
- width: 100,
199
- height: 100
200
- },
201
- touchBlocker: _objectSpread(_objectSpread({}, _reactNative.StyleSheet.absoluteFillObject), {}, {
202
- zIndex: 21,
203
- backgroundColor: 'transparent'
204
- }),
205
- cancelIcon: {
206
- position: 'absolute',
207
- top: 20,
208
- left: 20,
209
- backgroundColor: PRIMARY_GREEN,
210
- borderRadius: 5,
211
- padding: 8
212
- },
213
- buttonContainer: {
214
- position: 'absolute',
215
- bottom: 0,
216
- marginBottom: 20,
217
- flexDirection: 'row',
218
- justifyContent: 'center'
219
- },
220
- button: {
221
- width: 80,
222
- height: 80,
223
- borderRadius: 50,
224
- backgroundColor: GLOW_WHITE,
225
- borderWidth: 5,
226
- borderColor: PRIMARY_GREEN,
227
- alignItems: 'center',
228
- justifyContent: 'center'
229
- },
230
- text: {
231
- fontSize: 18,
232
- color: GLOW_WHITE
233
- },
234
- container: {
235
- flex: 1,
236
- backgroundColor: DEEP_BLACK,
237
- justifyContent: 'center',
238
- alignItems: 'center',
239
- padding: 20
240
- },
241
- iconText: {
242
- fontSize: 18,
243
- color: GLOW_WHITE,
244
- fontWeight: '600'
245
- }
1
+ "use strict";
2
+
3
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports["default"] = CustomCamera;
8
+ var _react = _interopRequireWildcard(require("react"));
9
+ var _reactNative = require("react-native");
10
+ var _reactNativeSafeAreaContext = require("react-native-safe-area-context");
11
+ var _expoCamera = require("expo-camera");
12
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t2 in e) "default" !== _t2 && {}.hasOwnProperty.call(e, _t2) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t2)) && (i.get || i.set) ? o(f, _t2, i) : f[_t2] = e[_t2]); return f; })(e, t); }
13
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
14
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
15
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
16
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
17
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
18
+ function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
19
+ function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); }
20
+ function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
21
+ function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
22
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
23
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
24
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
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
+ 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
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
28
+ var _Dimensions$get = _reactNative.Dimensions.get('window'),
29
+ width = _Dimensions$get.width;
30
+ function CustomCamera(_ref) {
31
+ var onPhotoCaptured = _ref.onPhotoCaptured,
32
+ onFrameCalculated = _ref.onFrameCalculated;
33
+ var _useState = (0, _react.useState)(false),
34
+ _useState2 = _slicedToArray(_useState, 2),
35
+ isReady = _useState2[0],
36
+ setIsReady = _useState2[1];
37
+ var _useState3 = (0, _react.useState)(false),
38
+ _useState4 = _slicedToArray(_useState3, 2),
39
+ loadingBeforeCapture = _useState4[0],
40
+ setLoadingBeforeCapture = _useState4[1];
41
+ var _useState5 = (0, _react.useState)(null),
42
+ _useState6 = _slicedToArray(_useState5, 2),
43
+ hasPermission = _useState6[0],
44
+ setHasPermission = _useState6[1];
45
+ var cameraRef = (0, _react.useRef)(null);
46
+ var cameraWrapperRef = (0, _react.useRef)(null);
47
+ var insets = (0, _reactNativeSafeAreaContext.useSafeAreaInsets)();
48
+ var _useState7 = (0, _react.useState)({
49
+ width: 0,
50
+ height: 0,
51
+ x: 0,
52
+ y: 0
53
+ }),
54
+ _useState8 = _slicedToArray(_useState7, 2),
55
+ cameraWrapperLayout = _useState8[0],
56
+ setCameraWrapperLayout = _useState8[1];
57
+ var _useState9 = (0, _react.useState)(null),
58
+ _useState0 = _slicedToArray(_useState9, 2),
59
+ greenFrame = _useState0[0],
60
+ setGreenFrame = _useState0[1];
61
+ (0, _react.useEffect)(function () {
62
+ _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
63
+ var _yield$Camera$request, status;
64
+ return _regenerator().w(function (_context) {
65
+ while (1) switch (_context.n) {
66
+ case 0:
67
+ _context.n = 1;
68
+ return _expoCamera.Camera.requestCameraPermissionsAsync();
69
+ case 1:
70
+ _yield$Camera$request = _context.v;
71
+ status = _yield$Camera$request.status;
72
+ setHasPermission(status === 'granted');
73
+ case 2:
74
+ return _context.a(2);
75
+ }
76
+ }, _callee);
77
+ }))();
78
+ }, []);
79
+
80
+ // Helper function to wait for multiple render cycles (works on iOS)
81
+ var waitForRender = function waitForRender() {
82
+ var cycles = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 5;
83
+ return new Promise(function (resolve) {
84
+ var count = 0;
85
+ var _tick = function tick() {
86
+ count++;
87
+ if (count >= cycles) {
88
+ resolve();
89
+ } else {
90
+ setImmediate(_tick);
91
+ }
92
+ };
93
+ setImmediate(_tick);
94
+ });
95
+ };
96
+
97
+ // CRITICAL FIX: Calculate green frame coordinates relative to camera preview
98
+ // The green frame should be calculated on the wrapper (as it's visually drawn there)
99
+ // But we store it with wrapper dimensions so ImageCropper can map it correctly
100
+ var calculateGreenFrameCoordinates = function calculateGreenFrameCoordinates() {
101
+ var wrapperWidth = cameraWrapperLayout.width;
102
+ var wrapperHeight = cameraWrapperLayout.height;
103
+ if (wrapperWidth === 0 || wrapperHeight === 0) {
104
+ console.warn("Camera wrapper layout not ready, cannot calculate green frame");
105
+ return null;
106
+ }
107
+
108
+ // Green frame dimensions: 80% width, 80% height (centered)
109
+ // The green frame should cover 80% of the image area, centered
110
+ var frameWidth = wrapperWidth * 0.80; // 80% width
111
+ var frameHeight = wrapperHeight * 0.80; // 80% height
112
+ var frameX = (wrapperWidth - frameWidth) / 2; // Centered horizontally
113
+ var frameY = (wrapperHeight - frameHeight) / 2; // Centered vertically
114
+
115
+ var frameCoords = {
116
+ x: frameX,
117
+ y: frameY,
118
+ width: frameWidth,
119
+ height: frameHeight,
120
+ wrapperWidth: wrapperWidth,
121
+ wrapperHeight: wrapperHeight,
122
+ // ✅ Store percentages for easier mapping later
123
+ percentX: frameX / wrapperWidth * 100,
124
+ percentY: frameY / wrapperHeight * 100,
125
+ percentWidth: 80,
126
+ percentHeight: 80
127
+ };
128
+ console.log("✅ Green frame coordinates calculated:", frameCoords);
129
+ return frameCoords;
130
+ };
131
+
132
+ // 🔁 Keep green frame state in sync with wrapper layout so we can both render it
133
+ // and send the exact same coordinates along with the captured photo.
134
+ (0, _react.useEffect)(function () {
135
+ var coords = calculateGreenFrameCoordinates();
136
+ if (coords) {
137
+ setGreenFrame(coords);
138
+ }
139
+ }, [cameraWrapperLayout]);
140
+ var takePicture = /*#__PURE__*/function () {
141
+ var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2() {
142
+ var photo, greenFrameCoords, fixedUri, _t;
143
+ return _regenerator().w(function (_context2) {
144
+ while (1) switch (_context2.p = _context2.n) {
145
+ case 0:
146
+ if (!cameraRef.current) {
147
+ _context2.n = 5;
148
+ break;
149
+ }
150
+ _context2.p = 1;
151
+ // Show loading after a delay (using setImmediate for iOS compatibility)
152
+ waitForRender(5).then(function () {
153
+ setLoadingBeforeCapture(true);
154
+ });
155
+
156
+ // Wait a bit before taking picture (works on iOS)
157
+ _context2.n = 2;
158
+ return waitForRender(2);
159
+ case 2:
160
+ _context2.n = 3;
161
+ return cameraRef.current.takePictureAsync({
162
+ quality: 1,
163
+ // Qualité maximale (0-1, 1 = meilleure qualité)
164
+ shutterSound: false,
165
+ // skipProcessing: true = Désactiver le traitement automatique pour préserver la qualité pixel-perfect
166
+ // IMPORTANT : Cela préserve la résolution originale et évite toute interpolation
167
+ skipProcessing: true,
168
+ // exif: true = Inclure les métadonnées EXIF (orientation, etc.)
169
+ // L'orientation sera gérée dans ImageCropper si nécessaire via la fonction de rotation
170
+ exif: true
171
+ });
172
+ case 3:
173
+ photo = _context2.v;
174
+ console.log("Photo captured with maximum quality:", {
175
+ uri: photo.uri,
176
+ width: photo.width,
177
+ height: photo.height,
178
+ exif: photo.exif ? "present" : "missing"
179
+ });
180
+
181
+ // ✅ CRITICAL FIX: Use the same green frame coordinates that are used for rendering
182
+ // Fallback to recalculation if, for some reason, state is not yet set
183
+ greenFrameCoords = greenFrame || calculateGreenFrameCoordinates(); // ✅ REFACTORISATION : Utiliser directement l'URI de la photo
184
+ // L'orientation sera gérée dans ImageCropper si l'utilisateur utilise la fonction de rotation
185
+ // skipProcessing: true préserve la qualité mais peut laisser l'orientation EXIF non appliquée
186
+ // C'est acceptable car l'utilisateur peut corriger via la rotation dans ImageCropper
187
+ fixedUri = photo.uri; // Envoyer l'URI et les coordonnées du green frame à ImageCropper
188
+ onPhotoCaptured(fixedUri, {
189
+ greenFrame: greenFrameCoords,
190
+ capturedImageSize: {
191
+ width: photo.width,
192
+ height: photo.height
193
+ }
194
+ });
195
+ setLoadingBeforeCapture(false);
196
+ _context2.n = 5;
197
+ break;
198
+ case 4:
199
+ _context2.p = 4;
200
+ _t = _context2.v;
201
+ console.error("Error capturing photo:", _t);
202
+ setLoadingBeforeCapture(false);
203
+ _reactNative.Alert.alert("Erreur", "Impossible de capturer la photo. Veuillez réessayer.");
204
+ case 5:
205
+ return _context2.a(2);
206
+ }
207
+ }, _callee2, null, [[1, 4]]);
208
+ }));
209
+ return function takePicture() {
210
+ return _ref3.apply(this, arguments);
211
+ };
212
+ }();
213
+ return /*#__PURE__*/_react["default"].createElement(_reactNative.SafeAreaView, {
214
+ style: styles.outerContainer
215
+ }, /*#__PURE__*/_react["default"].createElement(_reactNative.View, {
216
+ style: styles.cameraWrapper,
217
+ ref: cameraWrapperRef,
218
+ onLayout: function onLayout(e) {
219
+ var layout = e.nativeEvent.layout;
220
+ setCameraWrapperLayout({
221
+ width: layout.width,
222
+ height: layout.height,
223
+ x: layout.x,
224
+ y: layout.y
225
+ });
226
+ console.log("Camera wrapper layout updated:", layout);
227
+ }
228
+ }, /*#__PURE__*/_react["default"].createElement(_expoCamera.CameraView, {
229
+ style: styles.camera,
230
+ facing: "back",
231
+ ref: cameraRef,
232
+ onCameraReady: function onCameraReady() {
233
+ return setIsReady(true);
234
+ }
235
+ }), loadingBeforeCapture && /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(_reactNative.View, {
236
+ style: styles.loadingOverlay
237
+ }, /*#__PURE__*/_react["default"].createElement(_reactNative.Image, {
238
+ source: require('../src/assets/loadingCamera.gif'),
239
+ style: styles.loadingGif,
240
+ resizeMode: "contain"
241
+ })), /*#__PURE__*/_react["default"].createElement(_reactNative.View, {
242
+ style: styles.touchBlocker,
243
+ pointerEvents: "auto"
244
+ })), greenFrame && /*#__PURE__*/_react["default"].createElement(_reactNative.View, {
245
+ style: [styles.scanFrame, {
246
+ left: greenFrame.x,
247
+ top: greenFrame.y,
248
+ width: greenFrame.width,
249
+ height: greenFrame.height
250
+ }]
251
+ })), /*#__PURE__*/_react["default"].createElement(_reactNative.View, {
252
+ style: [styles.buttonContainer, {
253
+ bottom: ((insets === null || insets === void 0 ? void 0 : insets.bottom) || 0) + 16,
254
+ marginBottom: 0
255
+ }]
256
+ }, /*#__PURE__*/_react["default"].createElement(_reactNative.TouchableOpacity, {
257
+ style: styles.button,
258
+ onPress: takePicture,
259
+ disabled: !isReady || loadingBeforeCapture
260
+ })));
261
+ }
262
+ var PRIMARY_GREEN = '#198754';
263
+ var DEEP_BLACK = '#0B0B0B';
264
+ var GLOW_WHITE = 'rgba(255, 255, 255, 0.85)';
265
+ var styles = _reactNative.StyleSheet.create({
266
+ outerContainer: {
267
+ flex: 1,
268
+ backgroundColor: DEEP_BLACK,
269
+ justifyContent: 'center',
270
+ alignItems: 'center'
271
+ },
272
+ cameraWrapper: {
273
+ width: width,
274
+ aspectRatio: 9 / 16,
275
+ borderRadius: 30,
276
+ overflow: 'hidden',
277
+ alignItems: 'center',
278
+ justifyContent: 'center',
279
+ position: 'relative'
280
+ },
281
+ camera: _objectSpread({}, _reactNative.StyleSheet.absoluteFillObject),
282
+ scanFrame: {
283
+ position: 'absolute',
284
+ borderWidth: 4,
285
+ borderColor: PRIMARY_GREEN,
286
+ borderRadius: 5,
287
+ backgroundColor: 'rgba(0, 0, 0, 0.1)'
288
+ },
289
+ loadingOverlay: _objectSpread(_objectSpread({}, _reactNative.StyleSheet.absoluteFillObject), {}, {
290
+ backgroundColor: 'rgba(0, 0, 0, 0.5)',
291
+ zIndex: 20,
292
+ justifyContent: 'center',
293
+ alignItems: 'center'
294
+ }),
295
+ loadingGif: {
296
+ width: 100,
297
+ height: 100
298
+ },
299
+ touchBlocker: _objectSpread(_objectSpread({}, _reactNative.StyleSheet.absoluteFillObject), {}, {
300
+ zIndex: 21,
301
+ backgroundColor: 'transparent'
302
+ }),
303
+ cancelIcon: {
304
+ position: 'absolute',
305
+ top: 20,
306
+ left: 20,
307
+ backgroundColor: PRIMARY_GREEN,
308
+ borderRadius: 5,
309
+ padding: 8
310
+ },
311
+ buttonContainer: {
312
+ position: 'absolute',
313
+ bottom: 0,
314
+ marginBottom: 20,
315
+ flexDirection: 'row',
316
+ justifyContent: 'center'
317
+ },
318
+ button: {
319
+ width: 80,
320
+ height: 80,
321
+ borderRadius: 50,
322
+ backgroundColor: GLOW_WHITE,
323
+ borderWidth: 5,
324
+ borderColor: PRIMARY_GREEN,
325
+ alignItems: 'center',
326
+ justifyContent: 'center'
327
+ },
328
+ text: {
329
+ fontSize: 18,
330
+ color: GLOW_WHITE
331
+ },
332
+ container: {
333
+ flex: 1,
334
+ backgroundColor: DEEP_BLACK,
335
+ justifyContent: 'center',
336
+ alignItems: 'center',
337
+ padding: 20
338
+ },
339
+ iconText: {
340
+ fontSize: 18,
341
+ color: GLOW_WHITE,
342
+ fontWeight: '600'
343
+ }
246
344
  });