@shopify/react-native-skia
Version:
High-performance React Native Graphics using Skia
75 lines (61 loc) • 2.13 kB
text/typescript
/* eslint-disable @typescript-eslint/no-explicit-any */
import type { DependencyList } from "react";
import type {
FrameCallback,
FrameInfo,
SharedValue,
} from "react-native-reanimated";
// This one is needed for the deprecated useSharedValue function
// We can remove it once we remove the deprecation
let Reanimated2: any;
let Reanimated3: any;
let reanimatedVersion: string;
try {
Reanimated2 = require("react-native-reanimated");
reanimatedVersion = require("react-native-reanimated/package.json").version;
if (
reanimatedVersion &&
(reanimatedVersion >= "3.0.0" || reanimatedVersion.includes("3.0.0-"))
) {
Reanimated3 = Reanimated2;
}
} catch (e) {}
export const HAS_REANIMATED2 = !!Reanimated2;
export const HAS_REANIMATED3 = !!Reanimated3;
export function throwOnMissingReanimated() {
if (!HAS_REANIMATED2) {
throw new Error(
"Reanimated was not found, make sure react-native-reanimated package is installed if you want to use \
react-native-skia's integration layer API."
);
}
}
export const useSharedValue: <T>(
init: T,
oneWayReadsOnly?: boolean
) => SharedValue<T> = Reanimated2?.useSharedValue || throwOnMissingReanimated;
export const useFrameCallback: (
callback: (frameInfo: FrameInfo) => void,
autostart?: boolean
) => FrameCallback = Reanimated2?.useFrameCallback || throwOnMissingReanimated;
export const startMapper: (
worklet: () => void,
inputs?: unknown[],
outputs?: unknown[]
) => number = Reanimated2?.startMapper || throwOnMissingReanimated;
export const stopMapper: (mapperID: number) => void =
Reanimated2?.stopMapper || throwOnMissingReanimated;
export const runOnJS = Reanimated2?.runOnJS || throwOnMissingReanimated;
export const useAnimatedReaction: <T>(
prepare: () => T,
react: (v: T) => void,
dependencies?: DependencyList
) => void = Reanimated2?.useAnimatedReaction || throwOnMissingReanimated;
export const isSharedValue = <T>(value: unknown): value is SharedValue<T> => {
return (
!!value &&
(Reanimated3
? Reanimated3.isSharedValue(value)
: (value as any).value !== undefined)
);
};