mirror of
https://github.com/zoriya/react-native-svg.git
synced 2025-12-06 07:06:11 +00:00
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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user