import type { ComponentClass, ComponentType } from 'react'; import { tagMessage } from '../../utils'; import type { GestureCallbacks, GestureUpdateEventWithHandlerData, SharedValue, } from '../../v3/types'; import { installUIRuntimeBindings } from './installUIRuntimeBindings'; export type ReanimatedContext = { lastUpdateEvent: GestureUpdateEventWithHandlerData | undefined; }; interface WorkletProps { __closure: unknown; __workletHash: number; __initData?: unknown; __init?: () => unknown; __stackDetails?: unknown; __pluginVersion?: string; } type WorkletFunction< TArgs extends unknown[] = unknown[], TReturn = unknown, > = ((...args: TArgs) => TReturn) & WorkletProps; export type ReanimatedHandler = { doDependenciesDiffer: boolean; context: ReanimatedContext; }; export type SimplifiedShareableHost = { value: TValue; }; type WorkletsPackage = { getUIRuntimeHolder: () => object; createShareable: ( hostRuntimeId: number, initial: TValue ) => SimplifiedShareableHost; UIRuntimeId: number; scheduleOnUI: ( worklet: (...args: Args) => ReturnValue, ...args: Args ) => void; scheduleOnRN: ( fun: (...args: Args) => ReturnValue, ...args: Args ) => void; isWorkletFunction: < Args extends unknown[] = unknown[], ReturnValue = unknown, >( value: unknown ) => value is WorkletFunction; }; export type NativeEventsManager = new (component: { props: Record; _componentRef: React.Ref; // Removed in https://github.com/software-mansion/react-native-reanimated/pull/6736 // but we likely want to keep it for compatibility with older Reanimated versions _componentViewTag: number; getComponentViewTag: () => number; }) => { attachEvents: () => void; detachEvents: () => void; updateEvents: (prevProps: Record) => void; }; type ReanimatedPackage = { default: { // Slightly modified definition copied from 'react-native-reanimated' createAnimatedComponent

( component: ComponentType

, options?: unknown ): ComponentClass

; }; NativeEventsManager: NativeEventsManager; useHandler: ( handlers: GestureCallbacks ) => ReanimatedHandler; useEvent: ( callback: (event: T) => void, events: string[], rebuild: boolean ) => (event: unknown) => void; useSharedValue: (value: T) => SharedValue; setGestureState: (handlerTag: number, newState: number) => void; isSharedValue: (value: unknown) => value is SharedValue; useComposedEventHandler( handlers: (((event: T) => void) | null)[] ): (event: T) => void; }; let Reanimated: ReanimatedPackage | undefined; let Worklets: WorkletsPackage | undefined; try { // eslint-disable-next-line @typescript-eslint/no-var-requires Worklets = require('react-native-worklets') as WorkletsPackage; } catch (e) { // When 'react-native-worklets' is not available we want to quietly continue Worklets = undefined; } try { // eslint-disable-next-line @typescript-eslint/no-var-requires Reanimated = require('react-native-reanimated') as ReanimatedPackage; } catch (e) { // When 'react-native-reanimated' is not available we want to quietly continue // @ts-ignore TS demands the variable to be initialized Reanimated = undefined; } if (Worklets !== undefined) { installUIRuntimeBindings(Worklets.getUIRuntimeHolder); } if (Reanimated !== undefined && !Reanimated.setGestureState) { // The loaded module is Reanimated but it doesn't have the setGestureState defined Reanimated.setGestureState = () => { 'worklet'; console.warn( tagMessage( 'Please use newer version of react-native-reanimated in order to control state of the gestures.' ) ); }; } export { Reanimated, Worklets };