react-native-rectangle-doc-scanner 0.49.0 → 0.51.0

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.
@@ -32,11 +32,14 @@ var __importStar = (this && this.__importStar) || (function () {
32
32
  return result;
33
33
  };
34
34
  })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
35
38
  Object.defineProperty(exports, "__esModule", { value: true });
36
39
  exports.CropEditor = void 0;
37
40
  const react_1 = __importStar(require("react"));
38
41
  const react_native_1 = require("react-native");
39
- const react_native_perspective_image_cropper_1 = require("react-native-perspective-image-cropper");
42
+ const react_native_perspective_image_cropper_1 = __importDefault(require("react-native-perspective-image-cropper"));
40
43
  const coordinate_1 = require("./utils/coordinate");
41
44
  /**
42
45
  * CropEditor Component
@@ -57,6 +60,7 @@ const CropEditor = ({ document, overlayColor = 'rgba(0,0,0,0.5)', overlayStrokeC
57
60
  width: react_native_1.Dimensions.get('window').width,
58
61
  height: react_native_1.Dimensions.get('window').height,
59
62
  });
63
+ const [isImageLoading, setIsImageLoading] = (0, react_1.useState)(true);
60
64
  // Get initial rectangle from detected quad or use default
61
65
  const getInitialRectangle = (0, react_1.useCallback)(() => {
62
66
  if (!document.quad || !imageSize) {
@@ -72,7 +76,9 @@ const CropEditor = ({ document, overlayColor = 'rgba(0,0,0,0.5)', overlayStrokeC
72
76
  }, [document.quad, document.width, document.height, imageSize]);
73
77
  const handleImageLoad = (0, react_1.useCallback)((event) => {
74
78
  const { width, height } = event.nativeEvent.source;
79
+ console.log('Image loaded with size:', { width, height });
75
80
  setImageSize({ width, height });
81
+ setIsImageLoading(false);
76
82
  }, []);
77
83
  const handleLayout = (0, react_1.useCallback)((event) => {
78
84
  const { width, height } = event.nativeEvent.layout;
@@ -92,12 +98,16 @@ const CropEditor = ({ document, overlayColor = 'rgba(0,0,0,0.5)', overlayStrokeC
92
98
  onCropChange?.(rect);
93
99
  }, [imageSize, onCropChange]);
94
100
  // Wait for image to load to get dimensions
95
- if (!imageSize) {
96
- return (react_1.default.createElement(react_native_1.View, { style: styles.container, onLayout: handleLayout },
97
- react_1.default.createElement(react_native_1.Image, { source: { uri: `file://${document.path}` }, style: styles.hiddenImage, onLoad: handleImageLoad, resizeMode: "contain" })));
101
+ if (!imageSize || isImageLoading) {
102
+ return (react_1.default.createElement(react_native_1.View, { style: [styles.container, styles.loadingContainer], onLayout: handleLayout },
103
+ react_1.default.createElement(react_native_1.Image, { source: { uri: `file://${document.path}` }, style: styles.hiddenImage, onLoad: handleImageLoad, onError: (error) => {
104
+ console.error('Image load error:', error);
105
+ setIsImageLoading(false);
106
+ }, resizeMode: "contain" }),
107
+ react_1.default.createElement(react_native_1.ActivityIndicator, { size: "large", color: handlerColor })));
98
108
  }
99
109
  return (react_1.default.createElement(react_native_1.View, { style: styles.container, onLayout: handleLayout },
100
- react_1.default.createElement(react_native_perspective_image_cropper_1.CustomImageCropper, { height: displaySize.height, width: displaySize.width, image: `file://${document.path}`, rectangleCoordinates: getInitialRectangle(), overlayColor: overlayColor, overlayStrokeColor: overlayStrokeColor, handlerColor: handlerColor, enablePanStrict: enablePanStrict, onDragEnd: handleDragEnd })));
110
+ react_1.default.createElement(react_native_perspective_image_cropper_1.default, { height: displaySize.height, width: displaySize.width, image: `file://${document.path}`, rectangleCoordinates: getInitialRectangle(), overlayColor: overlayColor, overlayStrokeColor: overlayStrokeColor, handlerColor: handlerColor, enablePanStrict: enablePanStrict, onDragEnd: handleDragEnd })));
101
111
  };
102
112
  exports.CropEditor = CropEditor;
103
113
  const styles = react_native_1.StyleSheet.create({
@@ -105,9 +115,14 @@ const styles = react_native_1.StyleSheet.create({
105
115
  flex: 1,
106
116
  backgroundColor: '#000',
107
117
  },
118
+ loadingContainer: {
119
+ justifyContent: 'center',
120
+ alignItems: 'center',
121
+ },
108
122
  hiddenImage: {
109
123
  width: 1,
110
124
  height: 1,
111
125
  opacity: 0,
126
+ position: 'absolute',
112
127
  },
113
128
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-rectangle-doc-scanner",
3
- "version": "0.49.0",
3
+ "version": "0.51.0",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "repository": {
@@ -1,6 +1,6 @@
1
1
  import React, { useState, useCallback } from 'react';
2
- import { View, StyleSheet, Image, Dimensions } from 'react-native';
3
- import { CustomImageCropper } from 'react-native-perspective-image-cropper';
2
+ import { View, StyleSheet, Image, Dimensions, ActivityIndicator } from 'react-native';
3
+ import CustomImageCropper from 'react-native-perspective-image-cropper';
4
4
  import type { Rectangle as CropperRectangle } from 'react-native-perspective-image-cropper';
5
5
  import type { Point, Rectangle, CapturedDocument } from './types';
6
6
  import { quadToRectangle, scaleRectangle } from './utils/coordinate';
@@ -40,6 +40,7 @@ export const CropEditor: React.FC<CropEditorProps> = ({
40
40
  width: Dimensions.get('window').width,
41
41
  height: Dimensions.get('window').height,
42
42
  });
43
+ const [isImageLoading, setIsImageLoading] = useState(true);
43
44
 
44
45
  // Get initial rectangle from detected quad or use default
45
46
  const getInitialRectangle = useCallback((): CropperRectangle | undefined => {
@@ -66,7 +67,9 @@ export const CropEditor: React.FC<CropEditorProps> = ({
66
67
 
67
68
  const handleImageLoad = useCallback((event: any) => {
68
69
  const { width, height } = event.nativeEvent.source;
70
+ console.log('Image loaded with size:', { width, height });
69
71
  setImageSize({ width, height });
72
+ setIsImageLoading(false);
70
73
  }, []);
71
74
 
72
75
  const handleLayout = useCallback((event: any) => {
@@ -91,15 +94,20 @@ export const CropEditor: React.FC<CropEditorProps> = ({
91
94
  }, [imageSize, onCropChange]);
92
95
 
93
96
  // Wait for image to load to get dimensions
94
- if (!imageSize) {
97
+ if (!imageSize || isImageLoading) {
95
98
  return (
96
- <View style={styles.container} onLayout={handleLayout}>
99
+ <View style={[styles.container, styles.loadingContainer]} onLayout={handleLayout}>
97
100
  <Image
98
101
  source={{ uri: `file://${document.path}` }}
99
102
  style={styles.hiddenImage}
100
103
  onLoad={handleImageLoad}
104
+ onError={(error) => {
105
+ console.error('Image load error:', error);
106
+ setIsImageLoading(false);
107
+ }}
101
108
  resizeMode="contain"
102
109
  />
110
+ <ActivityIndicator size="large" color={handlerColor} />
103
111
  </View>
104
112
  );
105
113
  }
@@ -126,9 +134,14 @@ const styles = StyleSheet.create({
126
134
  flex: 1,
127
135
  backgroundColor: '#000',
128
136
  },
137
+ loadingContainer: {
138
+ justifyContent: 'center',
139
+ alignItems: 'center',
140
+ },
129
141
  hiddenImage: {
130
142
  width: 1,
131
143
  height: 1,
132
144
  opacity: 0,
145
+ position: 'absolute',
133
146
  },
134
147
  });
package/src/external.d.ts CHANGED
@@ -131,4 +131,6 @@ declare module 'react-native-perspective-image-cropper' {
131
131
  };
132
132
 
133
133
  export const CustomImageCropper: ComponentType<CustomImageCropperProps>;
134
+ const CustomImageCropperDefault: ComponentType<CustomImageCropperProps>;
135
+ export default CustomImageCropperDefault;
134
136
  }