Skip to content

Commit d460812

Browse files
authored
Merge branch 'next' into @akwasniewski/logic-detector
2 parents 5876daa + 50805b0 commit d460812

29 files changed

Lines changed: 451 additions & 207 deletions

packages/react-native-gesture-handler/src/handlers/gestures/GestureDetector/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1+
import { SharedValue } from '../../../v3/types';
12
import { GestureType, HandlerCallbacks } from '../gesture';
2-
import { SharedValue } from '../reanimatedWrapper';
33

44
export interface AttachedGestureState {
55
// Array of gestures that should be attached to the view under that gesture detector

packages/react-native-gesture-handler/src/handlers/gestures/reanimatedWrapper.ts

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,13 @@
11
import { ComponentClass } from 'react';
22
import { tagMessage } from '../../utils';
3-
import { GestureCallbacks, UpdateEvent } from '../../v3/types';
4-
5-
export interface SharedValue<Value = unknown> {
6-
value: Value;
7-
get(): Value;
8-
set(value: Value | ((value: Value) => Value)): void;
9-
addListener: (listenerID: number, listener: (value: Value) => void) => void;
10-
removeListener: (listenerID: number) => void;
11-
modify: (
12-
modifier?: <T extends Value>(value: T) => T,
13-
forceUpdate?: boolean
14-
) => void;
15-
}
3+
import {
4+
GestureCallbacks,
5+
GestureUpdateEvent,
6+
SharedValue,
7+
} from '../../v3/types';
168

179
export type ReanimatedContext<THandlerData> = {
18-
lastUpdateEvent: UpdateEvent<THandlerData> | undefined;
10+
lastUpdateEvent: GestureUpdateEvent<THandlerData> | undefined;
1911
};
2012

2113
interface WorkletProps {
@@ -52,7 +44,7 @@ let Reanimated:
5244
) => (event: unknown) => void;
5345
useSharedValue: <T>(value: T) => SharedValue<T>;
5446
setGestureState: (handlerTag: number, newState: number) => void;
55-
isSharedValue: (value: unknown) => value is SharedValue<unknown>;
47+
isSharedValue: <T = unknown>(value: unknown) => value is SharedValue<T>;
5648
isWorkletFunction<
5749
Args extends unknown[] = unknown[],
5850
ReturnValue = unknown,

packages/react-native-gesture-handler/src/v3/hooks/callbacks/stateChangeHandler.ts

Lines changed: 20 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,46 @@
11
import { CALLBACK_TYPE } from '../../../handlers/gestures/gesture';
22
import { State } from '../../../State';
3-
import { GestureCallbacks, StateChangeEvent } from '../../types';
4-
import { isEventForHandlerWithTag, isNativeEvent } from '../utils';
3+
import {
4+
GestureCallbacks,
5+
GestureStateChangeEvent,
6+
StateChangeEvent,
7+
} from '../../types';
8+
import { isEventForHandlerWithTag, maybeExtractNativeEvent } from '../utils';
59
import { runCallback } from '../utils/eventHandlersUtils';
610

711
export function getStateChangeHandler<THandlerData>(
812
handlerTag: number,
913
callbacks: GestureCallbacks<THandlerData>
1014
) {
11-
return (event: StateChangeEvent<THandlerData>) => {
15+
return (sourceEvent: StateChangeEvent<THandlerData>) => {
1216
'worklet';
1317

18+
const event = maybeExtractNativeEvent(
19+
sourceEvent
20+
) as GestureStateChangeEvent<THandlerData>;
21+
1422
if (!isEventForHandlerWithTag(handlerTag, event)) {
1523
return;
1624
}
1725

18-
let oldState: State | undefined;
19-
let state: State | undefined;
20-
21-
if (isNativeEvent(event)) {
22-
oldState = event.nativeEvent.oldState;
23-
state = event.nativeEvent.state;
24-
} else {
25-
oldState = event.oldState;
26-
state = event.state;
27-
}
28-
29-
if (oldState === State.UNDETERMINED && state === State.BEGAN) {
26+
if (event.oldState === State.UNDETERMINED && event.state === State.BEGAN) {
3027
runCallback(CALLBACK_TYPE.BEGAN, callbacks, event);
3128
} else if (
32-
(oldState === State.BEGAN || oldState === State.UNDETERMINED) &&
33-
state === State.ACTIVE
29+
(event.oldState === State.BEGAN ||
30+
event.oldState === State.UNDETERMINED) &&
31+
event.state === State.ACTIVE
3432
) {
3533
runCallback(CALLBACK_TYPE.START, callbacks, event);
36-
} else if (oldState !== state && state === State.END) {
37-
if (oldState === State.ACTIVE) {
34+
} else if (event.oldState !== event.state && event.state === State.END) {
35+
if (event.oldState === State.ACTIVE) {
3836
runCallback(CALLBACK_TYPE.END, callbacks, event, true);
3937
}
4038
runCallback(CALLBACK_TYPE.FINALIZE, callbacks, event, true);
4139
} else if (
42-
(state === State.FAILED || state === State.CANCELLED) &&
43-
state !== oldState
40+
(event.state === State.FAILED || event.state === State.CANCELLED) &&
41+
event.state !== event.oldState
4442
) {
45-
if (oldState === State.ACTIVE) {
43+
if (event.oldState === State.ACTIVE) {
4644
runCallback(CALLBACK_TYPE.END, callbacks, event, false);
4745
}
4846
runCallback(CALLBACK_TYPE.FINALIZE, callbacks, event, false);

packages/react-native-gesture-handler/src/v3/hooks/callbacks/touchEventHandler.ts

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
import { NativeSyntheticEvent } from 'react-native';
21
import { GestureCallbacks, TouchEvent } from '../../types';
3-
import { isEventForHandlerWithTag, isNativeEvent } from '../utils';
2+
import { isEventForHandlerWithTag, maybeExtractNativeEvent } from '../utils';
43
import { TouchEventType } from '../../../TouchEventType';
54
import { GestureTouchEvent } from '../../../handlers/gestureHandlerCommon';
65
import {
@@ -12,30 +11,18 @@ export function getTouchEventHandler<THandlerData>(
1211
handlerTag: number,
1312
callbacks: GestureCallbacks<THandlerData>
1413
) {
15-
return (event: TouchEvent) => {
14+
return (sourceEvent: TouchEvent) => {
1615
'worklet';
1716

17+
const event = maybeExtractNativeEvent(sourceEvent) as GestureTouchEvent;
18+
1819
if (!isEventForHandlerWithTag(handlerTag, event)) {
1920
return;
2021
}
2122

22-
if (
23-
isNativeEvent(event) &&
24-
event.nativeEvent.eventType !== TouchEventType.UNDETERMINED
25-
) {
26-
runCallback(
27-
touchEventTypeToCallbackType(
28-
(event as NativeSyntheticEvent<GestureTouchEvent>).nativeEvent
29-
.eventType
30-
),
31-
callbacks,
32-
event
33-
);
34-
} else if (
35-
(event as GestureTouchEvent).eventType !== TouchEventType.UNDETERMINED
36-
) {
23+
if (event.eventType !== TouchEventType.UNDETERMINED) {
3724
runCallback(
38-
touchEventTypeToCallbackType((event as GestureTouchEvent).eventType),
25+
touchEventTypeToCallbackType(event.eventType),
3926
callbacks,
4027
event
4128
);

packages/react-native-gesture-handler/src/v3/hooks/callbacks/updateHandler.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@ import { ReanimatedContext } from '../../../handlers/gestures/reanimatedWrapper'
44
import {
55
ChangeCalculatorType,
66
GestureCallbacks,
7+
GestureUpdateEvent,
78
UpdateEvent,
89
} from '../../types';
9-
import { isEventForHandlerWithTag } from '../utils';
10+
import { isEventForHandlerWithTag, maybeExtractNativeEvent } from '../utils';
1011
import { runCallback } from '../utils/eventHandlersUtils';
1112

1213
export function getUpdateHandler<THandlerData>(
@@ -15,9 +16,13 @@ export function getUpdateHandler<THandlerData>(
1516
context: ReanimatedContext<THandlerData> | undefined,
1617
changeEventCalculator?: ChangeCalculatorType<THandlerData>
1718
) {
18-
return (event: UpdateEvent<THandlerData>) => {
19+
return (sourceEvent: UpdateEvent<THandlerData>) => {
1920
'worklet';
2021

22+
const event = maybeExtractNativeEvent(
23+
sourceEvent
24+
) as GestureUpdateEvent<THandlerData>;
25+
2126
if (!isEventForHandlerWithTag(handlerTag, event)) {
2227
return;
2328
}
@@ -36,7 +41,6 @@ export function getUpdateHandler<THandlerData>(
3641
: event
3742
);
3843

39-
// TODO: Investigate why this is always undefined
4044
context.lastUpdateEvent = event;
4145
};
4246
}

packages/react-native-gesture-handler/src/v3/hooks/gestures/useFling.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,12 @@ import {
22
BaseGestureConfig,
33
ExcludeInternalConfigProps,
44
SingleGestureName,
5+
WithSharedValue,
56
} from '../../types';
67
import { useGesture } from '../useGesture';
78
import { cloneConfig } from '../utils';
89

9-
type FlingGestureProperties = {
10+
type FlingGestureProperties = WithSharedValue<{
1011
/**
1112
* Expressed allowed direction of movement. It's possible to pass one or many
1213
* directions in one parameter:
@@ -27,7 +28,7 @@ type FlingGestureProperties = {
2728
* Determine exact number of points required to handle the fling gesture.
2829
*/
2930
numberOfPointers?: number;
30-
};
31+
}>;
3132

3233
type FlingHandlerData = {
3334
x: number;

packages/react-native-gesture-handler/src/v3/hooks/gestures/useHover.ts

Lines changed: 34 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,30 +3,37 @@ import { HoverEffect } from '../../../handlers/gestures/hoverGesture';
33
import {
44
BaseGestureConfig,
55
ExcludeInternalConfigProps,
6+
HandlerData,
67
SingleGestureName,
8+
WithSharedValue,
79
} from '../../types';
810
import { useGesture } from '../useGesture';
9-
import { cloneConfig } from '../utils';
10-
11-
type HoverGestureProperties = {
12-
/**
13-
* Visual effect applied to the view while the view is hovered. The possible values are:
14-
*
15-
* - `HoverEffect.None`
16-
* - `HoverEffect.Lift`
17-
* - `HoverEffect.Highlight`
18-
*
19-
* Defaults to `HoverEffect.None`
20-
*/
21-
hoverEffect?: HoverEffect;
22-
};
11+
import { cloneConfig, getChangeEventCalculator } from '../utils';
12+
13+
type HoverGestureProperties = WithSharedValue<
14+
{
15+
/**
16+
* Visual effect applied to the view while the view is hovered. The possible values are:
17+
*
18+
* - `HoverEffect.None`
19+
* - `HoverEffect.Lift`
20+
* - `HoverEffect.Highlight`
21+
*
22+
* Defaults to `HoverEffect.None`
23+
*/
24+
hoverEffect?: HoverEffect;
25+
},
26+
HoverEffect
27+
>;
2328

2429
type HoverHandlerData = {
2530
x: number;
2631
y: number;
2732
absoluteX: number;
2833
absoluteY: number;
2934
stylusData: StylusData;
35+
changeX: number;
36+
changeY: number;
3037
};
3138

3239
type HoverGestureInternalConfig = BaseGestureConfig<
@@ -37,10 +44,23 @@ type HoverGestureInternalConfig = BaseGestureConfig<
3744
export type HoverGestureConfig =
3845
ExcludeInternalConfigProps<HoverGestureInternalConfig>;
3946

47+
function diffCalculator(
48+
current: HandlerData<HoverHandlerData>,
49+
previous: HandlerData<HoverHandlerData> | null
50+
) {
51+
'worklet';
52+
return {
53+
changeX: previous ? current.x - previous.x : 0,
54+
changeY: previous ? current.y - previous.y : 0,
55+
};
56+
}
57+
4058
export function useHover(config: HoverGestureConfig) {
4159
const hoverConfig = cloneConfig<HoverHandlerData, HoverGestureProperties>(
4260
config
4361
);
4462

63+
hoverConfig.changeEventCalculator = getChangeEventCalculator(diffCalculator);
64+
4565
return useGesture(SingleGestureName.Hover, hoverConfig);
4666
}

packages/react-native-gesture-handler/src/v3/hooks/gestures/useLongPress.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,12 @@ import {
22
BaseGestureConfig,
33
ExcludeInternalConfigProps,
44
SingleGestureName,
5+
WithSharedValue,
56
} from '../../types';
67
import { useGesture } from '../useGesture';
78
import { cloneConfig, remapProps } from '../utils';
89

9-
type LongPressGestureProperties = {
10+
type LongPressGestureProperties = WithSharedValue<{
1011
/**
1112
* Minimum time, expressed in milliseconds, that a finger must remain pressed on
1213
* the corresponding view. The default value is 500.
@@ -25,13 +26,13 @@ type LongPressGestureProperties = {
2526
* Determine exact number of points required to handle the long press gesture.
2627
*/
2728
numberOfPointers?: number;
28-
};
29+
}>;
2930

30-
type LongPressGestureInternalProperties = {
31+
type LongPressGestureInternalProperties = WithSharedValue<{
3132
minDurationMs?: number;
3233
maxDist?: number;
3334
numberOfPointers?: number;
34-
};
35+
}>;
3536

3637
type LongPressHandlerData = {
3738
x: number;

packages/react-native-gesture-handler/src/v3/hooks/gestures/useNative.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,12 @@ import {
22
BaseGestureConfig,
33
ExcludeInternalConfigProps,
44
SingleGestureName,
5+
WithSharedValue,
56
} from '../../types';
67
import { useGesture } from '../useGesture';
78
import { cloneConfig } from '../utils';
89

9-
type NativeViewGestureProperties = {
10+
type NativeViewGestureProperties = WithSharedValue<{
1011
/**
1112
* Android only.
1213
*
@@ -20,7 +21,7 @@ type NativeViewGestureProperties = {
2021
* `NativeViewGestureHandler` receives an `ACTIVE` state event.
2122
*/
2223
disallowInterruption?: boolean;
23-
};
24+
}>;
2425

2526
type NativeViewHandlerData = {
2627
pointerInside: boolean;

0 commit comments

Comments
 (0)