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 2dce1babef..3c7da5c433 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 @@ -1,7 +1,13 @@ import { useMemo } from 'react'; import { TouchEventType } from '../../../TouchEventType'; import { CALLBACK_TYPE } from '../../../handlers/gestures/gesture'; -import { GestureCallbacks, UnpackedGestureHandlerEvent } from '../../types'; +import { + GestureCallbacks, + GestureEventCallback, + GestureEventCallbackWithDidSucceed, + GestureTouchEventCallback, + UnpackedGestureHandlerEvent, +} from '../../types'; export function useMemoizedGestureCallbacks( callbacks: GestureCallbacks @@ -43,7 +49,11 @@ export function useMemoizedGestureCallbacks( function getHandler( type: CALLBACK_TYPE, callbacks: GestureCallbacks -) { +): + | GestureEventCallback + | GestureEventCallbackWithDidSucceed + | GestureTouchEventCallback + | undefined { 'worklet'; switch (type) { case CALLBACK_TYPE.BEGAN: @@ -51,7 +61,7 @@ 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: @@ -84,16 +94,25 @@ export function touchEventTypeToCallbackType( return CALLBACK_TYPE.UNDEFINED; } +type SingleParameterCallback = (event: T) => void; +type DoubleParameterCallback = (event: T, didSucceed: boolean) => void; + export function runCallback( type: CALLBACK_TYPE, callbacks: GestureCallbacks, event: UnpackedGestureHandlerEvent, - ...args: unknown[] + didSucceed?: 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 (didSucceed === undefined) { + (handler as SingleParameterCallback)(event); + } else { + (handler as DoubleParameterCallback)(event, didSucceed); + } } 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 0486a78a2b..15214653c1 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 GestureEventCallbackWithDidSucceed = ( + 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?: GestureEventCallbackWithDidSucceed; + onFinalize?: GestureEventCallbackWithDidSucceed; + onUpdate?: GestureEventCallback | AnimatedEvent; + onTouchesDown?: GestureTouchEventCallback; + onTouchesMove?: GestureTouchEventCallback; + onTouchesUp?: GestureTouchEventCallback; + onTouchesCancel?: GestureTouchEventCallback; }; export type GestureRelations = { diff --git a/packages/react-native-gesture-handler/src/v3/types/index.ts b/packages/react-native-gesture-handler/src/v3/types/index.ts index d9550c1645..fc94570b41 100644 --- a/packages/react-native-gesture-handler/src/v3/types/index.ts +++ b/packages/react-native-gesture-handler/src/v3/types/index.ts @@ -22,6 +22,9 @@ export type { export type { GestureCallbacks, + GestureEventCallback, + GestureEventCallbackWithDidSucceed, + GestureTouchEventCallback, GestureRelations, InternalConfigProps, CommonGestureConfig,