UNPKG

react-native-gesture-handler

Version:

Declarative API exposing native platform touch and gesture system to React Native

115 lines (94 loc) 3.91 kB
import type { GestureTouchEvent } from '../../handlers/gestureHandlerCommon'; import type { PointerType } from '../../PointerType'; import type { State } from '../../State'; // Structural stand-in for a synthetic event carrying `nativeEvent`. Kept // minimal on purpose: RN 0.87's Strict TS API makes the other synthetic-event // fields optional, so any richer shape stops being a superset of the real // `NativeSyntheticEvent` across RN versions. We only ever read `nativeEvent`. export type NativeEventWrapper<T> = { nativeEvent: T; }; // Payload of the managed button's press events. The codegen spec // (`specs/RNGestureHandlerButtonNativeComponent`) declares its own // codegen type — specs must stay self-contained for the codegen parser export type ButtonEvent = Readonly<{ pointerInside: boolean; x: number; y: number; absoluteX: number; absoluteY: number; numberOfPointers: number; pointerType: PointerType; }>; type EventPayload = { handlerTag: number; state: State; }; type StateChangeEventPayload = EventPayload & { oldState: State; }; type BaseHandlerData = { numberOfPointers: number; pointerType: PointerType; }; export type HandlerData<T> = BaseHandlerData & T; export type GestureUpdateEventWithHandlerData<T> = EventPayload & { handlerData: HandlerData<T>; }; export type GestureStateChangeEventWithHandlerData<T> = StateChangeEventPayload & { handlerData: HandlerData<T>; }; export type GestureHandlerEventWithHandlerData< THandlerData, TExtendedHandlerData extends THandlerData = THandlerData, > = | UpdateEventWithHandlerData<TExtendedHandlerData> | StateChangeEventWithHandlerData<THandlerData> | TouchEvent; export type UnpackedGestureHandlerEventWithHandlerData< THandlerData, TExtendedHandlerData extends THandlerData = THandlerData, > = | GestureUpdateEventWithHandlerData<TExtendedHandlerData> | GestureStateChangeEventWithHandlerData<THandlerData> | GestureTouchEvent; export type UpdateEventWithHandlerData<THandlerData> = | GestureUpdateEventWithHandlerData<THandlerData> | NativeEventWrapper<GestureUpdateEventWithHandlerData<THandlerData>>; export type StateChangeEventWithHandlerData<THandlerData> = | GestureStateChangeEventWithHandlerData<THandlerData> | NativeEventWrapper<GestureStateChangeEventWithHandlerData<THandlerData>>; export type TouchEvent = | GestureTouchEvent | NativeEventWrapper<GestureTouchEvent>; export type GestureEvent<THandlerData> = { handlerTag: number; } & HandlerData<THandlerData>; export type GestureEndEvent<THandlerData> = { canceled: boolean; } & GestureEvent<THandlerData>; export type UnpackedGestureHandlerEvent<THandlerData> = | GestureEvent<THandlerData> | GestureTouchEvent; // Structural stand-in for RN's `Animated.Value` as a mapping leaf: the // mapping checks only walk the object structure and never call into the // value, so any non-mapping shape with Animated.Value's core method works. type AnimatedValue = { setValue: (value: number) => void; }; // This is not how Animated.event is typed in React Native. We add _argMapping in order to // have access to the _argMapping property to check for usage of `change*` callbacks. // It's also not typed as a function, which is breaking Gesture Handler type definitions. type AnimatedMapping = { [key: string]: AnimatedMapping } | AnimatedValue; export type AnimatedEvent = { _argMapping: (AnimatedMapping | null)[]; }; export type ChangeCalculatorType<TExtendedHandlerData> = ( current: GestureUpdateEventWithHandlerData<TExtendedHandlerData>, previous?: GestureUpdateEventWithHandlerData<TExtendedHandlerData> ) => GestureUpdateEventWithHandlerData<TExtendedHandlerData>; export type DiffCalculatorType<TExtendedHandlerData> = ( current: HandlerData<TExtendedHandlerData>, previous: HandlerData<TExtendedHandlerData> | null ) => Partial<HandlerData<TExtendedHandlerData>>;