diff --git a/packages/react-native-gesture-handler/src/v3/hooks/utils/eventHandlersUtils.ts b/packages/react-native-gesture-handler/src/v3/hooks/utils/eventHandlersUtils.ts index ad3d006dbb..8b69f90494 100644 --- a/packages/react-native-gesture-handler/src/v3/hooks/utils/eventHandlersUtils.ts +++ b/packages/react-native-gesture-handler/src/v3/hooks/utils/eventHandlersUtils.ts @@ -3,6 +3,10 @@ import { CALLBACK_TYPE } from '../../../handlers/gestures/gesture'; import { ChangeCalculatorType, GestureCallbacks, + GestureEvent, + GestureEventCallback, + GestureEventCallbackWithSuccess, + GestureTouchEventCallback, UnpackedGestureHandlerEvent, } from '../../types'; @@ -60,7 +64,11 @@ export function prepareTouchHandlers( export function getHandler( type: CALLBACK_TYPE, callbacks: GestureCallbacks -) { +): + | GestureEventCallback + | GestureEventCallbackWithSuccess + | GestureTouchEventCallback + | undefined { 'worklet'; switch (type) { case CALLBACK_TYPE.BEGAN: @@ -68,7 +76,7 @@ export function getHandler( case CALLBACK_TYPE.START: return callbacks.onActivate; case CALLBACK_TYPE.UPDATE: - return callbacks.onUpdate; + return callbacks.onUpdate as GestureEventCallback; // Animated event is handled in different place. case CALLBACK_TYPE.END: return callbacks.onDeactivate; case CALLBACK_TYPE.FINALIZE: @@ -105,12 +113,26 @@ export function runCallback( type: CALLBACK_TYPE, callbacks: GestureCallbacks, event: UnpackedGestureHandlerEvent, - ...args: unknown[] + success?: boolean ) { 'worklet'; const handler = getHandler(type, callbacks); - // TODO: add proper types (likely boolean) - // @ts-ignore It works, duh - handler?.(event, ...args); + if (!handler) { + return; + } + + if (success !== undefined) { + (handler as GestureEventCallbackWithSuccess)?.( + event as GestureEvent, + success + ); + } else { + // @ts-ignore event is an object. + if ('allTouches' in event) { + (handler as GestureTouchEventCallback)?.(event); + } else { + (handler as GestureEventCallback)?.(event); + } + } } diff --git a/packages/react-native-gesture-handler/src/v3/types/ConfigTypes.ts b/packages/react-native-gesture-handler/src/v3/types/ConfigTypes.ts index aa043e8249..795027a16d 100644 --- a/packages/react-native-gesture-handler/src/v3/types/ConfigTypes.ts +++ b/packages/react-native-gesture-handler/src/v3/types/ConfigTypes.ts @@ -13,19 +13,27 @@ import { } from './EventTypes'; import { WithSharedValue } from './ReanimatedTypes'; +export type GestureEventCallback = ( + event: GestureEvent +) => void; + +export type GestureEventCallbackWithSuccess = ( + event: GestureEvent, + didSucceed: boolean +) => void; + +export type GestureTouchEventCallback = (event: GestureTouchEvent) => void; + export type GestureCallbacks = { - onBegin?: (event: GestureEvent) => void; - onActivate?: (event: GestureEvent) => void; - onDeactivate?: ( - event: GestureEvent, - didSucceed: boolean - ) => void; - onFinalize?: (event: GestureEvent, didSucceed: boolean) => void; - onUpdate?: ((event: GestureEvent) => void) | AnimatedEvent; - onTouchesDown?: (event: GestureTouchEvent) => void; - onTouchesMove?: (event: GestureTouchEvent) => void; - onTouchesUp?: (event: GestureTouchEvent) => void; - onTouchesCancel?: (event: GestureTouchEvent) => void; + onBegin?: GestureEventCallback; + onActivate?: GestureEventCallback; + onDeactivate?: GestureEventCallbackWithSuccess; + onFinalize?: GestureEventCallbackWithSuccess; + onUpdate?: GestureEventCallback | AnimatedEvent; + onTouchesDown?: GestureTouchEventCallback; + onTouchesMove?: GestureTouchEventCallback; + onTouchesUp?: GestureTouchEventCallback; + onTouchesCancel?: GestureTouchEventCallback; }; export type GestureRelations = {