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