ssc-refer
Version:
React refer component for SSC 3.0
101 lines (75 loc) • 3.4 kB
JavaScript
;
exports.__esModule = true;
var _extends2 = require('babel-runtime/helpers/extends');
var _extends3 = _interopRequireDefault(_extends2);
var _objectWithoutProperties2 = require('babel-runtime/helpers/objectWithoutProperties');
var _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2);
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _reactDom = require('react-dom');
var _getDisplayName = require('../refer/utils/getDisplayName');
var _getDisplayName2 = _interopRequireDefault(_getDisplayName);
var _scrollIntoViewIfNeeded = require('../refer/utils/scrollIntoViewIfNeeded');
var _scrollIntoViewIfNeeded2 = _interopRequireDefault(_scrollIntoViewIfNeeded);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var renderContainer = function renderContainer(Component) {
return _react2['default'].createClass({
displayName: 'renderContainer(' + (0, _getDisplayName2['default'])(Component) + ')',
propTypes: {
option: _react.PropTypes.oneOfType([_react.PropTypes.object, _react.PropTypes.string]).isRequired,
position: _react.PropTypes.number
},
contextTypes: {
activeIndex: _react.PropTypes.number.isRequired,
onActiveItemChange: _react.PropTypes.func.isRequired,
onInitialItemChange: _react.PropTypes.func.isRequired,
onMenuItemClick: _react.PropTypes.func.isRequired
},
componentWillMount: function componentWillMount() {
this._updateInitialItem(this.props);
},
componentWillReceiveProps: function componentWillReceiveProps(nextProps, nextContext) {
var currentlyActive = this.context.activeIndex === this.props.position;
var option = nextProps.option,
position = nextProps.position;
var activeIndex = nextContext.activeIndex,
onActiveItemChange = nextContext.onActiveItemChange;
if (position == null) {
return;
}
// The item will become active.
if (activeIndex === position) {
// Ensures that if the menu items exceed the bounds of the menu, the
// menu will scroll up or down as the user hits the arrow keys.
(0, _scrollIntoViewIfNeeded2['default'])((0, _reactDom.findDOMNode)(this));
// Fire the change handler when the menu item becomes active.
!currentlyActive && onActiveItemChange(option);
}
this._updateInitialItem(nextProps);
},
render: function render() {
var _context = this.context,
activeIndex = _context.activeIndex,
onMenuItemClick = _context.onMenuItemClick;
var _props = this.props,
option = _props.option,
position = _props.position,
props = (0, _objectWithoutProperties3['default'])(_props, ['option', 'position']);
return _react2['default'].createElement(Component, (0, _extends3['default'])({}, props, {
active: activeIndex === position,
onClick: function onClick() {
return onMenuItemClick(option);
}
}));
},
_updateInitialItem: function _updateInitialItem(props) {
var option = props.option,
position = props.position;
if (position === 0) {
this.context.onInitialItemChange(option);
}
}
});
};
exports['default'] = renderContainer;
module.exports = exports['default'];