react-stack-grid
Version:
Pinterest like layout components for React.js
255 lines (217 loc) • 9.78 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _extends = Object.assign || 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; };
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _propTypes = require('prop-types');
var _propTypes2 = _interopRequireDefault(_propTypes);
var _shallowequal = require('shallowequal');
var _shallowequal2 = _interopRequireDefault(_shallowequal);
var _styleHelper = require('../utils/style-helper');
var _requestAnimationFrame = require('../animations/request-animation-frame');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var getTransitionStyles = function getTransitionStyles(type, props) {
var rect = props.rect,
containerSize = props.containerSize,
index = props.index;
return props[type](rect, containerSize, index);
};
var getPositionStyles = function getPositionStyles(rect, zIndex, rtl) {
return {
translateX: (rtl ? -Math.round(rect.left) : Math.round(rect.left)) + 'px',
translateY: Math.round(rect.top) + 'px',
zIndex: zIndex
};
};
var GridItem = function (_Component) {
_inherits(GridItem, _Component);
function GridItem(props) {
_classCallCheck(this, GridItem);
var _this = _possibleConstructorReturn(this, (GridItem.__proto__ || Object.getPrototypeOf(GridItem)).call(this, props));
_this.mounted = false;
_this.appearTimer = null;
_this.node = null;
_this.state = _extends({}, getPositionStyles(props.rect, 1, props.rtl), getTransitionStyles('appear', props));
return _this;
}
_createClass(GridItem, [{
key: 'componentDidMount',
value: function componentDidMount() {
this.mounted = true;
this.props.onMounted(this);
}
}, {
key: 'componentWillUnmount',
value: function componentWillUnmount() {
this.mounted = false;
clearTimeout(this.appearTimer);
this.appearTimer = null;
this.props.onUnmount(this);
}
}, {
key: 'componentWillReceiveProps',
value: function componentWillReceiveProps(nextProps) {
var _this2 = this;
if (!(0, _shallowequal2.default)(nextProps, this.props)) {
(0, _requestAnimationFrame.raf)(function () {
_this2.setStateIfNeeded(_extends({}, _this2.state, getPositionStyles(nextProps.rect, 2, nextProps.rtl)));
});
}
}
}, {
key: 'shouldComponentUpdate',
value: function shouldComponentUpdate(nextProps, nextState) {
return !(0, _shallowequal2.default)(nextProps, this.props) || !(0, _shallowequal2.default)(nextState, this.state);
}
}, {
key: 'componentWillAppear',
value: function componentWillAppear(callback) {
this.appearTimer = setTimeout(callback, this.props.appearDelay * this.props.index);
}
}, {
key: 'componentDidAppear',
value: function componentDidAppear() {
this.setAppearedStyles();
}
}, {
key: 'componentWillEnter',
value: function componentWillEnter(callback) {
this.setEnterStyles();
this.forceUpdate(callback);
}
}, {
key: 'componentDidEnter',
value: function componentDidEnter() {
this.setEnteredStyles();
}
}, {
key: 'componentWillLeave',
value: function componentWillLeave(callback) {
this.setLeaveStyles();
setTimeout(callback, this.props.duration);
}
}, {
key: 'setStateIfNeeded',
value: function setStateIfNeeded(state) {
if (this.mounted) {
this.setState(state);
}
}
}, {
key: 'setAppearedStyles',
value: function setAppearedStyles() {
this.setStateIfNeeded(_extends({}, this.state, getTransitionStyles('appeared', this.props), getPositionStyles(this.props.rect, 1, this.props.rtl)));
}
}, {
key: 'setEnterStyles',
value: function setEnterStyles() {
this.setStateIfNeeded(_extends({}, this.state, getPositionStyles(this.props.rect, 2, this.props.rtl), getTransitionStyles('enter', this.props)));
}
}, {
key: 'setEnteredStyles',
value: function setEnteredStyles() {
this.setStateIfNeeded(_extends({}, this.state, getTransitionStyles('entered', this.props), getPositionStyles(this.props.rect, 1, this.props.rtl)));
}
}, {
key: 'setLeaveStyles',
value: function setLeaveStyles() {
this.setStateIfNeeded(_extends({}, this.state, getPositionStyles(this.props.rect, 2, this.props.rtl), getTransitionStyles('leaved', this.props)));
}
}, {
key: 'render',
value: function render() {
var _this3 = this;
var _props = this.props,
index = _props.index,
Element = _props.component,
containerSize = _props.containerSize,
appearDelay = _props.appearDelay,
appear = _props.appear,
appeared = _props.appeared,
enter = _props.enter,
entered = _props.entered,
leaved = _props.leaved,
onMounted = _props.onMounted,
onUnmount = _props.onUnmount,
itemKey = _props.itemKey,
rect = _props.rect,
duration = _props.duration,
easing = _props.easing,
units = _props.units,
vendorPrefix = _props.vendorPrefix,
userAgent = _props.userAgent,
rtl = _props.rtl,
rest = _objectWithoutProperties(_props, ['index', 'component', 'containerSize', 'appearDelay', 'appear', 'appeared', 'enter', 'entered', 'leaved', 'onMounted', 'onUnmount', 'itemKey', 'rect', 'duration', 'easing', 'units', 'vendorPrefix', 'userAgent', 'rtl']);
var style = (0, _styleHelper.buildStyles)(_extends({}, this.state, {
display: 'block',
position: 'absolute',
top: 0
}, rtl ? { right: 0 } : { left: 0 }, {
width: rect.width,
transition: (0, _styleHelper.transition)(['opacity', 'transform'], duration, easing)
}), units, vendorPrefix, userAgent);
/* eslint-disable no-return-assign */
return _react2.default.createElement(Element, _extends({}, rest, {
ref: function ref(node) {
return _this3.node = node;
},
style: style
}));
/* eslint-enable no-return-assign */
}
}]);
return GridItem;
}(_react.Component);
GridItem.propTypes = {
itemKey: _propTypes2.default.string,
index: _propTypes2.default.number,
component: _propTypes2.default.string,
rect: _propTypes2.default.shape({
top: _propTypes2.default.number,
left: _propTypes2.default.number,
width: _propTypes2.default.number,
height: _propTypes2.default.number
}),
containerSize: _propTypes2.default.shape({
width: _propTypes2.default.number,
height: _propTypes2.default.number,
actualWidth: _propTypes2.default.number
}),
duration: _propTypes2.default.number,
easing: _propTypes2.default.string,
appearDelay: _propTypes2.default.number,
appear: _propTypes2.default.func,
appeared: _propTypes2.default.func,
enter: _propTypes2.default.func,
entered: _propTypes2.default.func,
leaved: _propTypes2.default.func,
units: _propTypes2.default.shape({
length: _propTypes2.default.string,
angle: _propTypes2.default.string
}),
vendorPrefix: _propTypes2.default.bool,
userAgent: _propTypes2.default.string,
onMounted: _propTypes2.default.func,
onUnmount: _propTypes2.default.func,
rtl: _propTypes2.default.bool
};
var _default = GridItem;
exports.default = _default;
;
var _temp = function () {
if (typeof __REACT_HOT_LOADER__ === 'undefined') {
return;
}
__REACT_HOT_LOADER__.register(getTransitionStyles, 'getTransitionStyles', 'src/components/GridItem.js');
__REACT_HOT_LOADER__.register(getPositionStyles, 'getPositionStyles', 'src/components/GridItem.js');
__REACT_HOT_LOADER__.register(GridItem, 'GridItem', 'src/components/GridItem.js');
__REACT_HOT_LOADER__.register(_default, 'default', 'src/components/GridItem.js');
}();
;