react-native-reanimated
Version:
More powerful alternative to Animated library for React Native.
68 lines (57 loc) • 2.17 kB
text/typescript
;
import { RuntimeKind } from 'react-native-worklets';
import { IS_JEST, logger, SHOULD_BE_USE_WEB } from '../common';
import type { ShadowNodeWrapper } from '../commonTypes';
import type { AnimatedRefOnJS, AnimatedRefOnUI } from '../hook/commonTypes';
import type { DispatchCommand } from './types';
/**
* Lets you synchronously call a command of a native component.
*
* @param animatedRef - An [animated
* ref](https://docs.swmansion.com/react-native-reanimated/docs/core/useAnimatedRef#returns)
* connected to the component you'd want to call the command on.
* @param commandName - The name of the command to dispatch (e.g. `"focus"` or
* `"scrollToEnd"`).
* @param args - An optional array of arguments for the command.
* @see https://docs.swmansion.com/react-native-reanimated/docs/advanced/dispatchCommand
*/
export let dispatchCommand: DispatchCommand;
function dispatchCommandNative(
animatedRef: AnimatedRefOnJS | AnimatedRefOnUI,
commandName: string,
args: Array<unknown> = []
) {
'worklet';
if (globalThis.__RUNTIME_KIND === RuntimeKind.ReactNative) {
return;
}
const shadowNodeWrapper = animatedRef();
// This prevents crashes if ref has not been set yet
if (!shadowNodeWrapper) {
logger.warn(
`Tried to dispatch command "${commandName}" with an uninitialized ref. Make sure to pass the animated ref to the component before using it.`
);
return;
}
global._dispatchCommand!(
shadowNodeWrapper as ShadowNodeWrapper,
commandName,
args
);
}
function dispatchCommandJest() {
logger.warn('dispatchCommand() is not supported with Jest.');
}
function dispatchCommandDefault() {
logger.warn('dispatchCommand() is not supported on this configuration.');
}
if (!SHOULD_BE_USE_WEB) {
// Those assertions are actually correct since on Native platforms `AnimatedRef` is
// mapped as a different function in `serializableMappingCache` and
// TypeScript is not able to infer that.
dispatchCommand = dispatchCommandNative as unknown as DispatchCommand;
} else if (IS_JEST) {
dispatchCommand = dispatchCommandJest;
} else {
dispatchCommand = dispatchCommandDefault;
}