react-lottie-wrapper
Version:
lottie animation view for React
271 lines (229 loc) • 8.4 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _objectWithoutProperties2 = require("babel-runtime/helpers/objectWithoutProperties");
var _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2);
var _extends2 = require("babel-runtime/helpers/extends");
var _extends3 = _interopRequireDefault(_extends2);
var _getPrototypeOf = require("babel-runtime/core-js/object/get-prototype-of");
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
var _classCallCheck2 = require("babel-runtime/helpers/classCallCheck");
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = require("babel-runtime/helpers/createClass");
var _createClass3 = _interopRequireDefault(_createClass2);
var _possibleConstructorReturn2 = require("babel-runtime/helpers/possibleConstructorReturn");
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = require("babel-runtime/helpers/inherits");
var _inherits3 = _interopRequireDefault(_inherits2);
var _react = require("react");
var _react2 = _interopRequireDefault(_react);
var _propTypes = require("prop-types");
var _propTypes2 = _interopRequireDefault(_propTypes);
var _lottieWeb = require("lottie-web");
var _utils = require("./utils");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var Lottie = function (_Component) {
(0, _inherits3.default)(Lottie, _Component);
function Lottie() {
var _ref;
var _temp, _this, _ret;
(0, _classCallCheck3.default)(this, Lottie);
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return _ret = (_temp = (_this = (0, _possibleConstructorReturn3.default)(this, (_ref = Lottie.__proto__ || (0, _getPrototypeOf2.default)(Lottie)).call.apply(_ref, [this].concat(args))), _this), _this.handleClickToPause = function () {
// The pause() method is for handling pausing by passing a prop isPaused
// This method is for handling the ability to pause by clicking on the animation
if (_this.anim.isPaused) {
return _this.anim.play();
}
_this.anim.pause();
}, _temp), (0, _possibleConstructorReturn3.default)(_this, _ret);
}
(0, _createClass3.default)(Lottie, [{
key: "componentDidMount",
value: function componentDidMount() {
var _props = this.props,
options = _props.options,
eventListeners = _props.eventListeners;
var loop = options.loop,
autoplay = options.autoplay,
animationData = options.animationData,
rendererSettings = options.rendererSettings,
segments = options.segments;
this.options = (0, _extends3.default)({
container: this.el,
renderer: "svg",
loop: loop !== false,
autoplay: autoplay !== false,
segments: segments !== false,
animationData: animationData,
rendererSettings: rendererSettings
}, options);
this.anim = (0, _lottieWeb.loadAnimation)(this.options);
this.registerEvents(eventListeners);
}
}, {
key: "componentDidUpdate",
value: function componentDidUpdate(nextProps) {
/* Recreate the animation handle if the data is changed */
var _props2 = this.props,
eventListeners = _props2.eventListeners,
isStopped = _props2.isStopped,
segments = _props2.segments;
if (this.options.animationData !== nextProps.options.animationData) {
this.deRegisterEvents(eventListeners);
this.destroy();
this.options = (0, _extends3.default)({}, this.options, nextProps.options);
this.anim = (0, _lottieWeb.loadAnimation)(this.options);
this.registerEvents(nextProps.eventListeners);
}
if (isStopped) {
this.stop();
} else if (segments) {
this.playSegments();
} else {
this.play();
}
this.pause();
this.setSpeed();
this.setDirection();
}
}, {
key: "componentWillUnmount",
value: function componentWillUnmount() {
this.deRegisterEvents(this.props.eventListeners);
this.destroy();
this.options.animationData = null;
this.anim = null;
}
}, {
key: "setSpeed",
value: function setSpeed() {
this.anim.setSpeed(this.props.speed);
}
}, {
key: "setDirection",
value: function setDirection() {
this.anim.setDirection(this.props.direction);
}
}, {
key: "play",
value: function play() {
this.anim.play();
}
}, {
key: "playSegments",
value: function playSegments() {
this.anim.playSegments(this.props.segments);
}
}, {
key: "stop",
value: function stop() {
this.anim.stop();
}
}, {
key: "pause",
value: function pause() {
if (this.props.isPaused && !this.anim.isPaused) {
this.anim.pause();
} else if (!this.props.isPaused && this.anim.isPaused) {
this.anim.pause();
}
}
}, {
key: "destroy",
value: function destroy() {
this.anim.destroy();
}
}, {
key: "registerEvents",
value: function registerEvents(eventListeners) {
var _this2 = this;
eventListeners.forEach(function (_ref2) {
var eventName = _ref2.eventName,
callback = _ref2.callback;
_this2.anim.addEventListener(eventName, callback);
});
}
}, {
key: "deRegisterEvents",
value: function deRegisterEvents(eventListeners) {
var _this3 = this;
eventListeners.forEach(function (_ref3) {
var eventName = _ref3.eventName,
callback = _ref3.callback;
_this3.anim.removeEventListener(eventName, callback);
});
}
}, {
key: "render",
value: function render() {
var _this4 = this;
var _props3 = this.props,
renderAs = _props3.renderAs,
width = _props3.width,
height = _props3.height,
ariaLabel = _props3.ariaLabel,
isClickToPauseDisabled = _props3.isClickToPauseDisabled,
style = _props3.style,
isStopped = _props3.isStopped,
isPaused = _props3.isPaused,
eventListeners = _props3.eventListeners,
options = _props3.options,
extraProps = (0, _objectWithoutProperties3.default)(_props3, ["renderAs", "width", "height", "ariaLabel", "isClickToPauseDisabled", "style", "isStopped", "isPaused", "eventListeners", "options"]);
var lottieStyles = (0, _extends3.default)({
width: (0, _utils.getSize)(width),
height: (0, _utils.getSize)(height),
outline: "none"
}, style);
var onClickHandler = isClickToPauseDisabled ? function () {
return null;
} : this.handleClickToPause;
var Element = renderAs;
return _react2.default.createElement(Element, (0, _extends3.default)({
ref: function ref(c) {
_this4.el = c;
},
style: lottieStyles,
onClick: onClickHandler,
"aria-label": ariaLabel
}, extraProps));
}
}]);
return Lottie;
}(_react.Component);
Lottie.propTypes = {
options: _propTypes2.default.object.isRequired,
eventListeners: _propTypes2.default.arrayOf(_propTypes2.default.object),
height: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.number]),
width: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.number]),
renderAs: _propTypes2.default.oneOf(["div", "span"]),
isStopped: _propTypes2.default.bool,
isPaused: _propTypes2.default.bool,
speed: _propTypes2.default.number,
segments: _propTypes2.default.arrayOf(_propTypes2.default.number),
direction: _propTypes2.default.number,
role: _propTypes2.default.string,
ariaLabel: _propTypes2.default.string,
isClickToPauseDisabled: _propTypes2.default.bool,
title: _propTypes2.default.string,
style: _propTypes2.default.object,
className: _propTypes2.default.string,
tabIndex: _propTypes2.default.number
};
Lottie.defaultProps = {
renderAs: "div",
eventListeners: [],
isStopped: false,
isPaused: false,
speed: 1,
role: null,
ariaLabel: "animation",
isClickToPauseDisabled: false,
title: null,
className: null,
tabIndex: 0
};
exports.default = Lottie;