GT2/Ejectable/node_modules/react-native-reanimated/ios/REAModule.m

196 lines
5.5 KiB
Objective-C

#import "REAModule.h"
#import "REANodesManager.h"
#import "Transitioning/REATransitionManager.h"
#import "native/NativeProxy.h"
typedef void (^AnimatedOperation)(REANodesManager *nodesManager);
RCTBridge *_bridge_reanimated = nil;
@implementation REAModule
{
NSMutableArray<AnimatedOperation> *_operations;
REATransitionManager *_transitionManager;
}
RCT_EXPORT_MODULE(ReanimatedModule);
- (void)invalidate
{
_bridge_reanimated = nil;
_transitionManager = nil;
[_nodesManager invalidate];
[self.bridge.uiManager.observerCoordinator removeObserver:self];
}
- (dispatch_queue_t)methodQueue
{
// This module needs to be on the same queue as the UIManager to avoid
// having to lock `_operations` and `_preOperations` since `uiManagerWillPerformMounting`
// will be called from that queue.
return RCTGetUIManagerQueue();
}
- (void)setBridge:(RCTBridge *)bridge
{
[super setBridge:bridge];
_nodesManager = [[REANodesManager alloc] initWithModule:self
uiManager:self.bridge.uiManager];
_operations = [NSMutableArray new];
_transitionManager = [[REATransitionManager alloc] initWithUIManager:self.bridge.uiManager];
[bridge.uiManager.observerCoordinator addObserver:self];
}
#pragma mark -- Transitioning API
RCT_EXPORT_METHOD(animateNextTransition:(nonnull NSNumber *)rootTag config:(NSDictionary *)config)
{
[_transitionManager animateNextTransitionInRoot:rootTag withConfig:config];
}
#pragma mark -- API
RCT_EXPORT_METHOD(createNode:(nonnull NSNumber *)nodeID
config:(NSDictionary<NSString *, id> *)config)
{
[self addOperationBlock:^(REANodesManager *nodesManager) {
[nodesManager createNode:nodeID config:config];
}];
}
RCT_EXPORT_METHOD(dropNode:(nonnull NSNumber *)nodeID)
{
[self addOperationBlock:^(REANodesManager *nodesManager) {
[nodesManager dropNode:nodeID];
}];
}
RCT_EXPORT_METHOD(getValue:(nonnull NSNumber *)nodeID
callback:(RCTResponseSenderBlock)callback) {
[self addOperationBlock:^(REANodesManager *nodesManager) {
[nodesManager getValue:nodeID callback:(RCTResponseSenderBlock)callback];
}];
}
RCT_EXPORT_METHOD(connectNodes:(nonnull NSNumber *)parentID
childTag:(nonnull NSNumber *)childID)
{
[self addOperationBlock:^(REANodesManager *nodesManager) {
[nodesManager connectNodes:parentID childID:childID];
}];
}
RCT_EXPORT_METHOD(disconnectNodes:(nonnull NSNumber *)parentID
childTag:(nonnull NSNumber *)childID)
{
[self addOperationBlock:^(REANodesManager *nodesManager) {
[nodesManager disconnectNodes:parentID childID:childID];
}];
}
RCT_EXPORT_METHOD(connectNodeToView:(nonnull NSNumber *)nodeID
viewTag:(nonnull NSNumber *)viewTag)
{
NSString *viewName = [self.bridge.uiManager viewNameForReactTag:viewTag];
[self addOperationBlock:^(REANodesManager *nodesManager) {
[nodesManager connectNodeToView:nodeID viewTag:viewTag viewName:viewName];
}];
}
RCT_EXPORT_METHOD(disconnectNodeFromView:(nonnull NSNumber *)nodeID
viewTag:(nonnull NSNumber *)viewTag)
{
[self addOperationBlock:^(REANodesManager *nodesManager) {
[nodesManager disconnectNodeFromView:nodeID viewTag:viewTag];
}];
}
RCT_EXPORT_METHOD(attachEvent:(nonnull NSNumber *)viewTag
eventName:(nonnull NSString *)eventName
eventNodeID:(nonnull NSNumber *)eventNodeID)
{
[self addOperationBlock:^(REANodesManager *nodesManager) {
[nodesManager attachEvent:viewTag eventName:eventName eventNodeID:eventNodeID];
}];
}
RCT_EXPORT_METHOD(detachEvent:(nonnull NSNumber *)viewTag
eventName:(nonnull NSString *)eventName
eventNodeID:(nonnull NSNumber *)eventNodeID)
{
[self addOperationBlock:^(REANodesManager *nodesManager) {
[nodesManager detachEvent:viewTag eventName:eventName eventNodeID:eventNodeID];
}];
}
RCT_EXPORT_METHOD(configureProps:(nonnull NSArray<NSString *> *)nativeProps
uiProps:(nonnull NSArray<NSString *> *)uiProps)
{
[self addOperationBlock:^(REANodesManager *nodesManager) {
[nodesManager configureProps:[NSSet setWithArray:nativeProps] uiProps:[NSSet setWithArray:uiProps]];
}];
}
RCT_EXPORT_METHOD(setValue:(nonnull NSNumber *)nodeID
newValue:(nonnull NSNumber *)newValue
)
{
[self addOperationBlock:^(REANodesManager *nodesManager) {
[nodesManager setValueForNodeID:nodeID value:newValue];
}];
}
RCT_EXPORT_METHOD(triggerRender)
{
[self addOperationBlock:^(REANodesManager *nodesManager) {
[nodesManager postRunUpdatesAfterAnimation];
}];
}
#pragma mark -- Batch handling
- (void)addOperationBlock:(AnimatedOperation)operation
{
[_operations addObject:operation];
}
#pragma mark - RCTUIManagerObserver
- (void)uiManagerWillPerformMounting:(RCTUIManager *)uiManager
{
if (_operations.count == 0) {
return;
}
NSArray<AnimatedOperation> *operations = _operations;
_operations = [NSMutableArray new];
REANodesManager *nodesManager = _nodesManager;
[uiManager addUIBlock:^(__unused RCTUIManager *manager, __unused NSDictionary<NSNumber *, UIView *> *viewRegistry) {
for (AnimatedOperation operation in operations) {
operation(nodesManager);
}
[nodesManager operationsBatchDidComplete];
}];
}
#pragma mark -- Events
- (NSArray<NSString *> *)supportedEvents
{
return @[@"onReanimatedCall", @"onReanimatedPropsChange"];
}
- (void)eventDispatcherWillDispatchEvent:(id<RCTEvent>)event
{
// Events can be dispatched from any queue
[_nodesManager dispatchEvent:event];
}
@end