UNPKG

@shopify/react-native-skia

Version:

High-performance React Native Graphics using Skia

154 lines (127 loc) 5.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.useCanvasRef = exports.Canvas = void 0; var _react = _interopRequireWildcard(require("react")); var _views = require("../views"); var _Skia = require("../skia/Skia"); var _types = require("../dom/types"); var _values = require("../values"); var _Reconciler = require("./Reconciler"); var _HostComponents = require("./HostComponents"); var _processors = require("./processors"); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } const useCanvasRef = () => (0, _react.useRef)(null); exports.useCanvasRef = useCanvasRef; const useOnSizeEvent = resultValue => { const onSize = (0, _values.useValue)({ width: 0, height: 0 }); (0, _react.useLayoutEffect)(() => { if (!resultValue) { return; } return onSize.addListener(newValue => { if ((0, _processors.isValue)(resultValue)) { resultValue.current = newValue; } else { resultValue.value = newValue; } }); }, [resultValue, onSize]); return onSize; }; const Canvas = /*#__PURE__*/(0, _react.forwardRef)((_ref, forwardedRef) => { let { children, style, debug, mode, onTouch, onSize: _onSize, ...props } = _ref; const onSize = useOnSizeEvent(_onSize); const innerRef = useCanvasRef(); const ref = useCombinedRefs(forwardedRef, innerRef); const redraw = (0, _react.useCallback)(() => { var _innerRef$current; (_innerRef$current = innerRef.current) === null || _innerRef$current === void 0 ? void 0 : _innerRef$current.redraw(); }, [innerRef]); const getNativeId = (0, _react.useCallback)(() => { var _innerRef$current2; const id = ((_innerRef$current2 = innerRef.current) === null || _innerRef$current2 === void 0 ? void 0 : _innerRef$current2.nativeId) ?? -1; return id; }, [innerRef]); const registerValues = (0, _react.useCallback)(values => { if (ref.current !== null) { return ref.current.registerValues(values); } return () => {}; }, [ref]); const root = (0, _react.useMemo)(() => new _Reconciler.SkiaRoot(_Skia.Skia, registerValues, redraw, getNativeId), [redraw, registerValues, getNativeId]); // Render effect (0, _react.useEffect)(() => { root.render(children); }, [children, root, redraw]); (0, _react.useEffect)(() => { return () => { root.unmount(); }; }, [root]); if (_HostComponents.NATIVE_DOM) { return /*#__PURE__*/_react.default.createElement(_views.SkiaDomView, _extends({ ref: ref, style: style, root: root.dom, onTouch: onTouch, onSize: onSize, mode: mode, debug: debug }, props)); } else { return /*#__PURE__*/_react.default.createElement(_views.SkiaView // eslint-disable-next-line @typescript-eslint/no-explicit-any , _extends({ ref: ref, style: style, mode: mode, debug: debug, onSize: onSize, onDraw: (canvas, info) => { onTouch && onTouch(info.touches); const ctx = new _types.JsiDrawingContext(_Skia.Skia, canvas); root.dom.render(ctx); } }, props)); } }); /** * Combines a list of refs into a single ref. This can be used to provide * both a forwarded ref and an internal ref keeping the same functionality * on both of the refs. * @param refs Array of refs to combine * @returns A single ref that can be used in a ref prop. */ exports.Canvas = Canvas; const useCombinedRefs = function () { for (var _len = arguments.length, refs = new Array(_len), _key = 0; _key < _len; _key++) { refs[_key] = arguments[_key]; } const targetRef = _react.default.useRef(null); _react.default.useEffect(() => { refs.forEach(ref => { if (ref) { if (typeof ref === "function") { ref(targetRef.current); } else { ref.current = targetRef.current; } } }); }, [refs]); return targetRef; }; //# sourceMappingURL=Canvas.js.map