UNPKG

fluorine-lib

Version:

Reactive state and side effect management for React using a single stream of actions

131 lines (90 loc) 4.83 kB
'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; }; exports.default = connectStore; var _react = require('react'); var React = _interopRequireDefault(_react).default; var Component = _react.Component; var _assert = require('../util/assert'); var assert = _interopRequireDefault(_assert).default; var _isObservable = require('../util/isObservable'); var isObservable = _interopRequireDefault(_isObservable).default; var _isDispatcher = require('../util/isDispatcher'); var isDispatcher = _interopRequireDefault(_isDispatcher).default; 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; } function connectStore(selector) { var prop = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'data'; var pureProps = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; assert(typeof selector === 'function' || isObservable(selector), 'Expected selector to be either a function or an observable.'); return function (Child) { var _class, _temp; return _temp = _class = function (_Component) { _inherits(Connector, _Component); function Connector(props) { var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; _classCallCheck(this, Connector); var _this = _possibleConstructorReturn(this, _Component.call(this, props, context)); _this.subscribe = function () { _this.sub = _this.store.subscribe(function (next) { _this.setState({ data: next }); }, function (err) { throw err; }); }; var observer = context.observer, observable = context.observable; _this.store = typeof selector === 'function' ? selector(observable, props) : selector; _this.state = {}; return _this; } Connector.prototype.componentWillMount = function componentWillMount() { this.subscribe(); }; Connector.prototype.shouldComponentUpdate = function shouldComponentUpdate(props, state) { if (!pureProps || state.data !== this.state.data) { return true; } for (var key in props) { if (props.hasOwnProperty(key) && props[key] !== this.props[key]) { return true; } } return false; }; Connector.prototype.componentWillReceiveProps = function componentWillReceiveProps(props) { if (typeof selector === 'function') { var _store = selector(this.context.observable, props); if (this.store !== _store) { this.store = _store; this.sub.unsubscribe(); this.subscribe(); } } }; Connector.prototype.componentWillUnmount = function componentWillUnmount() { this.sub.unsubscribe(); }; Connector.prototype.render = function render() { var _extends2; var observer = this.context.observer; var data = this.state.data; if (process.env.NODE_ENV !== 'production' && data === undefined) { console.error('Rendering `undefined` causes undefined behaviour in most cases! This message will only show up in development.'); } return React.createElement(Child, _extends({}, this.props, (_extends2 = {}, _extends2[prop] = data, _extends2.observer = observer, _extends2))); }; return Connector; }(Component), _class.contextTypes = { observable: React.PropTypes.object, observer: React.PropTypes.object }, _temp; }; } module.exports = exports['default'];