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