redux-plugins-immutable-react
Version:
React components that work with redux-plugins-immutable
172 lines (133 loc) • 7.03 kB
JavaScript
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 _immutable = require('immutable');
var Immutable = _interopRequireWildcard(_immutable);
var _reactRedux = require('react-redux');
var _reselect = require('reselect');
var _warning = require('warning');
var _warning2 = _interopRequireDefault(_warning);
var _createOrCloneElement = require('./util/createOrCloneElement');
var _createOrCloneElement2 = _interopRequireDefault(_createOrCloneElement);
var _propTypes = require('./util/propTypes');
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
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; }
/**
* A shell into which plugins can inject components. For example if you had:
*
* import PluginComponents from './PluginComponents';
*
* const Menu = ({children}) => <ul>
* <li><a>Input Settings</a></li>
* <li><a>Output Settings</a></li>
* <li divider/>
* {children}
* </ul>;
*
* <Dropdown component="div">
* <Button caret>Settings</Button>
* <PluginComponents componentKey="SettingsMenuItems">{Menu}</PluginComponents>
* </Dropdown>
*
* Then anything at the path ['components', 'SettingsMenuItems'] in any plugin will
* be passed in the children to the created <Menu> element. This way it's easy for
* plugins to extend the UI in arbitrary places.
*
* There are two ways of specifying what component to get from each plugin:
* * componentKey prop - use plugin.getIn(['components', componentKey])
* * getComponent prop - use getComponent(plugin)
*
* You can specify a sortPlugins prop to control the order in which plugin components
* show.
*/
var PluginComponents = function (_Component) {
_inherits(PluginComponents, _Component);
function PluginComponents() {
var _Object$getPrototypeO;
var _temp, _this, _ret;
_classCallCheck(this, PluginComponents);
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_Object$getPrototypeO = Object.getPrototypeOf(PluginComponents)).call.apply(_Object$getPrototypeO, [this].concat(args))), _this), _this.selectPluginComponents = (0, _reselect.createSelector)(function (props) {
return props.plugins;
}, function (props) {
return props.sortPlugins;
}, function (_ref) {
var getComponent = _ref.getComponent;
var componentKey = _ref.componentKey;
if (getComponent) return getComponent;
if (componentKey) return function (plugin) {
return plugin.getIn(['components', componentKey]);
};
return function () {
return undefined;
};
}, function (props) {
return props.componentProps || {};
}, function (plugins, sortPlugins, getComponent, componentProps) {
if (plugins) {
if (sortPlugins) plugins = sortPlugins(plugins);
return plugins.map(function (plugin, key) {
var component = plugin && getComponent(plugin);
if (Array.isArray(component) || component instanceof Immutable.Iterable) {
return component.map(function (comp, index) {
return comp && (0, _createOrCloneElement2.default)(comp, _extends({}, componentProps, { key: key + '-' + index }));
});
}
return component && (0, _createOrCloneElement2.default)(component, _extends({}, componentProps, { key: key }));
}).toList().flatten().toArray();
}
}), _temp), _possibleConstructorReturn(_this, _ret);
}
_createClass(PluginComponents, [{
key: 'componentWillReceiveProps',
value: function componentWillReceiveProps(nextProps) {
var getComponent = nextProps.getComponent;
var componentKey = nextProps.componentKey;
(0, _warning2.default)(getComponent || componentKey, "you must provide either getComponent or componentKey");
}
}, {
key: 'render',
value: function render() {
var children = this.props.children;
var pluginComponents = this.selectPluginComponents(this.props);
if (children) return children(pluginComponents);
var props = _extends({}, this.props);
delete props.componentKey;
delete props.componentProps;
delete props.getComponent;
delete props.plugins;
delete props.sortPlugins;
delete props.dispatch;
return _react2.default.createElement(
'div',
props,
pluginComponents
);
}
}]);
return PluginComponents;
}(_react.Component);
PluginComponents.propTypes = {
children: _react.PropTypes.func,
componentKey: _propTypes.mapKey,
componentProps: _react.PropTypes.object,
getComponent: _react.PropTypes.func,
plugins: _react.PropTypes.instanceOf(Immutable.Map),
sortPlugins: _react.PropTypes.func
};
function select(state) {
return {
plugins: state.get('plugins')
};
}
exports.default = (0, _reactRedux.connect)(select)(PluginComponents);
;