react-native-expo-cropper 1.0.29 → 1.0.31

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/.babelrc ADDED
@@ -0,0 +1,7 @@
1
+ {
2
+ "presets": [
3
+ "@babel/preset-env",
4
+ "@babel/preset-react"
5
+ ]
6
+ }
7
+
package/App.js ADDED
@@ -0,0 +1,27 @@
1
+ import React from 'react';
2
+ import { SafeAreaView, StatusBar, StyleSheet } from 'react-native';
3
+ import ImageCropper from './src/ImageCropper';
4
+
5
+ const App = () => {
6
+ const handleCrop = (uri) => {
7
+ console.log('Cropped Image URI:', uri);
8
+ };
9
+
10
+ return (
11
+ <>
12
+ <StatusBar backgroundColor="black" barStyle="light-content" />
13
+ <SafeAreaView style={styles.container}>
14
+ <ImageCropper onCrop={handleCrop} />
15
+ </SafeAreaView>
16
+ </>
17
+ );
18
+ };
19
+
20
+ const styles = StyleSheet.create({
21
+ container: {
22
+ flex: 1,
23
+ backgroundColor: 'black',
24
+ },
25
+ });
26
+
27
+ export default App;
package/app.json ADDED
@@ -0,0 +1,3 @@
1
+ {
2
+ "expo": {}
3
+ }
@@ -0,0 +1,278 @@
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
+ var ImageManipulator = _interopRequireWildcard(require("expo-image-manipulator"));
13
+ 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 _t3 in e) "default" !== _t3 && {}.hasOwnProperty.call(e, _t3) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t3)) && (i.get || i.set) ? o(f, _t3, i) : f[_t3] = e[_t3]); return f; })(e, t); }
14
+ 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; }
15
+ 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; }
16
+ 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; }
17
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
18
+ 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); }
19
+ 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 }; })(); }
20
+ 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); }
21
+ 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); }
22
+ 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); }); }; }
23
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
24
+ 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."); }
25
+ 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; } }
26
+ 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; }
27
+ 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; } }
28
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
29
+ var _Dimensions$get = _reactNative.Dimensions.get('window'),
30
+ width = _Dimensions$get.width;
31
+ function CustomCamera(_ref) {
32
+ var onPhotoCaptured = _ref.onPhotoCaptured;
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, 1),
43
+ setHasPermission = _useState6[0];
44
+ var cameraRef = (0, _react.useRef)(null);
45
+ var insets = (0, _reactNativeSafeAreaContext.useSafeAreaInsets)();
46
+ (0, _react.useEffect)(function () {
47
+ _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
48
+ var _yield$Camera$request, status;
49
+ return _regenerator().w(function (_context) {
50
+ while (1) switch (_context.n) {
51
+ case 0:
52
+ _context.n = 1;
53
+ return _expoCamera.Camera.requestCameraPermissionsAsync();
54
+ case 1:
55
+ _yield$Camera$request = _context.v;
56
+ status = _yield$Camera$request.status;
57
+ setHasPermission(status === 'granted');
58
+ case 2:
59
+ return _context.a(2);
60
+ }
61
+ }, _callee);
62
+ }))();
63
+ }, []);
64
+
65
+ // Helper function to wait for multiple render cycles (works on iOS)
66
+ var waitForRender = function waitForRender() {
67
+ var cycles = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 5;
68
+ return new Promise(function (resolve) {
69
+ var count = 0;
70
+ var _tick = function tick() {
71
+ count++;
72
+ if (count >= cycles) {
73
+ resolve();
74
+ } else {
75
+ setImmediate(_tick);
76
+ }
77
+ };
78
+ setImmediate(_tick);
79
+ });
80
+ };
81
+
82
+ // Helper function to fix image orientation (removes EXIF orientation)
83
+ var fixImageOrientation = /*#__PURE__*/function () {
84
+ var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(uri) {
85
+ var fixedImage, _t;
86
+ return _regenerator().w(function (_context2) {
87
+ while (1) switch (_context2.p = _context2.n) {
88
+ case 0:
89
+ _context2.p = 0;
90
+ _context2.n = 1;
91
+ return ImageManipulator.manipulateAsync(uri, [],
92
+ // Empty array = apply EXIF orientation automatically
93
+ {
94
+ compress: 1,
95
+ format: ImageManipulator.SaveFormat.PNG
96
+ });
97
+ case 1:
98
+ fixedImage = _context2.v;
99
+ return _context2.a(2, fixedImage.uri);
100
+ case 2:
101
+ _context2.p = 2;
102
+ _t = _context2.v;
103
+ console.error("Error fixing image orientation:", _t);
104
+ return _context2.a(2, uri);
105
+ }
106
+ }, _callee2, null, [[0, 2]]);
107
+ }));
108
+ return function fixImageOrientation(_x) {
109
+ return _ref3.apply(this, arguments);
110
+ };
111
+ }();
112
+ var takePicture = /*#__PURE__*/function () {
113
+ var _ref4 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3() {
114
+ var photo, fixedUri, _t2;
115
+ return _regenerator().w(function (_context3) {
116
+ while (1) switch (_context3.p = _context3.n) {
117
+ case 0:
118
+ if (!cameraRef.current) {
119
+ _context3.n = 6;
120
+ break;
121
+ }
122
+ _context3.p = 1;
123
+ // Show loading after a delay (using setImmediate for iOS compatibility)
124
+ waitForRender(20).then(function () {
125
+ setLoadingBeforeCapture(true);
126
+ });
127
+
128
+ // Wait a bit before taking picture (works on iOS)
129
+ _context3.n = 2;
130
+ return waitForRender(3);
131
+ case 2:
132
+ _context3.n = 3;
133
+ return cameraRef.current.takePictureAsync({
134
+ quality: 1,
135
+ shutterSound: false
136
+ });
137
+ case 3:
138
+ photo = _context3.v;
139
+ _context3.n = 4;
140
+ return fixImageOrientation(photo.uri);
141
+ case 4:
142
+ fixedUri = _context3.v;
143
+ onPhotoCaptured(fixedUri);
144
+ setLoadingBeforeCapture(false);
145
+ _context3.n = 6;
146
+ break;
147
+ case 5:
148
+ _context3.p = 5;
149
+ _t2 = _context3.v;
150
+ setLoadingBeforeCapture(false);
151
+ _reactNative.Alert.alert("Erreur");
152
+ case 6:
153
+ return _context3.a(2);
154
+ }
155
+ }, _callee3, null, [[1, 5]]);
156
+ }));
157
+ return function takePicture() {
158
+ return _ref4.apply(this, arguments);
159
+ };
160
+ }();
161
+ return /*#__PURE__*/_react["default"].createElement(_reactNative.SafeAreaView, {
162
+ style: styles.outerContainer
163
+ }, /*#__PURE__*/_react["default"].createElement(_reactNative.View, {
164
+ style: styles.cameraWrapper
165
+ }, /*#__PURE__*/_react["default"].createElement(_expoCamera.CameraView, {
166
+ style: styles.camera,
167
+ facing: "back",
168
+ ref: cameraRef,
169
+ onCameraReady: function onCameraReady() {
170
+ return setIsReady(true);
171
+ }
172
+ }), loadingBeforeCapture && /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(_reactNative.View, {
173
+ style: styles.loadingOverlay
174
+ }, /*#__PURE__*/_react["default"].createElement(_reactNative.Image, {
175
+ source: require('../src/assets/loadingCamera.gif'),
176
+ style: styles.loadingGif,
177
+ resizeMode: "contain"
178
+ })), /*#__PURE__*/_react["default"].createElement(_reactNative.View, {
179
+ style: styles.touchBlocker,
180
+ pointerEvents: "auto"
181
+ })), /*#__PURE__*/_react["default"].createElement(_reactNative.View, {
182
+ style: styles.scanFrame
183
+ })), /*#__PURE__*/_react["default"].createElement(_reactNative.View, {
184
+ style: [styles.buttonContainer, {
185
+ bottom: ((insets === null || insets === void 0 ? void 0 : insets.bottom) || 0) + 16,
186
+ marginBottom: 0
187
+ }]
188
+ }, /*#__PURE__*/_react["default"].createElement(_reactNative.TouchableOpacity, {
189
+ style: styles.button,
190
+ onPress: takePicture,
191
+ disabled: !isReady || loadingBeforeCapture
192
+ })));
193
+ }
194
+ var PRIMARY_GREEN = '#198754';
195
+ var DEEP_BLACK = '#0B0B0B';
196
+ var GLOW_WHITE = 'rgba(255, 255, 255, 0.85)';
197
+ var styles = _reactNative.StyleSheet.create({
198
+ outerContainer: {
199
+ flex: 1,
200
+ backgroundColor: DEEP_BLACK,
201
+ justifyContent: 'center',
202
+ alignItems: 'center'
203
+ },
204
+ cameraWrapper: {
205
+ width: width,
206
+ aspectRatio: 9 / 16,
207
+ borderRadius: 30,
208
+ overflow: 'hidden',
209
+ alignItems: 'center',
210
+ justifyContent: 'center',
211
+ position: 'relative'
212
+ },
213
+ camera: _objectSpread({}, _reactNative.StyleSheet.absoluteFillObject),
214
+ scanFrame: {
215
+ position: 'absolute',
216
+ width: '95%',
217
+ height: '80%',
218
+ borderWidth: 4,
219
+ borderColor: PRIMARY_GREEN,
220
+ borderRadius: 5,
221
+ backgroundColor: 'rgba(0, 0, 0, 0.1)'
222
+ },
223
+ loadingOverlay: _objectSpread(_objectSpread({}, _reactNative.StyleSheet.absoluteFillObject), {}, {
224
+ backgroundColor: 'rgba(0, 0, 0, 0.5)',
225
+ zIndex: 20,
226
+ justifyContent: 'center',
227
+ alignItems: 'center'
228
+ }),
229
+ loadingGif: {
230
+ width: 100,
231
+ height: 100
232
+ },
233
+ touchBlocker: _objectSpread(_objectSpread({}, _reactNative.StyleSheet.absoluteFillObject), {}, {
234
+ zIndex: 21,
235
+ backgroundColor: 'transparent'
236
+ }),
237
+ cancelIcon: {
238
+ position: 'absolute',
239
+ top: 20,
240
+ left: 20,
241
+ backgroundColor: PRIMARY_GREEN,
242
+ borderRadius: 5,
243
+ padding: 8
244
+ },
245
+ buttonContainer: {
246
+ position: 'absolute',
247
+ bottom: 0,
248
+ marginBottom: 20,
249
+ flexDirection: 'row',
250
+ justifyContent: 'center'
251
+ },
252
+ button: {
253
+ width: 80,
254
+ height: 80,
255
+ borderRadius: 50,
256
+ backgroundColor: GLOW_WHITE,
257
+ borderWidth: 5,
258
+ borderColor: PRIMARY_GREEN,
259
+ alignItems: 'center',
260
+ justifyContent: 'center'
261
+ },
262
+ text: {
263
+ fontSize: 18,
264
+ color: GLOW_WHITE
265
+ },
266
+ container: {
267
+ flex: 1,
268
+ backgroundColor: DEEP_BLACK,
269
+ justifyContent: 'center',
270
+ alignItems: 'center',
271
+ padding: 20
272
+ },
273
+ iconText: {
274
+ fontSize: 18,
275
+ color: GLOW_WHITE,
276
+ fontWeight: '600'
277
+ }
278
+ });