Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
137 commits
Select commit Hold shift + click to select a range
daa017c
Separate Reanimated from JS in NativeDetector
m-bert Aug 21, 2025
1e17cf8
Separate Reanimated on Android
m-bert Aug 21, 2025
08d1e2b
Separate Reanimated on iOS
m-bert Aug 21, 2025
256f707
Reorganize structure
m-bert Aug 21, 2025
19fd985
Create ceparate hooks for Reanimated
m-bert Aug 21, 2025
133319b
Add checks in useGesture
m-bert Aug 22, 2025
e50f6cc
use isAnimatedEvent
m-bert Aug 22, 2025
b3ef022
Extract handlers in separate function
m-bert Aug 22, 2025
952fbe1
Pass correct touch event callback
m-bert Aug 22, 2025
ec9eaa7
Merge branch 'next' into @mbert/extract-reanimated-handlers
m-bert Aug 22, 2025
60a56e6
Merge branch 'next' into @mbert/extract-reanimated-handlers
m-bert Aug 25, 2025
fda23cc
Fix crash when onUpdate is Animated.Event
m-bert Aug 25, 2025
e46554b
Unify lateinit
m-bert Aug 25, 2025
13f3af4
Rename EventTarget on Android
m-bert Aug 25, 2025
d7a2b1a
Rename EventTarget on iOS
m-bert Aug 25, 2025
1b04d3c
Add reset for animated and reanimated events flags
m-bert Aug 25, 2025
b8df015
Rename getter for event handlers
m-bert Aug 25, 2025
93343da
Correctly handle disableReanimated
m-bert Aug 26, 2025
d1d3efb
Unpack nativeEvent
m-bert Aug 26, 2025
03a1e64
Bring back hooks
m-bert Aug 26, 2025
cc1313a
Use old name
m-bert Aug 26, 2025
dac39cf
Disable coalescing on Android
m-bert Aug 7, 2025
51b5a86
Implement DFS for gesture relations
m-bert Aug 13, 2025
92b4a3a
Implement module method for updating relations
m-bert Aug 14, 2025
e73ee57
Add blocksHandlers array
m-bert Aug 14, 2025
432aee0
Handle Simultaneous as root
m-bert Aug 14, 2025
b09d746
Change name to enum
m-bert Aug 14, 2025
db5d261
Move DFS to other file
m-bert Aug 14, 2025
43212af
Do not traverse single gestures
m-bert Aug 18, 2025
4ec26c0
Handle external relations
m-bert Aug 18, 2025
fa599af
Use operation block
m-bert Aug 20, 2025
42fc8c2
Move flushOperations into JS
m-bert Aug 20, 2025
f62a6df
Add exports for type
m-bert Aug 20, 2025
504feae
Add composed handler
m-bert Aug 26, 2025
122613f
Merge branch 'next' into @mbert/extract-reanimated-handlers
m-bert Aug 26, 2025
246f096
Merge branch '@mbert/extract-reanimated-handlers' into @mbert/relatio…
m-bert Aug 26, 2025
e229d84
Rename dfs
m-bert Aug 26, 2025
fac31e2
Split utils
m-bert Aug 26, 2025
53ce245
Merge branch 'next' into @mbert/extract-reanimated-handlers
m-bert Sep 4, 2025
fb88c8c
Change hook eslint rule to warning
m-bert Sep 4, 2025
8e5f07e
Extract choosing handler type into function
m-bert Sep 4, 2025
feaa167
Rename event handlers
m-bert Sep 4, 2025
3f2ea8c
Improve error message
m-bert Sep 4, 2025
4022b96
Move for loop inside function
m-bert Sep 4, 2025
8d9fc49
Merge branch '@mbert/extract-reanimated-handlers' into @mbert/relatio…
m-bert Sep 4, 2025
2dc44b8
Do not drop relataions on config change
m-bert Sep 4, 2025
fab60e5
Rename method
m-bert Sep 5, 2025
31c0e8b
Merge branch '@mbert/extract-reanimated-handlers' into @mbert/relatio…
m-bert Sep 5, 2025
832ffb0
Rename files to camelCase
m-bert Sep 5, 2025
bea99ab
Merge branch 'next' into @mbert/relations-v2
m-bert Sep 5, 2025
fb8c8e3
Rename files to camelCase
m-bert Sep 5, 2025
192556e
Remove todo
m-bert Sep 5, 2025
7c7876b
Make simultaneousWithExternalGesture symmetric
m-bert Sep 5, 2025
3e2b661
Fix crash with animated
m-bert Sep 5, 2025
8cd19ff
Add todo
m-bert Sep 5, 2025
74ec173
Type config
m-bert Sep 5, 2025
5c560e8
Split types and handler data
m-bert Sep 8, 2025
619aed9
Use enums
m-bert Sep 8, 2025
b12824b
Use named type
m-bert Sep 8, 2025
4ad7f5b
Extract dfs call to utils
m-bert Sep 8, 2025
a6f1ecb
Pass composed type as argument
m-bert Sep 8, 2025
761e22a
Move function to global scope
m-bert Sep 8, 2025
648f862
Update comment
m-bert Sep 8, 2025
ce2de67
Assign instead of only push
m-bert Sep 9, 2025
ec85bb5
Add warning about the same gesture passed multiple times
m-bert Sep 9, 2025
d6abf0d
Merge branch '@mbert/relations-v2' into @mbert/properly-type-config
m-bert Sep 9, 2025
2e99481
Do not store set in variable
m-bert Sep 9, 2025
adfada7
Change warning to error
m-bert Sep 9, 2025
7ab9b3b
Use warn about multiple animated events
m-bert Sep 9, 2025
c2c88cc
Do not add repeating tags with external relations into simultaneous h…
m-bert Sep 10, 2025
4baf2cb
Do not mark gesture as simultaneous with itself
m-bert Sep 10, 2025
db2e974
Handle external simultaneous composition
m-bert Sep 11, 2025
6fe39a5
Remove todo
m-bert Sep 11, 2025
1429ecd
Update types
m-bert Sep 11, 2025
81677c7
Change dfs name
m-bert Sep 11, 2025
759d022
Prepare external relations in useGesture
m-bert Sep 11, 2025
7c001fe
Rename types
m-bert Sep 12, 2025
c3d63cc
Mark otherHandlers as possibly undefined
m-bert Sep 12, 2025
3aa7e96
Merge branch '@mbert/relations-v2' into @mbert/properly-type-config
m-bert Sep 12, 2025
d20025b
Add default parameters to Gesture type
m-bert Sep 12, 2025
100e1aa
useTap
m-bert Sep 15, 2025
944cada
Make NativeDetector generic
m-bert Sep 15, 2025
b3e37e7
Merge branch 'next' into @mbert/properly-type-config
m-bert Sep 15, 2025
df1a0f5
Merge branch '@mbert/properly-type-config' into @mbert/gesture-hooks
m-bert Sep 15, 2025
a9392eb
useFling
m-bert Sep 15, 2025
72118e7
useLongPress
m-bert Sep 15, 2025
0688821
Small tap improvements
m-bert Sep 15, 2025
d3a7c32
usePinch
m-bert Sep 15, 2025
bc3f1e5
useRotation
m-bert Sep 15, 2025
3d3198c
Change interface to type
m-bert Sep 15, 2025
2d746d3
useHover
m-bert Sep 15, 2025
ed4af90
useManual
m-bert Sep 15, 2025
7871cc6
useNative
m-bert Sep 15, 2025
28455b3
usePan
m-bert Sep 15, 2025
c21c055
Rename types
m-bert Sep 15, 2025
0bf03e1
Add common props to HandlerData
m-bert Sep 15, 2025
37f392e
Long press default behavior
m-bert Sep 15, 2025
d3ad70f
Pan props validation
m-bert Sep 15, 2025
b8f6921
Extract nativeEvent earlier
m-bert Sep 15, 2025
ab23cf5
Hover change calculator
m-bert Sep 15, 2025
313b3b3
Pan change calculator
m-bert Sep 15, 2025
7bd1ac1
Pinch change calculator
m-bert Sep 15, 2025
029fba8
Rotation change calculator
m-bert Sep 15, 2025
787db88
Extract diff calculations
m-bert Sep 15, 2025
d69d9c4
Merge branch 'next' into @mbert/properly-type-config
m-bert Sep 16, 2025
14a72f1
Merge branch '@mbert/properly-type-config' into @mbert/gesture-hooks
m-bert Sep 16, 2025
85fe1cd
Merge branch '@mbert/gesture-hooks' into @mbert/add-event-calculators
m-bert Sep 16, 2025
e609fe4
Merge branch 'next' into @mbert/gesture-hooks
m-bert Sep 16, 2025
932abfe
Merge branch '@mbert/gesture-hooks' into @mbert/add-event-calculators
m-bert Sep 16, 2025
60b4655
Merge branch 'next' into @mbert/gesture-hooks
m-bert Sep 16, 2025
d2ff3a4
Remove unnecexxary export keywords
m-bert Sep 16, 2025
c10d2e2
Add ts-ignore explanations in NativeDetector
m-bert Sep 16, 2025
557988f
Merge branch '@mbert/gesture-hooks' into @mbert/add-event-calculators
m-bert Sep 16, 2025
65a01e5
Add worklet directive
m-bert Sep 16, 2025
51c55a1
Remove todo
m-bert Sep 16, 2025
e2ab449
Switch order in type name
m-bert Sep 16, 2025
d77bd44
Update types
m-bert Sep 16, 2025
4b406a8
Fix NativeViewGestureHandler name
m-bert Sep 16, 2025
68dd1e6
Fix types
m-bert Sep 16, 2025
875e1dc
Merge branch '@mbert/gesture-hooks' into @mbert/add-event-calculators
m-bert Sep 16, 2025
7f33ffc
Merge branch 'next' into @mbert/gesture-hooks
m-bert Sep 17, 2025
ff6a3c6
Merge branch '@mbert/gesture-hooks' into @mbert/add-event-calculators
m-bert Sep 17, 2025
78a8f1a
Change type name to only T
m-bert Sep 18, 2025
5d0ef4d
Add cloneConfig to other gestures
m-bert Sep 18, 2025
dc472e1
Rename Props to Properties
m-bert Sep 18, 2025
b496adf
Merge branch 'next' into @mbert/gesture-hooks
m-bert Sep 18, 2025
cbaffd2
Merge branch '@mbert/gesture-hooks' into @mbert/add-event-calculators
m-bert Sep 18, 2025
a33781f
Merge branch 'next' into @mbert/add-event-calculators
m-bert Sep 19, 2025
68a24ca
Make change properties non-nullable
m-bert Sep 29, 2025
16b1cc2
Change Extacted to Unpacked
m-bert Sep 29, 2025
312c954
Use 0 instead of current values
m-bert Sep 29, 2025
8bbbd3b
Merge branch 'next' into @mbert/add-event-calculators
m-bert Sep 29, 2025
a28e2c9
Do not copy event
m-bert Sep 29, 2025
04c91fd
Merge branch 'next' into @mbert/add-event-calculators
m-bert Sep 30, 2025
771e25c
Revert "Use 0 instead of current values"
m-bert Oct 2, 2025
f399d36
Use 0 instead of current values in Hover
m-bert Oct 2, 2025
85b70cd
Merge branch 'next' into @mbert/add-event-calculators
m-bert Oct 2, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { ComponentClass } from 'react';
import { tagMessage } from '../../utils';
import { GestureCallbacks, UpdateEvent } from '../../v3/types';
import { GestureCallbacks, GestureUpdateEvent } from '../../v3/types';

export interface SharedValue<Value = unknown> {
value: Value;
Expand All @@ -15,7 +15,7 @@ export interface SharedValue<Value = unknown> {
}

export type ReanimatedContext<THandlerData> = {
lastUpdateEvent: UpdateEvent<THandlerData> | undefined;
lastUpdateEvent: GestureUpdateEvent<THandlerData> | undefined;
};

interface WorkletProps {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,48 +1,46 @@
import { CALLBACK_TYPE } from '../../../handlers/gestures/gesture';
import { State } from '../../../State';
import { GestureCallbacks, StateChangeEvent } from '../../types';
import { isEventForHandlerWithTag, isNativeEvent } from '../utils';
import {
GestureCallbacks,
GestureStateChangeEvent,
StateChangeEvent,
} from '../../types';
import { isEventForHandlerWithTag, maybeExtractNativeEvent } from '../utils';
import { runCallback } from '../utils/eventHandlersUtils';

export function getStateChangeHandler<THandlerData>(
handlerTag: number,
callbacks: GestureCallbacks<THandlerData>
) {
return (event: StateChangeEvent<THandlerData>) => {
return (sourceEvent: StateChangeEvent<THandlerData>) => {
'worklet';

const event = maybeExtractNativeEvent(
sourceEvent
) as GestureStateChangeEvent<THandlerData>;

if (!isEventForHandlerWithTag(handlerTag, event)) {
return;
}

let oldState: State | undefined;
let state: State | undefined;

if (isNativeEvent(event)) {
oldState = event.nativeEvent.oldState;
state = event.nativeEvent.state;
} else {
oldState = event.oldState;
state = event.state;
}

if (oldState === State.UNDETERMINED && state === State.BEGAN) {
if (event.oldState === State.UNDETERMINED && event.state === State.BEGAN) {
runCallback(CALLBACK_TYPE.BEGAN, callbacks, event);
} else if (
(oldState === State.BEGAN || oldState === State.UNDETERMINED) &&
state === State.ACTIVE
(event.oldState === State.BEGAN ||
event.oldState === State.UNDETERMINED) &&
event.state === State.ACTIVE
) {
runCallback(CALLBACK_TYPE.START, callbacks, event);
} else if (oldState !== state && state === State.END) {
if (oldState === State.ACTIVE) {
} else if (event.oldState !== event.state && event.state === State.END) {
if (event.oldState === State.ACTIVE) {
runCallback(CALLBACK_TYPE.END, callbacks, event, true);
}
runCallback(CALLBACK_TYPE.FINALIZE, callbacks, event, true);
} else if (
(state === State.FAILED || state === State.CANCELLED) &&
state !== oldState
(event.state === State.FAILED || event.state === State.CANCELLED) &&
event.state !== event.oldState
) {
if (oldState === State.ACTIVE) {
if (event.oldState === State.ACTIVE) {
runCallback(CALLBACK_TYPE.END, callbacks, event, false);
}
runCallback(CALLBACK_TYPE.FINALIZE, callbacks, event, false);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import { NativeSyntheticEvent } from 'react-native';
import { GestureCallbacks, TouchEvent } from '../../types';
import { isEventForHandlerWithTag, isNativeEvent } from '../utils';
import { isEventForHandlerWithTag, maybeExtractNativeEvent } from '../utils';
import { TouchEventType } from '../../../TouchEventType';
import { GestureTouchEvent } from '../../../handlers/gestureHandlerCommon';
import {
Expand All @@ -12,30 +11,18 @@ export function getTouchEventHandler<THandlerData>(
handlerTag: number,
callbacks: GestureCallbacks<THandlerData>
) {
return (event: TouchEvent) => {
return (sourceEvent: TouchEvent) => {
'worklet';

const event = maybeExtractNativeEvent(sourceEvent) as GestureTouchEvent;

if (!isEventForHandlerWithTag(handlerTag, event)) {
return;
}

if (
isNativeEvent(event) &&
event.nativeEvent.eventType !== TouchEventType.UNDETERMINED
) {
runCallback(
touchEventTypeToCallbackType(
(event as NativeSyntheticEvent<GestureTouchEvent>).nativeEvent
.eventType
),
callbacks,
event
);
} else if (
(event as GestureTouchEvent).eventType !== TouchEventType.UNDETERMINED
) {
if (event.eventType !== TouchEventType.UNDETERMINED) {
runCallback(
touchEventTypeToCallbackType((event as GestureTouchEvent).eventType),
touchEventTypeToCallbackType(event.eventType),
callbacks,
event
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,10 @@ import { ReanimatedContext } from '../../../handlers/gestures/reanimatedWrapper'
import {
ChangeCalculatorType,
GestureCallbacks,
GestureUpdateEvent,
UpdateEvent,
} from '../../types';
import { isEventForHandlerWithTag } from '../utils';
import { isEventForHandlerWithTag, maybeExtractNativeEvent } from '../utils';
import { runCallback } from '../utils/eventHandlersUtils';

export function getUpdateHandler<THandlerData>(
Expand All @@ -15,9 +16,13 @@ export function getUpdateHandler<THandlerData>(
context: ReanimatedContext<THandlerData> | undefined,
changeEventCalculator?: ChangeCalculatorType<THandlerData>
) {
return (event: UpdateEvent<THandlerData>) => {
return (sourceEvent: UpdateEvent<THandlerData>) => {
'worklet';

const event = maybeExtractNativeEvent(
sourceEvent
) as GestureUpdateEvent<THandlerData>;

if (!isEventForHandlerWithTag(handlerTag, event)) {
return;
}
Expand All @@ -36,7 +41,6 @@ export function getUpdateHandler<THandlerData>(
: event
);

// TODO: Investigate why this is always undefined
context.lastUpdateEvent = event;
};
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,11 @@ import { HoverEffect } from '../../../handlers/gestures/hoverGesture';
import {
BaseGestureConfig,
ExcludeInternalConfigProps,
HandlerData,
SingleGestureName,
} from '../../types';
import { useGesture } from '../useGesture';
import { cloneConfig } from '../utils';
import { cloneConfig, getChangeEventCalculator } from '../utils';

type HoverGestureProperties = {
/**
Expand All @@ -27,6 +28,8 @@ type HoverHandlerData = {
absoluteX: number;
absoluteY: number;
stylusData: StylusData;
changeX: number;
changeY: number;
};

type HoverGestureInternalConfig = BaseGestureConfig<
Expand All @@ -37,10 +40,23 @@ type HoverGestureInternalConfig = BaseGestureConfig<
export type HoverGestureConfig =
ExcludeInternalConfigProps<HoverGestureInternalConfig>;

function diffCalculator(
current: HandlerData<HoverHandlerData>,
previous: HandlerData<HoverHandlerData> | null
) {
'worklet';
return {
changeX: previous ? current.x - previous.x : 0,
changeY: previous ? current.y - previous.y : 0,
};
}

export function useHover(config: HoverGestureConfig) {
const hoverConfig = cloneConfig<HoverHandlerData, HoverGestureProperties>(
config
);

hoverConfig.changeEventCalculator = getChangeEventCalculator(diffCalculator);

return useGesture(SingleGestureName.Hover, hoverConfig);
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@ import { StylusData } from '../../../handlers/gestureHandlerCommon';
import {
BaseGestureConfig,
ExcludeInternalConfigProps,
HandlerData,
SingleGestureName,
} from '../../types';
import { useGesture } from '../useGesture';
import { cloneConfig, remapProps } from '../utils';
import { getChangeEventCalculator, remapProps, cloneConfig } from '../utils';

type CommonPanGestureProperties = {
/**
Expand Down Expand Up @@ -114,6 +115,8 @@ type PanHandlerData = {
velocityX: number;
velocityY: number;
stylusData: StylusData;
changeX: number;
changeY: number;
};

export type PanGestureConfig = ExcludeInternalConfigProps<
Expand Down Expand Up @@ -236,6 +239,21 @@ function transformPanProps(
}
}

function diffCalculator(
current: HandlerData<PanHandlerData>,
previous: HandlerData<PanHandlerData> | null
) {
'worklet';
return {
changeX: previous
? current.translationX - previous.translationX
: current.translationX,
changeY: previous
? current.translationY - previous.translationY
: current.translationY,
};
}

export function usePan(config: PanGestureConfig) {
if (__DEV__) {
validatePanConfig(config);
Expand All @@ -252,6 +270,8 @@ export function usePan(config: PanGestureConfig) {

transformPanProps(panConfig);

panConfig.changeEventCalculator = getChangeEventCalculator(diffCalculator);

return useGesture<PanHandlerData, PanGestureInternalProperties>(
SingleGestureName.Pan,
panConfig
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import {
BaseGestureConfig,
ExcludeInternalConfigProps,
HandlerData,
SingleGestureName,
} from '../../types';
import { useGesture } from '../useGesture';
import { cloneConfig } from '../utils';
import { cloneConfig, getChangeEventCalculator } from '../utils';

type PinchGestureProperties = Record<string, never>;

Expand All @@ -13,6 +14,7 @@ type PinchHandlerData = {
focalX: number;
focalY: number;
velocity: number;
scaleChange: number;
};

type PinchGestureInternalConfig = BaseGestureConfig<
Expand All @@ -23,10 +25,22 @@ type PinchGestureInternalConfig = BaseGestureConfig<
export type PinchGestureConfig =
ExcludeInternalConfigProps<PinchGestureInternalConfig>;

function diffCalculator(
current: HandlerData<PinchHandlerData>,
previous: HandlerData<PinchHandlerData> | null
) {
'worklet';
return {
scaleChange: previous ? current.scale / previous.scale : current.scale,
};
}

export function usePinch(config: PinchGestureConfig) {
const pinchConfig = cloneConfig<PinchHandlerData, PinchGestureProperties>(
config
);

pinchConfig.changeEventCalculator = getChangeEventCalculator(diffCalculator);

return useGesture(SingleGestureName.Pinch, pinchConfig);
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import {
BaseGestureConfig,
ExcludeInternalConfigProps,
HandlerData,
SingleGestureName,
} from '../../types';
import { useGesture } from '../useGesture';
import { cloneConfig } from '../utils';
import { cloneConfig, getChangeEventCalculator } from '../utils';

type RotationGestureProperties = Record<string, never>;

Expand All @@ -13,6 +14,7 @@ type RotationHandlerData = {
anchorX: number;
anchorY: number;
velocity: number;
rotationChange: number;
};

type RotationGestureInternalConfig = BaseGestureConfig<
Expand All @@ -23,11 +25,26 @@ type RotationGestureInternalConfig = BaseGestureConfig<
export type RotationGestureConfig =
ExcludeInternalConfigProps<RotationGestureInternalConfig>;

function diffCalculator(
current: HandlerData<RotationHandlerData>,
previous: HandlerData<RotationHandlerData> | null
) {
'worklet';
return {
rotationChange: previous
? current.rotation - previous.rotation
: current.rotation,
};
}

export function useRotation(config: RotationGestureConfig) {
const rotationConfig = cloneConfig<
RotationHandlerData,
RotationGestureProperties
>(config);

rotationConfig.changeEventCalculator =
getChangeEventCalculator(diffCalculator);

return useGesture(SingleGestureName.Rotation, rotationConfig);
}
Loading
Loading