UNPKG

layout-components

Version:

A React Layout Componentss. Contains webpack configuration and document generator.

176 lines (135 loc) 5.98 kB
"use strict"; exports.__esModule = true; exports.default = undefined; var _class, _temp2; /** Responsive * Takes in a list of breakPoints. * When the window/container width is wider than the largest break-point, * pick the children with "default" key. * */ var _react = require("react"); var _react2 = _interopRequireDefault(_react); var _propTypes = require("prop-types"); var _propTypes2 = _interopRequireDefault(_propTypes); 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"); } } 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 any = _propTypes2.default.any; var node = _propTypes2.default.node; var func = _propTypes2.default.func; var Responsive = (_temp2 = _class = function (_React$Component) { _inherits(Responsive, _React$Component); function Responsive() { var _temp, _this, _ret; _classCallCheck(this, Responsive); for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } return _ret = (_temp = (_this = _possibleConstructorReturn(this, _React$Component.call.apply(_React$Component, [this].concat(args))), _this), _this.onResize = function () { var width = _this.getWidth(); var breakKey = _this.getBreakRange(_this.state.orderedBreakPoints, width); _this.setBreakKey(breakKey); }, _temp), _possibleConstructorReturn(_this, _ret); } //todo: optimize this component, avoid using state when not necessary Responsive.prototype.componentWillMount = function componentWillMount() { var orderedBreakPoints = this.orderBreakPoints(); var width = this.getWidth(); var breakKey = this.getBreakRange(orderedBreakPoints, width); this.setBreakKey(breakKey); }; Responsive.prototype.componentDidMount = function componentDidMount() { window.addEventListener("resize", this.onResize); }; Responsive.prototype.componentWillReceiveProps = function componentWillReceiveProps(newProps) { if (this.props.breakPoints !== newProps.breakPoints) this.orderBreakPoints(newProps); }; Responsive.prototype.componentWillUnmount = function componentWillUnmount() { window.removeEventListener("resize", this.onResize); }; Responsive.prototype.getWidth = function getWidth() { var _props = this.props; var fill = _props.fill; var height = _props.height; var container = this.refs.container; var width = void 0; if (fill) { if (height) width = container.clientHeight;else width = container.clientWidth; } else { if (height) width = window.innerHeight;else width = window.innerWidth; } this.setState({ width: width }); return width; }; Responsive.prototype.orderBreakPoints = function orderBreakPoints(newProps) { var _ref = newProps || this.props; var breakPoints = _ref.breakPoints; var orderedBreakPoints = Object.keys(breakPoints).map(function (k) { return { breakPoint: breakPoints[k], breakKey: k }; }).sort(function (a, b) { return a.breakKey - b.breakKey; }); this.setState({ orderedBreakPoints: orderedBreakPoints }); return orderedBreakPoints; }; Responsive.prototype.getBreakRange = function getBreakRange(orderedBreakPoints, width) { // breakPoints are sorted to be ascending if (orderedBreakPoints.length === 0) { return "default"; } for (var i = 0; i < orderedBreakPoints.length; i++) { if (width <= orderedBreakPoints[i].breakPoint) { return orderedBreakPoints[i].breakKey; } } return "default"; }; Responsive.prototype.setBreakKey = function setBreakKey(breakKey) { this.setState({ breakKey: breakKey }); if (this.props.onBreakChange) this.props.onBreakChange(breakKey); }; Responsive.prototype.renderChild = function renderChild() { var children = this.props.children; var _ref2 = this.state || {}; var breakKey = _ref2.breakKey; var _children = [].concat(children); for (var key in children) { if (children[key].props["data-" + breakKey]) return children[key]; } return _react2.default.createElement( "div", null, "no child found" ); }; Responsive.prototype.render = function render() { var fill = this.props.fill; if (fill) { return _react2.default.createElement( "div", { ref: "container" }, this.renderChild() ); } else { return this.renderChild(); } }; return Responsive; }(_react2.default.Component), _class.propTypes = { breakPoints: any, children: node, fill: any, onBreakChange: func }, _temp2); exports.default = Responsive; ; (function () { if (typeof __REACT_HOT_LOADER__ === 'undefined') { return; } __REACT_HOT_LOADER__.register(any, "any", "src/Responsive.js"); __REACT_HOT_LOADER__.register(node, "node", "src/Responsive.js"); __REACT_HOT_LOADER__.register(func, "func", "src/Responsive.js"); __REACT_HOT_LOADER__.register(Responsive, "Responsive", "src/Responsive.js"); })(); ;