react-move
Version:
Beautiful, data-driven animations for React.
257 lines (212 loc) • 7.59 kB
JavaScript
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;