Skip to content

Commit 99a6530

Browse files
authored
Bind SharedValues in handler config (#3658)
## Description This PR introduces `SharedValue` bindings to config. This will allow users to specify values in config as`SharedValues`, e.g: ```tsx const taps = useSharedValue(2); const gesture = useGesture('TapGestureHandler', { onEnd: () => { console.log('Tap detected. Required number of taps:', taps.value); taps.set(taps.value + 1); }, numberOfTaps: taps, }); ``` ## Test plan <details> <summary>Tested on the following code:</summary> ```tsx import * as React from 'react'; import { Animated, Button } from 'react-native'; import { useSharedValue } from 'react-native-reanimated'; import { GestureHandlerRootView, NativeDetector, useGesture, } from 'react-native-gesture-handler'; export default function App() { const [visible, setVisible] = React.useState(true); const taps = useSharedValue(2); const gesture = useGesture('TapGestureHandler', { onEnd: () => { console.log('Tap detected. Required number of taps:', taps.value); taps.set(taps.value + 1); }, numberOfTaps: taps, }); return ( <GestureHandlerRootView style={{ flex: 1, backgroundColor: 'white', paddingTop: 8 }}> <Button title="Toggle visibility" onPress={() => { setVisible(!visible); }} /> {visible && ( <NativeDetector gesture={gesture}> <Animated.View style={[ { width: 150, height: 150, backgroundColor: 'blue', opacity: 0.5, borderWidth: 10, borderColor: 'green', marginTop: 20, marginLeft: 40, }, ]} /> </NativeDetector> )} </GestureHandlerRootView> ); } ``` </details>
1 parent e91171e commit 99a6530

29 files changed

+204
-57
lines changed

packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/core/FlingGestureHandler.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,8 +132,9 @@ class FlingGestureHandler : GestureHandler() {
132132

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

135-
override fun setConfig(handler: FlingGestureHandler, config: ReadableMap) {
136-
super.setConfig(handler, config)
135+
override fun updateConfig(handler: FlingGestureHandler, config: ReadableMap) {
136+
super.updateConfig(handler, config)
137+
137138
if (config.hasKey(KEY_NUMBER_OF_POINTERS)) {
138139
handler.numberOfPointersRequired = config.getInt(KEY_NUMBER_OF_POINTERS)
139140
}

packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandler.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -865,8 +865,12 @@ open class GestureHandler {
865865

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

868-
open fun setConfig(handler: T, config: ReadableMap) {
868+
fun setConfig(handler: T, config: ReadableMap) {
869869
handler.resetConfig()
870+
updateConfig(handler, config)
871+
}
872+
873+
open fun updateConfig(handler: T, config: ReadableMap) {
870874
if (config.hasKey(KEY_SHOULD_CANCEL_WHEN_OUTSIDE)) {
871875
handler.shouldCancelWhenOutside = config.getBoolean(KEY_SHOULD_CANCEL_WHEN_OUTSIDE)
872876
}

packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/core/LongPressGestureHandler.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -181,8 +181,8 @@ class LongPressGestureHandler(context: Context) : GestureHandler() {
181181

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

184-
override fun setConfig(handler: LongPressGestureHandler, config: ReadableMap) {
185-
super.setConfig(handler, config)
184+
override fun updateConfig(handler: LongPressGestureHandler, config: ReadableMap) {
185+
super.updateConfig(handler, config)
186186
if (config.hasKey(KEY_MIN_DURATION_MS)) {
187187
handler.minDurationMs = config.getInt(KEY_MIN_DURATION_MS).toLong()
188188
}

packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/core/NativeViewGestureHandler.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -175,8 +175,8 @@ class NativeViewGestureHandler : GestureHandler() {
175175

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

178-
override fun setConfig(handler: NativeViewGestureHandler, config: ReadableMap) {
179-
super.setConfig(handler, config)
178+
override fun updateConfig(handler: NativeViewGestureHandler, config: ReadableMap) {
179+
super.updateConfig(handler, config)
180180
if (config.hasKey(KEY_SHOULD_ACTIVATE_ON_START)) {
181181
handler.shouldActivateOnStart = config.getBoolean(KEY_SHOULD_ACTIVATE_ON_START)
182182
}

packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/core/PanGestureHandler.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -260,8 +260,8 @@ class PanGestureHandler(context: Context?) : GestureHandler() {
260260

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

263-
override fun setConfig(handler: PanGestureHandler, config: ReadableMap) {
264-
super.setConfig(handler, config)
263+
override fun updateConfig(handler: PanGestureHandler, config: ReadableMap) {
264+
super.updateConfig(handler, config)
265265
var hasCustomActivationCriteria = false
266266
if (config.hasKey(KEY_ACTIVE_OFFSET_X_START)) {
267267
handler.activeOffsetXStart =

packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/core/TapGestureHandler.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,8 +145,8 @@ class TapGestureHandler : GestureHandler() {
145145

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

148-
override fun setConfig(handler: TapGestureHandler, config: ReadableMap) {
149-
super.setConfig(handler, config)
148+
override fun updateConfig(handler: TapGestureHandler, config: ReadableMap) {
149+
super.updateConfig(handler, config)
150150
if (config.hasKey(KEY_NUMBER_OF_TAPS)) {
151151
handler.numberOfTaps = config.getInt(KEY_NUMBER_OF_TAPS)
152152
}

packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerModule.kt

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,19 +90,24 @@ class RNGestureHandlerModule(reactContext: ReactApplicationContext?) :
9090
}
9191
}
9292

93-
private fun <T : GestureHandler> updateGestureHandlerHelper(handlerTag: Int, config: ReadableMap) {
93+
@ReactMethod
94+
override fun setGestureHandlerConfig(handlerTagDouble: Double, config: ReadableMap) {
95+
val handlerTag = handlerTagDouble.toInt()
9496
val handler = registry.getHandler(handlerTag) ?: return
9597
val factory = RNGestureHandlerFactoryUtil.findFactoryForHandler<GestureHandler>(handler) ?: return
98+
9699
interactionManager.dropRelationsForHandlerWithTag(handlerTag)
97100
interactionManager.configureInteractions(handler, config)
98101
factory.setConfig(handler, config)
99102
}
100103

101104
@ReactMethod
102-
override fun updateGestureHandler(handlerTagDouble: Double, config: ReadableMap) {
105+
override fun updateGestureHandlerConfig(handlerTagDouble: Double, config: ReadableMap) {
103106
val handlerTag = handlerTagDouble.toInt()
107+
val handler = registry.getHandler(handlerTag) ?: return
108+
val factory = RNGestureHandlerFactoryUtil.findFactoryForHandler<GestureHandler>(handler) ?: return
104109

105-
updateGestureHandlerHelper<GestureHandler>(handlerTag, config)
110+
factory.updateConfig(handler, config)
106111
}
107112

108113
@ReactMethod

packages/react-native-gesture-handler/apple/Handlers/RNFlingHandler.m

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -255,9 +255,9 @@ - (void)resetConfig
255255
#endif
256256
}
257257

258-
- (void)configure:(NSDictionary *)config
258+
- (void)updateConfig:(NSDictionary *)config
259259
{
260-
[super configure:config];
260+
[super updateConfig:config];
261261
RNBetterSwipeGestureRecognizer *recognizer = (RNBetterSwipeGestureRecognizer *)_recognizer;
262262

263263
id prop = config[@"direction"];

packages/react-native-gesture-handler/apple/Handlers/RNForceTouchHandler.m

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -153,9 +153,9 @@ - (void)resetConfig
153153
recognizer.minForce = defaultMinForce;
154154
}
155155

156-
- (void)configure:(NSDictionary *)config
156+
- (void)updateConfig:(NSDictionary *)config
157157
{
158-
[super configure:config];
158+
[super updateConfig:config];
159159
RNForceTouchGestureRecognizer *recognizer = (RNForceTouchGestureRecognizer *)_recognizer;
160160

161161
APPLY_FLOAT_PROP(maxForce);

packages/react-native-gesture-handler/apple/Handlers/RNHoverHandler.m

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,9 +141,9 @@ - (void)resetConfig
141141
#endif
142142
}
143143

144-
- (void)configure:(NSDictionary *)config
144+
- (void)updateConfig:(NSDictionary *)config
145145
{
146-
[super configure:config];
146+
[super updateConfig:config];
147147

148148
#if CHECK_TARGET(13_4)
149149
if (@available(iOS 13.4, *)) {

0 commit comments

Comments
 (0)