dynamsoft-capture-vision-react-native 3.0.5200 → 3.2.3000

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.
Files changed (93) hide show
  1. package/README.md +5 -2
  2. package/android/build.gradle +20 -10
  3. package/android/gradle.properties +3 -3
  4. package/android/src/main/cpp/JsiCore.cpp +1 -1
  5. package/android/src/main/cpp/JsiDbr.cpp +208 -23
  6. package/android/src/main/cpp/JsiDcp.cpp +1 -1
  7. package/android/src/main/cpp/JsiDlr.cpp +10 -1
  8. package/android/src/main/cpp/JsiUtility.cpp +470 -62
  9. package/android/src/main/cpp/JsiUtility.h +13 -3
  10. package/android/src/main/dysJniLibs/debug/arm64-v8a/librn_dys.so +0 -0
  11. package/android/src/main/dysJniLibs/debug/armeabi-v7a/librn_dys.so +0 -0
  12. package/android/src/main/dysJniLibs/debug/x86/librn_dys.so +0 -0
  13. package/android/src/main/dysJniLibs/debug/x86_64/librn_dys.so +0 -0
  14. package/android/src/main/dysJniLibs/release/arm64-v8a/librn_dys.so +0 -0
  15. package/android/src/main/dysJniLibs/release/armeabi-v7a/librn_dys.so +0 -0
  16. package/android/src/main/dysJniLibs/release/x86/librn_dys.so +0 -0
  17. package/android/src/main/dysJniLibs/release/x86_64/librn_dys.so +0 -0
  18. package/android/src/main/dysJniLibsFor81/debug/arm64-v8a/librn_dys.so +0 -0
  19. package/android/src/main/dysJniLibsFor81/debug/armeabi-v7a/librn_dys.so +0 -0
  20. package/android/src/main/dysJniLibsFor81/debug/x86/librn_dys.so +0 -0
  21. package/android/src/main/dysJniLibsFor81/debug/x86_64/librn_dys.so +0 -0
  22. package/android/src/main/dysJniLibsFor81/release/arm64-v8a/librn_dys.so +0 -0
  23. package/android/src/main/dysJniLibsFor81/release/armeabi-v7a/librn_dys.so +0 -0
  24. package/android/src/main/dysJniLibsFor81/release/x86/librn_dys.so +0 -0
  25. package/android/src/main/dysJniLibsFor81/release/x86_64/librn_dys.so +0 -0
  26. package/android/src/main/dysJniLibsFor82/debug/arm64-v8a/librn_dys.so +0 -0
  27. package/android/src/main/dysJniLibsFor82/debug/armeabi-v7a/librn_dys.so +0 -0
  28. package/android/src/main/dysJniLibsFor82/debug/x86/librn_dys.so +0 -0
  29. package/android/src/main/dysJniLibsFor82/debug/x86_64/librn_dys.so +0 -0
  30. package/android/src/main/dysJniLibsFor82/release/arm64-v8a/librn_dys.so +0 -0
  31. package/android/src/main/dysJniLibsFor82/release/armeabi-v7a/librn_dys.so +0 -0
  32. package/android/src/main/dysJniLibsFor82/release/x86/librn_dys.so +0 -0
  33. package/android/src/main/dysJniLibsFor82/release/x86_64/librn_dys.so +0 -0
  34. package/android/src/main/java/com/dynamsoft/reactnativelib/CVRModule.kt +17 -2
  35. package/android/src/main/java/com/dynamsoft/reactnativelib/CameraViewManager.kt +13 -1
  36. package/android/src/main/java/com/dynamsoft/reactnativelib/ImageEditorViewManager.kt +1 -1
  37. package/android/src/main/java/com/dynamsoft/reactnativelib/{utils → basicutils}/Basic.kt +1 -1
  38. package/android/src/main/java/com/dynamsoft/reactnativelib/{utils → basicutils}/ForCore.kt +1 -2
  39. package/android/src/main/java/com/dynamsoft/reactnativelib/{utils → basicutils}/ForCvr.kt +1 -5
  40. package/android/src/main/java/com/dynamsoft/reactnativelib/{utils → basicutils}/ForDBR.kt +74 -3
  41. package/android/src/main/java/com/dynamsoft/reactnativelib/{utils → basicutils}/ForDCE.kt +33 -13
  42. package/android/src/main/java/com/dynamsoft/reactnativelib/{utils → basicutils}/ForDCP.kt +1 -1
  43. package/android/src/main/java/com/dynamsoft/reactnativelib/{utils → basicutils}/ForDDN.kt +1 -3
  44. package/android/src/main/java/com/dynamsoft/reactnativelib/{utils → basicutils}/ForDLR.kt +6 -3
  45. package/android/src/main/java/com/dynamsoft/reactnativelib/{utils → basicutils}/ImageUtil.kt +2 -2
  46. package/android/src/main/java/com/dynamsoft/reactnativelib/cvr/CaptureVisionRouterModuleImpl.kt +25 -5
  47. package/android/src/main/java/com/dynamsoft/reactnativelib/dce/CameraEnhancerModuleImpl.kt +6 -3
  48. package/android/src/main/java/com/dynamsoft/reactnativelib/dce/CameraViewManagerImpl.kt +15 -3
  49. package/android/src/main/java/com/dynamsoft/reactnativelib/dce/ImageEditorViewManagerImpl.kt +1 -5
  50. package/android/src/main/java/com/dynamsoft/reactnativelib/dce/ImageEditorViewModuleImpl.kt +2 -4
  51. package/android/src/main/java/com/dynamsoft/reactnativelib/dce/RNCameraView.kt +1 -2
  52. package/android/src/main/java/com/dynamsoft/reactnativelib/utility/ImageManagerModuleImpl.kt +75 -3
  53. package/android/src/main/java/com/dynamsoft/reactnativelib/utility/MultiCrossFilterModuleImpl.kt +2 -2
  54. package/dynamsoft-capture-vision-react-native.podspec +1 -1
  55. package/ios/CPP/ImageDataHostObject.cpp +1 -1
  56. package/ios/CPP/ImageDataHostObject.hpp +1 -1
  57. package/ios/CPP/RNDynamsoft+JSI.h +3 -0
  58. package/ios/CPP/RNDynamsoft+JSI.mm +119 -2
  59. package/ios/CPP/RNDynamsoft+Json.m +114 -14
  60. package/ios/CPP/YeetJSIUtils.h +2 -0
  61. package/ios/CPP/YeetJSIUtils.mm +15 -0
  62. package/ios/RNDynamsoftCameraView.h +4 -0
  63. package/ios/RNDynamsoftCameraView.m +25 -0
  64. package/ios/RNDynamsoftCameraViewManager.m +8 -2
  65. package/ios/RNDynamsoftCaptureVisionRouter.mm +149 -92
  66. package/ios/RNDynamsoftImageEditorViewManager.mm +71 -40
  67. package/ios/RNDynamsoftImageManager.mm +295 -81
  68. package/ios/RNDynamsoftImageSourceAdapter.mm +100 -65
  69. package/package.json +1 -1
  70. package/src/core/EnumGrayscaleEnhancementMode.tsx +1 -0
  71. package/src/core/EnumGrayscaleTransformationMode.tsx +1 -0
  72. package/src/core/EnumImageFileFormat.tsx +6 -0
  73. package/src/core/index.tsx +1 -0
  74. package/src/cvr/CaptureVisionRouter.tsx +33 -5
  75. package/src/dbr/BarcodeDetails.tsx +51 -0
  76. package/src/dbr/BarcodeResultItem.tsx +11 -0
  77. package/src/dbr/EnumBarcodeFormat.tsx +2 -0
  78. package/src/dbr/EnumDeblurMode.tsx +1 -0
  79. package/src/dbr/EnumLocalizationMode.tsx +1 -0
  80. package/src/dbr/EnumQRCodeErrorCorrectionLevel.tsx +6 -0
  81. package/src/dbr/index.tsx +2 -0
  82. package/src/dce/CameraEnhancer.tsx +14 -6
  83. package/src/dce/CameraView.tsx +10 -2
  84. package/src/dce/DynamsoftCameraViewNativeComponent.ts +25 -0
  85. package/src/dce/EnumCameraPosition.tsx +13 -1
  86. package/src/dce/EnumEnhancedFeatures.tsx +3 -4
  87. package/src/dce/ImageEditorView.tsx +1 -1
  88. package/src/dlr/CharacterResult.tsx +4 -1
  89. package/src/dlr/SimplifiedLabelRecognizerSettings.tsx +2 -0
  90. package/src/dlr/TextLineResultItem.tsx +5 -0
  91. package/src/utility/EnumFilterType.tsx +5 -0
  92. package/src/utility/ImageManager.tsx +227 -9
  93. package/src/utility/index.tsx +1 -0
@@ -51,6 +51,28 @@ RCT_EXPORT_MODULE(DynamsoftCaptureVisionRouterModule)
51
51
  _cvr = nil;
52
52
  }
53
53
 
54
+ RCT_EXPORT_METHOD(setGlobalIntraOpNumThreads:(NSInteger)intraOpNumThreads) {
55
+ [DSCaptureVisionRouter setGlobalIntraOpNumThreads:intraOpNumThreads];
56
+ }
57
+
58
+ RCT_EXPORT_METHOD(clearDLModelBuffers) {
59
+ [DSCaptureVisionRouter clearDLModelBuffers];
60
+ }
61
+
62
+ RCT_EXPORT_METHOD(switchCapturingTemplate:(NSString *)templateName
63
+ resolve:(RCTPromiseResolveBlock)resolve
64
+ rejecter: (RCTPromiseRejectBlock)reject)
65
+ {
66
+ NSError *error = nil;
67
+ [self.cvr switchCapturingTemplate:templateName error:&error];
68
+ if (error) {
69
+ NSString *code = [NSString stringWithFormat:@"%ld",(long)error.code];
70
+ reject(code, error.localizedDescription, error);
71
+ } else {
72
+ resolve(@(true));
73
+ }
74
+ }
75
+
54
76
  RCT_EXPORT_METHOD(startCapturing:(NSString *)templateName
55
77
  resolve:(RCTPromiseResolveBlock)resolve
56
78
  rejecter: (RCTPromiseRejectBlock)reject)
@@ -333,7 +355,8 @@ RCT_EXPORT_METHOD(removeFilter:(NSString *)key) {
333
355
  return [[self.cvr getIntermediateResultManager] getOriginalImage:imageHashId];
334
356
  }
335
357
 
336
- #pragma mark - global
358
+ #pragma mark - Global JSI
359
+ // --- RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(install) ---
337
360
  RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(install)
338
361
  {
339
362
  RCTBridge* bridge = [RCTBridge currentBridge];
@@ -350,110 +373,144 @@ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(install)
350
373
  return @true;
351
374
  }
352
375
 
376
+ // --- Helper Functions and Macros ---
377
+ static void installHostFunction(
378
+ jsi::Runtime &jsiRuntime,
379
+ const char* name,
380
+ size_t argCount,
381
+ HostFunctionType hostFunction) {
382
+
383
+ auto func = Function::createFromHostFunction(
384
+ jsiRuntime,
385
+ PropNameID::forAscii(jsiRuntime, name),
386
+ argCount,
387
+ std::move(hostFunction)
388
+ );
389
+ jsiRuntime.global().setProperty(jsiRuntime, name, std::move(func));
390
+ }
391
+
392
+ // --- JSI Installation Logic ---
353
393
  static void install(jsi::Runtime &jsiRuntime, RNDynamsoftCaptureVisionRouter *rnCapture) {
354
- const char* captureImageData = "captureImageData";
355
- auto captureImageDataFunc = Function::createFromHostFunction(jsiRuntime,
356
- PropNameID::forAscii(jsiRuntime,captureImageData),
357
- 2,
358
- [rnCapture](Runtime &runtime,
359
- const Value &thisValue,
360
- const Value *arguments,
361
- size_t count) -> Value {
362
- NSString *name = convertJSIStringToNSString(runtime, arguments[1].getString(runtime));
363
- Object obj = arguments[0].getObject(runtime);
364
- if (obj.isHostObject<ImageDataHostObject>(runtime)) {
365
- ImageDataHostObject hostObject = ImageDataHostObject::getHOFromObject(runtime, std::move(obj));
366
- DSImageData *data = [DSImageData imageDataFromHostObject:hostObject];
367
- DSCapturedResult *result = [rnCapture.cvr captureFromBuffer:data templateName:name];
394
+
395
+ // 1. captureImageData(imageDataHostObject, templateName)
396
+ installHostFunction(jsiRuntime, "captureImageData", 2,
397
+ [rnCapture](Runtime &runtime, const Value &thisValue, const Value *arguments, size_t count) -> Value {
398
+ // Argument check
399
+ if (count != 2 || !arguments[1].isString() || !arguments[0].isObject()) {
400
+ return Value(false); // Or throw a JSI exception
401
+ }
402
+
403
+ NSString *name = convertJSIStringToNSString(runtime, arguments[1].getString(runtime));
404
+ Object obj = arguments[0].getObject(runtime);
405
+
406
+ if (obj.isHostObject<ImageDataHostObject>(runtime)) {
407
+ // Assuming ImageDataHostObject::getHOFromObject returns a non-owning copy or reference
408
+ ImageDataHostObject hostObject = ImageDataHostObject::getHOFromObject(runtime, obj);
409
+
410
+ // Get the Objective-C object from the HostObject
411
+ DSImageData *data = [DSImageData imageDataFromHostObject:hostObject];
412
+
413
+ DSCapturedResult *result = [rnCapture.cvr captureFromBuffer:data templateName:name];
414
+ return [result convertToJSIObject:runtime];
415
+ }
416
+ return Value(false);
417
+ }
418
+ );
419
+
420
+ // 2. captureFile(filePath, templateName)
421
+ installHostFunction(jsiRuntime, "captureFile", 2,
422
+ [rnCapture](Runtime &runtime, const Value &thisValue, const Value *arguments, size_t count) -> Value {
423
+ // Argument check
424
+ if (count != 2 || !arguments[0].isString() || !arguments[1].isString()) {
425
+ return Value(false);
426
+ }
427
+
428
+ NSString *file = convertJSIStringToNSString(runtime, arguments[0].getString(runtime));
429
+ NSString *name = convertJSIStringToNSString(runtime, arguments[1].getString(runtime));
430
+
431
+ DSCapturedResult *result = [rnCapture.cvr captureFromFile:file templateName:name];
368
432
  return [result convertToJSIObject:runtime];
369
433
  }
370
- return Value(false);
371
- });
372
- jsiRuntime.global().setProperty(jsiRuntime, captureImageData, std::move(captureImageDataFunc));
373
-
374
- const char* captureFile = "captureFile";
375
- auto captureFileFunc = Function::createFromHostFunction(jsiRuntime,
376
- PropNameID::forAscii(jsiRuntime, captureFile),
377
- 2,
378
- [rnCapture](Runtime &runtime,
379
- const Value &thisValue,
380
- const Value *arguments,
381
- size_t count) -> Value {
382
- NSString *file = convertJSIStringToNSString(runtime, arguments[0].getString(runtime));
383
- NSString *name = convertJSIStringToNSString(runtime, arguments[1].getString(runtime));
384
- DSCapturedResult *result = [rnCapture.cvr captureFromFile:file templateName:name];
385
- return [result convertToJSIObject:runtime];
386
- });
387
- jsiRuntime.global().setProperty(jsiRuntime, captureFile, std::move(captureFileFunc));
388
-
389
- const char* captureFileBytes = "captureFileBytes";
390
- auto captureFileBytesFunc = Function::createFromHostFunction(jsiRuntime,
391
- PropNameID::forAscii(jsiRuntime, captureFileBytes),
392
- 2,
393
- [rnCapture](Runtime &runtime,
394
- const Value &thisValue,
395
- const Value *arguments,
396
- size_t count) -> Value {
397
- ArrayBuffer buffer = arguments[0].asObject(runtime).getArrayBuffer(runtime);
398
- NSData *data = convertArrayBufferToNSData(runtime, buffer);
399
- NSString *name = convertJSIStringToNSString(runtime, arguments[1].getString(runtime));
400
- DSCapturedResult *result = [rnCapture.cvr captureFromFileBytes:data templateName:name];
401
- return [result convertToJSIObject:runtime];
402
- });
403
- jsiRuntime.global().setProperty(jsiRuntime, captureFileBytes, std::move(captureFileBytesFunc));
434
+ );
435
+
436
+ // 3. captureFileBytes(arrayBuffer, templateName)
437
+ installHostFunction(jsiRuntime, "captureFileBytes", 2,
438
+ [rnCapture](Runtime &runtime, const Value &thisValue, const Value *arguments, size_t count) -> Value {
439
+ // Argument check
440
+ if (count != 2 || !arguments[0].isObject() || !arguments[1].isString()) {
441
+ return Value(false);
442
+ }
443
+
444
+ Object obj = arguments[0].asObject(runtime);
445
+ if (!obj.isArrayBuffer(runtime)) {
446
+ return Value(false);
447
+ }
448
+
449
+ ArrayBuffer buffer = obj.getArrayBuffer(runtime);
450
+ NSData *data = convertArrayBufferToNSData(runtime, buffer);
451
+ NSString *name = convertJSIStringToNSString(runtime, arguments[1].getString(runtime));
452
+
453
+ DSCapturedResult *result = [rnCapture.cvr captureFromFileBytes:data templateName:name];
454
+ return [result convertToJSIObject:runtime];
455
+ }
456
+ );
404
457
 
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;
458
+ // --- Image Data Array Accessors ---
459
+
460
+ // Generic lambda for getting a list of images (deskewed or enhanced)
461
+ auto getImageArrayFunc = [rnCapture](Runtime &runtime, NSArray<DSImageData *> *imageDataArray) -> Value {
414
462
  Array array(runtime, imageDataArray.count);
415
463
  for (int i = 0; i < imageDataArray.count; i++) {
464
+ // Create a new JSI Host Object wrapping the existing Objective-C object's data
465
+ // This assumes ImageDataHostObject has a suitable constructor/initialization.
416
466
  ImageDataHostObject hostObject = [[imageDataArray objectAtIndex:i] hostObject];
417
467
  Object obj = Object::createFromHostObject(runtime, std::make_shared<ImageDataHostObject>(hostObject));
418
468
  array.setValueAtIndex(runtime, i, obj);
419
469
  }
420
470
  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),
427
- 0,
428
- [rnCapture](Runtime &runtime,
429
- const Value &thisValue,
430
- const Value *arguments,
431
- size_t count) -> Value {
432
- NSMutableArray<DSImageData *> *imageDataArray = rnCapture.enhancedImageDataArray;
433
- Array array(runtime, imageDataArray.count);
434
- for (int i = 0; i < imageDataArray.count; i++) {
435
- ImageDataHostObject hostObject = [[imageDataArray objectAtIndex:i] hostObject];
471
+ };
472
+
473
+ // 4. getCurrentDeskewedImages()
474
+ installHostFunction(jsiRuntime, "getCurrentDeskewedImages", 0,
475
+ [rnCapture, getImageArrayFunc](Runtime &runtime, const Value &thisValue, const Value *arguments, size_t count) -> Value {
476
+ if (count != 0) {
477
+ return Value(Array(runtime, 0));
478
+ }
479
+ return getImageArrayFunc(runtime, rnCapture.deskewedImageDataArray);
480
+ }
481
+ );
482
+
483
+ // 5. getCurrentEnhancedImages()
484
+ installHostFunction(jsiRuntime, "getCurrentEnhancedImages", 0,
485
+ [rnCapture, getImageArrayFunc](Runtime &runtime, const Value &thisValue, const Value *arguments, size_t count) -> Value {
486
+ if (count != 0) {
487
+ return Value(Array(runtime, 0));
488
+ }
489
+ return getImageArrayFunc(runtime, rnCapture.enhancedImageDataArray);
490
+ }
491
+ );
492
+
493
+ // 6. cvr_getOriginalImage(imageHashId)
494
+ installHostFunction(jsiRuntime, "cvr_getOriginalImage", 1,
495
+ [rnCapture](Runtime &runtime, const Value &thisValue, const Value *arguments, size_t count) -> Value {
496
+ // Argument check
497
+ if (count != 1 || !arguments[0].isString()) {
498
+ return Value::null(); // Or Value(false) depending on expected JS behavior
499
+ }
500
+
501
+ NSString *imageHashId = convertJSIStringToNSString(runtime, arguments[0].getString(runtime));
502
+
503
+ DSImageData *imageData = [rnCapture getOriginalImage:imageHashId];
504
+ if (imageData == nil) {
505
+ return Value::null();
506
+ }
507
+
508
+ ImageDataHostObject hostObject = [imageData hostObject];
509
+ // Create a new JSI Host Object wrapper
436
510
  Object obj = Object::createFromHostObject(runtime, std::make_shared<ImageDataHostObject>(hostObject));
437
- array.setValueAtIndex(runtime, i, obj);
511
+ return obj;
438
512
  }
439
- return array;
440
- });
441
- jsiRuntime.global().setProperty(jsiRuntime, getCurrentEnhancedImages, std::move(getCurrentEnhancedImagesFunc));
442
-
443
- const char* getOriginalImage = "cvr_getOriginalImage";
444
- auto getOriginalImageFunc = Function::createFromHostFunction(jsiRuntime,
445
- PropNameID::forAscii(jsiRuntime, getOriginalImage),
446
- 1,
447
- [rnCapture](Runtime &runtime,
448
- const Value &thisValue,
449
- const Value *arguments,
450
- size_t count) -> Value {
451
- NSString *imageHashId = convertJSIStringToNSString(runtime, arguments[0].getString(runtime));
452
- ImageDataHostObject hostObject = [[rnCapture getOriginalImage:imageHashId] hostObject];
453
- Object obj = Object::createFromHostObject(runtime, std::make_shared<ImageDataHostObject>(hostObject));
454
- return obj;
455
- });
456
- jsiRuntime.global().setProperty(jsiRuntime, getOriginalImage, std::move(getOriginalImageFunc));
513
+ );
457
514
  }
458
515
 
459
516
  @end
@@ -81,7 +81,29 @@ RCT_EXPORT_METHOD(getSelectedQuad:(nonnull NSNumber *)tag
81
81
  }];
82
82
  }
83
83
 
84
- #pragma mark - Global
84
+ - (void)trySetImageDataWithTag:(nonnull NSNumber *)tag data:(DSImageData *)data attempt:(NSInteger)attempt {
85
+ const NSInteger maxAttempts = 10;
86
+ const NSTimeInterval retryDelay = 0.1; // 100ms
87
+
88
+ [self.bridge.uiManager addUIBlock:
89
+ ^(__unused RCTUIManager *uiManager, NSDictionary<NSNumber *, UIView *> *viewRegistry) {
90
+ id view = viewRegistry[tag];
91
+ if (!view || ![view isKindOfClass:[RNDynamsoftImageEditorView class]]) {
92
+ if (attempt < maxAttempts) {
93
+ dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(retryDelay * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
94
+ [self trySetImageDataWithTag:tag data:data attempt:1];
95
+ });
96
+ } else {
97
+ RCTLogError(@"Cannot find RNDynamsoftImageEditorView with tag #%@ after %ld attempts", tag, (long)attempt);
98
+ }
99
+ } else {
100
+ ((RNDynamsoftImageEditorView *)view).editorView.imageData = data;
101
+ }
102
+ }];
103
+ }
104
+
105
+ #pragma mark - Global JSI
106
+ // --- RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(install) ---
85
107
  RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(install)
86
108
  {
87
109
  RCTBridge* bridge = [RCTBridge currentBridge];
@@ -98,49 +120,58 @@ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(install)
98
120
  return @true;
99
121
  }
100
122
 
101
- static void install(jsi::Runtime &jsiRuntime, RNDynamsoftImageEditorViewManager *rnEditorViewManager) {
102
- const char* setOriginalImage = "editorView_setOriginalImage";
103
- auto setOriginalImageFunc = Function::createFromHostFunction(jsiRuntime,
104
- PropNameID::forAscii(jsiRuntime, setOriginalImage),
105
- 2,
106
- [rnEditorViewManager](Runtime &runtime,
107
- const Value &thisValue,
108
- const Value *arguments,
109
- size_t count) -> Value {
110
-
111
- double tag = arguments[0].getNumber();
112
- Object obj = arguments[1].getObject(runtime);
113
- if (obj.isHostObject<ImageDataHostObject>(runtime)) {
114
- ImageDataHostObject hostObject = ImageDataHostObject::getHOFromObject(runtime, std::move(obj));
115
- DSImageData *data = [DSImageData imageDataFromHostObject:hostObject];
116
- [rnEditorViewManager trySetImageDataWithTag:@(tag) data:data attempt:1];
117
- return Value(true);
118
- }
119
- return Value(false);
120
- });
123
+ // --- Helper Function (Assumed to be accessible, copied here for completeness) ---
124
+ static void installHostFunction(
125
+ jsi::Runtime &jsiRuntime,
126
+ const char* name,
127
+ size_t argCount,
128
+ HostFunctionType hostFunction) {
121
129
 
122
- jsiRuntime.global().setProperty(jsiRuntime, setOriginalImage, std::move(setOriginalImageFunc));
130
+ auto func = Function::createFromHostFunction(
131
+ jsiRuntime,
132
+ PropNameID::forAscii(jsiRuntime, name),
133
+ argCount,
134
+ std::move(hostFunction)
135
+ );
136
+ jsiRuntime.global().setProperty(jsiRuntime, name, std::move(func));
123
137
  }
124
138
 
125
- - (void)trySetImageDataWithTag:(nonnull NSNumber *)tag data:(DSImageData *)data attempt:(NSInteger)attempt {
126
- const NSInteger maxAttempts = 10;
127
- const NSTimeInterval retryDelay = 0.1; // 100ms
139
+ // --- JSI Installation Logic ---
140
+ static void install(jsi::Runtime &jsiRuntime, RNDynamsoftImageEditorViewManager *rnEditorViewManager) {
128
141
 
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
- }];
142
+ // 1. editorView_setOriginalImage(viewTag, imageDataHostObject)
143
+ installHostFunction(jsiRuntime, "editorView_setOriginalImage", 2,
144
+ [rnEditorViewManager](Runtime &runtime, const Value &thisValue, const Value *arguments, size_t count) -> Value {
145
+
146
+ // 🔍 Argument Validation & Type Check (Optimized)
147
+ if (count != 2 || !arguments[0].isNumber() || !arguments[1].isObject()) {
148
+ // Should potentially throw an exception for incorrect usage,
149
+ // but returning Value(false) keeps it consistent with original code style.
150
+ return Value(false);
151
+ }
152
+
153
+ // Extract View Tag (JS number)
154
+ double tag = arguments[0].getNumber();
155
+ NSNumber *viewTag = @(tag); // Convert to NSNumber for Objective-C method
156
+
157
+ // Extract Image Data Host Object (Requires runtime for getObject)
158
+ Object obj = arguments[1].getObject(runtime);
159
+
160
+ // Check if it's the specific Host Object type (Requires runtime for isHostObject)
161
+ if (obj.isHostObject<ImageDataHostObject>(runtime)) {
162
+ // Safely convert Host Object to DSImageData
163
+ ImageDataHostObject hostObject = ImageDataHostObject::getHOFromObject(runtime, obj);
164
+ DSImageData *data = [DSImageData imageDataFromHostObject:hostObject];
165
+
166
+ // Call the Objective-C View Manager method
167
+ [rnEditorViewManager trySetImageDataWithTag:viewTag data:data attempt:1];
168
+
169
+ return Value(true);
170
+ }
171
+
172
+ return Value(false);
173
+ }
174
+ );
144
175
  }
145
176
 
146
177
  @end