mirror of
https://github.com/zoriya/react-native-svg.git
synced 2025-12-23 07:35:21 +00:00
PR restoring backwards compatibility due to braking changes in method signatures of getViewManagerNames and setHitSlop, lambda expression being available for RN > 0.64(?). Since viewRegistry_DEPRECATED is available from RN 0.65, and its addUIBlock method is available from RN 0.69, and both those things are only really needed on new architecture, we use them only there and stick to the old impl for old arch.
95 lines
2.9 KiB
Plaintext
95 lines
2.9 KiB
Plaintext
/**
|
|
* Copyright (c) 2015-present, Horcrux.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the MIT-style license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*/
|
|
|
|
#import "RNSVGSvgViewModule.h"
|
|
#import <React/RCTBridge.h>
|
|
#import <React/RCTUIManager.h>
|
|
#import <React/RCTUIManagerUtils.h>
|
|
#import "RNSVGSvgView.h"
|
|
|
|
@implementation RNSVGSvgViewModule
|
|
|
|
RCT_EXPORT_MODULE()
|
|
|
|
#ifdef RN_FABRIC_ENABLED
|
|
@synthesize viewRegistry_DEPRECATED = _viewRegistry_DEPRECATED;
|
|
#endif // RN_FABRIC_ENABLED
|
|
@synthesize bridge = _bridge;
|
|
|
|
- (void)toDataURL:(nonnull NSNumber *)reactTag
|
|
options:(NSDictionary *)options
|
|
callback:(RCTResponseSenderBlock)callback
|
|
attempt:(int)attempt
|
|
{
|
|
void (^block)(void) = ^{
|
|
#ifdef RN_FABRIC_ENABLED
|
|
[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];
|
|
#endif // RN_FABRIC_ENABLED
|
|
NSString *b64;
|
|
if ([view isKindOfClass:[RNSVGSvgView class]]) {
|
|
RNSVGSvgView *svg = view;
|
|
if (options == nil) {
|
|
b64 = [svg getDataURL];
|
|
} 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];
|
|
}
|
|
} 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(@[]);
|
|
}
|
|
}];
|
|
};
|
|
if (self.bridge) {
|
|
dispatch_async(RCTGetUIManagerQueue(), block);
|
|
} else {
|
|
dispatch_async(dispatch_get_main_queue(), block);
|
|
}
|
|
}
|
|
|
|
RCT_EXPORT_METHOD(toDataURL
|
|
: (nonnull NSNumber *)reactTag options
|
|
: (NSDictionary *)options callback
|
|
: (RCTResponseSenderBlock)callback)
|
|
{
|
|
[self toDataURL:reactTag options:options callback:callback attempt:0];
|
|
}
|
|
|
|
#ifdef RN_FABRIC_ENABLED
|
|
- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:
|
|
(const facebook::react::ObjCTurboModule::InitParams &)params
|
|
{
|
|
return std::make_shared<facebook::react::NativeSvgViewModuleSpecJSI>(params);
|
|
}
|
|
#endif
|
|
|
|
@end
|