From e04c0a7ae33f3be5fedefa1803b3f6d9d7564cc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82?= Date: Tue, 2 Dec 2025 18:50:48 +0100 Subject: [PATCH 1/2] Fix type --- .../src/v3/hooks/utils/eventHandlersUtils.ts | 34 +++++++++++++++---- .../src/v3/types/ConfigTypes.ts | 32 ++++++++++------- 2 files changed, 48 insertions(+), 18 deletions(-) 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 = { From 43c304cc2f3079530f5cadc2f51e020535a7787c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82?= Date: Mon, 15 Dec 2025 11:18:13 +0100 Subject: [PATCH 2/2] Remove useless casts --- .../src/v3/hooks/utils/eventHandlersUtils.ts | 22 +++++++------------ .../src/v3/types/ConfigTypes.ts | 6 ++--- .../src/v3/types/index.ts | 3 +++ 3 files changed, 14 insertions(+), 17 deletions(-) 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 33bcdea489..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 @@ -3,9 +3,8 @@ import { TouchEventType } from '../../../TouchEventType'; import { CALLBACK_TYPE } from '../../../handlers/gestures/gesture'; import { GestureCallbacks, - GestureEvent, GestureEventCallback, - GestureEventCallbackWithSuccess, + GestureEventCallbackWithDidSucceed, GestureTouchEventCallback, UnpackedGestureHandlerEvent, } from '../../types'; @@ -52,7 +51,7 @@ function getHandler( callbacks: GestureCallbacks ): | GestureEventCallback - | GestureEventCallbackWithSuccess + | GestureEventCallbackWithDidSucceed | GestureTouchEventCallback | undefined { 'worklet'; @@ -95,6 +94,9 @@ 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, @@ -108,17 +110,9 @@ export function runCallback( return; } - if (didSucceed !== undefined) { - (handler as GestureEventCallbackWithSuccess)?.( - event as GestureEvent, - didSucceed - ); + if (didSucceed === undefined) { + (handler as SingleParameterCallback)(event); } else { - // @ts-ignore event is an object. - if ('allTouches' in event) { - (handler as GestureTouchEventCallback)?.(event); - } else { - (handler as GestureEventCallback)?.(event); - } + (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 33f51b50e7..15214653c1 100644 --- a/packages/react-native-gesture-handler/src/v3/types/ConfigTypes.ts +++ b/packages/react-native-gesture-handler/src/v3/types/ConfigTypes.ts @@ -17,7 +17,7 @@ export type GestureEventCallback = ( event: GestureEvent ) => void; -export type GestureEventCallbackWithSuccess = ( +export type GestureEventCallbackWithDidSucceed = ( event: GestureEvent, didSucceed: boolean ) => void; @@ -27,8 +27,8 @@ export type GestureTouchEventCallback = (event: GestureTouchEvent) => void; export type GestureCallbacks = { onBegin?: GestureEventCallback; onActivate?: GestureEventCallback; - onDeactivate?: GestureEventCallbackWithSuccess; - onFinalize?: GestureEventCallbackWithSuccess; + onDeactivate?: GestureEventCallbackWithDidSucceed; + onFinalize?: GestureEventCallbackWithDidSucceed; onUpdate?: GestureEventCallback | AnimatedEvent; onTouchesDown?: GestureTouchEventCallback; onTouchesMove?: GestureTouchEventCallback; 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,