@shopify/react-native-skia
Version:
High-performance React Native Graphics using Skia
127 lines (123 loc) • 4.07 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.bindReanimatedProps = bindReanimatedProps;
exports.extractReanimatedProps = extractReanimatedProps;
exports.unbindReanimatedNode = void 0;
var _ReanimatedProxy = _interopRequireDefault(require("./ReanimatedProxy"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/* eslint-disable @typescript-eslint/no-explicit-any */
let HAS_REANIMATED = false;
let HAS_REANIMATED_3 = false;
try {
require("react-native-reanimated");
HAS_REANIMATED = true;
const reanimatedVersion = require("react-native-reanimated/package.json").version;
if (reanimatedVersion && (reanimatedVersion >= "3.0.0" || reanimatedVersion.includes("3.0.0-"))) {
HAS_REANIMATED_3 = true;
}
} catch (e) {
HAS_REANIMATED = false;
}
const _bindings = new WeakMap();
const unbindReanimatedNode = node => {
if (!HAS_REANIMATED) {
return;
}
const previousMapperId = _bindings.get(node);
if (previousMapperId !== undefined) {
_ReanimatedProxy.default.stopMapper(previousMapperId);
}
};
exports.unbindReanimatedNode = unbindReanimatedNode;
function extractReanimatedProps(props) {
if (!HAS_REANIMATED) {
return [props, {}];
}
const reanimatedProps = {};
const otherProps = {};
for (const propName in props) {
if (propName === "children") {
continue;
}
const propValue = props[propName];
if (_ReanimatedProxy.default.isSharedValue(propValue)) {
reanimatedProps[propName] = propValue;
otherProps[propName] = propValue.value;
} else {
otherProps[propName] = propValue;
}
}
return [otherProps, reanimatedProps];
}
function bindReanimatedProps2(container, node, reanimatedProps) {
const sharedValues = Object.values(reanimatedProps);
const previousMapperId = _bindings.get(node);
if (previousMapperId !== undefined) {
_ReanimatedProxy.default.stopMapper(previousMapperId);
}
if (sharedValues.length > 0) {
const viewId = container.getNativeId();
const {
SkiaViewApi
} = global;
const updateProps = () => {
for (const propName in reanimatedProps) {
node && node.setProp(propName, reanimatedProps[propName].value);
}
// On React Native we use the SkiaViewApi to redraw because it can
// run on the worklet thread (container.redraw can't)
// if SkiaViewApi is undefined, we are on web and container.redraw()
// can safely be invoked
if (SkiaViewApi) {
SkiaViewApi.requestRedraw(viewId);
} else {
container.redraw();
}
};
const mapperId = _ReanimatedProxy.default.startMapper(() => {
"worklet";
_ReanimatedProxy.default.runOnJS(updateProps)();
}, sharedValues);
_bindings.set(node, mapperId);
}
}
function bindReanimatedProps(container, node, reanimatedProps) {
if (HAS_REANIMATED && !HAS_REANIMATED_3) {
return bindReanimatedProps2(container, node, reanimatedProps);
}
if (!HAS_REANIMATED) {
return;
}
const sharedValues = Object.values(reanimatedProps);
const previousMapperId = _bindings.get(node);
if (previousMapperId !== undefined) {
_ReanimatedProxy.default.stopMapper(previousMapperId);
}
if (sharedValues.length > 0) {
const viewId = container.getNativeId();
const {
SkiaViewApi
} = global;
const mapperId = _ReanimatedProxy.default.startMapper(() => {
"worklet";
if (node) {
for (const propName in reanimatedProps) {
node.setProp(propName, reanimatedProps[propName].value);
}
}
// On React Native we use the SkiaViewApi to redraw because it can
// run on the worklet thread (container.redraw can't)
// if SkiaViewApi is undefined, we are on web and container.redraw()
// can safely be invoked
if (SkiaViewApi) {
SkiaViewApi.requestRedraw(viewId);
} else {
container.redraw();
}
}, sharedValues);
_bindings.set(node, mapperId);
}
}
//# sourceMappingURL=renderHelpers.js.map