react-native-signature-canvas 4.7.4 → 5.0.1

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/CHANGELOG.md CHANGED
@@ -1,3 +1,54 @@
1
+ # [5.0.0](https://github.com/YanYuanFE/react-native-signature-canvas/compare/v4.5.1...v5.0.0) (2025-06-28)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * add originWhitelist prop ([068c646](https://github.com/YanYuanFE/react-native-signature-canvas/commit/068c6467d1e9910c4911e727b2144e065a9a7322))
7
+ * backgorund color to transparent and loader color to transparent ([3001d4e](https://github.com/YanYuanFE/react-native-signature-canvas/commit/3001d4edfdcf1806e2f16a518d25f1690b80557e))
8
+ * fix canvas not display for android api 28 ([835669b](https://github.com/YanYuanFE/react-native-signature-canvas/commit/835669bb65ab5c88c43830b7a783eed105f3910d))
9
+
10
+
11
+ ### Features
12
+
13
+ * add onLoadEnd prop ([49a8664](https://github.com/YanYuanFE/react-native-signature-canvas/commit/49a866408b6356ce9e71b1c794993a3f2fe85337))
14
+ * add showsVerticalScrollIndicator prop ([a4d64c5](https://github.com/YanYuanFE/react-native-signature-canvas/commit/a4d64c5754a9da4ecb9d531a1585a38994d18d6d))
15
+ * export SignatureViewProps ([8f0c321](https://github.com/YanYuanFE/react-native-signature-canvas/commit/8f0c3211b20782cd8f35a43083f39d5ea351f932))
16
+
17
+
18
+
19
+ ## [4.5.1](https://github.com/YanYuanFE/react-native-signature-canvas/compare/v4.3.0...v4.5.1) (2023-05-04)
20
+
21
+
22
+ ### Bug Fixes
23
+
24
+ * **android:** sigsegv crash on android ([49644b8](https://github.com/YanYuanFE/react-native-signature-canvas/commit/49644b802a7cb80443292972b1fbd3d4dbdfd9c4))
25
+ * fix bgSrc props ([bef3ab2](https://github.com/YanYuanFE/react-native-signature-canvas/commit/bef3ab27ebb990a94dd74517ab67754d557307ae))
26
+ * fix webview version ([1b55f45](https://github.com/YanYuanFE/react-native-signature-canvas/commit/1b55f45e27560cd8b0bdf62504a7d27b412687c2))
27
+
28
+
29
+ ### Features
30
+
31
+ * update rn latest example ([f9a568f](https://github.com/YanYuanFE/react-native-signature-canvas/commit/f9a568f68c966690ee2ec1b300b2e2fb6f18ee56))
32
+
33
+
34
+
35
+ # [4.3.0](https://github.com/YanYuanFE/react-native-signature-canvas/compare/v4.2.1...v4.3.0) (2021-08-11)
36
+
37
+
38
+
39
+ ## [4.2.1](https://github.com/YanYuanFE/react-native-signature-canvas/compare/v4.2.0...v4.2.1) (2021-08-04)
40
+
41
+
42
+ ### Bug Fixes
43
+
44
+ * ts imageType ([d50d227](https://github.com/YanYuanFE/react-native-signature-canvas/commit/d50d22747278f860152ff1c8a87be6e335236724))
45
+
46
+
47
+
48
+ # [4.2.0](https://github.com/YanYuanFE/react-native-signature-canvas/compare/v4.1.0...v4.2.0) (2021-07-24)
49
+
50
+
51
+
1
52
  # [4.1.0](https://github.com/YanYuanFE/react-native-signature-canvas/compare/v4.0.0...v4.1.0) (2021-07-14)
2
53
 
3
54
 
package/QUICK_START.md ADDED
@@ -0,0 +1,219 @@
1
+ # Quick Start Guide
2
+
3
+ Get up and running with `react-native-signature-canvas` in minutes!
4
+
5
+ ## 🚀 Installation
6
+
7
+ ```bash
8
+ # Install the package
9
+ npm install react-native-signature-canvas
10
+
11
+ # For React Native CLI projects, also install WebView
12
+ npm install react-native-webview
13
+ cd ios && pod install # iOS only
14
+ ```
15
+
16
+ ## 📱 Basic Example
17
+
18
+ ```jsx
19
+ import React, { useRef, useState } from 'react';
20
+ import { View, Button, StyleSheet } from 'react-native';
21
+ import SignatureCanvas from 'react-native-signature-canvas';
22
+
23
+ export default function App() {
24
+ const ref = useRef();
25
+ const [signature, setSignature] = useState();
26
+
27
+ const handleOK = (signature) => {
28
+ console.log(signature);
29
+ setSignature(signature);
30
+ };
31
+
32
+ const handleClear = () => {
33
+ ref.current?.clearSignature();
34
+ };
35
+
36
+ const handleSave = () => {
37
+ ref.current?.readSignature();
38
+ };
39
+
40
+ return (
41
+ <View style={styles.container}>
42
+ <SignatureCanvas
43
+ ref={ref}
44
+ onOK={handleOK}
45
+ onEmpty={() => console.log('Empty')}
46
+ descriptionText="Sign here"
47
+ clearText="Clear"
48
+ confirmText="Save"
49
+ style={styles.signature}
50
+ />
51
+
52
+ <View style={styles.buttons}>
53
+ <Button title="Clear" onPress={handleClear} />
54
+ <Button title="Save" onPress={handleSave} />
55
+ </View>
56
+ </View>
57
+ );
58
+ }
59
+
60
+ const styles = StyleSheet.create({
61
+ container: {
62
+ flex: 1,
63
+ padding: 20,
64
+ },
65
+ signature: {
66
+ flex: 1,
67
+ borderColor: '#000033',
68
+ borderWidth: 1,
69
+ },
70
+ buttons: {
71
+ flexDirection: 'row',
72
+ justifyContent: 'space-around',
73
+ marginTop: 20,
74
+ },
75
+ });
76
+ ```
77
+
78
+ ## ⚡ Enhanced Example with New Features
79
+
80
+ ```jsx
81
+ import React, { useRef, useState } from 'react';
82
+ import { View, Button, StyleSheet, Alert } from 'react-native';
83
+ import SignatureCanvas from 'react-native-signature-canvas';
84
+
85
+ export default function EnhancedSignatureApp() {
86
+ const ref = useRef();
87
+ const [signature, setSignature] = useState();
88
+ const [isLoading, setIsLoading] = useState(false);
89
+
90
+ const handleSignature = (signature) => {
91
+ setSignature(signature);
92
+ setIsLoading(false);
93
+ Alert.alert('Success', 'Signature saved!');
94
+ };
95
+
96
+ const handleEmpty = () => {
97
+ setIsLoading(false);
98
+ Alert.alert('Empty', 'Please draw a signature first');
99
+ };
100
+
101
+ const handleError = (error) => {
102
+ setIsLoading(false);
103
+ Alert.alert('Error', error.message);
104
+ };
105
+
106
+ const handleSave = () => {
107
+ setIsLoading(true);
108
+ ref.current?.readSignature();
109
+ };
110
+
111
+ return (
112
+ <View style={styles.container}>
113
+ <SignatureCanvas
114
+ ref={ref}
115
+ onOK={handleSignature}
116
+ onEmpty={handleEmpty}
117
+ onError={handleError}
118
+ descriptionText="Sign here"
119
+ clearText="Clear"
120
+ confirmText={isLoading ? "Saving..." : "Save"}
121
+ penColor="#0066cc"
122
+ backgroundColor="rgba(255,255,255,0)"
123
+ // NEW: WebView customization
124
+ webviewProps={{
125
+ cacheEnabled: true,
126
+ androidLayerType: "hardware",
127
+ }}
128
+ style={styles.signature}
129
+ />
130
+
131
+ <View style={styles.controls}>
132
+ <Button
133
+ title="Clear"
134
+ onPress={() => ref.current?.clearSignature()}
135
+ />
136
+ <Button
137
+ title="Undo"
138
+ onPress={() => ref.current?.undo()}
139
+ />
140
+ <Button
141
+ title="Save"
142
+ onPress={handleSave}
143
+ disabled={isLoading}
144
+ />
145
+ </View>
146
+ </View>
147
+ );
148
+ }
149
+
150
+ const styles = StyleSheet.create({
151
+ container: {
152
+ flex: 1,
153
+ backgroundColor: '#f5f5f5',
154
+ padding: 20,
155
+ },
156
+ signature: {
157
+ flex: 1,
158
+ borderColor: '#ddd',
159
+ borderWidth: 1,
160
+ borderRadius: 8,
161
+ backgroundColor: 'white',
162
+ },
163
+ controls: {
164
+ flexDirection: 'row',
165
+ justifyContent: 'space-around',
166
+ marginTop: 20,
167
+ paddingVertical: 10,
168
+ },
169
+ });
170
+ ```
171
+
172
+ ## 🔧 Common Configurations
173
+
174
+ ### High Performance Setup
175
+ ```jsx
176
+ <SignatureCanvas
177
+ webviewProps={{
178
+ cacheEnabled: true,
179
+ androidLayerType: "hardware",
180
+ androidHardwareAccelerationDisabled: false,
181
+ }}
182
+ />
183
+ ```
184
+
185
+ ### Low Memory Setup
186
+ ```jsx
187
+ <SignatureCanvas
188
+ webviewProps={{
189
+ cacheEnabled: false,
190
+ androidLayerType: "software",
191
+ androidHardwareAccelerationDisabled: true,
192
+ }}
193
+ />
194
+ ```
195
+
196
+ ### Security Focused Setup
197
+ ```jsx
198
+ <SignatureCanvas
199
+ webviewProps={{
200
+ allowFileAccess: false,
201
+ allowFileAccessFromFileURLs: false,
202
+ mixedContentMode: "never",
203
+ allowsLinkPreview: false,
204
+ }}
205
+ />
206
+ ```
207
+
208
+ ## 📖 Next Steps
209
+
210
+ - [Read the full documentation](./README.md)
211
+ - [Learn about WebView customization](./WEBVIEW_PROPS.md)
212
+ - [Check out example apps](./example/)
213
+ - [View TypeScript definitions](./index.d.ts)
214
+
215
+ ## 🆘 Need Help?
216
+
217
+ - [Check troubleshooting guide](./README.md#troubleshooting)
218
+ - [View common issues](https://github.com/YanYuanFE/react-native-signature-canvas/issues)
219
+ - [Ask questions in discussions](https://github.com/YanYuanFE/react-native-signature-canvas/discussions)
package/README.md CHANGED
@@ -10,14 +10,19 @@ A React Native component for capturing signatures or drawing on a canvas with a
10
10
 
11
11
  ## Features
12
12
 
13
- - Cross-platform support (iOS, Android, Expo)
14
- - Smooth, responsive drawing experience
15
- - Customizable pen color, size, and background
16
- - Support for background and overlay images
17
- - Export signatures as PNG, JPEG, or SVG
18
- - Undo/redo functionality
19
- - Drawing and erasing modes
20
- - TypeScript support
13
+ - ✅ **Cross-platform support** (iOS, Android, Expo)
14
+ - ✅ **Smooth, responsive drawing experience** with optimized performance
15
+ - ✅ **Customizable pen color, size, and background**
16
+ - ✅ **Support for background and overlay images**
17
+ - ✅ **Export signatures** as PNG, JPEG, or SVG
18
+ - ✅ **Undo/redo functionality**
19
+ - ✅ **Drawing and erasing modes**
20
+ - ✅ **Full TypeScript support** with enhanced type definitions
21
+ - 🆕 **Advanced error handling** with automatic recovery
22
+ - 🆕 **Performance monitoring** and optimization
23
+ - 🆕 **Flexible WebView customization** via `webviewProps`
24
+ - 🆕 **Enhanced security** with configurable restrictions
25
+ - 🆕 **Memory management** and leak prevention
21
26
 
22
27
  ## Installation
23
28
 
@@ -55,23 +60,33 @@ import SignatureCanvas from 'react-native-signature-canvas';
55
60
 
56
61
  const SignatureScreen = () => {
57
62
  const [signature, setSignature] = useState(null);
63
+ const [isLoading, setIsLoading] = useState(false);
58
64
  const ref = useRef();
59
65
 
60
66
  const handleSignature = (signature) => {
61
- console.log(signature);
67
+ console.log('Signature captured:', signature);
62
68
  setSignature(signature);
69
+ setIsLoading(false);
63
70
  };
64
71
 
65
72
  const handleEmpty = () => {
66
- console.log('Empty');
73
+ console.log('Signature is empty');
74
+ setIsLoading(false);
67
75
  };
68
76
 
69
77
  const handleClear = () => {
70
- console.log('Clear success!');
78
+ console.log('Signature cleared');
79
+ setSignature(null);
80
+ };
81
+
82
+ const handleError = (error) => {
83
+ console.error('Signature pad error:', error);
84
+ setIsLoading(false);
71
85
  };
72
86
 
73
87
  const handleEnd = () => {
74
- ref.current.readSignature();
88
+ setIsLoading(true);
89
+ ref.current?.readSignature();
75
90
  };
76
91
 
77
92
  return (
@@ -91,10 +106,18 @@ const SignatureScreen = () => {
91
106
  onOK={handleSignature}
92
107
  onEmpty={handleEmpty}
93
108
  onClear={handleClear}
109
+ onError={handleError}
94
110
  autoClear={true}
95
111
  descriptionText="Sign here"
96
112
  clearText="Clear"
97
- confirmText="Save"
113
+ confirmText={isLoading ? "Processing..." : "Save"}
114
+ penColor="#000000"
115
+ backgroundColor="rgba(255,255,255,0)"
116
+ webviewProps={{
117
+ // Custom WebView optimization
118
+ cacheEnabled: true,
119
+ androidLayerType: "hardware",
120
+ }}
98
121
  />
99
122
  </View>
100
123
  );
@@ -162,6 +185,8 @@ export default SignatureScreen;
162
185
  | `webStyle` | `string` | - | WebView style to override default style |
163
186
  | `webviewContainerStyle` | `object` | - | Style for the WebView container |
164
187
  | `androidLayerType` | `none\|software\|hardware` | `hardware` | Sets the Android WebView layer type |
188
+ | `onError` | `function` | - | Callback when an error occurs |
189
+ | `webviewProps` | `object` | `{}` | Additional props to pass to the underlying WebView |
165
190
 
166
191
  ## Methods
167
192
 
@@ -179,6 +204,76 @@ Access these methods using a ref to the SignatureCanvas component.
179
204
  | `undo()` | Undo last stroke |
180
205
  | `redo()` | Redo last stroke |
181
206
 
207
+ ## WebView Customization (New!)
208
+
209
+ The `webviewProps` parameter allows you to customize the underlying WebView behavior while maintaining signature functionality:
210
+
211
+ ```jsx
212
+ <SignatureCanvas
213
+ // ... other props
214
+ webviewProps={{
215
+ // Performance optimization
216
+ cacheEnabled: true,
217
+ androidLayerType: "hardware",
218
+ androidHardwareAccelerationDisabled: false,
219
+
220
+ // Security settings
221
+ allowFileAccess: false,
222
+ allowFileAccessFromFileURLs: false,
223
+ mixedContentMode: "never",
224
+
225
+ // UI customization
226
+ decelerationRate: 'fast',
227
+ bounces: false,
228
+
229
+ // Any other WebView props...
230
+ }}
231
+ />
232
+ ```
233
+
234
+ ### Performance Optimization Examples
235
+
236
+ ```jsx
237
+ // High-performance mode
238
+ <SignatureCanvas
239
+ webviewProps={{
240
+ cacheEnabled: true,
241
+ androidLayerType: "hardware",
242
+ androidHardwareAccelerationDisabled: false,
243
+ }}
244
+ />
245
+
246
+ // Low-memory mode
247
+ <SignatureCanvas
248
+ webviewProps={{
249
+ cacheEnabled: false,
250
+ androidLayerType: "software",
251
+ androidHardwareAccelerationDisabled: true,
252
+ }}
253
+ />
254
+ ```
255
+
256
+ ## Error Handling (Enhanced!)
257
+
258
+ ```jsx
259
+ const [error, setError] = useState(null);
260
+
261
+ const handleError = (error) => {
262
+ console.error('Signature error:', error);
263
+ setError(error.message);
264
+ // Error recovery is automatic, but you can handle it here
265
+ };
266
+
267
+ <SignatureCanvas
268
+ onError={handleError}
269
+ // Component automatically retries on recoverable errors
270
+ />
271
+
272
+ {error && (
273
+ <Text style={{ color: 'red' }}>Error: {error}</Text>
274
+ )}
275
+ ```
276
+
182
277
  ## Advanced Usage
183
278
 
184
279
  ### Using a Background Image
@@ -304,12 +399,162 @@ const styles = StyleSheet.create({
304
399
  });
305
400
  ```
306
401
 
402
+ ## Performance & Reliability
403
+
404
+ ### Automatic Error Recovery
405
+ - **Smart retry logic** with exponential backoff
406
+ - **Circuit breaker pattern** to prevent cascading failures
407
+ - **Memory leak prevention** with automatic cleanup
408
+ - **Performance monitoring** with automatic optimization
409
+
410
+ ### Performance Features
411
+ - **Debounced resize handling** for smooth interaction
412
+ - **Memory pressure detection** with adaptive optimization
413
+ - **Optimized rendering** with reduced re-renders
414
+ - **Device-specific optimization** based on hardware capabilities
415
+
416
+ ### Security Enhancements
417
+ - **Configurable WebView security** via `webviewProps`
418
+ - **Input validation** for all methods and callbacks
419
+ - **XSS protection** with content security policies
420
+ - **File access restrictions** by default
421
+
422
+ ## Migration Guide
423
+
424
+ ### From v4.6.x to v4.7.x
425
+
426
+ This version is fully backward compatible. New features:
427
+
428
+ ```jsx
429
+ // NEW: Enhanced error handling
430
+ <SignatureCanvas
431
+ onError={(error) => console.error(error)} // New callback
432
+ />
433
+
434
+ // NEW: WebView customization
435
+ <SignatureCanvas
436
+ webviewProps={{ // New prop
437
+ cacheEnabled: false,
438
+ androidLayerType: "software"
439
+ }}
440
+ />
441
+ ```
442
+
443
+ ## Troubleshooting
444
+
445
+ ### Common Issues
446
+
447
+ **Issue**: Signature pad not loading
448
+ ```jsx
449
+ // Solution: Add error handling and check WebView props
450
+ <SignatureCanvas
451
+ onError={(error) => console.log('Error:', error)}
452
+ onLoadEnd={() => console.log('Loaded successfully')}
453
+ webviewProps={{
454
+ startInLoadingState: true,
455
+ renderLoading: () => <ActivityIndicator />
456
+ }}
457
+ />
458
+ ```
459
+
460
+ **Issue**: Poor performance on older devices
461
+ ```jsx
462
+ // Solution: Use low-performance mode
463
+ <SignatureCanvas
464
+ webviewProps={{
465
+ androidLayerType: "software",
466
+ androidHardwareAccelerationDisabled: true,
467
+ cacheEnabled: false
468
+ }}
469
+ />
470
+ ```
471
+
472
+ **Issue**: Memory issues
473
+ ```jsx
474
+ // Solution: The component now handles this automatically
475
+ // But you can customize via webviewProps if needed
476
+ <SignatureCanvas
477
+ webviewProps={{
478
+ cacheEnabled: false, // Reduce memory usage
479
+ androidLayerType: "software" // Use software rendering
480
+ }}
481
+ />
482
+ ```
483
+
484
+ ## API Reference
485
+
486
+ For detailed API documentation, see:
487
+ - [WEBVIEW_PROPS.md](./WEBVIEW_PROPS.md) - WebView customization guide
488
+ - [TypeScript definitions](./index.d.ts) - Complete type definitions
489
+
307
490
  ## Core Technology
308
491
 
309
492
  This component is built on:
310
493
  - [signature_pad.js](https://github.com/szimek/signature_pad) for the core signature functionality
311
494
  - React Native WebView for cross-platform rendering
495
+ - Enhanced with performance monitoring and error recovery systems
496
+
497
+ ## Contributing
498
+
499
+ Contributions are welcome! Please read our contributing guidelines and submit pull requests to help improve this component.
500
+
501
+ ### Development Setup
502
+
503
+ ```bash
504
+ # Clone the repository
505
+ git clone https://github.com/YanYuanFE/react-native-signature-canvas.git
506
+
507
+ # Install dependencies
508
+ cd react-native-signature-canvas
509
+ npm install
510
+
511
+ # Run example apps
512
+ cd example/expo-app
513
+ npm install && npm start
514
+ ```
515
+
516
+ ## Changelog
517
+
518
+ ### v4.7.x (Latest)
519
+ - 🆕 Added `webviewProps` for WebView customization
520
+ - 🆕 Enhanced error handling with automatic recovery
521
+ - 🆕 Performance monitoring and optimization
522
+ - 🆕 Memory leak prevention
523
+ - 🆕 Improved TypeScript definitions
524
+ - 🔧 Fixed global variable pollution in WebView JavaScript
525
+ - 🔧 Added input validation for all methods
526
+ - ⚡ Optimized rendering performance
527
+
528
+ [View full changelog](./CHANGELOG.md)
312
529
 
313
530
  ## License
314
531
 
315
- MIT
532
+ MIT License - see [LICENSE](./LICENSE) file for details.
533
+
534
+
535
+ ## Buy Me a Coffee ☕
536
+
537
+ If you find this project helpful, consider supporting its development with cryptocurrency donations:
538
+
539
+ ### Cryptocurrency Donations
540
+
541
+ | Currency | Address | QR Code |
542
+ |----------|---------|----------|
543
+ | **Bitcoin (BTC)** | `bc1phyz9agr0m9l2w9pd8w85w4da2jt3wl4cre7vv0qq4uesm3fv00pscu96tux` | ![BTC QR](https://api.qrserver.com/v1/create-qr-code/?size=100x100&data=bc1phyz9agr0m9l2w9pd8w85w4da2jt3wl4cre7vv0qq4uesm3fv00pscu96tux) |
544
+ | **Ethereum (ETH)** | `0xf5dfe16b1e64e8e3a92063fb2922447e13b48945` | ![ETH QR](https://api.qrserver.com/v1/create-qr-code/?size=100x100&data=0xf5dfe16b1e64e8e3a92063fb2922447e13b48945) |
545
+ | **Solana (SOL)** | `3VuhyeTj3hMSrmzq7NctHkgFxvJrmtAUQTzagEBEu3Vm` | ![SOL QR](https://api.qrserver.com/v1/create-qr-code/?size=100x100&data=3VuhyeTj3hMSrmzq7NctHkgFxvJrmtAUQTzagEBEu3Vm) |
546
+
547
+
548
+ ### Other Ways to Support
549
+
550
+ - ⭐ Star this repository
551
+ - 🐛 Report bugs and issues
552
+ - 💡 Suggest new features
553
+ - 🤝 Contribute code improvements
554
+ - 📢 Share this project with others
555
+
556
+ Your support helps maintain and improve this open-source project. Thank you! 🙏
557
+
558
+ ---
559
+
560
+ **Made with ❤️ for the React Native community**