Skip to content

Commit 797299c

Browse files
committed
Memoze event handlers
1 parent 76caf44 commit 797299c

File tree

4 files changed

+61
-26
lines changed

4 files changed

+61
-26
lines changed
Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { useMemo } from 'react';
12
import { BaseGestureConfig } from '../../../types';
23
import { extractStateChangeHandlers } from '../../utils';
34
import { getStateChangeHandler } from '../stateChangeHandler';
@@ -6,7 +7,8 @@ export function useGestureStateChangeEvent<THandlerData, TConfig>(
67
handlerTag: number,
78
config: BaseGestureConfig<THandlerData, TConfig>
89
) {
9-
const handlers = extractStateChangeHandlers(config);
10-
11-
return getStateChangeHandler(handlerTag, handlers);
10+
return useMemo(() => {
11+
const handlers = extractStateChangeHandlers(config);
12+
return getStateChangeHandler(handlerTag, handlers);
13+
}, [handlerTag, config]);
1214
}
Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { useMemo } from 'react';
12
import { BaseGestureConfig } from '../../../types';
23
import { extractTouchHandlers } from '../../utils';
34
import { getTouchEventHandler } from '../touchEventHandler';
@@ -6,7 +7,8 @@ export function useGestureTouchEvent<THandlerData, TConfig>(
67
handlerTag: number,
78
config: BaseGestureConfig<THandlerData, TConfig>
89
) {
9-
const handlers = extractTouchHandlers(config);
10-
11-
return getTouchEventHandler(handlerTag, handlers);
10+
return useMemo(() => {
11+
const handlers = extractTouchHandlers(config);
12+
return getTouchEventHandler(handlerTag, handlers);
13+
}, [handlerTag, config]);
1214
}

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

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,26 @@ import { extractUpdateHandlers, isAnimatedEvent } from '../../utils';
22
import { ReanimatedContext } from '../../../../handlers/gestures/reanimatedWrapper';
33
import { getUpdateHandler } from '../updateHandler';
44
import { BaseGestureConfig } from '../../../types';
5+
import { useMemo } from 'react';
56

67
export function useGestureUpdateEvent<THandlerData, TConfig>(
78
handlerTag: number,
89
config: BaseGestureConfig<THandlerData, TConfig>
910
) {
10-
const { handlers, changeEventCalculator } = extractUpdateHandlers(config);
11+
return useMemo(() => {
12+
const { handlers, changeEventCalculator } = extractUpdateHandlers(config);
1113

12-
const jsContext: ReanimatedContext<THandlerData> = {
13-
lastUpdateEvent: undefined,
14-
};
14+
const jsContext: ReanimatedContext<THandlerData> = {
15+
lastUpdateEvent: undefined,
16+
};
1517

16-
return isAnimatedEvent(config.onUpdate)
17-
? undefined
18-
: getUpdateHandler(handlerTag, handlers, jsContext, changeEventCalculator);
18+
return isAnimatedEvent(config.onUpdate)
19+
? undefined
20+
: getUpdateHandler(
21+
handlerTag,
22+
handlers,
23+
jsContext,
24+
changeEventCalculator
25+
);
26+
}, [handlerTag, config]);
1927
}

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

Lines changed: 36 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useEffect, useMemo } from 'react';
1+
import { useEffect, useMemo, useRef } from 'react';
22
import { getNextHandlerTag } from '../../handlers/getNextHandlerTag';
33
import RNGestureHandlerModule from '../../RNGestureHandlerModule';
44
import { useGestureCallbacks } from './useGestureCallbacks';
@@ -69,12 +69,20 @@ export function useGesture<THandlerData, TConfig>(
6969
throw new Error(tagMessage('Failed to create reanimated event handlers.'));
7070
}
7171

72-
const gestureRelations = prepareRelations(config, tag);
72+
const gestureRelations = useMemo(
73+
() => prepareRelations(config, tag),
74+
[config, tag]
75+
);
7376

74-
useMemo(() => {
77+
const currentGestureRef = useRef({ type: '', tag: -1 });
78+
if (
79+
currentGestureRef.current.tag !== tag ||
80+
currentGestureRef.current.type !== (type as string)
81+
) {
82+
currentGestureRef.current = { type, tag };
7583
RNGestureHandlerModule.createGestureHandler(type, tag, {});
7684
RNGestureHandlerModule.flushOperations();
77-
}, [type, tag]);
85+
}
7886

7987
useEffect(() => {
8088
return () => {
@@ -93,21 +101,36 @@ export function useGesture<THandlerData, TConfig>(
93101
return () => {
94102
unbindSharedValues(config, tag);
95103
};
96-
}, [tag, config]);
104+
}, [tag, config, type]);
97105

98-
return {
99-
tag,
100-
type,
101-
config,
102-
detectorCallbacks: {
106+
return useMemo(
107+
() => ({
108+
tag,
109+
type,
110+
config,
111+
detectorCallbacks: {
112+
onGestureHandlerStateChange,
113+
onGestureHandlerEvent,
114+
onGestureHandlerTouchEvent,
115+
onReanimatedStateChange,
116+
onReanimatedUpdateEvent,
117+
onReanimatedTouchEvent,
118+
onGestureHandlerAnimatedEvent,
119+
},
120+
gestureRelations,
121+
}),
122+
[
123+
tag,
124+
type,
125+
config,
103126
onGestureHandlerStateChange,
104127
onGestureHandlerEvent,
105128
onGestureHandlerTouchEvent,
106129
onReanimatedStateChange,
107130
onReanimatedUpdateEvent,
108131
onReanimatedTouchEvent,
109132
onGestureHandlerAnimatedEvent,
110-
},
111-
gestureRelations,
112-
};
133+
gestureRelations,
134+
]
135+
);
113136
}

0 commit comments

Comments
 (0)