Skip to content
Closed
Show file tree
Hide file tree
Changes from 37 commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
68e48c6
Handle shared values on JS
m-bert Aug 5, 2025
bc7c28b
Update config on android
m-bert Aug 5, 2025
e3f51d2
Update config on iOS
m-bert Aug 5, 2025
2df4900
Rename
m-bert Aug 5, 2025
3929618
Change method in ForceTouch
m-bert Aug 6, 2025
ea1f170
Update mocks
m-bert Aug 6, 2025
7cf3962
Rename ID variable
m-bert Aug 6, 2025
dedb725
Remove unnecessary worklet directive
m-bert Aug 6, 2025
03fb873
Merge branch 'next' into @mbert/shared-values
m-bert Aug 7, 2025
f337486
Disable coalescing on Android
m-bert Aug 7, 2025
43c84e5
Basic simultaneous
m-bert Aug 7, 2025
c0433bf
Add Exclusvie composition
m-bert Aug 8, 2025
4a81c1c
useRace
m-bert Aug 8, 2025
18de5ca
Add gesture names
m-bert Aug 8, 2025
26f38b3
Merge branch 'next' into @mbert/shared-values
m-bert Aug 8, 2025
d906df9
Merge branch '@mbert/shared-values' into @mbert/gesture-relations
m-bert Aug 8, 2025
50ffbcd
Inline updateGestureHandler
m-bert Aug 11, 2025
8d1ad9b
Move extracting SharedValues into separate effect
m-bert Aug 11, 2025
9a98e19
Store shared values in array
m-bert Aug 11, 2025
fd6eb79
Rename functions
m-bert Aug 11, 2025
2af12c1
Do not store shared values
m-bert Aug 11, 2025
d8a2824
Merge branch 'next' into @mbert/shared-values
m-bert Aug 11, 2025
4c29715
Merge branch 'next' into @mbert/shared-values
m-bert Aug 11, 2025
ee6c581
Merge branch '@mbert/shared-values' into @mbert/gesture-relations
m-bert Aug 11, 2025
b973da8
Implement DFS for gesture relations
m-bert Aug 13, 2025
39d976d
Implement module method for updating relations
m-bert Aug 14, 2025
f622d69
Add blocksHandlers array
m-bert Aug 14, 2025
b83c17f
Handle Simultaneous as root
m-bert Aug 14, 2025
18b1269
Change name to enum
m-bert Aug 14, 2025
b7ca9bb
Move DFS to other file
m-bert Aug 14, 2025
fe7386a
Do not traverse single gestures
m-bert Aug 18, 2025
988fba3
Handle external relations
m-bert Aug 18, 2025
390faa1
Reanimated composedHandler
m-bert Aug 18, 2025
fd20c1b
Merge branch 'next' into @mbert/shared-values
m-bert Aug 19, 2025
e4f6aa4
Merge branch '@mbert/shared-values' into @mbert/gesture-relations
m-bert Aug 19, 2025
43c2d86
Merge branch 'next' into @mbert/shared-values
m-bert Aug 19, 2025
1e9270c
Merge branch '@mbert/shared-values' into @mbert/gesture-relations
m-bert Aug 19, 2025
1829491
Do not freeze config
m-bert Aug 19, 2025
73bd21b
Use operation block
m-bert Aug 20, 2025
ee63683
Copy config
m-bert Aug 20, 2025
ed5e9d8
Move flushOperations into JS
m-bert Aug 20, 2025
9c89722
Merge branch 'next' into @mbert/shared-values
m-bert Aug 20, 2025
de5b0f1
Merge branch '@mbert/shared-values' into @mbert/gesture-relations
m-bert Aug 20, 2025
36d0c25
Add exports for type
m-bert Aug 20, 2025
5e31c72
Merge branch 'next' into @mbert/gesture-relations
m-bert Aug 26, 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
Expand Up @@ -132,8 +132,9 @@ class FlingGestureHandler : GestureHandler() {

override fun create(context: Context?): FlingGestureHandler = FlingGestureHandler()

override fun setConfig(handler: FlingGestureHandler, config: ReadableMap) {
super.setConfig(handler, config)
override fun updateConfig(handler: FlingGestureHandler, config: ReadableMap) {
super.updateConfig(handler, config)

if (config.hasKey(KEY_NUMBER_OF_POINTERS)) {
handler.numberOfPointersRequired = config.getInt(KEY_NUMBER_OF_POINTERS)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -865,8 +865,12 @@ open class GestureHandler {

fun create(context: Context?, handlerTag: Int): T = create(context).also { it.tag = handlerTag }

open fun setConfig(handler: T, config: ReadableMap) {
fun setConfig(handler: T, config: ReadableMap) {
handler.resetConfig()
updateConfig(handler, config)
}

open fun updateConfig(handler: T, config: ReadableMap) {
if (config.hasKey(KEY_SHOULD_CANCEL_WHEN_OUTSIDE)) {
handler.shouldCancelWhenOutside = config.getBoolean(KEY_SHOULD_CANCEL_WHEN_OUTSIDE)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -181,8 +181,8 @@ class LongPressGestureHandler(context: Context) : GestureHandler() {

override fun create(context: Context?): LongPressGestureHandler = LongPressGestureHandler((context)!!)

override fun setConfig(handler: LongPressGestureHandler, config: ReadableMap) {
super.setConfig(handler, config)
override fun updateConfig(handler: LongPressGestureHandler, config: ReadableMap) {
super.updateConfig(handler, config)
if (config.hasKey(KEY_MIN_DURATION_MS)) {
handler.minDurationMs = config.getInt(KEY_MIN_DURATION_MS).toLong()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -175,8 +175,8 @@ class NativeViewGestureHandler : GestureHandler() {

override fun create(context: Context?): NativeViewGestureHandler = NativeViewGestureHandler()

override fun setConfig(handler: NativeViewGestureHandler, config: ReadableMap) {
super.setConfig(handler, config)
override fun updateConfig(handler: NativeViewGestureHandler, config: ReadableMap) {
super.updateConfig(handler, config)
if (config.hasKey(KEY_SHOULD_ACTIVATE_ON_START)) {
handler.shouldActivateOnStart = config.getBoolean(KEY_SHOULD_ACTIVATE_ON_START)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -260,8 +260,8 @@ class PanGestureHandler(context: Context?) : GestureHandler() {

override fun create(context: Context?): PanGestureHandler = PanGestureHandler(context)

override fun setConfig(handler: PanGestureHandler, config: ReadableMap) {
super.setConfig(handler, config)
override fun updateConfig(handler: PanGestureHandler, config: ReadableMap) {
super.updateConfig(handler, config)
var hasCustomActivationCriteria = false
if (config.hasKey(KEY_ACTIVE_OFFSET_X_START)) {
handler.activeOffsetXStart =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -145,8 +145,8 @@ class TapGestureHandler : GestureHandler() {

override fun create(context: Context?): TapGestureHandler = TapGestureHandler()

override fun setConfig(handler: TapGestureHandler, config: ReadableMap) {
super.setConfig(handler, config)
override fun updateConfig(handler: TapGestureHandler, config: ReadableMap) {
super.updateConfig(handler, config)
if (config.hasKey(KEY_NUMBER_OF_TAPS)) {
handler.numberOfTaps = config.getInt(KEY_NUMBER_OF_TAPS)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,8 @@ class RNGestureHandlerEvent private constructor() : Event<RNGestureHandlerEvent>
EVENT_NAME
}

override fun canCoalesce() = true
// Unfortunately getCoalescingKey is not considered when sending event to C++, therefore we have to disable coalescing in v3
override fun canCoalesce() = actionType != GestureHandler.ACTION_TYPE_NATIVE_DETECTOR

override fun getCoalescingKey() = coalescingKey

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -90,19 +90,31 @@ class RNGestureHandlerModule(reactContext: ReactApplicationContext?) :
}
}

private fun <T : GestureHandler> updateGestureHandlerHelper(handlerTag: Int, config: ReadableMap) {
@ReactMethod
override fun setGestureHandlerConfig(handlerTagDouble: Double, config: ReadableMap) {
val handlerTag = handlerTagDouble.toInt()
val handler = registry.getHandler(handlerTag) ?: return
val factory = RNGestureHandlerFactoryUtil.findFactoryForHandler<GestureHandler>(handler) ?: return
interactionManager.dropRelationsForHandlerWithTag(handlerTag)
interactionManager.configureInteractions(handler, config)

factory.setConfig(handler, config)
}

@ReactMethod
override fun updateGestureHandler(handlerTagDouble: Double, config: ReadableMap) {
override fun updateGestureHandlerConfig(handlerTagDouble: Double, config: ReadableMap) {
val handlerTag = handlerTagDouble.toInt()
val handler = registry.getHandler(handlerTag) ?: return
val factory = RNGestureHandlerFactoryUtil.findFactoryForHandler<GestureHandler>(handler) ?: return

factory.updateConfig(handler, config)
}

@ReactMethod
override fun configureRelations(handlerTagDouble: Double, relations: ReadableMap) {
val handlerTag = handlerTagDouble.toInt()
val handler = registry.getHandler(handlerTag) ?: return

updateGestureHandlerHelper<GestureHandler>(handlerTag, config)
interactionManager.dropRelationsForHandlerWithTag(handlerTag)
interactionManager.configureInteractions(handler, relations)
}

@ReactMethod
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -255,9 +255,9 @@ - (void)resetConfig
#endif
}

- (void)configure:(NSDictionary *)config
- (void)updateConfig:(NSDictionary *)config
{
[super configure:config];
[super updateConfig:config];
RNBetterSwipeGestureRecognizer *recognizer = (RNBetterSwipeGestureRecognizer *)_recognizer;

id prop = config[@"direction"];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -153,9 +153,9 @@ - (void)resetConfig
recognizer.minForce = defaultMinForce;
}

- (void)configure:(NSDictionary *)config
- (void)updateConfig:(NSDictionary *)config
{
[super configure:config];
[super updateConfig:config];
RNForceTouchGestureRecognizer *recognizer = (RNForceTouchGestureRecognizer *)_recognizer;

APPLY_FLOAT_PROP(maxForce);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -141,9 +141,9 @@ - (void)resetConfig
#endif
}

- (void)configure:(NSDictionary *)config
- (void)updateConfig:(NSDictionary *)config
{
[super configure:config];
[super updateConfig:config];

#if CHECK_TARGET(13_4)
if (@available(iOS 13.4, *)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -217,9 +217,9 @@ - (void)resetConfig
recognizer.allowableMovement = 10;
}

- (void)configure:(NSDictionary *)config
- (void)updateConfig:(NSDictionary *)config
{
[super configure:config];
[super updateConfig:config];
RNBetterLongPressGestureRecognizer *recognizer = (RNBetterLongPressGestureRecognizer *)_recognizer;

id prop = config[@"minDurationMs"];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -123,9 +123,9 @@ - (instancetype)initWithTag:(NSNumber *)tag
return self;
}

- (void)configure:(NSDictionary *)config
- (void)updateConfig:(NSDictionary *)config
{
[super configure:config];
[super updateConfig:config];
_shouldActivateOnStart = [RCTConvert BOOL:config[@"shouldActivateOnStart"]];
_disallowInterruption = [RCTConvert BOOL:config[@"disallowInterruption"]];
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -381,9 +381,9 @@ - (void)resetConfig
recognizer.activateAfterLongPress = NAN;
}

- (void)configure:(NSDictionary *)config
- (void)updateConfig:(NSDictionary *)config
{
[super configure:config];
[super updateConfig:config];
RNBetterPanGestureRecognizer *recognizer = (RNBetterPanGestureRecognizer *)_recognizer;

APPLY_FLOAT_PROP(minVelocityX);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -284,9 +284,9 @@ - (void)resetConfig
recognizer.maxDistSq = NAN;
}

- (void)configure:(NSDictionary *)config
- (void)updateConfig:(NSDictionary *)config
{
[super configure:config];
[super updateConfig:config];
RNBetterTapGestureRecognizer *recognizer = (RNBetterTapGestureRecognizer *)_recognizer;

APPLY_INT_PROP(numberOfTaps);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,9 @@
- (void)bindToView:(nonnull RNGHUIView *)view;
- (void)unbindFromView;
- (void)resetConfig NS_REQUIRES_SUPER;
- (void)configure:(nullable NSDictionary *)config NS_REQUIRES_SUPER;
- (void)setConfig:(nullable NSDictionary *)config NS_REQUIRES_SUPER;
- (void)updateConfig:(nullable NSDictionary *)config NS_REQUIRES_SUPER;
- (void)updateRelations:(nonnull NSDictionary *)relations;
- (void)handleGesture:(nonnull id)recognizer;
- (void)handleGesture:(nonnull id)recognizer inState:(RNGestureHandlerState)state;
- (BOOL)containsPointInView;
Expand Down
16 changes: 12 additions & 4 deletions packages/react-native-gesture-handler/apple/RNGestureHandler.mm
Original file line number Diff line number Diff line change
Expand Up @@ -113,13 +113,14 @@ - (void)resetConfig
#endif
}

- (void)configure:(NSDictionary *)config
- (void)setConfig:(NSDictionary *)config
{
[self resetConfig];
_handlersToWaitFor = [RCTConvert NSNumberArray:config[@"waitFor"]];
_simultaneousHandlers = [RCTConvert NSNumberArray:config[@"simultaneousHandlers"]];
_handlersThatShouldWait = [RCTConvert NSNumberArray:config[@"blocksHandlers"]];
[self updateConfig:config];
}

- (void)updateConfig:(NSDictionary *)config
{
id prop = config[@"enabled"];
if (prop != nil) {
self.enabled = [RCTConvert BOOL:prop];
Expand Down Expand Up @@ -179,6 +180,13 @@ - (void)configure:(NSDictionary *)config
}
}

- (void)updateRelations:(NSDictionary *)relations
{
_handlersToWaitFor = [RCTConvert NSNumberArray:relations[@"waitFor"]];
_simultaneousHandlers = [RCTConvert NSNumberArray:relations[@"simultaneousHandlers"]];
_handlersThatShouldWait = [RCTConvert NSNumberArray:relations[@"blocksHandlers"]];
}

- (void)setEnabled:(BOOL)enabled
{
_enabled = enabled;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,11 @@
toViewWithTag:(nonnull NSNumber *)viewTag
withActionType:(RNGestureHandlerActionType)actionType;

- (void)updateGestureHandler:(nonnull NSNumber *)handlerTag config:(nonnull NSDictionary *)config;
- (void)setGestureHandlerConfig:(nonnull NSNumber *)handlerTag config:(nonnull NSDictionary *)config;

- (void)updateGestureHandlerConfig:(nonnull NSNumber *)handlerTag config:(nonnull NSDictionary *)config;

- (void)updateGestureHandlerRelations:(nonnull NSNumber *)handlerTag relations:(nonnull NSDictionary *)relations;

- (void)dropGestureHandler:(nonnull NSNumber *)handlerTag;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ - (void)createGestureHandler:(NSString *)handlerName tag:(NSNumber *)handlerTag
}

RNGestureHandler *gestureHandler = [[nodeClass alloc] initWithTag:handlerTag];
[gestureHandler configure:config];
[gestureHandler setConfig:config];
[_registry registerGestureHandler:gestureHandler];

__weak id<RNGestureHandlerEventEmitter> emitter = self;
Expand Down Expand Up @@ -178,10 +178,22 @@ - (void)attachGestureHandler:(nonnull NSNumber *)handlerTag
[self registerViewWithGestureRecognizerAttachedIfNeeded:view];
}

- (void)updateGestureHandler:(NSNumber *)handlerTag config:(NSDictionary *)config
- (void)setGestureHandlerConfig:(NSNumber *)handlerTag config:(NSDictionary *)config
{
RNGestureHandler *handler = [_registry handlerWithTag:handlerTag];
[handler configure:config];
[handler setConfig:config];
}

- (void)updateGestureHandlerConfig:(NSNumber *)handlerTag config:(NSDictionary *)config
{
RNGestureHandler *handler = [_registry handlerWithTag:handlerTag];
[handler updateConfig:config];
}

- (void)updateGestureHandlerRelations:(NSNumber *)handlerTag relations:(NSDictionary *)relations
{
RNGestureHandler *handler = [_registry handlerWithTag:handlerTag];
[handler updateRelations:relations];
}

- (void)dropGestureHandler:(NSNumber *)handlerTag
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -145,13 +145,25 @@ - (void)attachGestureHandler:(double)handlerTag newView:(double)viewTag actionTy
}];
}

- (void)updateGestureHandler:(double)handlerTag newConfig:(NSDictionary *)config
- (void)setGestureHandlerConfig:(double)handlerTag newConfig:(NSDictionary *)config
{
[self addOperationBlock:^(RNGestureHandlerManager *manager) {
[manager updateGestureHandler:[NSNumber numberWithDouble:handlerTag] config:config];
[manager setGestureHandlerConfig:[NSNumber numberWithDouble:handlerTag] config:config];
}];
}

- (void)updateGestureHandlerConfig:(double)handlerTag newConfig:(NSDictionary *)config
{
RNGestureHandlerManager *manager = [RNGestureHandlerModule handlerManagerForModuleId:_moduleId];
[manager updateGestureHandlerConfig:[NSNumber numberWithDouble:handlerTag] config:config];
}

- (void)configureRelations:(double)handlerTag relations:(NSDictionary *)relations
{
RNGestureHandlerManager *manager = [RNGestureHandlerModule handlerManagerForModuleId:_moduleId];
[manager updateGestureHandlerRelations:[NSNumber numberWithDouble:handlerTag] relations:relations];
}

- (void)dropGestureHandler:(double)handlerTag
{
[self addOperationBlock:^(RNGestureHandlerManager *manager) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@
NodeManager.getHandler(handlerTag),
config as unknown as Config
);
this.updateGestureHandler(handlerTag, config as unknown as Config);
this.setGestureHandlerConfig(handlerTag, config as unknown as Config);
},
attachGestureHandler(
handlerTag: number,
Expand All @@ -63,7 +63,7 @@
}

// @ts-ignore Types should be HTMLElement or React.Component
NodeManager.getHandler(handlerTag).init(newView, propsRef, actionType);

Check warning on line 66 in packages/react-native-gesture-handler/src/RNGestureHandlerModule.web.ts

View workflow job for this annotation

GitHub Actions / check

Unsafe call of an `any` typed value
},
detachGestureHandler(handlerTag: number) {
if (shouldPreventDrop) {
Expand All @@ -73,14 +73,17 @@

NodeManager.detachGestureHandler(handlerTag);
},
updateGestureHandler(handlerTag: number, newConfig: Config) {
setGestureHandlerConfig(handlerTag: number, newConfig: Config) {
NodeManager.getHandler(handlerTag).updateGestureConfig(newConfig);

InteractionManager.instance.configureInteractions(
NodeManager.getHandler(handlerTag),
newConfig
);
},
updateGestureHandlerConfig(_handlerTag: number, _newConfig: Config) {
// TODO: To be implemented
},
getGestureHandlerNode(handlerTag: number) {
return NodeManager.getHandler(handlerTag);
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,10 @@ export default {
) {
// NO-OP
},
updateGestureHandler(_handlerTag: number, _newConfig: Config) {
setGestureHandlerConfig(_handlerTag: number, _newConfig: Config) {
// NO-OP
},
updateGestureHandlerConfig(_handlerTag: number, _newConfig: Config) {
// NO-OP
},
getGestureHandlerNode(_handlerTag: number) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -396,12 +396,15 @@ export default function createHandler<
});
};

private updateGestureHandler = (
private setGestureHandlerConfig = (
newConfig: Readonly<Record<string, unknown>>
) => {
this.config = newConfig;

RNGestureHandlerModule.updateGestureHandler(this.handlerTag, newConfig);
RNGestureHandlerModule.setGestureHandlerConfig(
this.handlerTag,
newConfig
);
scheduleFlushOperations();
};

Expand All @@ -426,7 +429,7 @@ export default function createHandler<
config
);
if (!deepEqual(this.config, newConfig)) {
this.updateGestureHandler(newConfig);
this.setGestureHandlerConfig(newConfig);
}
}
}
Expand All @@ -439,7 +442,7 @@ export default function createHandler<
[...allowedProps, ...customNativeProps],
config
);
this.updateGestureHandler(newConfig);
this.setGestureHandlerConfig(newConfig);
}

override render() {
Expand Down
Loading
Loading