react-native-reanimated
Version:
More powerful alternative to Animated library for React Native.
186 lines (167 loc) • 5.33 kB
text/typescript
import { NativeModules } from 'react-native';
import type {
ShareableRef,
ShareableSyncDataHolderRef,
Value3D,
ValueRotation,
} from '../commonTypes';
import type {
LayoutAnimationFunction,
LayoutAnimationType,
} from '../layoutReanimation';
import { checkCppVersion } from '../platform-specific/checkCppVersion';
import type { WorkletRuntime } from '../runtimes';
import { getValueUnpackerCode } from '../valueUnpacker';
// this is the type of `__reanimatedModuleProxy` which is injected using JSI
export interface NativeReanimatedModule {
installValueUnpacker(valueUnpackerCode: string): void;
makeShareableClone<T>(
value: T,
shouldPersistRemote: boolean
): ShareableRef<T>;
makeSynchronizedDataHolder<T>(
valueRef: ShareableRef<T>
): ShareableSyncDataHolderRef<T>;
getDataSynchronously<T>(ref: ShareableSyncDataHolderRef<T>): T;
scheduleOnUI<T>(shareable: ShareableRef<T>): void;
createWorkletRuntime(
name: string,
initializer: ShareableRef<() => void>
): WorkletRuntime;
registerEventHandler<T>(
eventHandler: ShareableRef<T>,
eventName: string,
emitterReactTag: number
): number;
unregisterEventHandler(id: number): void;
getViewProp<T>(
viewTag: number,
propName: string,
callback?: (result: T) => void
): Promise<T>;
enableLayoutAnimations(flag: boolean): void;
registerSensor(
sensorType: number,
interval: number,
iosReferenceFrame: number,
handler: ShareableRef<(data: Value3D | ValueRotation) => void>
): number;
unregisterSensor(sensorId: number): void;
configureProps(uiProps: string[], nativeProps: string[]): void;
subscribeForKeyboardEvents(
handler: ShareableRef<number>,
isStatusBarTranslucent: boolean
): number;
unsubscribeFromKeyboardEvents(listenerId: number): void;
configureLayoutAnimation(
viewTag: number,
type: LayoutAnimationType,
sharedTransitionTag: string,
config: ShareableRef<Keyframe | LayoutAnimationFunction>
): void;
}
export class NativeReanimated {
native = true;
private InnerNativeModule: NativeReanimatedModule;
constructor() {
if (global.__reanimatedModuleProxy === undefined) {
const { ReanimatedModule } = NativeModules;
ReanimatedModule?.installTurboModule();
}
if (global.__reanimatedModuleProxy === undefined) {
throw new Error(
`[Reanimated] Native part of Reanimated doesn't seem to be initialized.
See https://docs.swmansion.com/react-native-reanimated/docs/guides/troubleshooting#Native-part-of-reanimated-doesnt-seem-to-be-initialized for more details.`
);
}
checkCppVersion();
this.InnerNativeModule = global.__reanimatedModuleProxy;
this.InnerNativeModule.installValueUnpacker(getValueUnpackerCode());
}
makeShareableClone<T>(value: T, shouldPersistRemote: boolean) {
return this.InnerNativeModule.makeShareableClone(
value,
shouldPersistRemote
);
}
makeSynchronizedDataHolder<T>(valueRef: ShareableRef<T>) {
return this.InnerNativeModule.makeSynchronizedDataHolder(valueRef);
}
getDataSynchronously<T>(ref: ShareableSyncDataHolderRef<T>) {
return this.InnerNativeModule.getDataSynchronously(ref);
}
scheduleOnUI<T>(shareable: ShareableRef<T>) {
return this.InnerNativeModule.scheduleOnUI(shareable);
}
createWorkletRuntime(name: string, initializer: ShareableRef<() => void>) {
return this.InnerNativeModule.createWorkletRuntime(name, initializer);
}
registerSensor(
sensorType: number,
interval: number,
iosReferenceFrame: number,
handler: ShareableRef<(data: Value3D | ValueRotation) => void>
) {
return this.InnerNativeModule.registerSensor(
sensorType,
interval,
iosReferenceFrame,
handler
);
}
unregisterSensor(sensorId: number) {
return this.InnerNativeModule.unregisterSensor(sensorId);
}
registerEventHandler<T>(
eventHandler: ShareableRef<T>,
eventName: string,
emitterReactTag: number
) {
return this.InnerNativeModule.registerEventHandler(
eventHandler,
eventName,
emitterReactTag
);
}
unregisterEventHandler(id: number) {
return this.InnerNativeModule.unregisterEventHandler(id);
}
getViewProp<T>(
viewTag: number,
propName: string,
callback?: (result: T) => void
) {
return this.InnerNativeModule.getViewProp(viewTag, propName, callback);
}
configureLayoutAnimation(
viewTag: number,
type: LayoutAnimationType,
sharedTransitionTag: string,
config: ShareableRef<Keyframe | LayoutAnimationFunction>
) {
this.InnerNativeModule.configureLayoutAnimation(
viewTag,
type,
sharedTransitionTag,
config
);
}
enableLayoutAnimations(flag: boolean) {
this.InnerNativeModule.enableLayoutAnimations(flag);
}
configureProps(uiProps: string[], nativeProps: string[]) {
this.InnerNativeModule.configureProps(uiProps, nativeProps);
}
subscribeForKeyboardEvents(
handler: ShareableRef<number>,
isStatusBarTranslucent: boolean
) {
return this.InnerNativeModule.subscribeForKeyboardEvents(
handler,
isStatusBarTranslucent
);
}
unsubscribeFromKeyboardEvents(listenerId: number) {
this.InnerNativeModule.unsubscribeFromKeyboardEvents(listenerId);
}
}