dynamsoft-capture-vision-react-native 2.6.1016 → 3.0.5100
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/LICENSE +2 -2
- package/README.md +7 -9
- package/android/build.gradle +73 -42
- package/android/src/main/cpp/CMakeLists.txt +22 -0
- package/android/src/main/cpp/ImgHO.cpp +95 -0
- package/android/src/main/cpp/ImgHO.h +34 -0
- package/android/src/main/cpp/JsiCore.cpp +284 -0
- package/android/src/main/cpp/JsiCore.h +51 -0
- package/android/src/main/cpp/JsiCvr.cpp +327 -0
- package/android/src/main/cpp/JsiCvr.h +54 -0
- package/android/src/main/cpp/JsiDbr.cpp +38 -0
- package/android/src/main/cpp/JsiDbr.h +26 -0
- package/android/src/main/cpp/JsiDce.cpp +59 -0
- package/android/src/main/cpp/JsiDce.h +17 -0
- package/android/src/main/cpp/JsiDcp.cpp +51 -0
- package/android/src/main/cpp/JsiDcp.h +31 -0
- package/android/src/main/cpp/JsiDdn.cpp +50 -0
- package/android/src/main/cpp/JsiDdn.h +28 -0
- package/android/src/main/cpp/JsiDlr.cpp +51 -0
- package/android/src/main/cpp/JsiDlr.h +26 -0
- package/android/src/main/cpp/JsiUtility.cpp +196 -0
- package/android/src/main/cpp/JsiUtility.h +16 -0
- package/android/src/main/cpp/RawBuffer.cpp +24 -0
- package/android/src/main/cpp/RawBuffer.h +24 -0
- package/android/src/main/cpp/android_log.h +14 -0
- package/android/src/main/dysJniLibs/debug/arm64-v8a/librn_dys.so +0 -0
- package/android/src/main/dysJniLibs/debug/armeabi-v7a/librn_dys.so +0 -0
- package/android/src/main/dysJniLibs/debug/x86/librn_dys.so +0 -0
- package/android/src/main/dysJniLibs/debug/x86_64/librn_dys.so +0 -0
- package/android/src/main/dysJniLibs/release/arm64-v8a/librn_dys.so +0 -0
- package/android/src/main/dysJniLibs/release/armeabi-v7a/librn_dys.so +0 -0
- package/android/src/main/dysJniLibs/release/x86/librn_dys.so +0 -0
- package/android/src/main/dysJniLibs/release/x86_64/librn_dys.so +0 -0
- package/android/src/{oldarch → main/java}/com/dynamsoft/reactnativelib/CVRModule.kt +4 -4
- package/android/src/{oldarch → main/java}/com/dynamsoft/reactnativelib/DCEModule.kt +10 -0
- package/android/src/main/java/com/dynamsoft/reactnativelib/ReactNativeDcvPackage.kt +13 -85
- package/android/src/{oldarch → main/java}/com/dynamsoft/reactnativelib/VersionsModule.kt +2 -2
- package/android/src/main/java/com/dynamsoft/reactnativelib/cvr/CaptureVisionRouterModuleImpl.kt +25 -25
- package/android/src/main/java/com/dynamsoft/reactnativelib/dce/CameraEnhancerModuleImpl.kt +23 -2
- package/android/src/main/java/com/dynamsoft/reactnativelib/license/LicenseModuleImpl.kt +1 -1
- package/android/src/main/java/com/dynamsoft/reactnativelib/utility/ImageManagerModuleImpl.kt +19 -4
- package/android/src/main/java/com/dynamsoft/reactnativelib/utils/ForCore.kt +14 -0
- package/android/src/main/java/com/dynamsoft/reactnativelib/utils/ForCvr.kt +12 -7
- package/android/src/main/java/com/dynamsoft/reactnativelib/utils/ForDBR.kt +1 -7
- package/android/src/main/java/com/dynamsoft/reactnativelib/utils/ForDCE.kt +2 -2
- package/android/src/main/java/com/dynamsoft/reactnativelib/utils/ForDDN.kt +27 -19
- package/dynamsoft-capture-vision-react-native.podspec +9 -7
- package/ios/CPP/DSImageData+HostObject.h +1 -1
- package/ios/CPP/RNDynamsoft+JSI.h +2 -2
- package/ios/CPP/RNDynamsoft+JSI.mm +18 -10
- package/ios/CPP/RNDynamsoft+Json.h +2 -13
- package/ios/CPP/RNDynamsoft+Json.m +48 -39
- package/ios/CPP/YeetJSIUtils.h +3 -1
- package/ios/CPP/YeetJSIUtils.mm +5 -0
- package/ios/RNDynamsoftCameraView.m +1 -1
- package/ios/RNDynamsoftCameraViewManager.m +23 -8
- package/ios/RNDynamsoftCaptureVisionRouter.mm +76 -45
- package/ios/RNDynamsoftImageEditorView.m +1 -1
- package/ios/RNDynamsoftImageEditorViewManager.mm +36 -13
- package/ios/RNDynamsoftImageManager.mm +33 -4
- package/ios/RNDynamsoftImageSourceAdapter.mm +1 -1
- package/ios/RNDynamsoftLicense.m +1 -1
- package/ios/RNDynamsoftMultiCrossFilter.m +9 -9
- package/ios/RNDynamsoftVersions.m +1 -13
- package/package.json +3 -11
- package/src/core/CapturedResultBase.tsx +18 -0
- package/src/core/EnumCaptureResultItemType.tsx +12 -6
- package/src/core/EnumCrossVerificationStatus.tsx +6 -6
- package/src/core/ImageData.tsx +1 -1
- package/src/core/index.tsx +1 -0
- package/src/cvr/CaptureVisionRouter.tsx +47 -51
- package/src/cvr/CapturedResult.tsx +24 -46
- package/src/cvr/CapturedResultReceiver.tsx +12 -19
- package/src/cvr/NativeDynamsoftCaptureVisionRouterModule.tsx +2 -2
- package/src/cvr/SimplifiedCaptureVisionSettings.tsx +4 -4
- package/src/dbr/DecodedBarcodesResult.tsx +3 -17
- package/src/dce/CameraEnhancer.tsx +9 -0
- package/src/dce/DynamsoftCameraViewNativeComponent.ts +2 -2
- package/src/dce/EnumResolution.tsx +7 -0
- package/src/dce/NativeDynamsoftCameraViewModule.tsx +4 -0
- package/src/dce/index.tsx +1 -0
- package/src/dcp/ParsedResult.tsx +3 -14
- package/src/ddn/DeskewedImageResultItem.tsx +40 -0
- package/src/ddn/DetectedQuadResultItem.tsx +3 -1
- package/src/ddn/EnhancedImageResultItem.tsx +20 -0
- package/src/ddn/ProcessedDocumentResult.tsx +27 -0
- package/src/ddn/SimplifiedDocumentNormalizerSettings.tsx +18 -3
- package/src/ddn/index.tsx +3 -3
- package/src/dlr/RecognizedTextLinesResult.tsx +2 -16
- package/src/index.tsx +0 -1
- package/src/utility/ImageManager.tsx +66 -45
- package/android/src/main/java/com/dynamsoft/reactnativelib/rtu/BarcodeScannerModuleImpl.kt +0 -80
- package/android/src/main/java/com/dynamsoft/reactnativelib/rtu/MRZScannerModuleImpl.kt +0 -77
- package/android/src/main/java/com/dynamsoft/reactnativelib/rtu/ScannerInterface.kt +0 -47
- package/android/src/main/jniLibs/arm64-v8a/librn_dys.so +0 -0
- package/android/src/main/jniLibs/armeabi-v7a/librn_dys.so +0 -0
- package/android/src/main/jniLibs/x86/librn_dys.so +0 -0
- package/android/src/main/jniLibs/x86_64/librn_dys.so +0 -0
- package/android/src/newarch/com/dynamsoft/reactnativelib/BarcodeScannerModule.kt +0 -22
- package/android/src/newarch/com/dynamsoft/reactnativelib/CVRModule.kt +0 -91
- package/android/src/newarch/com/dynamsoft/reactnativelib/CameraViewManager.kt +0 -52
- package/android/src/newarch/com/dynamsoft/reactnativelib/DCEModule.kt +0 -91
- package/android/src/newarch/com/dynamsoft/reactnativelib/ISAModule.kt +0 -60
- package/android/src/newarch/com/dynamsoft/reactnativelib/ImageEditorViewManager.kt +0 -16
- package/android/src/newarch/com/dynamsoft/reactnativelib/ImageEditorViewModule.kt +0 -24
- package/android/src/newarch/com/dynamsoft/reactnativelib/ImageManagerModule.kt +0 -12
- package/android/src/newarch/com/dynamsoft/reactnativelib/LicenseModule.kt +0 -14
- package/android/src/newarch/com/dynamsoft/reactnativelib/MRZScannerModule.kt +0 -22
- package/android/src/newarch/com/dynamsoft/reactnativelib/MultiCrossFilterModule.kt +0 -58
- package/android/src/newarch/com/dynamsoft/reactnativelib/VersionsModule.kt +0 -41
- package/android/src/oldarch/com/dynamsoft/reactnativelib/BarcodeScannerModule.kt +0 -24
- package/android/src/oldarch/com/dynamsoft/reactnativelib/MRZScannerModule.kt +0 -24
- package/ios/RNDynamsoftBarcodeScanner.h +0 -14
- package/ios/RNDynamsoftBarcodeScanner.m +0 -169
- package/ios/RNDynamsoftMRZScanner.h +0 -14
- package/ios/RNDynamsoftMRZScanner.m +0 -140
- package/src/ddn/DetectedQuadsResult.tsx +0 -31
- package/src/ddn/NormalizedImageResultItem.tsx +0 -32
- package/src/ddn/NormalizedImagesResult.tsx +0 -27
- package/src/rtu/BarcodeScanConfig.tsx +0 -104
- package/src/rtu/BarcodeScanResult.tsx +0 -31
- package/src/rtu/BarcodeScanner.tsx +0 -112
- package/src/rtu/EnumResultState.tsx +0 -21
- package/src/rtu/MRZScanConfig.tsx +0 -67
- package/src/rtu/MRZScanResult.tsx +0 -84
- package/src/rtu/MRZScanner.tsx +0 -90
- package/src/rtu/NativeDynamsoftBarcodeScannerModule.tsx +0 -6
- package/src/rtu/NativeDynamsoftMRZScannerModule.tsx +0 -6
- package/src/rtu/index.tsx +0 -7
- /package/android/src/main/{withNamespace/AndroidManifest.xml → AndroidManifest.xml} +0 -0
- /package/android/src/main/{withoutNamespace/AndroidManifest.xml → AndroidManifest_noPackage.xml} +0 -0
- /package/android/src/{oldarch → main/java}/com/dynamsoft/reactnativelib/CameraViewManager.kt +0 -0
- /package/android/src/{oldarch → main/java}/com/dynamsoft/reactnativelib/ISAModule.kt +0 -0
- /package/android/src/{oldarch → main/java}/com/dynamsoft/reactnativelib/ImageEditorViewManager.kt +0 -0
- /package/android/src/{oldarch → main/java}/com/dynamsoft/reactnativelib/ImageEditorViewModule.kt +0 -0
- /package/android/src/{oldarch → main/java}/com/dynamsoft/reactnativelib/ImageManagerModule.kt +0 -0
- /package/android/src/{oldarch → main/java}/com/dynamsoft/reactnativelib/LicenseModule.kt +0 -0
- /package/android/src/{oldarch → main/java}/com/dynamsoft/reactnativelib/MultiCrossFilterModule.kt +0 -0
|
@@ -72,9 +72,9 @@ void runOnMainThread(void (^block)(void))
|
|
|
72
72
|
@implementation DSSimplifiedCaptureVisionSettings (Json)
|
|
73
73
|
|
|
74
74
|
- (void)updateWithDicitionary:(NSDictionary *)dictionary {
|
|
75
|
-
NSNumber *
|
|
76
|
-
if (
|
|
77
|
-
self.
|
|
75
|
+
NSNumber *outputOriginalImage = [dictionary valueForKey:@"outputOriginalImage"];
|
|
76
|
+
if (outputOriginalImage) {
|
|
77
|
+
self.outputOriginalImage = outputOriginalImage.boolValue;
|
|
78
78
|
}
|
|
79
79
|
NSDictionary *roi = [dictionary valueForKey:@"roi"];
|
|
80
80
|
if (roi) {
|
|
@@ -112,7 +112,7 @@ void runOnMainThread(void (^block)(void))
|
|
|
112
112
|
|
|
113
113
|
- (NSObject *)toJson {
|
|
114
114
|
if (self) {
|
|
115
|
-
NSDictionary *dictionary = @{@"
|
|
115
|
+
NSDictionary *dictionary = @{@"outputOriginalImage":@(self.outputOriginalImage),
|
|
116
116
|
@"roi":self.roi ? [self.roi toJson] : [NSNull null],
|
|
117
117
|
@"roiMeasuredInPercentage":@(self.roiMeasuredInPercentage),
|
|
118
118
|
@"maxParallelTasks":@(self.maxParallelTasks),
|
|
@@ -134,7 +134,8 @@ void runOnMainThread(void (^block)(void))
|
|
|
134
134
|
- (void)updateWithDicitionary:(NSDictionary *)dictionary {
|
|
135
135
|
NSString *_barcodeFormatIdsNumberString = [dictionary valueForKey:@"_barcodeFormatIdsNumberString"];
|
|
136
136
|
if (_barcodeFormatIdsNumberString) {
|
|
137
|
-
|
|
137
|
+
NSUInteger unsignedIntegerValue = strtoull([_barcodeFormatIdsNumberString UTF8String], NULL, 10);
|
|
138
|
+
self.barcodeFormatIds = unsignedIntegerValue;
|
|
138
139
|
}
|
|
139
140
|
NSNumber *expectedBarcodesCount = [dictionary valueForKey:@"expectedBarcodesCount"];
|
|
140
141
|
if (expectedBarcodesCount) {
|
|
@@ -377,17 +378,27 @@ void runOnMainThread(void (^block)(void))
|
|
|
377
378
|
};
|
|
378
379
|
}
|
|
379
380
|
break;
|
|
380
|
-
case
|
|
381
|
+
case DSCapturedResultItemTypeDeskewedImage:
|
|
381
382
|
{
|
|
382
|
-
|
|
383
|
+
DSDeskewedImageResultItem *item = (DSDeskewedImageResultItem *)self;
|
|
383
384
|
dictionary = @{ @"type":@(item.type),
|
|
384
385
|
@"targetROIDefName":item.targetROIDefName,
|
|
385
386
|
@"taskName":item.taskName,
|
|
386
|
-
@"
|
|
387
|
-
@"crossVerificationStatus":@(item.crossVerificationStatus)
|
|
387
|
+
@"sourceDeskewQuad":[item.sourceDeskewQuad toJson],
|
|
388
|
+
@"crossVerificationStatus":@(item.crossVerificationStatus),
|
|
389
|
+
@"originalToLocalMatrix":CGAffineTransformToArray(item.originalToLocalMatrix)
|
|
388
390
|
};
|
|
389
391
|
}
|
|
390
392
|
break;
|
|
393
|
+
case DSCapturedResultItemTypeEnhancedImage: {
|
|
394
|
+
DSEnhancedImageResultItem *item = (DSEnhancedImageResultItem *)self;
|
|
395
|
+
dictionary = @{ @"type":@(item.type),
|
|
396
|
+
@"targetROIDefName":item.targetROIDefName,
|
|
397
|
+
@"taskName":item.taskName,
|
|
398
|
+
@"originalToLocalMatrix":CGAffineTransformToArray(item.originalToLocalMatrix)
|
|
399
|
+
};
|
|
400
|
+
break;
|
|
401
|
+
}
|
|
391
402
|
case DSCapturedResultItemTypeParsedResult:
|
|
392
403
|
{
|
|
393
404
|
DSParsedResultItem *item = (DSParsedResultItem *)self;
|
|
@@ -475,56 +486,54 @@ void runOnMainThread(void (^block)(void))
|
|
|
475
486
|
|
|
476
487
|
@end
|
|
477
488
|
|
|
478
|
-
@implementation
|
|
489
|
+
@implementation DSProcessedDocumentResult (Json)
|
|
479
490
|
|
|
480
491
|
- (NSObject *)toJson {
|
|
481
492
|
if (self) {
|
|
482
|
-
id
|
|
483
|
-
if (self.
|
|
493
|
+
id detectedQuadResultItems;
|
|
494
|
+
if (self.detectedQuadResultItems.count > 0) {
|
|
484
495
|
NSMutableArray *array = [NSMutableArray array];
|
|
485
|
-
for (DSDetectedQuadResultItem *item in self.
|
|
496
|
+
for (DSDetectedQuadResultItem *item in self.detectedQuadResultItems) {
|
|
486
497
|
NSDictionary *obj = [item toJson];
|
|
487
498
|
if (obj) {
|
|
488
499
|
[array addObject:obj];
|
|
489
500
|
}
|
|
490
501
|
}
|
|
491
|
-
|
|
502
|
+
detectedQuadResultItems = [array copy];
|
|
492
503
|
} else {
|
|
493
|
-
|
|
504
|
+
detectedQuadResultItems = [NSNull null];
|
|
494
505
|
}
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
@"rotationTransformMatrix":CGAffineTransformToArray(self.rotationTransformMatrix),
|
|
498
|
-
@"errorCode":@(self.errorCode),
|
|
499
|
-
@"errorMessage":self.errorMessage ? self.errorMessage : [NSNull null]
|
|
500
|
-
};
|
|
501
|
-
return dictionary;
|
|
502
|
-
} else {
|
|
503
|
-
return [NSNull null];
|
|
504
|
-
}
|
|
505
|
-
}
|
|
506
|
-
|
|
507
|
-
@end
|
|
508
|
-
|
|
509
|
-
@implementation DSNormalizedImagesResult (Json)
|
|
510
|
-
|
|
511
|
-
- (NSObject *)toJson {
|
|
512
|
-
if (self) {
|
|
513
|
-
id items;
|
|
514
|
-
if (self.items.count > 0) {
|
|
506
|
+
id deskewedImageResultItems;
|
|
507
|
+
if (self.deskewedImageResultItems.count > 0) {
|
|
515
508
|
NSMutableArray *array = [NSMutableArray array];
|
|
516
|
-
for (
|
|
509
|
+
for (DSDeskewedImageResultItem *item in self.deskewedImageResultItems) {
|
|
517
510
|
NSDictionary *obj = [item toJson];
|
|
518
511
|
if (obj) {
|
|
519
512
|
[array addObject:obj];
|
|
520
513
|
}
|
|
521
514
|
}
|
|
522
|
-
|
|
515
|
+
deskewedImageResultItems = [array copy];
|
|
523
516
|
} else {
|
|
524
|
-
|
|
517
|
+
deskewedImageResultItems = [NSNull null];
|
|
525
518
|
}
|
|
519
|
+
id enhancedImageResultItems;
|
|
520
|
+
if (self.enhancedImageResultItems.count > 0) {
|
|
521
|
+
NSMutableArray *array = [NSMutableArray array];
|
|
522
|
+
for (DSEnhancedImageResultItem *item in self.enhancedImageResultItems) {
|
|
523
|
+
NSDictionary *obj = [item toJson];
|
|
524
|
+
if (obj) {
|
|
525
|
+
[array addObject:obj];
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
enhancedImageResultItems = [array copy];
|
|
529
|
+
} else {
|
|
530
|
+
enhancedImageResultItems = [NSNull null];
|
|
531
|
+
}
|
|
532
|
+
|
|
526
533
|
NSDictionary *dictionary = @{@"originalImageHashId":self.originalImageHashId,
|
|
527
|
-
@"
|
|
534
|
+
@"detectedQuadResultItems":detectedQuadResultItems,
|
|
535
|
+
@"deskewedImageResultItems":deskewedImageResultItems,
|
|
536
|
+
@"enhancedImageResultItems":enhancedImageResultItems,
|
|
528
537
|
@"rotationTransformMatrix":CGAffineTransformToArray(self.rotationTransformMatrix),
|
|
529
538
|
@"errorCode":@(self.errorCode),
|
|
530
539
|
@"errorMessage":self.errorMessage ? self.errorMessage : [NSNull null]
|
package/ios/CPP/YeetJSIUtils.h
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
#import <jsi/jsi.h>
|
|
7
7
|
#import <React/RCTBridgeModule.h>
|
|
8
8
|
#include "ImageDataHostObject.hpp"
|
|
9
|
-
#import <
|
|
9
|
+
#import <DynamsoftCaptureVisionBundle/DSImageData.h>
|
|
10
10
|
|
|
11
11
|
using namespace facebook;
|
|
12
12
|
/**
|
|
@@ -34,6 +34,8 @@ RCTResponseSenderBlock convertJSIFunctionToCallback(
|
|
|
34
34
|
jsi::Runtime &runtime,
|
|
35
35
|
const jsi::Function &value);
|
|
36
36
|
|
|
37
|
+
NSData* convertArrayBufferToNSData(jsi::Runtime &runtime, const jsi::ArrayBuffer &buffer);
|
|
38
|
+
|
|
37
39
|
struct Promise {
|
|
38
40
|
Promise(jsi::Runtime &rt, jsi::Function resolve, jsi::Function reject);
|
|
39
41
|
|
package/ios/CPP/YeetJSIUtils.mm
CHANGED
|
@@ -149,6 +149,11 @@ RCTResponseSenderBlock convertJSIFunctionToCallback(
|
|
|
149
149
|
};
|
|
150
150
|
}
|
|
151
151
|
|
|
152
|
+
NSData* convertArrayBufferToNSData(jsi::Runtime &runtime, const jsi::ArrayBuffer &buffer) {
|
|
153
|
+
return [NSData dataWithBytes:buffer.data(runtime)
|
|
154
|
+
length:buffer.size(runtime)];
|
|
155
|
+
}
|
|
156
|
+
|
|
152
157
|
Promise::Promise(jsi::Runtime &rt, jsi::Function resolve, jsi::Function reject)
|
|
153
158
|
: runtime_(rt), resolve_(std::move(resolve)), reject_(std::move(reject)) {}
|
|
154
159
|
|
|
@@ -4,8 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
#import "RNDynamsoftCameraViewManager.h"
|
|
6
6
|
#import "RNDynamsoftCameraView.h"
|
|
7
|
-
#import <
|
|
8
|
-
#import <DynamsoftCore/DynamsoftCore.h>
|
|
7
|
+
#import <DynamsoftCaptureVisionBundle/DynamsoftCaptureVisionBundle.h>
|
|
9
8
|
#import <React/RCTUIManager.h>
|
|
10
9
|
#import "RNDynamsoftImageSourceAdapter.h"
|
|
11
10
|
|
|
@@ -60,11 +59,24 @@ RCT_EXPORT_METHOD(close) {
|
|
|
60
59
|
}
|
|
61
60
|
|
|
62
61
|
RCT_EXPORT_METHOD(setCameraView:(nonnull NSNumber *)tag) {
|
|
62
|
+
[self trySetCameraViewWithTag:tag attempt:1];
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
- (void)trySetCameraViewWithTag:(nonnull NSNumber *)tag attempt:(NSInteger)attempt {
|
|
66
|
+
const NSInteger maxAttempts = 10;
|
|
67
|
+
const NSTimeInterval retryDelay = 0.1; // 100ms
|
|
68
|
+
|
|
63
69
|
[self.bridge.uiManager addUIBlock:
|
|
64
70
|
^(__unused RCTUIManager *uiManager, NSDictionary<NSNumber *, UIView *> *viewRegistry) {
|
|
65
71
|
id view = viewRegistry[tag];
|
|
66
72
|
if (!view || ![view isKindOfClass:[RNDynamsoftCameraView class]]) {
|
|
67
|
-
|
|
73
|
+
if (attempt < maxAttempts) {
|
|
74
|
+
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(retryDelay * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
|
|
75
|
+
[self trySetCameraViewWithTag:tag attempt:attempt + 1];
|
|
76
|
+
});
|
|
77
|
+
} else {
|
|
78
|
+
RCTLogError(@"Cannot find RNDynamsoftCameraView with tag #%@ after %ld attempts", tag, (long)attempt);
|
|
79
|
+
}
|
|
68
80
|
} else {
|
|
69
81
|
self.dce.cameraView = ((RNDynamsoftCameraView *)view).cameraView;
|
|
70
82
|
}
|
|
@@ -72,8 +84,7 @@ RCT_EXPORT_METHOD(setCameraView:(nonnull NSNumber *)tag) {
|
|
|
72
84
|
}
|
|
73
85
|
|
|
74
86
|
RCT_EXPORT_METHOD(selectCamera:(NSInteger)position) {
|
|
75
|
-
|
|
76
|
-
[self.dce selectCameraWithPosition:position error:&error];
|
|
87
|
+
[self.dce selectCameraWithPosition:position completion:nil];
|
|
77
88
|
}
|
|
78
89
|
|
|
79
90
|
RCT_EXPORT_METHOD(getCameraPosition:(RCTPromiseResolveBlock)resolve
|
|
@@ -87,7 +98,7 @@ RCT_EXPORT_METHOD(setFocus:(CGFloat)x y:(CGFloat)y mode:(NSInteger)mode) {
|
|
|
87
98
|
}
|
|
88
99
|
|
|
89
100
|
RCT_EXPORT_METHOD(getFocusMode:(RCTPromiseResolveBlock)resolve
|
|
90
|
-
rejecter:(RCTPromiseRejectBlock)reject)
|
|
101
|
+
rejecter:(RCTPromiseRejectBlock)reject)
|
|
91
102
|
{
|
|
92
103
|
resolve(@([self.dce getFocusMode]));
|
|
93
104
|
}
|
|
@@ -110,9 +121,9 @@ RCT_EXPORT_METHOD(disableEnhancedFeatures:(NSInteger)features) {
|
|
|
110
121
|
[self.dce disableEnhancedFeatures:features];
|
|
111
122
|
}
|
|
112
123
|
|
|
113
|
-
RCT_EXPORT_METHOD(setScanRegion:(NSDictionary *)region
|
|
124
|
+
RCT_EXPORT_METHOD(setScanRegion:(NSDictionary *)region
|
|
114
125
|
resolve:(RCTPromiseResolveBlock)resolve
|
|
115
|
-
rejecter: (RCTPromiseRejectBlock)reject)
|
|
126
|
+
rejecter: (RCTPromiseRejectBlock)reject)
|
|
116
127
|
{
|
|
117
128
|
if (region) {
|
|
118
129
|
NSNumber *top = [region valueForKey:@"top"];
|
|
@@ -164,4 +175,8 @@ RCT_EXPORT_METHOD(vibrate) {
|
|
|
164
175
|
[DSFeedback vibrate];
|
|
165
176
|
}
|
|
166
177
|
|
|
178
|
+
RCT_EXPORT_METHOD(setResolution:(NSInteger)resolution) {
|
|
179
|
+
[self.dce setResolution:resolution];
|
|
180
|
+
}
|
|
181
|
+
|
|
167
182
|
@end
|
|
@@ -3,11 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
#import "RNDynamsoftCaptureVisionRouter.h"
|
|
6
|
-
#import <
|
|
7
|
-
#import <DynamsoftBarcodeReader/DynamsoftBarcodeReader.h>
|
|
8
|
-
#import <DynamsoftLabelRecognizer/DynamsoftLabelRecognizer.h>
|
|
9
|
-
#import <DynamsoftDocumentNormalizer/DynamsoftDocumentNormalizer.h>
|
|
10
|
-
#import <DynamsoftUtility/DynamsoftUtility.h>
|
|
6
|
+
#import <DynamsoftCaptureVisionBundle/DynamsoftCaptureVisionBundle.h>
|
|
11
7
|
#import <React/RCTUIManager.h>
|
|
12
8
|
#import "RNDynamsoftImageSourceAdapter.h"
|
|
13
9
|
#import "RNDynamsoft+Json.h"
|
|
@@ -25,7 +21,9 @@ using namespace std;
|
|
|
25
21
|
|
|
26
22
|
@property (nonatomic, strong) DSCaptureVisionRouter *cvr;
|
|
27
23
|
|
|
28
|
-
@property (nonatomic, strong) NSMutableArray<DSImageData *> *
|
|
24
|
+
@property (nonatomic, strong) NSMutableArray<DSImageData *> *deskewedImageDataArray;
|
|
25
|
+
|
|
26
|
+
@property (nonatomic, strong) NSMutableArray<DSImageData *> *enhancedImageDataArray;
|
|
29
27
|
|
|
30
28
|
@property (nonatomic, strong) NSMutableDictionary<NSString *, NSNumber *> *receiveDictionary;
|
|
31
29
|
|
|
@@ -55,7 +53,7 @@ RCT_EXPORT_MODULE(DynamsoftCaptureVisionRouterModule)
|
|
|
55
53
|
|
|
56
54
|
RCT_EXPORT_METHOD(startCapturing:(NSString *)templateName
|
|
57
55
|
resolve:(RCTPromiseResolveBlock)resolve
|
|
58
|
-
rejecter: (RCTPromiseRejectBlock)reject)
|
|
56
|
+
rejecter: (RCTPromiseRejectBlock)reject)
|
|
59
57
|
{
|
|
60
58
|
[self.cvr startCapturing:templateName completionHandler:^(BOOL isSuccess, NSError * _Nullable error) {
|
|
61
59
|
if (!isSuccess && error) {
|
|
@@ -88,7 +86,7 @@ RCT_EXPORT_METHOD(setInput:(NSString *)key) {
|
|
|
88
86
|
}
|
|
89
87
|
}
|
|
90
88
|
|
|
91
|
-
RCT_EXPORT_METHOD(
|
|
89
|
+
RCT_EXPORT_METHOD(getSimplifiedSettings:(NSString *)name
|
|
92
90
|
resolve:(RCTPromiseResolveBlock)resolve
|
|
93
91
|
rejecter: (RCTPromiseRejectBlock)reject)
|
|
94
92
|
{
|
|
@@ -105,7 +103,7 @@ RCT_EXPORT_METHOD(getSettings:(NSString *)name
|
|
|
105
103
|
RCT_EXPORT_METHOD(updateSettings:(NSDictionary *)dictionary
|
|
106
104
|
templateName:(NSString *)templateName
|
|
107
105
|
resolve:(RCTPromiseResolveBlock)resolve
|
|
108
|
-
rejecter: (RCTPromiseRejectBlock)reject)
|
|
106
|
+
rejecter: (RCTPromiseRejectBlock)reject)
|
|
109
107
|
{
|
|
110
108
|
NSError *error;
|
|
111
109
|
DSSimplifiedCaptureVisionSettings *settings = [self.cvr getSimplifiedSettings:templateName error:nil];
|
|
@@ -120,7 +118,7 @@ RCT_EXPORT_METHOD(updateSettings:(NSDictionary *)dictionary
|
|
|
120
118
|
}
|
|
121
119
|
|
|
122
120
|
RCT_EXPORT_METHOD(resetSettings:(RCTPromiseResolveBlock)resolve
|
|
123
|
-
rejecter: (RCTPromiseRejectBlock)reject)
|
|
121
|
+
rejecter: (RCTPromiseRejectBlock)reject)
|
|
124
122
|
{
|
|
125
123
|
NSError *error;
|
|
126
124
|
BOOL isSuccess = [self.cvr resetSettings:&error];
|
|
@@ -159,11 +157,12 @@ RCT_EXPORT_METHOD(initSettingsFromFile:(NSString *)path
|
|
|
159
157
|
}
|
|
160
158
|
|
|
161
159
|
RCT_EXPORT_METHOD(outputSettings:(NSString *)name
|
|
160
|
+
includeDefaultValues:(BOOL)includeDefaultValues
|
|
162
161
|
resolve:(RCTPromiseResolveBlock)resolve
|
|
163
162
|
rejecter: (RCTPromiseRejectBlock)reject)
|
|
164
163
|
{
|
|
165
164
|
NSError *error;
|
|
166
|
-
NSString *setting = [self.cvr outputSettings:name error:&error];
|
|
165
|
+
NSString *setting = [self.cvr outputSettings:name includeDefaultValues:includeDefaultValues error:&error];
|
|
167
166
|
if (error) {
|
|
168
167
|
NSString *code = [NSString stringWithFormat:@"%ld",(long)error.code];
|
|
169
168
|
reject(code, error.localizedDescription, error);
|
|
@@ -172,13 +171,14 @@ RCT_EXPORT_METHOD(outputSettings:(NSString *)name
|
|
|
172
171
|
}
|
|
173
172
|
}
|
|
174
173
|
|
|
175
|
-
RCT_EXPORT_METHOD(outputSettingsToFile:(NSString *)name
|
|
174
|
+
RCT_EXPORT_METHOD(outputSettingsToFile:(NSString *)name
|
|
176
175
|
file:(NSString *)path
|
|
176
|
+
includeDefaultValues:(BOOL)includeDefaultValues
|
|
177
177
|
resolve:(RCTPromiseResolveBlock)resolve
|
|
178
|
-
rejecter: (RCTPromiseRejectBlock)reject)
|
|
178
|
+
rejecter: (RCTPromiseRejectBlock)reject)
|
|
179
179
|
{
|
|
180
180
|
NSError *error;
|
|
181
|
-
BOOL isSuccess = [self.cvr outputSettingsToFile:name
|
|
181
|
+
BOOL isSuccess = [self.cvr outputSettingsToFile:name filePath:path includeDefaultValues:includeDefaultValues error:&error];
|
|
182
182
|
if (!isSuccess && error) {
|
|
183
183
|
NSString *code = [NSString stringWithFormat:@"%ld",(long)error.code];
|
|
184
184
|
reject(code, error.localizedDescription, error);
|
|
@@ -216,8 +216,7 @@ RCT_EXPORT_METHOD(removeFilter:(NSString *)key) {
|
|
|
216
216
|
{
|
|
217
217
|
return @[@"onCapturedResultReceived",
|
|
218
218
|
@"onDecodedBarcodesReceived",
|
|
219
|
-
@"
|
|
220
|
-
@"onNormalizedImagesReceived",
|
|
219
|
+
@"onProcessedDocumentResultReceived",
|
|
221
220
|
@"onRecognizedTextLinesReceived",
|
|
222
221
|
@"onParsedResultsReceived"];
|
|
223
222
|
}
|
|
@@ -234,12 +233,19 @@ RCT_EXPORT_METHOD(removeFilter:(NSString *)key) {
|
|
|
234
233
|
|
|
235
234
|
- (void)onCapturedResultReceived:(DSCapturedResult *)result {
|
|
236
235
|
if (hasListeners && [self.receiveDictionary valueForKey:@"onCapturedResultReceived"].boolValue) {
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
for (
|
|
236
|
+
DSProcessedDocumentResult *imageResult = result.processedDocumentResult;
|
|
237
|
+
[self.deskewedImageDataArray removeAllObjects];
|
|
238
|
+
for (DSDeskewedImageResultItem *item in imageResult.deskewedImageResultItems) {
|
|
239
|
+
DSImageData *data = item.imageData;
|
|
240
|
+
if (data) {
|
|
241
|
+
[self.deskewedImageDataArray addObject:data];
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
[self.enhancedImageDataArray removeAllObjects];
|
|
245
|
+
for (DSEnhancedImageResultItem *item in imageResult.enhancedImageResultItems) {
|
|
240
246
|
DSImageData *data = item.imageData;
|
|
241
247
|
if (data) {
|
|
242
|
-
[self.
|
|
248
|
+
[self.enhancedImageDataArray addObject:data];
|
|
243
249
|
}
|
|
244
250
|
}
|
|
245
251
|
[self sendEventWithName:@"onCapturedResultReceived" body:[result toJson]];
|
|
@@ -256,24 +262,23 @@ RCT_EXPORT_METHOD(removeFilter:(NSString *)key) {
|
|
|
256
262
|
}
|
|
257
263
|
}
|
|
258
264
|
|
|
259
|
-
- (void)
|
|
260
|
-
if (hasListeners && [self.receiveDictionary valueForKey:@"
|
|
261
|
-
[self
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
for (DSNormalizedImageResultItem *item in result.items) {
|
|
265
|
+
- (void)onProcessedDocumentResultReceived:(DSProcessedDocumentResult *)result {
|
|
266
|
+
if (hasListeners && [self.receiveDictionary valueForKey:@"onProcessedDocumentResultReceived"].boolValue) {
|
|
267
|
+
[self.deskewedImageDataArray removeAllObjects];
|
|
268
|
+
for (DSDeskewedImageResultItem *item in result.deskewedImageResultItems) {
|
|
269
|
+
DSImageData *data = item.imageData;
|
|
270
|
+
if (data) {
|
|
271
|
+
[self.deskewedImageDataArray addObject:data];
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
[self.enhancedImageDataArray removeAllObjects];
|
|
275
|
+
for (DSEnhancedImageResultItem *item in result.enhancedImageResultItems) {
|
|
271
276
|
DSImageData *data = item.imageData;
|
|
272
277
|
if (data) {
|
|
273
|
-
[self.
|
|
278
|
+
[self.enhancedImageDataArray addObject:data];
|
|
274
279
|
}
|
|
275
280
|
}
|
|
276
|
-
[self sendEventWithName:@"
|
|
281
|
+
[self sendEventWithName:@"onProcessedDocumentResultReceived" body:[result toJson]];
|
|
277
282
|
dispatch_time_t timeout = dispatch_time(DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC);
|
|
278
283
|
__unused long result = dispatch_semaphore_wait(semaphore, timeout);
|
|
279
284
|
}
|
|
@@ -296,11 +301,18 @@ RCT_EXPORT_METHOD(removeFilter:(NSString *)key) {
|
|
|
296
301
|
}
|
|
297
302
|
|
|
298
303
|
#pragma mark - Private
|
|
299
|
-
- (NSMutableArray<DSImageData *> *)
|
|
300
|
-
if (!
|
|
301
|
-
|
|
304
|
+
- (NSMutableArray<DSImageData *> *)deskewedImageDataArray {
|
|
305
|
+
if (!_deskewedImageDataArray) {
|
|
306
|
+
_deskewedImageDataArray = [NSMutableArray array];
|
|
302
307
|
}
|
|
303
|
-
return
|
|
308
|
+
return _deskewedImageDataArray;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
- (NSMutableArray<DSImageData *> *)enhancedImageDataArray {
|
|
312
|
+
if (!_enhancedImageDataArray) {
|
|
313
|
+
_enhancedImageDataArray = [NSMutableArray array];
|
|
314
|
+
}
|
|
315
|
+
return _enhancedImageDataArray;
|
|
304
316
|
}
|
|
305
317
|
|
|
306
318
|
- (NSMutableDictionary<NSString *,DSMultiFrameResultCrossFilter *> *)filterDictionary {
|
|
@@ -382,23 +394,42 @@ static void install(jsi::Runtime &jsiRuntime, RNDynamsoftCaptureVisionRouter *rn
|
|
|
382
394
|
const Value &thisValue,
|
|
383
395
|
const Value *arguments,
|
|
384
396
|
size_t count) -> Value {
|
|
385
|
-
|
|
397
|
+
ArrayBuffer buffer = arguments[0].asObject(runtime).getArrayBuffer(runtime);
|
|
398
|
+
NSData *data = convertArrayBufferToNSData(runtime, buffer);
|
|
386
399
|
NSString *name = convertJSIStringToNSString(runtime, arguments[1].getString(runtime));
|
|
387
|
-
NSData *data = [[NSData alloc] initWithBase64EncodedString:bytes options:(NSDataBase64DecodingIgnoreUnknownCharacters)];
|
|
388
400
|
DSCapturedResult *result = [rnCapture.cvr captureFromFileBytes:data templateName:name];
|
|
389
401
|
return [result convertToJSIObject:runtime];
|
|
390
402
|
});
|
|
391
403
|
jsiRuntime.global().setProperty(jsiRuntime, captureFileBytes, std::move(captureFileBytesFunc));
|
|
392
404
|
|
|
393
|
-
const char*
|
|
394
|
-
auto
|
|
395
|
-
PropNameID::forAscii(jsiRuntime,
|
|
405
|
+
const char* getCurrentDeskewedImages = "getCurrentDeskewedImages";
|
|
406
|
+
auto getCurrentDeskewedImagesFunc = Function::createFromHostFunction(jsiRuntime,
|
|
407
|
+
PropNameID::forAscii(jsiRuntime, getCurrentDeskewedImages),
|
|
408
|
+
0,
|
|
409
|
+
[rnCapture](Runtime &runtime,
|
|
410
|
+
const Value &thisValue,
|
|
411
|
+
const Value *arguments,
|
|
412
|
+
size_t count) -> Value {
|
|
413
|
+
NSMutableArray<DSImageData *> *imageDataArray = rnCapture.deskewedImageDataArray;
|
|
414
|
+
Array array(runtime, imageDataArray.count);
|
|
415
|
+
for (int i = 0; i < imageDataArray.count; i++) {
|
|
416
|
+
ImageDataHostObject hostObject = [[imageDataArray objectAtIndex:i] hostObject];
|
|
417
|
+
Object obj = Object::createFromHostObject(runtime, std::make_shared<ImageDataHostObject>(hostObject));
|
|
418
|
+
array.setValueAtIndex(runtime, i, obj);
|
|
419
|
+
}
|
|
420
|
+
return array;
|
|
421
|
+
});
|
|
422
|
+
jsiRuntime.global().setProperty(jsiRuntime, getCurrentDeskewedImages, std::move(getCurrentDeskewedImagesFunc));
|
|
423
|
+
|
|
424
|
+
const char* getCurrentEnhancedImages = "getCurrentEnhancedImages";
|
|
425
|
+
auto getCurrentEnhancedImagesFunc = Function::createFromHostFunction(jsiRuntime,
|
|
426
|
+
PropNameID::forAscii(jsiRuntime, getCurrentEnhancedImages),
|
|
396
427
|
0,
|
|
397
428
|
[rnCapture](Runtime &runtime,
|
|
398
429
|
const Value &thisValue,
|
|
399
430
|
const Value *arguments,
|
|
400
431
|
size_t count) -> Value {
|
|
401
|
-
NSMutableArray<DSImageData *> *imageDataArray = rnCapture.
|
|
432
|
+
NSMutableArray<DSImageData *> *imageDataArray = rnCapture.enhancedImageDataArray;
|
|
402
433
|
Array array(runtime, imageDataArray.count);
|
|
403
434
|
for (int i = 0; i < imageDataArray.count; i++) {
|
|
404
435
|
ImageDataHostObject hostObject = [[imageDataArray objectAtIndex:i] hostObject];
|
|
@@ -407,7 +438,7 @@ static void install(jsi::Runtime &jsiRuntime, RNDynamsoftCaptureVisionRouter *rn
|
|
|
407
438
|
}
|
|
408
439
|
return array;
|
|
409
440
|
});
|
|
410
|
-
jsiRuntime.global().setProperty(jsiRuntime,
|
|
441
|
+
jsiRuntime.global().setProperty(jsiRuntime, getCurrentEnhancedImages, std::move(getCurrentEnhancedImagesFunc));
|
|
411
442
|
|
|
412
443
|
const char* getOriginalImage = "cvr_getOriginalImage";
|
|
413
444
|
auto getOriginalImageFunc = Function::createFromHostFunction(jsiRuntime,
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
#import "RNDynamsoftImageEditorViewManager.h"
|
|
6
6
|
#import "RNDynamsoftImageEditorView.h"
|
|
7
|
-
#import <
|
|
7
|
+
#import <DynamsoftCaptureVisionBundle/DynamsoftCaptureVisionBundle.h>
|
|
8
8
|
#import <React/RCTBridge+Private.h>
|
|
9
9
|
#import "DSImageData+HostObject.h"
|
|
10
10
|
#import <React/RCTUIManager.h>
|
|
@@ -23,11 +23,24 @@ RCT_EXPORT_MODULE(DynamsoftImageEditorView)
|
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
RCT_EXPORT_METHOD(setQuads:(nonnull NSNumber *)tag quadArray:(NSArray *)array layerId:(NSInteger)layerId) {
|
|
26
|
+
[self trySetQuadsWithTag:tag quadArray:array layerId:layerId attempt:1];
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
- (void)trySetQuadsWithTag:(nonnull NSNumber *)tag quadArray:(NSArray *)array layerId:(NSInteger)layerId attempt:(NSInteger)attempt {
|
|
30
|
+
const NSInteger maxAttempts = 10;
|
|
31
|
+
const NSTimeInterval retryDelay = 0.1; // 100ms
|
|
32
|
+
|
|
26
33
|
[self.bridge.uiManager addUIBlock:
|
|
27
34
|
^(__unused RCTUIManager *uiManager, NSDictionary<NSNumber *, UIView *> *viewRegistry) {
|
|
28
35
|
id view = viewRegistry[tag];
|
|
29
36
|
if (!view || ![view isKindOfClass:[RNDynamsoftImageEditorView class]]) {
|
|
30
|
-
|
|
37
|
+
if (attempt < maxAttempts) {
|
|
38
|
+
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(retryDelay * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
|
|
39
|
+
[self trySetQuadsWithTag:tag quadArray:array layerId:layerId attempt:attempt + 1];
|
|
40
|
+
});
|
|
41
|
+
} else {
|
|
42
|
+
RCTLogError(@"Cannot find RNDynamsoftImageEditorView with tag #%@ after %ld attempts", tag, (long)attempt);
|
|
43
|
+
}
|
|
31
44
|
} else {
|
|
32
45
|
if (array && array.count > 0) {
|
|
33
46
|
NSMutableArray<DSQuadDrawingItem *> *items = [NSMutableArray array];
|
|
@@ -46,7 +59,7 @@ RCT_EXPORT_METHOD(setQuads:(nonnull NSNumber *)tag quadArray:(NSArray *)array la
|
|
|
46
59
|
|
|
47
60
|
RCT_EXPORT_METHOD(getSelectedQuad:(nonnull NSNumber *)tag
|
|
48
61
|
resolver:(RCTPromiseResolveBlock)resolve
|
|
49
|
-
rejecter:(RCTPromiseRejectBlock)reject)
|
|
62
|
+
rejecter:(RCTPromiseRejectBlock)reject)
|
|
50
63
|
{
|
|
51
64
|
[self.bridge.uiManager addUIBlock:
|
|
52
65
|
^(__unused RCTUIManager *uiManager, NSDictionary<NSNumber *, UIView *> *viewRegistry) {
|
|
@@ -100,7 +113,7 @@ static void install(jsi::Runtime &jsiRuntime, RNDynamsoftImageEditorViewManager
|
|
|
100
113
|
if (obj.isHostObject<ImageDataHostObject>(runtime)) {
|
|
101
114
|
ImageDataHostObject hostObject = ImageDataHostObject::getHOFromObject(runtime, std::move(obj));
|
|
102
115
|
DSImageData *data = [DSImageData imageDataFromHostObject:hostObject];
|
|
103
|
-
[rnEditorViewManager
|
|
116
|
+
[rnEditorViewManager trySetImageDataWithTag:@(tag) data:data attempt:1];
|
|
104
117
|
return Value(true);
|
|
105
118
|
}
|
|
106
119
|
return Value(false);
|
|
@@ -109,15 +122,25 @@ static void install(jsi::Runtime &jsiRuntime, RNDynamsoftImageEditorViewManager
|
|
|
109
122
|
jsiRuntime.global().setProperty(jsiRuntime, setOriginalImage, std::move(setOriginalImageFunc));
|
|
110
123
|
}
|
|
111
124
|
|
|
112
|
-
- (void)
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
125
|
+
- (void)trySetImageDataWithTag:(nonnull NSNumber *)tag data:(DSImageData *)data attempt:(NSInteger)attempt {
|
|
126
|
+
const NSInteger maxAttempts = 10;
|
|
127
|
+
const NSTimeInterval retryDelay = 0.1; // 100ms
|
|
128
|
+
|
|
129
|
+
[self.bridge.uiManager addUIBlock:
|
|
130
|
+
^(__unused RCTUIManager *uiManager, NSDictionary<NSNumber *, UIView *> *viewRegistry) {
|
|
131
|
+
id view = viewRegistry[tag];
|
|
132
|
+
if (!view || ![view isKindOfClass:[RNDynamsoftImageEditorView class]]) {
|
|
133
|
+
if (attempt < maxAttempts) {
|
|
134
|
+
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(retryDelay * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
|
|
135
|
+
[self trySetImageDataWithTag:tag data:data attempt:1];
|
|
136
|
+
});
|
|
137
|
+
} else {
|
|
138
|
+
RCTLogError(@"Cannot find RNDynamsoftImageEditorView with tag #%@ after %ld attempts", tag, (long)attempt);
|
|
139
|
+
}
|
|
140
|
+
} else {
|
|
141
|
+
((RNDynamsoftImageEditorView *)view).editorView.imageData = data;
|
|
142
|
+
}
|
|
143
|
+
}];
|
|
121
144
|
}
|
|
122
145
|
|
|
123
146
|
@end
|