UNPKG

react-move

Version:

Beautiful, data-driven animations for React.

257 lines (212 loc) 7.59 kB
import _classCallCheck from "@babel/runtime/helpers/esm/classCallCheck"; import _createClass from "@babel/runtime/helpers/esm/createClass"; import _assertThisInitialized from "@babel/runtime/helpers/esm/assertThisInitialized"; import _inherits from "@babel/runtime/helpers/esm/inherits"; import _possibleConstructorReturn from "@babel/runtime/helpers/esm/possibleConstructorReturn"; import _getPrototypeOf from "@babel/runtime/helpers/esm/getPrototypeOf"; import _defineProperty from "@babel/runtime/helpers/esm/defineProperty"; function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { BaseNode, interval } from 'kapellmeister'; import mergeKeys from '../core/mergeKeys'; import { ENTER, UPDATE, LEAVE } from '../core/types'; import { numeric } from '../utils'; var NodeGroup = function (_Component) { _inherits(NodeGroup, _Component); var _super = _createSuper(NodeGroup); function NodeGroup(props) { var _this; _classCallCheck(this, NodeGroup); _this = _super.call(this, props); _defineProperty(_assertThisInitialized(_this), "animate", function () { var _this$state = _this.state, nodeKeys = _this$state.nodeKeys, nodeHash = _this$state.nodeHash; if (_this.unmounting) { return; } var pending = false; var nextNodeKeys = []; var length = nodeKeys.length; for (var i = 0; i < length; i++) { var k = nodeKeys[i]; var n = nodeHash[k]; var isTransitioning = n.isTransitioning(); if (isTransitioning) { pending = true; } if (n.type === LEAVE && !isTransitioning) { delete nodeHash[k]; } else { nextNodeKeys.push(k); } } if (!pending) { _this.interval.stop(); } _this.setState(function () { return { nodeKeys: nextNodeKeys, nodes: nextNodeKeys.map(function (key) { return nodeHash[key]; }) }; }); }); _defineProperty(_assertThisInitialized(_this), "interval", null); _defineProperty(_assertThisInitialized(_this), "unmounting", false); var interpolation = props.interpolation; var Node = function (_BaseNode) { _inherits(Node, _BaseNode); var _super2 = _createSuper(Node); function Node(key, data) { var _this2; _classCallCheck(this, Node); _this2 = _super2.call(this); _defineProperty(_assertThisInitialized(_this2), "getInterpolator", interpolation); _this2.key = key; _this2.data = data; _this2.type = ENTER; return _this2; } return Node; }(BaseNode); _this.state = { Node: Node, nodeKeys: [], nodeHash: {}, nodes: [], data: null }; return _this; } _createClass(NodeGroup, [{ key: "componentDidMount", value: function componentDidMount() { this.startInterval(); } }, { key: "componentDidUpdate", value: function componentDidUpdate(prevProps) { if (prevProps.data !== this.props.data && !this.unmounting) { this.startInterval(); } } }, { key: "startInterval", value: function startInterval() { if (!this.interval) { this.interval = interval(this.animate); } else { this.interval.restart(this.animate); } } }, { key: "componentWillUnmount", value: function componentWillUnmount() { var _this$state2 = this.state, nodeKeys = _this$state2.nodeKeys, nodeHash = _this$state2.nodeHash; this.unmounting = true; if (this.interval) { this.interval.stop(); } nodeKeys.forEach(function (key) { nodeHash[key].stopTransitions(); }); } }, { key: "render", value: function render() { var renderedChildren = this.props.children(this.state.nodes); return renderedChildren && React.Children.only(renderedChildren); } }], [{ key: "getDerivedStateFromProps", value: function getDerivedStateFromProps(nextProps, prevState) { if (nextProps.data !== prevState.data) { var data = nextProps.data, keyAccessor = nextProps.keyAccessor, start = nextProps.start, enter = nextProps.enter, update = nextProps.update, leave = nextProps.leave; var Node = prevState.Node, nodeKeys = prevState.nodeKeys, nodeHash = prevState.nodeHash; var keyIndex = {}; for (var i = 0; i < nodeKeys.length; i++) { keyIndex[nodeKeys[i]] = i; } var nextKeyIndex = {}; var nextNodeKeys = []; for (var _i = 0; _i < data.length; _i++) { var d = data[_i]; var k = keyAccessor(d, _i); nextKeyIndex[k] = _i; nextNodeKeys.push(k); if (keyIndex[k] === undefined) { var node = new Node(); node.key = k; node.data = d; node.type = ENTER; nodeHash[k] = node; } } for (var _i2 = 0; _i2 < nodeKeys.length; _i2++) { var _k = nodeKeys[_i2]; var n = nodeHash[_k]; if (nextKeyIndex[_k] !== undefined) { n.data = data[nextKeyIndex[_k]]; n.type = UPDATE; } else { n.type = LEAVE; } } var mergedNodeKeys = mergeKeys(nodeKeys, keyIndex, nextNodeKeys, nextKeyIndex); for (var _i3 = 0; _i3 < mergedNodeKeys.length; _i3++) { var _k2 = mergedNodeKeys[_i3]; var _n = nodeHash[_k2]; var _d = _n.data; if (_n.type === ENTER) { _n.setState(start(_d, nextKeyIndex[_k2])); _n.transition(enter(_d, nextKeyIndex[_k2])); } else if (_n.type === LEAVE) { _n.transition(leave(_d, keyIndex[_k2])); } else { _n.transition(update(_d, nextKeyIndex[_k2])); } } return { data: data, nodes: mergedNodeKeys.map(function (key) { return nodeHash[key]; }), nodeHash: nodeHash, nodeKeys: mergedNodeKeys }; } return null; } }]); return NodeGroup; }(Component); NodeGroup.propTypes = process.env.NODE_ENV !== "production" ? { data: PropTypes.array.isRequired, keyAccessor: PropTypes.func.isRequired, interpolation: PropTypes.func, start: PropTypes.func.isRequired, enter: PropTypes.func, update: PropTypes.func, leave: PropTypes.func, children: PropTypes.func.isRequired } : {}; NodeGroup.defaultProps = { enter: function enter() {}, update: function update() {}, leave: function leave() {}, interpolation: numeric }; export default NodeGroup;