redux-fluorine
Version:
A Redux enhancer to manage groups of actions as observables (agendas)
84 lines (63 loc) • 2.21 kB
JavaScript
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; };
import symbolObservable from 'symbol-observable';
import isObservable from './util/isObservable';
import executeAgenda from './util/executeAgenda';
import wrapStateReducer from './util/wrapStateReducer';
function _ref2() {
return this;
}
function wrapStore(store) {
var _extends2;
function getState() {
var _store$getState = store.getState();
var state = _store$getState.state;
return state;
}
function dispatch(action) {
if (isObservable(action)) {
return executeAgenda(action, store);
}
return store.dispatch(action);
}
function replaceReducer(reducer) {
store.replaceReducer(wrapStateReducer(reducer));
}
function _ref(observer) {
if (typeof observer !== 'object') {
throw new TypeError('Expected the observer to be an object.');
}
function observeState() {
observer.next && observer.next(getState());
}
observeState();
var unsubscribe = store.subscribe(observeState);
return { unsubscribe: unsubscribe };
}
function observable() {
var _ref3;
return _ref3 = {
subscribe: _ref
}, _ref3[symbolObservable] = _ref2, _ref3;
}
return _extends({}, store, (_extends2 = {
preAgendaStore: store,
dispatch: dispatch,
getState: getState,
replaceReducer: replaceReducer
}, _extends2[symbolObservable] = observable, _extends2));
}
function _ref4(createStore) {
return function (reducer, preloadedState, enhancer) {
// Pass wrapped reducer to `createStore` instead
var wrappedReducer = wrapStateReducer(reducer, preloadedState);
var store = createStore(wrappedReducer, undefined, enhancer);
if (store.preAgendaStore) {
// Check whether this method was applied twice
throw new Error('createAgendaEnhancer: The Redux Fluorine enhancer should only be applied once.');
}
return wrapStore(store);
};
}
export default function createAgendaEnhancer() {
return _ref4;
}