UNPKG

5.66 kBPlain TextView Raw
1#import "REAModule.h"
2
3#import "REANodesManager.h"
4#import "Transitioning/REATransitionManager.h"
5#import "native/NativeProxy.h"
6
7typedef void (^AnimatedOperation)(REANodesManager *nodesManager);
8
9RCTBridge *_bridge_reanimated = nil;
10
11@implementation REAModule
12{
13 NSMutableArray<AnimatedOperation> *_operations;
14 REATransitionManager *_transitionManager;
15}
16
17RCT_EXPORT_MODULE(ReanimatedModule);
18
19- (void)invalidate
20{
21 _bridge_reanimated = nil;
22 _transitionManager = nil;
23 [_nodesManager invalidate];
24 [self.bridge.uiManager.observerCoordinator removeObserver:self];
25}
26
27- (dispatch_queue_t)methodQueue
28{
29 // This module needs to be on the same queue as the UIManager to avoid
30 // having to lock `_operations` and `_preOperations` since `uiManagerWillPerformMounting`
31 // will be called from that queue.
32 return RCTGetUIManagerQueue();
33}
34
35- (void)setBridge:(RCTBridge *)bridge
36{
37 [super setBridge:bridge];
38
39 _nodesManager = [[REANodesManager alloc] initWithModule:self
40 uiManager:self.bridge.uiManager];
41 _operations = [NSMutableArray new];
42
43 _transitionManager = [[REATransitionManager alloc] initWithUIManager:self.bridge.uiManager];
44
45 [bridge.uiManager.observerCoordinator addObserver:self];
46}
47
48#pragma mark -- Transitioning API
49
50RCT_EXPORT_METHOD(animateNextTransition:(nonnull NSNumber *)rootTag config:(NSDictionary *)config)
51{
52 [_transitionManager animateNextTransitionInRoot:rootTag withConfig:config];
53}
54
55#pragma mark -- API
56
57RCT_EXPORT_METHOD(createNode:(nonnull NSNumber *)nodeID
58 config:(NSDictionary<NSString *, id> *)config)
59{
60 [self addOperationBlock:^(REANodesManager *nodesManager) {
61 [nodesManager createNode:nodeID config:config];
62 }];
63}
64
65RCT_EXPORT_METHOD(dropNode:(nonnull NSNumber *)nodeID)
66{
67 [self addOperationBlock:^(REANodesManager *nodesManager) {
68 [nodesManager dropNode:nodeID];
69 }];
70}
71
72RCT_EXPORT_METHOD(getValue:(nonnull NSNumber *)nodeID
73 callback:(RCTResponseSenderBlock)callback) {
74 [self addOperationBlock:^(REANodesManager *nodesManager) {
75 [nodesManager getValue:nodeID callback:(RCTResponseSenderBlock)callback];
76 }];
77}
78
79RCT_EXPORT_METHOD(connectNodes:(nonnull NSNumber *)parentID
80 childTag:(nonnull NSNumber *)childID)
81{
82 [self addOperationBlock:^(REANodesManager *nodesManager) {
83 [nodesManager connectNodes:parentID childID:childID];
84 }];
85}
86
87RCT_EXPORT_METHOD(disconnectNodes:(nonnull NSNumber *)parentID
88 childTag:(nonnull NSNumber *)childID)
89{
90 [self addOperationBlock:^(REANodesManager *nodesManager) {
91 [nodesManager disconnectNodes:parentID childID:childID];
92 }];
93}
94
95RCT_EXPORT_METHOD(connectNodeToView:(nonnull NSNumber *)nodeID
96 viewTag:(nonnull NSNumber *)viewTag)
97{
98 NSString *viewName = [self.bridge.uiManager viewNameForReactTag:viewTag];
99 [self addOperationBlock:^(REANodesManager *nodesManager) {
100 [nodesManager connectNodeToView:nodeID viewTag:viewTag viewName:viewName];
101 }];
102}
103
104RCT_EXPORT_METHOD(disconnectNodeFromView:(nonnull NSNumber *)nodeID
105 viewTag:(nonnull NSNumber *)viewTag)
106{
107 [self addOperationBlock:^(REANodesManager *nodesManager) {
108 [nodesManager disconnectNodeFromView:nodeID viewTag:viewTag];
109 }];
110}
111
112RCT_EXPORT_METHOD(attachEvent:(nonnull NSNumber *)viewTag
113 eventName:(nonnull NSString *)eventName
114 eventNodeID:(nonnull NSNumber *)eventNodeID)
115{
116 [self addOperationBlock:^(REANodesManager *nodesManager) {
117 [nodesManager attachEvent:viewTag eventName:eventName eventNodeID:eventNodeID];
118 }];
119}
120
121RCT_EXPORT_METHOD(detachEvent:(nonnull NSNumber *)viewTag
122 eventName:(nonnull NSString *)eventName
123 eventNodeID:(nonnull NSNumber *)eventNodeID)
124{
125 [self addOperationBlock:^(REANodesManager *nodesManager) {
126 [nodesManager detachEvent:viewTag eventName:eventName eventNodeID:eventNodeID];
127 }];
128}
129
130RCT_EXPORT_METHOD(configureProps:(nonnull NSArray<NSString *> *)nativeProps
131 uiProps:(nonnull NSArray<NSString *> *)uiProps)
132{
133 [self addOperationBlock:^(REANodesManager *nodesManager) {
134 [nodesManager configureProps:[NSSet setWithArray:nativeProps] uiProps:[NSSet setWithArray:uiProps]];
135 }];
136}
137
138RCT_EXPORT_METHOD(setValue:(nonnull NSNumber *)nodeID
139 newValue:(nonnull NSNumber *)newValue
140 )
141{
142 [self addOperationBlock:^(REANodesManager *nodesManager) {
143 [nodesManager setValueForNodeID:nodeID value:newValue];
144 }];
145}
146
147RCT_EXPORT_METHOD(triggerRender)
148{
149 [self addOperationBlock:^(REANodesManager *nodesManager) {
150 [nodesManager postRunUpdatesAfterAnimation];
151 }];
152}
153
154#pragma mark -- Batch handling
155
156- (void)addOperationBlock:(AnimatedOperation)operation
157{
158 [_operations addObject:operation];
159}
160
161#pragma mark - RCTUIManagerObserver
162
163- (void)uiManagerWillPerformMounting:(RCTUIManager *)uiManager
164{
165 if (_operations.count == 0) {
166 return;
167 }
168
169 NSArray<AnimatedOperation> *operations = _operations;
170 _operations = [NSMutableArray new];
171
172 REANodesManager *nodesManager = _nodesManager;
173
174 [uiManager addUIBlock:^(__unused RCTUIManager *manager, __unused NSDictionary<NSNumber *, UIView *> *viewRegistry) {
175 for (AnimatedOperation operation in operations) {
176 operation(nodesManager);
177 }
178 [nodesManager operationsBatchDidComplete];
179 }];
180}
181
182#pragma mark -- Events
183
184- (NSArray<NSString *> *)supportedEvents
185{
186 return @[@"onReanimatedCall", @"onReanimatedPropsChange"];
187}
188
189- (void)eventDispatcherWillDispatchEvent:(id<RCTEvent>)event
190{
191 // Events can be dispatched from any queue
192 [_nodesManager dispatchEvent:event];
193}
194
195@end