fix: implementation toDataURL for iOS platform both architectures (#2405)

# Summary
Closes #2233 
in iOS and old Arch, a callback on `toDataURL` method will only be
called the second time of asking.
Based on that
[PR](https://github.com/software-mansion/react-native-svg/pull/2234)
format `RNSVGSvgViewModule` file.

## Test Plan
We can easily test that fix by running the `Test2233`, we have an
example of the problem.

### What are the steps to reproduce (after prerequisites)?

## Compatibility

| OS      | Implemented |
| ------- | :---------: |
| iOS     |          |
This commit is contained in:
Bohdan Artiukhov
2024-08-13 10:45:10 +02:00
committed by GitHub
parent 4320df270a
commit 3350ab442a
3 changed files with 76 additions and 43 deletions

View File

@@ -26,54 +26,47 @@ RCT_EXPORT_MODULE()
callback:(RCTResponseSenderBlock)callback
attempt:(int)attempt
{
void (^block)(void) = ^{
#ifdef RCT_NEW_ARCH_ENABLED
[self.viewRegistry_DEPRECATED addUIBlock:^(RCTViewRegistry *viewRegistry) {
__kindof RNSVGPlatformView *view = [viewRegistry viewForReactTag:reactTag];
[self.viewRegistry_DEPRECATED addUIBlock:^(RCTViewRegistry *viewRegistry) {
__kindof RNSVGPlatformView *view = [viewRegistry viewForReactTag:reactTag];
#else
[self.bridge.uiManager
addUIBlock:^(RCTUIManager *uiManager, NSDictionary<NSNumber *, RNSVGPlatformView *> *viewRegistry) {
__kindof RNSVGPlatformView *view = [uiManager viewForReactTag:reactTag];
[self.bridge.uiManager
addUIBlock:^(RCTUIManager *uiManager, NSDictionary<NSNumber *, RNSVGPlatformView *> *viewRegistry) {
__kindof RNSVGPlatformView *view = [uiManager viewForReactTag:reactTag];
#endif // RCT_NEW_ARCH_ENABLED
NSString *b64;
if ([view isKindOfClass:[RNSVGSvgView class]]) {
RNSVGSvgView *svg = view;
if (options == nil) {
b64 = [svg getDataURLWithBounds:svg.boundingBox];
} else {
id width = [options objectForKey:@"width"];
id height = [options objectForKey:@"height"];
if (![width isKindOfClass:NSNumber.class] || ![height isKindOfClass:NSNumber.class]) {
RCTLogError(@"Invalid width or height given to toDataURL");
return;
}
NSNumber *w = width;
NSInteger wi = (NSInteger)[w intValue];
NSNumber *h = height;
NSInteger hi = (NSInteger)[h intValue];
CGRect bounds = CGRectMake(0, 0, wi, hi);
b64 = [svg getDataURLWithBounds:bounds];
NSString *b64;
if ([view isKindOfClass:[RNSVGSvgView class]]) {
RNSVGSvgView *svg = view;
if (options == nil) {
b64 = [svg getDataURLWithBounds:svg.boundingBox];
} else {
id width = [options objectForKey:@"width"];
id height = [options objectForKey:@"height"];
if (![width isKindOfClass:NSNumber.class] || ![height isKindOfClass:NSNumber.class]) {
RCTLogError(@"Invalid width or height given to toDataURL");
return;
}
} else {
RCTLogError(@"Invalid svg returned from registry, expecting RNSVGSvgView, got: %@", view);
return;
NSNumber *w = width;
NSInteger wi = (NSInteger)[w intValue];
NSNumber *h = height;
NSInteger hi = (NSInteger)[h intValue];
CGRect bounds = CGRectMake(0, 0, wi, hi);
b64 = [svg getDataURLWithBounds:bounds];
}
if (b64) {
callback(@[ b64 ]);
} else if (attempt < 1) {
[self toDataURL:reactTag options:options callback:callback attempt:(attempt + 1)];
} else {
callback(@[]);
}
}];
};
if (self.bridge) {
dispatch_async(RCTGetUIManagerQueue(), block);
} else {
dispatch_async(dispatch_get_main_queue(), block);
}
}
} else {
RCTLogError(@"Invalid svg returned from registry, expecting RNSVGSvgView, got: %@", view);
return;
}
if (b64) {
callback(@[ b64 ]);
} else if (attempt < 1) {
[self toDataURL:reactTag options:options callback:callback attempt:(attempt + 1)];
} else {
callback(@[]);
}
}];
};
RCT_EXPORT_METHOD(toDataURL
: (nonnull NSNumber *)reactTag options
@@ -91,4 +84,13 @@ RCT_EXPORT_METHOD(toDataURL
}
#endif
- (dispatch_queue_t)methodQueue
{
if (self.bridge) {
return RCTGetUIManagerQueue();
} else {
return dispatch_get_main_queue();
}
}
@end