Use ReactTag to map events to component view

Summary:
Use `reactTag` instead of address of `UIView` to map events from paper components to Fabric.

changelog: [internal]

Reviewed By: shergin

Differential Revision: D17954974

fbshipit-source-id: 0d8bf748e58f4cb6769e107bc7fd0e66b93d8f12
This commit is contained in:
Samuel Susla 2019-10-31 14:39:41 -07:00 коммит произвёл Facebook Github Bot
Родитель 03fd80c937
Коммит fbfce92e97
5 изменённых файлов: 41 добавлений и 19 удалений

Просмотреть файл

@ -34,6 +34,12 @@ using namespace facebook::react;
return self;
}
- (void)setTag:(NSInteger)tag
{
[self.coordinator removeObserveForTag:self.tag];
[super setTag:tag];
}
+ (NSMutableSet<NSString *> *)supportedViewManagers
{
static NSMutableSet<NSString *> *supported =
@ -106,14 +112,19 @@ using namespace facebook::react;
if (!_paperView) {
__weak __typeof(self) weakSelf = self;
_paperView = [self.coordinator viewWithInterceptor:^(std::string eventName, folly::dynamic event) {
if (weakSelf) {
__typeof(self) strongSelf = weakSelf;
auto eventEmitter =
std::static_pointer_cast<LegacyViewManagerInteropViewEventEmitter const>(strongSelf->_eventEmitter);
eventEmitter->dispatchEvent(eventName, event);
}
}];
_paperView = self.coordinator.paperView;
[self.coordinator addObserveForTag:self.tag
usingBlock:^(std::string eventName, folly::dynamic event) {
if (weakSelf) {
__typeof(self) strongSelf = weakSelf;
auto eventEmitter =
std::static_pointer_cast<LegacyViewManagerInteropViewEventEmitter const>(
strongSelf->_eventEmitter);
eventEmitter->dispatchEvent(eventName, event);
}
}];
_paperView.reactTag = [NSNumber numberWithInteger:self.tag];
self.contentView = _paperView;
}

Просмотреть файл

@ -29,7 +29,7 @@
- (void)setProps:(NSDictionary<NSString *, id> *)props forView:(id<RCTComponent>)view;
- (void)setProps:(NSDictionary<NSString *, id> *)props forShadowView:(RCTShadowView *)shadowView;
@property (nonatomic, copy, nullable) void (^eventInterceptor)(NSString *eventName, NSDictionary *event, id sender);
@property (nonatomic, copy, nullable) void (^eventInterceptor)(NSString *eventName, NSDictionary *event, NSNumber *reactTag);
- (NSDictionary<NSString *, id> *)viewConfig;

Просмотреть файл

@ -117,7 +117,7 @@ static RCTPropBlock createEventSetter(NSString *propName, SEL setter,Interceptor
}
if (eventInterceptor) {
eventInterceptor(propName, event, strongTarget);
eventInterceptor(propName, event, strongTarget.reactTag);
} else {
RCTComponentEvent *componentEvent = [[RCTComponentEvent alloc] initWithName:propName
viewTag:strongTarget.reactTag

Просмотреть файл

@ -19,7 +19,11 @@ typedef void (^InterceptorBlock)(std::string eventName, folly::dynamic event);
- (instancetype)initWithComponentData:(RCTComponentData *)componentData;
- (UIView *)viewWithInterceptor:(InterceptorBlock)block;
- (UIView *)paperView;
- (void)addObserveForTag:(NSInteger)tag usingBlock:(InterceptorBlock)block;
- (void)removeObserveForTag:(NSInteger)tag;
- (void)setProps:(folly::dynamic const &)props forView:(UIView *)view;

Просмотреть файл

@ -19,7 +19,7 @@ using namespace facebook::react;
Each instnace of `RCTLegacyViewManagerInteropComponentView` registers a block to which events are dispatched.
This is the container that maps unretained UIView pointer to a block to which the event is dispatched.
*/
NSMutableDictionary<NSValue *, InterceptorBlock> *_eventInterceptors;
NSMutableDictionary<NSNumber *, InterceptorBlock> *_eventInterceptors;
}
- (instancetype)initWithComponentData:(RCTComponentData *)componentData;
@ -30,10 +30,9 @@ using namespace facebook::react;
_eventInterceptors = [NSMutableDictionary new];
__weak __typeof(self) weakSelf = self;
_componentData.eventInterceptor = ^(NSString *eventName, NSDictionary *event, id sender) {
_componentData.eventInterceptor = ^(NSString *eventName, NSDictionary *event, NSNumber *reactTag) {
__typeof(self) strongSelf = weakSelf;
InterceptorBlock block =
[strongSelf->_eventInterceptors objectForKey:[NSValue valueWithNonretainedObject:sender]];
InterceptorBlock block = [strongSelf->_eventInterceptors objectForKey:reactTag];
if (block) {
block(std::string([RCTNormalizeInputEventName(eventName) UTF8String]), convertIdToFollyDynamic(event));
}
@ -42,11 +41,19 @@ using namespace facebook::react;
return self;
}
- (UIView *)viewWithInterceptor:(InterceptorBlock)block
- (void)addObserveForTag:(NSInteger)tag usingBlock:(InterceptorBlock)block
{
UIView *view = [_componentData createViewWithTag:NULL];
[_eventInterceptors setObject:block forKey:[NSValue valueWithNonretainedObject:view]];
return view;
[_eventInterceptors setObject:block forKey:[NSNumber numberWithInteger:tag]];
}
- (void)removeObserveForTag:(NSInteger)tag
{
[_eventInterceptors removeObjectForKey:[NSNumber numberWithInteger:tag]];
}
- (UIView *)paperView
{
return [_componentData createViewWithTag:NULL];
}
- (void)setProps:(folly::dynamic const &)props forView:(UIView *)view