diff --git a/packages/react-native-gesture-handler/android/noreanimated/src/main/java/com/swmansion/gesturehandler/ReanimatedProxy.kt b/packages/react-native-gesture-handler/android/noreanimated/src/main/java/com/swmansion/gesturehandler/ReanimatedProxy.kt index e98bbb390f..1168f68ab2 100644 --- a/packages/react-native-gesture-handler/android/noreanimated/src/main/java/com/swmansion/gesturehandler/ReanimatedProxy.kt +++ b/packages/react-native-gesture-handler/android/noreanimated/src/main/java/com/swmansion/gesturehandler/ReanimatedProxy.kt @@ -9,8 +9,4 @@ class ReanimatedProxy { fun > sendEvent(event: T, reactApplicationContext: ReactContext) { // no-op } - - companion object { - const val REANIMATED_INSTALLED = false - } } diff --git a/packages/react-native-gesture-handler/android/reanimated/src/main/java/com/swmansion/gesturehandler/ReanimatedProxy.kt b/packages/react-native-gesture-handler/android/reanimated/src/main/java/com/swmansion/gesturehandler/ReanimatedProxy.kt index c11fea2a9b..f567ff64c5 100644 --- a/packages/react-native-gesture-handler/android/reanimated/src/main/java/com/swmansion/gesturehandler/ReanimatedProxy.kt +++ b/packages/react-native-gesture-handler/android/reanimated/src/main/java/com/swmansion/gesturehandler/ReanimatedProxy.kt @@ -14,8 +14,4 @@ class ReanimatedProxy { reanimatedModule?.nodesManager?.onEventDispatch(event) } - - companion object { - const val REANIMATED_INSTALLED = true - } } diff --git a/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerModule.kt b/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerModule.kt index a5819f3c84..09b02ad1f1 100644 --- a/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerModule.kt +++ b/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerModule.kt @@ -12,7 +12,6 @@ import com.facebook.react.turbomodule.core.interfaces.BindingsInstallerHolder import com.facebook.react.turbomodule.core.interfaces.TurboModuleWithJSIBindings import com.facebook.soloader.SoLoader import com.swmansion.gesturehandler.NativeRNGestureHandlerModuleSpec -import com.swmansion.gesturehandler.ReanimatedProxy import com.swmansion.gesturehandler.core.GestureHandler import com.swmansion.gesturehandler.react.events.RNGestureHandlerEventDispatcher @@ -29,6 +28,7 @@ class RNGestureHandlerModule(reactContext: ReactApplicationContext?) : @DoNotStrip @Suppress("unused") private var mHybridData: HybridData = initHybrid() + private var isReanimatedAvailable = false private var uiRuntimeDecorated = false private val registry: RNGestureHandlerRegistry get() = registries[moduleId]!! @@ -62,7 +62,7 @@ class RNGestureHandlerModule(reactContext: ReactApplicationContext?) : @ReactMethod override fun createGestureHandler(handlerName: String, handlerTagDouble: Double, config: ReadableMap): Boolean { - if (ReanimatedProxy.REANIMATED_INSTALLED && !uiRuntimeDecorated) { + if (isReanimatedAvailable && !uiRuntimeDecorated) { uiRuntimeDecorated = decorateUIRuntime() } @@ -124,6 +124,11 @@ class RNGestureHandlerModule(reactContext: ReactApplicationContext?) : @ReactMethod override fun flushOperations() = Unit + @ReactMethod + override fun setReanimatedAvailable(isAvailable: Boolean) { + isReanimatedAvailable = isAvailable + } + @DoNotStrip @Suppress("unused") fun setGestureHandlerState(handlerTag: Int, newState: Int) { diff --git a/packages/react-native-gesture-handler/apple/RNGestureHandlerModule.mm b/packages/react-native-gesture-handler/apple/RNGestureHandlerModule.mm index 604551274a..fda2921666 100644 --- a/packages/react-native-gesture-handler/apple/RNGestureHandlerModule.mm +++ b/packages/react-native-gesture-handler/apple/RNGestureHandlerModule.mm @@ -42,7 +42,6 @@ @implementation RNGestureHandlerModule { jsi::Runtime *_rnRuntime; int _moduleId; - bool _checkedIfReanimatedIsAvailable; bool _isReanimatedAvailable; bool _uiRuntimeDecorated; } @@ -121,10 +120,6 @@ - (bool)installUIRuntimeBindings - (NSNumber *)createGestureHandler:(NSString *)handlerName handlerTag:(double)handlerTag config:(NSDictionary *)config { - if (!_checkedIfReanimatedIsAvailable) { - _isReanimatedAvailable = [self.moduleRegistry moduleForName:"ReanimatedModule"] != nil; - } - if (_isReanimatedAvailable && !_uiRuntimeDecorated) { _uiRuntimeDecorated = [self installUIRuntimeBindings]; } @@ -191,6 +186,11 @@ - (void)flushOperations }]; } +- (void)setReanimatedAvailable:(BOOL)isAvailable +{ + _isReanimatedAvailable = isAvailable; +} + - (void)setGestureState:(int)state forHandler:(int)handlerTag { if (RCTIsMainQueue()) { diff --git a/packages/react-native-gesture-handler/src/RNGestureHandlerModule.web.ts b/packages/react-native-gesture-handler/src/RNGestureHandlerModule.web.ts index 1baf8dd9e7..c30bfd7729 100644 --- a/packages/react-native-gesture-handler/src/RNGestureHandlerModule.web.ts +++ b/packages/react-native-gesture-handler/src/RNGestureHandlerModule.web.ts @@ -89,4 +89,7 @@ export default { }, // eslint-disable-next-line @typescript-eslint/no-empty-function flushOperations() {}, + setReanimatedAvailable(_isAvailable: boolean) { + // No-op on web + }, }; diff --git a/packages/react-native-gesture-handler/src/handlers/gestures/reanimatedWrapper.ts b/packages/react-native-gesture-handler/src/handlers/gestures/reanimatedWrapper.ts index 9044a8a3df..afef43867e 100644 --- a/packages/react-native-gesture-handler/src/handlers/gestures/reanimatedWrapper.ts +++ b/packages/react-native-gesture-handler/src/handlers/gestures/reanimatedWrapper.ts @@ -5,6 +5,7 @@ import { GestureUpdateEventWithHandlerData, SharedValue, } from '../../v3/types'; +import { NativeProxy } from '../../v3/NativeProxy'; export type ReanimatedContext = { lastUpdateEvent: GestureUpdateEventWithHandlerData | undefined; @@ -80,6 +81,7 @@ let Reanimated: try { Reanimated = require('react-native-reanimated'); + NativeProxy.setReanimatedAvailable(true); } catch (e) { // When 'react-native-reanimated' is not available we want to quietly continue // @ts-ignore TS demands the variable to be initialized @@ -90,6 +92,7 @@ if (!Reanimated?.useSharedValue) { // @ts-ignore Make sure the loaded module is actually Reanimated, if it's not // reset the module to undefined so we can fallback to the default implementation Reanimated = undefined; + NativeProxy.setReanimatedAvailable(false); } if (Reanimated !== undefined && !Reanimated.setGestureState) { diff --git a/packages/react-native-gesture-handler/src/mocks/mocks.tsx b/packages/react-native-gesture-handler/src/mocks/mocks.tsx index 03d42f34fc..e04a070782 100644 --- a/packages/react-native-gesture-handler/src/mocks/mocks.tsx +++ b/packages/react-native-gesture-handler/src/mocks/mocks.tsx @@ -25,6 +25,7 @@ const setGestureHandlerConfig = NOOP; const updateGestureHandlerConfig = NOOP; const flushOperations = NOOP; const configureRelations = NOOP; +const setReanimatedAvailable = NOOP; const install = NOOP; const NativeViewGestureHandler = View; const TapGestureHandler = View; @@ -66,6 +67,7 @@ export default { setGestureHandlerConfig, updateGestureHandlerConfig, configureRelations, + setReanimatedAvailable, flushOperations, install, // Probably can be removed diff --git a/packages/react-native-gesture-handler/src/specs/NativeRNGestureHandlerModule.ts b/packages/react-native-gesture-handler/src/specs/NativeRNGestureHandlerModule.ts index c1dcd6a4e7..c40798482b 100644 --- a/packages/react-native-gesture-handler/src/specs/NativeRNGestureHandlerModule.ts +++ b/packages/react-native-gesture-handler/src/specs/NativeRNGestureHandlerModule.ts @@ -24,6 +24,7 @@ export interface Spec extends TurboModule { configureRelations: (handlerTag: Double, relations: Object) => void; dropGestureHandler: (handlerTag: Double) => void; flushOperations: () => void; + setReanimatedAvailable: (isAvailable: boolean) => void; } export default TurboModuleRegistry.getEnforcing('RNGestureHandlerModule'); diff --git a/packages/react-native-gesture-handler/src/v3/NativeProxy.ts b/packages/react-native-gesture-handler/src/v3/NativeProxy.ts index 14431b433b..c115060b28 100644 --- a/packages/react-native-gesture-handler/src/v3/NativeProxy.ts +++ b/packages/react-native-gesture-handler/src/v3/NativeProxy.ts @@ -51,4 +51,7 @@ export const NativeProxy = { RNGestureHandlerModule.configureRelations(handlerTag, relations); }); }, + setReanimatedAvailable: (isAvailable: boolean) => { + RNGestureHandlerModule.setReanimatedAvailable(isAvailable); + }, } as const; diff --git a/packages/react-native-gesture-handler/src/v3/NativeProxy.web.ts b/packages/react-native-gesture-handler/src/v3/NativeProxy.web.ts index abafb2ed5d..ef81140e62 100644 --- a/packages/react-native-gesture-handler/src/v3/NativeProxy.web.ts +++ b/packages/react-native-gesture-handler/src/v3/NativeProxy.web.ts @@ -35,4 +35,7 @@ export const NativeProxy = { configureRelations: (handlerTag: number, relations: GestureRelations) => { RNGestureHandlerModule.configureRelations(handlerTag, relations); }, + setReanimatedAvailable: (isAvailable: boolean) => { + RNGestureHandlerModule.setReanimatedAvailable(isAvailable); + }, } as const;