Skip to content

Commit 8bbbd3b

Browse files
committed
Merge branch 'next' into @mbert/add-event-calculators
2 parents 312c954 + e93030d commit 8bbbd3b

File tree

9 files changed

+67
-57
lines changed

9 files changed

+67
-57
lines changed

packages/react-native-gesture-handler/apple/RNGestureHandlerModule.mm

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,8 +161,9 @@ - (void)updateGestureHandlerConfig:(double)handlerTag newConfig:(NSDictionary *)
161161

162162
- (void)configureRelations:(double)handlerTag relations:(NSDictionary *)relations
163163
{
164-
RNGestureHandlerManager *manager = [RNGestureHandlerModule handlerManagerForModuleId:_moduleId];
165-
[manager updateGestureHandlerRelations:[NSNumber numberWithDouble:handlerTag] relations:relations];
164+
[self addOperationBlock:^(RNGestureHandlerManager *manager) {
165+
[manager updateGestureHandlerRelations:[NSNumber numberWithDouble:handlerTag] relations:relations];
166+
}];
166167
}
167168

168169
- (void)dropGestureHandler:(double)handlerTag

packages/react-native-gesture-handler/src/RNGestureHandlerModule.web.ts

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import type { Config, PropsRef } from './web/interfaces';
66
import InteractionManager from './web/tools/InteractionManager';
77
import NodeManager from './web/tools/NodeManager';
88
import { GestureHandlerWebDelegate } from './web/tools/GestureHandlerWebDelegate';
9+
import { GestureRelations } from './v3/types';
910

1011
// init method is called inside attachGestureHandler function. However, this function may
1112
// fail when received view is not valid HTML element. On the other hand, dropGestureHandler
@@ -37,10 +38,6 @@ export default {
3738
handlerTag,
3839
new GestureClass(new GestureHandlerWebDelegate())
3940
);
40-
InteractionManager.instance.configureInteractions(
41-
NodeManager.getHandler(handlerTag),
42-
config as unknown as Config
43-
);
4441
this.setGestureHandlerConfig(handlerTag, config as unknown as Config);
4542
},
4643
attachGestureHandler(
@@ -75,11 +72,6 @@ export default {
7572
},
7673
setGestureHandlerConfig(handlerTag: number, newConfig: Config) {
7774
NodeManager.getHandler(handlerTag).setGestureConfig(newConfig);
78-
79-
InteractionManager.instance.configureInteractions(
80-
NodeManager.getHandler(handlerTag),
81-
newConfig
82-
);
8375
},
8476
updateGestureHandlerConfig(handlerTag: number, newConfig: Config) {
8577
NodeManager.getHandler(handlerTag).updateGestureConfig(newConfig);
@@ -95,6 +87,12 @@ export default {
9587

9688
NodeManager.dropGestureHandler(handlerTag);
9789
},
90+
configureRelations(handlerTag: number, relations: GestureRelations) {
91+
InteractionManager.instance.configureInteractions(
92+
NodeManager.getHandler(handlerTag),
93+
relations
94+
);
95+
},
9896
// eslint-disable-next-line @typescript-eslint/no-empty-function
9997
flushOperations() {},
10098
};

packages/react-native-gesture-handler/src/handlers/createHandler.tsx

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -405,6 +405,16 @@ export default function createHandler<
405405
this.handlerTag,
406406
newConfig
407407
);
408+
409+
RNGestureHandlerModule.configureRelations(
410+
this.handlerTag,
411+
filterConfig(this.config, [
412+
'waitFor',
413+
'simultaneousHandlers',
414+
'blocksHandlers',
415+
])
416+
);
417+
408418
scheduleFlushOperations();
409419
};
410420

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

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -63,11 +63,12 @@ export function attachHandlers({
6363
for (const handler of gesturesToAttach) {
6464
RNGestureHandlerModule.setGestureHandlerConfig(
6565
handler.handlerTag,
66-
filterConfig(
67-
handler.config,
68-
ALLOWED_PROPS,
69-
extractGestureRelations(handler)
70-
)
66+
filterConfig(handler.config, ALLOWED_PROPS)
67+
);
68+
69+
RNGestureHandlerModule.configureRelations(
70+
handler.handlerTag,
71+
extractGestureRelations(handler)
7172
);
7273
}
7374

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

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -67,11 +67,12 @@ export function updateHandlers(
6767

6868
RNGestureHandlerModule.setGestureHandlerConfig(
6969
handler.handlerTag,
70-
filterConfig(
71-
handler.config,
72-
ALLOWED_PROPS,
73-
extractGestureRelations(handler)
74-
)
70+
filterConfig(handler.config, ALLOWED_PROPS)
71+
);
72+
73+
RNGestureHandlerModule.configureRelations(
74+
handler.handlerTag,
75+
extractGestureRelations(handler)
7576
);
7677

7778
registerHandler(handler.handlerTag, handler, handler.config.testId);

packages/react-native-gesture-handler/src/v3/NativeDetector/HostGestureDetector.web.tsx

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,8 @@ const HostGestureDetector = (props: GestureHandlerDetectorProps) => {
6262
};
6363

6464
useEffect(() => {
65-
detachHandlers(attachedNativeHandlerTags.current);
66-
}, [children]);
65+
propsRef.current = props;
66+
}, [props]);
6767

6868
useEffect(() => {
6969
if (React.Children.count(children) !== 1) {
@@ -72,14 +72,13 @@ const HostGestureDetector = (props: GestureHandlerDetectorProps) => {
7272
);
7373
}
7474

75-
attachHandlers(new Set(handlerTags));
76-
}, [handlerTags, children]);
75+
const newHandlerTags = new Set(handlerTags);
76+
attachHandlers(newHandlerTags);
7777

78-
useEffect(() => {
7978
return () => {
80-
detachHandlers(attachedHandlerTags.current);
79+
detachHandlers(newHandlerTags);
8180
};
82-
}, []);
81+
}, [handlerTags, children]);
8382

8483
return (
8584
<View style={{ display: 'contents' }} ref={viewRef as Ref<View>}>

packages/react-native-gesture-handler/src/v3/NativeDetector/utils.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,4 +146,6 @@ export function configureRelations<THandlerData, TConfig>(
146146
gesture.gestureRelations
147147
);
148148
}
149+
150+
RNGestureHandlerModule.flushOperations();
149151
}

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

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -94,21 +94,17 @@ export function useGesture<THandlerData, TConfig>(
9494
}, [type, tag]);
9595

9696
useEffect(() => {
97+
const preparedConfig = prepareConfig(config);
98+
RNGestureHandlerModule.setGestureHandlerConfig(tag, preparedConfig);
99+
RNGestureHandlerModule.flushOperations();
100+
97101
bindSharedValues(config, tag);
98102

99103
return () => {
100104
unbindSharedValues(config, tag);
101105
};
102106
}, [tag, config]);
103107

104-
useEffect(() => {
105-
const preparedConfig = prepareConfig(config);
106-
107-
RNGestureHandlerModule.setGestureHandlerConfig(tag, preparedConfig);
108-
109-
RNGestureHandlerModule.flushOperations();
110-
}, [config, tag]);
111-
112108
return {
113109
tag,
114110
type,

packages/react-native-gesture-handler/src/web/tools/InteractionManager.ts

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { GestureRelations } from '../../v3/types';
12
import type IGestureHandler from '../handlers/IGestureHandler';
23
import { Config, Handler } from '../interfaces';
34

@@ -11,45 +12,46 @@ export default class InteractionManager {
1112
// eslint-disable-next-line no-useless-constructor, @typescript-eslint/no-empty-function
1213
private constructor() {}
1314

14-
public configureInteractions(handler: IGestureHandler, config: Config) {
15+
public configureInteractions(
16+
handler: IGestureHandler,
17+
config: GestureRelations | Config
18+
) {
1519
this.dropRelationsForHandlerWithTag(handler.handlerTag);
1620

1721
if (config.waitFor) {
1822
const waitFor: number[] = [];
19-
config.waitFor.forEach((otherHandler: Handler): void => {
20-
// New API reference
21-
if (typeof otherHandler === 'number') {
22-
waitFor.push(otherHandler);
23-
} else {
24-
// Old API reference
25-
waitFor.push(otherHandler.handlerTag);
26-
}
23+
config.waitFor.forEach((otherHandler: Handler | number) => {
24+
waitFor.push(
25+
typeof otherHandler === 'number'
26+
? otherHandler
27+
: otherHandler.handlerTag
28+
);
2729
});
2830

2931
this.waitForRelations.set(handler.handlerTag, waitFor);
3032
}
3133

3234
if (config.simultaneousHandlers) {
3335
const simultaneousHandlers: number[] = [];
34-
config.simultaneousHandlers.forEach((otherHandler: Handler): void => {
35-
if (typeof otherHandler === 'number') {
36-
simultaneousHandlers.push(otherHandler);
37-
} else {
38-
simultaneousHandlers.push(otherHandler.handlerTag);
39-
}
36+
config.simultaneousHandlers.forEach((otherHandler: Handler | number) => {
37+
simultaneousHandlers.push(
38+
typeof otherHandler === 'number'
39+
? otherHandler
40+
: otherHandler.handlerTag
41+
);
4042
});
4143

4244
this.simultaneousRelations.set(handler.handlerTag, simultaneousHandlers);
4345
}
4446

4547
if (config.blocksHandlers) {
4648
const blocksHandlers: number[] = [];
47-
config.blocksHandlers.forEach((otherHandler: Handler): void => {
48-
if (typeof otherHandler === 'number') {
49-
blocksHandlers.push(otherHandler);
50-
} else {
51-
blocksHandlers.push(otherHandler.handlerTag);
52-
}
49+
config.blocksHandlers.forEach((otherHandler: Handler | number) => {
50+
blocksHandlers.push(
51+
typeof otherHandler === 'number'
52+
? otherHandler
53+
: otherHandler.handlerTag
54+
);
5355
});
5456

5557
this.blocksHandlersRelations.set(handler.handlerTag, blocksHandlers);

0 commit comments

Comments
 (0)