'use strict';
var _interopRequire = function (obj) { return obj && obj.__esModule ? obj['default'] : obj; };
exports.__esModule = true;
var _React$PropTypes = require('react');
var React = _interopRequire(_React$PropTypes);
var _Flux = require('../Flux');
var _assign = require('object-assign');
var assign = _interopRequire(_assign);
var instanceMethods = {
getChildContext: function getChildContext() {
var flux = this.getFlux();
if (!flux) {
return {};
}return { flux: flux };
},
getFlux: function getFlux() {
return this.props.flux || this.context.flux;
},
initialize: function initialize() {
this._fluxStateGetters = [];
this._fluxListeners = {};
this.flux = this.getFlux();
if (!(this.flux instanceof _Flux.Flux)) {
throw new Error('fluxMixin: Could not find Flux instance. Ensure that your component ' + 'has either `this.context.flux` or `this.props.flux`.');
}
},
componentWillUnmount: function componentWillUnmount() {
var flux = this.getFlux();
for (var key in this._fluxListeners) {
if (!this._fluxListeners.hasOwnProperty(key)) continue;
var store = flux.getStore(key);
if (typeof store === 'undefined') continue;
var listener = this._fluxListeners[key];
store.removeListener('change', listener);
}
},
componentWillReceiveProps: function componentWillReceiveProps(nextProps) {
this.updateStores(nextProps);
},
updateStores: function updateStores() {
var props = arguments[0] === undefined ? this.props : arguments[0];
var state = this.getStoreState(props);
this.setState(state);
},
getStoreState: function getStoreState() {
var props = arguments[0] === undefined ? this.props : arguments[0];
return this._fluxStateGetters.reduce(function (result, stateGetter) {
var getter = stateGetter.getter;
var stores = stateGetter.stores;
var stateFromStores = getter(stores, props);
return assign(result, stateFromStores);
}, {});
},
connectToStores: function connectToStores() {
var _this = this;
var stateGetterMap = arguments[0] === undefined ? {} : arguments[0];
var stateGetter = arguments[1] === undefined ? null : arguments[1];
var flux = this.getFlux();
var getStore = function getStore(key) {
var store = flux.getStore(key);
if (typeof store === 'undefined') {
throw new Error('connectToStores(): Store with key \'' + key + '\' does not exist.');
}
return store;
};
if (typeof stateGetterMap === 'string') {
var key = stateGetterMap;
var store = getStore(key);
var getter = stateGetter || defaultStateGetter;
this._fluxStateGetters.push({ stores: store, getter: getter });
var listener = createStoreListener(this, store, getter);
store.addListener('change', listener);
this._fluxListeners[key] = listener;
} else if (Array.isArray(stateGetterMap)) {
(function () {
var stores = stateGetterMap.map(getStore);
var getter = stateGetter || defaultReduceStateGetter;
_this._fluxStateGetters.push({ stores: stores, getter: getter });
var listener = createStoreListener(_this, stores, getter);
stateGetterMap.forEach(function (key, index) {
var store = stores[index];
store.addListener('change', listener);
_this._fluxListeners[key] = listener;
});
})();
} else {
for (var key in stateGetterMap) {
var store = getStore(key);
var getter = stateGetterMap[key] || defaultStateGetter;
this._fluxStateGetters.push({ stores: store, getter: getter });
var listener = createStoreListener(this, store, getter);
store.addListener('change', listener);
this._fluxListeners[key] = listener;
}
}
return this.getStoreState();
}
};
var staticProperties = {
contextTypes: {
flux: _React$PropTypes.PropTypes.instanceOf(_Flux.Flux) },
childContextTypes: {
flux: _React$PropTypes.PropTypes.instanceOf(_Flux.Flux) },
propTypes: {
connectToStores: _React$PropTypes.PropTypes.oneOfType([_React$PropTypes.PropTypes.string, _React$PropTypes.PropTypes.arrayOf(_React$PropTypes.PropTypes.string), _React$PropTypes.PropTypes.object]),
flux: _React$PropTypes.PropTypes.instanceOf(_Flux.Flux),
render: React.PropTypes.func,
stateGetter: React.PropTypes.func } };
exports.instanceMethods = instanceMethods;
exports.staticProperties = staticProperties;
function createStoreListener(component, store, storeStateGetter) {
return (function () {
var state = storeStateGetter(store, this.props);
this.setState(state);
}).bind(component);
}
function defaultStateGetter(store) {
return store.getStateAsObject();
}
function defaultReduceStateGetter(stores) {
return stores.reduce(function (result, store) {
return assign(result, store.getStateAsObject());
}, {});
}