UNPKG

5.56 kBPlain TextView Raw
1#import "REAModule.h"
2
3#import "REANodesManager.h"
4#import "Transitioning/REATransitionManager.h"
5
6typedef void (^AnimatedOperation)(REANodesManager *nodesManager);
7
8@implementation REAModule
9{
10 REANodesManager *_nodesManager;
11 NSMutableArray<AnimatedOperation> *_operations;
12 REATransitionManager *_transitionManager;
13}
14
15RCT_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
49RCT_EXPORT_METHOD(animateNextTransition:(nonnull NSNumber *)rootTag config:(NSDictionary *)config)
50{
51 [_transitionManager animateNextTransitionInRoot:rootTag withConfig:config];
52}
53
54#pragma mark -- API
55
56RCT_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
64RCT_EXPORT_METHOD(dropNode:(nonnull NSNumber *)nodeID)
65{
66 [self addOperationBlock:^(REANodesManager *nodesManager) {
67 [nodesManager dropNode:nodeID];
68 }];
69}
70
71RCT_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
78RCT_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
86RCT_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
94RCT_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
103RCT_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
111RCT_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
120RCT_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
129RCT_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
137RCT_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