apeman-react-mixins
Version:
React mixin set of apeman.
132 lines (102 loc) • 8.43 kB
JavaScript
/**
* Mixin to handle resize.
* @mixin ApLayoutMixin
*/
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.ApLayoutEvent = undefined;
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _deepEqual = require('deep-equal');
var _deepEqual2 = _interopRequireDefault(_deepEqual);
var _defaults = require('defaults');
var _defaults2 = _interopRequireDefault(_defaults);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var LAYOUT_INTERVAL = 80;
var ApLayoutEvent = exports.ApLayoutEvent = function ApLayoutEvent(values) {
_classCallCheck(this, ApLayoutEvent);
var s = this;
Object.assign(s, values);
};
/** @lends ApLayoutMixin */
var ApLayoutMixin = {
// --------------------
// Custom
// --------------------
$apLayoutMixed: true,
/**
* Reserve layout.
*/
layout: function layout(immidate) {
var s = this;
var props = s.props;
clearTimeout(s._layoutTimer);
s._layoutTimer = setTimeout(function () {
if (!s.isMounted()) {
return;
}
var layouts = s.calcLayouts && s.calcLayouts();
var changed = !(0, _deepEqual2.default)(s.layouts, layouts);
if (changed) {
s.componentWillLayout(layouts);
s.layouts = layouts;
s.forceUpdate();
if (props.onLayout) {
var event = new ApLayoutEvent({ layouts: layouts });
props.onLayout(event);
}
s.componentDidLayout(layouts);
}
}, immidate ? 0 : LAYOUT_INTERVAL);
},
// --------------------
// Specs
// --------------------
propTypes: {
onLayout: _react.PropTypes.func
},
// --------------------
// Lifecycle
// --------------------
componentWillMount: function componentWillMount() {
var s = this;
if (s.getInitialLayouts) {
s.layouts = s.getInitialLayouts();
}
var noop = function noop() {
return undefined;
};
(0, _defaults2.default)(s, {
componentWillLayout: noop,
componentDidLayout: noop
});
},
componentDidMount: function componentDidMount() {
var s = this;
if (!s.calcLayouts) {
console.warn('[ApLayoutMixin] Should implement .calcLayouts()');
}
window.addEventListener('resize', s.layout);
s.layout(true);
},
componentWillReceiveProps: function componentWillReceiveProps(nextProps) {
var s = this;
s.layout();
},
componentWillUnmount: function componentWillUnmount() {
var s = this;
clearTimeout(s._layoutTimer);
window.removeEventListener('resize', s.layout);
delete s._layoutTimer;
},
// --------------------
// Private
// --------------------
layouts: null,
_layoutTimer: null
};
exports.default = Object.freeze(ApLayoutMixin);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFwX2xheW91dF9taXhpbi5qc3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFLQTs7Ozs7OztBQUVBOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7Ozs7QUFFQSxJQUFNLGtCQUFrQixFQUF4Qjs7SUFFYSxhLFdBQUEsYSxHQUNYLHVCQUFhLE1BQWIsRUFBcUI7QUFBQTs7QUFDbkIsTUFBTSxJQUFJLElBQVY7QUFDQSxTQUFPLE1BQVAsQ0FBYyxDQUFkLEVBQWlCLE1BQWpCO0FBQ0QsQzs7Ozs7QUFJSCxJQUFNLGdCQUFnQjs7Ozs7QUFLcEIsa0JBQWdCLElBTEk7Ozs7O0FBVXBCLFFBVm9CLGtCQVVaLFFBVlksRUFVRjtBQUNoQixRQUFNLElBQUksSUFBVjtBQURnQixRQUVWLEtBRlUsR0FFQSxDQUZBLENBRVYsS0FGVTs7QUFHaEIsaUJBQWEsRUFBRSxZQUFmO0FBQ0EsTUFBRSxZQUFGLEdBQWlCLFdBQVcsWUFBTTtBQUNoQyxVQUFJLENBQUMsRUFBRSxTQUFGLEVBQUwsRUFBb0I7QUFDbEI7QUFDRDtBQUNELFVBQUksVUFBVSxFQUFFLFdBQUYsSUFBaUIsRUFBRSxXQUFGLEVBQS9CO0FBQ0EsVUFBSSxVQUFVLENBQUMseUJBQVUsRUFBRSxPQUFaLEVBQXFCLE9BQXJCLENBQWY7QUFDQSxVQUFJLE9BQUosRUFBYTtBQUNYLFVBQUUsbUJBQUYsQ0FBc0IsT0FBdEI7QUFDQSxVQUFFLE9BQUYsR0FBWSxPQUFaO0FBQ0EsVUFBRSxXQUFGO0FBQ0EsWUFBSSxNQUFNLFFBQVYsRUFBb0I7QUFDbEIsY0FBSSxRQUFRLElBQUksYUFBSixDQUFrQixFQUFFLGdCQUFGLEVBQWxCLENBQVo7QUFDQSxnQkFBTSxRQUFOLENBQWUsS0FBZjtBQUNEO0FBQ0QsVUFBRSxrQkFBRixDQUFxQixPQUFyQjtBQUNEO0FBQ0YsS0FoQmdCLEVBZ0JkLFdBQVcsQ0FBWCxHQUFlLGVBaEJELENBQWpCO0FBaUJELEdBL0JtQjs7Ozs7OztBQXFDcEIsYUFBVztBQUNULGNBQVUsaUJBQU07QUFEUCxHQXJDUzs7Ozs7O0FBNkNwQixvQkE3Q29CLGdDQTZDRTtBQUNwQixRQUFNLElBQUksSUFBVjtBQUNBLFFBQUksRUFBRSxpQkFBTixFQUF5QjtBQUN2QixRQUFFLE9BQUYsR0FBWSxFQUFFLGlCQUFGLEVBQVo7QUFDRDtBQUNELFFBQUksT0FBTyxTQUFQLElBQU87QUFBQSxhQUFNLFNBQU47QUFBQSxLQUFYOztBQUVBLDRCQUFTLENBQVQsRUFBWTtBQUNWLDJCQUFxQixJQURYO0FBRVYsMEJBQW9CO0FBRlYsS0FBWjtBQUlELEdBeERtQjtBQXlEcEIsbUJBekRvQiwrQkF5REM7QUFDbkIsUUFBTSxJQUFJLElBQVY7QUFDQSxRQUFJLENBQUMsRUFBRSxXQUFQLEVBQW9CO0FBQ2xCLGNBQVEsSUFBUixDQUFhLGlEQUFiO0FBQ0Q7QUFDRCxXQUFPLGdCQUFQLENBQXdCLFFBQXhCLEVBQWtDLEVBQUUsTUFBcEM7QUFDQSxNQUFFLE1BQUYsQ0FBUyxJQUFUO0FBQ0QsR0FoRW1CO0FBa0VwQiwyQkFsRW9CLHFDQWtFTyxTQWxFUCxFQWtFa0I7QUFDcEMsUUFBTSxJQUFJLElBQVY7QUFDQSxNQUFFLE1BQUY7QUFDRCxHQXJFbUI7QUF1RXBCLHNCQXZFb0Isa0NBdUVJO0FBQ3RCLFFBQU0sSUFBSSxJQUFWO0FBQ0EsaUJBQWEsRUFBRSxZQUFmO0FBQ0EsV0FBTyxtQkFBUCxDQUEyQixRQUEzQixFQUFxQyxFQUFFLE1BQXZDO0FBQ0EsV0FBTyxFQUFFLFlBQVQ7QUFDRCxHQTVFbUI7Ozs7Ozs7QUFrRnBCLFdBQVMsSUFsRlc7QUFtRnBCLGdCQUFjOztBQW5GTSxDQUF0Qjs7a0JBdUZlLE9BQU8sTUFBUCxDQUFjLGFBQWQsQyIsImZpbGUiOiJhcF9sYXlvdXRfbWl4aW4uanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL29rdW5pc2hpbmlzaGkvUHJvamVjdHMvYXBlbWFuLXByb2plY3RzL2FwZW1hbi1yZWFjdC1taXhpbnMvbGliIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNaXhpbiB0byBoYW5kbGUgcmVzaXplLlxuICogQG1peGluIEFwTGF5b3V0TWl4aW5cbiAqL1xuXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IFJlYWN0LCB7UHJvcFR5cGVzIGFzIHR5cGVzfSBmcm9tICdyZWFjdCdcbmltcG9ydCBkZWVwRXF1YWwgZnJvbSAnZGVlcC1lcXVhbCdcbmltcG9ydCBkZWZhdWx0cyBmcm9tICdkZWZhdWx0cydcblxuY29uc3QgTEFZT1VUX0lOVEVSVkFMID0gODBcblxuZXhwb3J0IGNsYXNzIEFwTGF5b3V0RXZlbnQge1xuICBjb25zdHJ1Y3RvciAodmFsdWVzKSB7XG4gICAgY29uc3QgcyA9IHRoaXNcbiAgICBPYmplY3QuYXNzaWduKHMsIHZhbHVlcylcbiAgfVxufVxuXG4vKiogQGxlbmRzIEFwTGF5b3V0TWl4aW4gKi9cbmNvbnN0IEFwTGF5b3V0TWl4aW4gPSB7XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gQ3VzdG9tXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICRhcExheW91dE1peGVkOiB0cnVlLFxuXG4gIC8qKlxuICAgKiBSZXNlcnZlIGxheW91dC5cbiAgICovXG4gIGxheW91dCAoaW1taWRhdGUpIHtcbiAgICBjb25zdCBzID0gdGhpc1xuICAgIGxldCB7IHByb3BzIH0gPSBzXG4gICAgY2xlYXJUaW1lb3V0KHMuX2xheW91dFRpbWVyKVxuICAgIHMuX2xheW91dFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAoIXMuaXNNb3VudGVkKCkpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBsZXQgbGF5b3V0cyA9IHMuY2FsY0xheW91dHMgJiYgcy5jYWxjTGF5b3V0cygpXG4gICAgICBsZXQgY2hhbmdlZCA9ICFkZWVwRXF1YWwocy5sYXlvdXRzLCBsYXlvdXRzKVxuICAgICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgICAgcy5jb21wb25lbnRXaWxsTGF5b3V0KGxheW91dHMpXG4gICAgICAgIHMubGF5b3V0cyA9IGxheW91dHNcbiAgICAgICAgcy5mb3JjZVVwZGF0ZSgpXG4gICAgICAgIGlmIChwcm9wcy5vbkxheW91dCkge1xuICAgICAgICAgIGxldCBldmVudCA9IG5ldyBBcExheW91dEV2ZW50KHsgbGF5b3V0cyB9KVxuICAgICAgICAgIHByb3BzLm9uTGF5b3V0KGV2ZW50KVxuICAgICAgICB9XG4gICAgICAgIHMuY29tcG9uZW50RGlkTGF5b3V0KGxheW91dHMpXG4gICAgICB9XG4gICAgfSwgaW1taWRhdGUgPyAwIDogTEFZT1VUX0lOVEVSVkFMKVxuICB9LFxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIFNwZWNzXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgcHJvcFR5cGVzOiB7XG4gICAgb25MYXlvdXQ6IHR5cGVzLmZ1bmNcbiAgfSxcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBMaWZlY3ljbGVcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBjb21wb25lbnRXaWxsTW91bnQgKCkge1xuICAgIGNvbnN0IHMgPSB0aGlzXG4gICAgaWYgKHMuZ2V0SW5pdGlhbExheW91dHMpIHtcbiAgICAgIHMubGF5b3V0cyA9IHMuZ2V0SW5pdGlhbExheW91dHMoKVxuICAgIH1cbiAgICBsZXQgbm9vcCA9ICgpID0+IHVuZGVmaW5lZFxuXG4gICAgZGVmYXVsdHMocywge1xuICAgICAgY29tcG9uZW50V2lsbExheW91dDogbm9vcCxcbiAgICAgIGNvbXBvbmVudERpZExheW91dDogbm9vcFxuICAgIH0pXG4gIH0sXG4gIGNvbXBvbmVudERpZE1vdW50ICgpIHtcbiAgICBjb25zdCBzID0gdGhpc1xuICAgIGlmICghcy5jYWxjTGF5b3V0cykge1xuICAgICAgY29uc29sZS53YXJuKCdbQXBMYXlvdXRNaXhpbl0gU2hvdWxkIGltcGxlbWVudCAuY2FsY0xheW91dHMoKScpXG4gICAgfVxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBzLmxheW91dClcbiAgICBzLmxheW91dCh0cnVlKVxuICB9LFxuXG4gIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgKG5leHRQcm9wcykge1xuICAgIGNvbnN0IHMgPSB0aGlzXG4gICAgcy5sYXlvdXQoKVxuICB9LFxuXG4gIGNvbXBvbmVudFdpbGxVbm1vdW50ICgpIHtcbiAgICBjb25zdCBzID0gdGhpc1xuICAgIGNsZWFyVGltZW91dChzLl9sYXlvdXRUaW1lcilcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgcy5sYXlvdXQpXG4gICAgZGVsZXRlIHMuX2xheW91dFRpbWVyXG4gIH0sXG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gUHJpdmF0ZVxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIGxheW91dHM6IG51bGwsXG4gIF9sYXlvdXRUaW1lcjogbnVsbFxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IE9iamVjdC5mcmVlemUoQXBMYXlvdXRNaXhpbilcbiJdfQ==