1#import "RNGestureHandlerEvents.h"
2
3#define SAFE_VELOCITY(velocity) @(isnan(velocity) ? 0 : velocity)
4
5@implementation RNGestureHandlerEventExtraData
6
7- (instancetype)initWithData:(NSDictionary *)data;
8{
9  if ((self = [super init])) {
10    _data = data;
11  }
12  return self;
13}
14
15+ (RNGestureHandlerEventExtraData *)forPosition:(CGPoint)position
16                           withAbsolutePosition:(CGPoint)absolutePosition
17                            withNumberOfTouches:(NSUInteger)numberOfTouches
18{
19  return [[RNGestureHandlerEventExtraData alloc] initWithData:@{
20    @"x" : @(position.x),
21    @"y" : @(position.y),
22    @"absoluteX" : @(absolutePosition.x),
23    @"absoluteY" : @(absolutePosition.y),
24    @"numberOfPointers" : @(numberOfTouches)
25  }];
26}
27
28+ (RNGestureHandlerEventExtraData *)forPosition:(CGPoint)position
29                           withAbsolutePosition:(CGPoint)absolutePosition
30                            withNumberOfTouches:(NSUInteger)numberOfTouches
31                                   withDuration:(NSUInteger)duration
32{
33  return [[RNGestureHandlerEventExtraData alloc] initWithData:@{
34    @"x" : @(position.x),
35    @"y" : @(position.y),
36    @"absoluteX" : @(absolutePosition.x),
37    @"absoluteY" : @(absolutePosition.y),
38    @"numberOfPointers" : @(numberOfTouches),
39    @"duration" : @(duration)
40  }];
41}
42
43+ (RNGestureHandlerEventExtraData *)forPan:(CGPoint)position
44                      withAbsolutePosition:(CGPoint)absolutePosition
45                           withTranslation:(CGPoint)translation
46                              withVelocity:(CGPoint)velocity
47                       withNumberOfTouches:(NSUInteger)numberOfTouches
48{
49  return [[RNGestureHandlerEventExtraData alloc] initWithData:@{
50    @"x" : @(position.x),
51    @"y" : @(position.y),
52    @"absoluteX" : @(absolutePosition.x),
53    @"absoluteY" : @(absolutePosition.y),
54    @"translationX" : @(translation.x),
55    @"translationY" : @(translation.y),
56    @"velocityX" : SAFE_VELOCITY(velocity.x),
57    @"velocityY" : SAFE_VELOCITY(velocity.y),
58    @"numberOfPointers" : @(numberOfTouches)
59  }];
60}
61
62+ (RNGestureHandlerEventExtraData *)forForce:(CGFloat)force
63                                 forPosition:(CGPoint)position
64                        withAbsolutePosition:(CGPoint)absolutePosition
65                         withNumberOfTouches:(NSUInteger)numberOfTouches
66{
67  return [[RNGestureHandlerEventExtraData alloc] initWithData:@{
68    @"x" : @(position.x),
69    @"y" : @(position.y),
70    @"absoluteX" : @(absolutePosition.x),
71    @"absoluteY" : @(absolutePosition.y),
72    @"force" : @(force),
73    @"numberOfPointers" : @(numberOfTouches)
74  }];
75}
76
77+ (RNGestureHandlerEventExtraData *)forPinch:(CGFloat)scale
78                              withFocalPoint:(CGPoint)focalPoint
79                                withVelocity:(CGFloat)velocity
80                         withNumberOfTouches:(NSUInteger)numberOfTouches
81{
82  return [[RNGestureHandlerEventExtraData alloc] initWithData:@{
83    @"scale" : @(scale),
84    @"focalX" : @(focalPoint.x),
85    @"focalY" : @(focalPoint.y),
86    @"velocity" : SAFE_VELOCITY(velocity),
87    @"numberOfPointers" : @(numberOfTouches)
88  }];
89}
90
91+ (RNGestureHandlerEventExtraData *)forRotation:(CGFloat)rotation
92                                withAnchorPoint:(CGPoint)anchorPoint
93                                   withVelocity:(CGFloat)velocity
94                            withNumberOfTouches:(NSUInteger)numberOfTouches
95{
96  return [[RNGestureHandlerEventExtraData alloc] initWithData:@{
97    @"rotation" : @(rotation),
98    @"anchorX" : @(anchorPoint.x),
99    @"anchorY" : @(anchorPoint.y),
100    @"velocity" : SAFE_VELOCITY(velocity),
101    @"numberOfPointers" : @(numberOfTouches)
102  }];
103}
104
105+ (RNGestureHandlerEventExtraData *)forEventType:(RNGHTouchEventType)eventType
106                             withChangedPointers:(NSArray<NSDictionary *> *)changedPointers
107                                 withAllPointers:(NSArray<NSDictionary *> *)allPointers
108                             withNumberOfTouches:(NSUInteger)numberOfTouches
109{
110  if (changedPointers == nil || allPointers == nil) {
111    changedPointers = @[];
112    allPointers = @[];
113    eventType = RNGHTouchEventTypeUndetermined;
114  }
115
116  return [[RNGestureHandlerEventExtraData alloc] initWithData:@{
117    @"eventType" : @(eventType),
118    @"changedTouches" : changedPointers,
119    @"allTouches" : allPointers,
120    @"numberOfTouches" : @(numberOfTouches)
121  }];
122}
123
124+ (RNGestureHandlerEventExtraData *)forPointerInside:(BOOL)pointerInside
125{
126  return [[RNGestureHandlerEventExtraData alloc] initWithData:@{@"pointerInside" : @(pointerInside)}];
127}
128
129@end
130
131@implementation RNGestureHandlerEvent {
132  NSNumber *_handlerTag;
133  RNGestureHandlerState _state;
134  RNGestureHandlerEventExtraData *_extraData;
135}
136
137@synthesize viewTag = _viewTag;
138@synthesize coalescingKey = _coalescingKey;
139
140- (instancetype)initWithReactTag:(NSNumber *)reactTag
141                      handlerTag:(NSNumber *)handlerTag
142                           state:(RNGestureHandlerState)state
143                       extraData:(RNGestureHandlerEventExtraData *)extraData
144                   coalescingKey:(uint16_t)coalescingKey
145{
146  if ((self = [super init])) {
147    _viewTag = reactTag;
148    _handlerTag = handlerTag;
149    _state = state;
150    _extraData = extraData;
151    _coalescingKey = coalescingKey;
152  }
153  return self;
154}
155
156RCT_NOT_IMPLEMENTED(-(instancetype)init)
157
158- (NSString *)eventName
159{
160  return @"onGestureHandlerEvent";
161}
162
163- (BOOL)canCoalesce
164{
165  return YES;
166}
167
168- (id<RCTEvent>)coalesceWithEvent:(id<RCTEvent>)newEvent;
169{
170  return newEvent;
171}
172
173+ (NSString *)moduleDotMethod
174{
175  return @"RCTEventEmitter.receiveEvent";
176}
177
178- (NSArray *)arguments
179{
180  NSMutableDictionary *body = [NSMutableDictionary dictionaryWithDictionary:_extraData.data];
181  [body setObject:_viewTag forKey:@"target"];
182  [body setObject:_handlerTag forKey:@"handlerTag"];
183  [body setObject:@(_state) forKey:@"state"];
184  return @[ self.viewTag, @"onGestureHandlerEvent", body ];
185}
186
187@end
188
189@implementation RNGestureHandlerStateChange {
190  NSNumber *_handlerTag;
191  RNGestureHandlerState _state;
192  RNGestureHandlerState _prevState;
193  RNGestureHandlerEventExtraData *_extraData;
194}
195
196@synthesize viewTag = _viewTag;
197@synthesize coalescingKey = _coalescingKey;
198
199- (instancetype)initWithReactTag:(NSNumber *)reactTag
200                      handlerTag:(NSNumber *)handlerTag
201                           state:(RNGestureHandlerState)state
202                       prevState:(RNGestureHandlerState)prevState
203                       extraData:(RNGestureHandlerEventExtraData *)extraData
204{
205  static uint16_t coalescingKey = 0;
206  if ((self = [super init])) {
207    _viewTag = reactTag;
208    _handlerTag = handlerTag;
209    _state = state;
210    _prevState = prevState;
211    _extraData = extraData;
212    _coalescingKey = coalescingKey++;
213  }
214  return self;
215}
216
217RCT_NOT_IMPLEMENTED(-(instancetype)init)
218
219- (NSString *)eventName
220{
221  return @"onGestureHandlerStateChange";
222}
223
224- (BOOL)canCoalesce
225{
226  // TODO: event coalescing
227  return NO;
228}
229
230- (id<RCTEvent>)coalesceWithEvent:(id<RCTEvent>)newEvent;
231{
232  return newEvent;
233}
234
235+ (NSString *)moduleDotMethod
236{
237  return @"RCTEventEmitter.receiveEvent";
238}
239
240- (NSArray *)arguments
241{
242  NSMutableDictionary *body = [NSMutableDictionary dictionaryWithDictionary:_extraData.data];
243  [body setObject:_viewTag forKey:@"target"];
244  [body setObject:_handlerTag forKey:@"handlerTag"];
245  [body setObject:@(_state) forKey:@"state"];
246  [body setObject:@(_prevState) forKey:@"oldState"];
247  return @[ self.viewTag, @"onGestureHandlerStateChange", body ];
248}
249
250@end
251