1 | #import "REAModule.h"
|
2 |
|
3 | #import "REANodesManager.h"
|
4 | #import "Transitioning/REATransitionManager.h"
|
5 | #import "native/NativeProxy.h"
|
6 |
|
7 | typedef void (^AnimatedOperation)(REANodesManager *nodesManager);
|
8 |
|
9 | RCTBridge *_bridge_reanimated = nil;
|
10 |
|
11 | @implementation REAModule
|
12 | {
|
13 | NSMutableArray<AnimatedOperation> *_operations;
|
14 | REATransitionManager *_transitionManager;
|
15 | }
|
16 |
|
17 | RCT_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 |
|
50 | RCT_EXPORT_METHOD(animateNextTransition:(nonnull NSNumber *)rootTag config:(NSDictionary *)config)
|
51 | {
|
52 | [_transitionManager animateNextTransitionInRoot:rootTag withConfig:config];
|
53 | }
|
54 |
|
55 | #pragma mark -- API
|
56 |
|
57 | RCT_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 |
|
65 | RCT_EXPORT_METHOD(dropNode:(nonnull NSNumber *)nodeID)
|
66 | {
|
67 | [self addOperationBlock:^(REANodesManager *nodesManager) {
|
68 | [nodesManager dropNode:nodeID];
|
69 | }];
|
70 | }
|
71 |
|
72 | RCT_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 |
|
79 | RCT_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 |
|
87 | RCT_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 |
|
95 | RCT_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 |
|
104 | RCT_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 |
|
112 | RCT_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 |
|
121 | RCT_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 |
|
130 | RCT_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 |
|
138 | RCT_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 |
|
147 | RCT_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
|