forked from software-mansion/react-native-gesture-handler
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathRNGestureHandlerModule.m
More file actions
143 lines (106 loc) · 3.95 KB
/
RNGestureHandlerModule.m
File metadata and controls
143 lines (106 loc) · 3.95 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#import "RNGestureHandlerModule.h"
#import <React/RCTLog.h>
#import <React/RCTViewManager.h>
#import <React/RCTComponent.h>
#import <React/RCTUIManager.h>
#import <React/RCTUIManagerObserverCoordinator.h>
#import "RNGestureHandlerState.h"
#import "RNGestureHandler.h"
#import "RNGestureHandlerManager.h"
@interface RNGestureHandlerModule () <RCTUIManagerObserver>
@end
@interface RNDummyViewManager : RCTViewManager
@end
@implementation RNDummyViewManager
RCT_EXPORT_MODULE()
RCT_EXPORT_VIEW_PROPERTY(onGestureHandlerEvent, RCTDirectEventBlock)
RCT_EXPORT_VIEW_PROPERTY(onGestureHandlerStateChange, RCTDirectEventBlock)
@end
typedef void (^GestureHandlerOperation)(RNGestureHandlerManager *manager);
@implementation RNGestureHandlerModule
{
RNGestureHandlerManager *_manager;
// Oparations called after views have been updated.
NSMutableArray<GestureHandlerOperation> *_operations;
}
RCT_EXPORT_MODULE()
- (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 `uiManagerWillFlushUIBlocks`
// will be called from that queue.
// This is required as this module rely on having all the view nodes created before
// gesture handlers can be associated with them
return RCTGetUIManagerQueue();
}
- (void)setBridge:(RCTBridge *)bridge
{
[super setBridge:bridge];
_manager = [[RNGestureHandlerManager alloc]
initWithUIManager:bridge.uiManager
eventDispatcher:bridge.eventDispatcher];
_operations = [NSMutableArray new];
[bridge.uiManager.observerCoordinator addObserver:self];
}
RCT_EXPORT_METHOD(createGestureHandler:(nonnull NSNumber *)viewTag withName:(nonnull NSString *)handlerName tag:(nonnull NSNumber *)handlerTag config:(NSDictionary *)config)
{
[self addOperationBlock:^(RNGestureHandlerManager *manager) {
[manager createGestureHandler:viewTag withName:handlerName tag:handlerTag config:config];
}];
}
RCT_EXPORT_METHOD(dropGestureHandlersForView:(nonnull NSNumber *)viewTag)
{
[self addOperationBlock:^(RNGestureHandlerManager *manager) {
[manager dropGestureHandlersForView:viewTag];
}];
}
RCT_EXPORT_METHOD(handleSetJSResponder:(nonnull NSNumber *)viewTag blockNativeResponder:(nonnull NSNumber *)blockNativeResponder)
{
[self addOperationBlock:^(RNGestureHandlerManager *manager) {
[manager handleSetJSResponder:viewTag blockNativeResponder:blockNativeResponder];
}];
}
RCT_EXPORT_METHOD(handleClearJSResponder)
{
[self addOperationBlock:^(RNGestureHandlerManager *manager) {
[manager handleClearJSResponder];
}];
}
#pragma mark -- Batch handling
- (void)addOperationBlock:(GestureHandlerOperation)operation
{
[_operations addObject:operation];
}
#pragma mark - RCTUIManagerObserver
- (void)uiManagerWillFlushUIBlocks:(RCTUIManager *)uiManager
{
if (_operations.count == 0) {
return;
}
NSArray<GestureHandlerOperation> *operations = _operations;
_operations = [NSMutableArray new];
[uiManager addUIBlock:^(__unused RCTUIManager *manager, __unused NSDictionary<NSNumber *, UIView *> *viewRegistry) {
for (GestureHandlerOperation operation in operations) {
operation(self->_manager);
}
}];
}
#pragma mark Events
- (NSArray<NSString *> *)supportedEvents
{
return @[@"onGestureHandlerEvent", @"onGestureHandlerStateChange"];
}
#pragma mark Module Constants
- (NSDictionary *)constantsToExport
{
return @{ @"State": @{
@"UNDETERMINED": @(RNGestureHandlerStateUndetermined),
@"BEGAN": @(RNGestureHandlerStateBegan),
@"ACTIVE": @(RNGestureHandlerStateActive),
@"CANCELLED": @(RNGestureHandlerStateCancelled),
@"FAILED": @(RNGestureHandlerStateFailed),
@"END": @(RNGestureHandlerStateEnd)
}
};
}
@end