diff --git a/src/components/ngRedux.js b/src/components/ngRedux.js index 4b86840..18028b3 100644 --- a/src/components/ngRedux.js +++ b/src/components/ngRedux.js @@ -2,6 +2,8 @@ import Connector from './connector'; import invariant from 'invariant'; import {createStore, applyMiddleware, compose, combineReducers} from 'redux'; import digestMiddleware from './digestMiddleware'; +import providedStoreMiddleware from './providedStoreMiddleware'; +import wrapStore from './storeWrapper'; import curry from 'lodash.curry'; import isFunction from 'lodash.isfunction'; @@ -20,6 +22,14 @@ export default function ngReduxProvider() { let _storeEnhancers = undefined; let _initialState = undefined; let _reducerIsObject = undefined; + let _providedStore = undefined; + + this.provideStore = (store, middlewares = [], storeEnhancers) => { + _providedStore = store; + _reducer = (state, action) => action.payload; + _storeEnhancers = storeEnhancers; + _middlewares = [...middlewares, providedStoreMiddleware(store)]; + } this.createStoreWith = (reducer, middlewares, storeEnhancers, initialState) => { invariant( @@ -36,7 +46,7 @@ export default function ngReduxProvider() { _reducer = reducer; _reducerIsObject = isObject(reducer); - _storeEnhancers = storeEnhancers + _storeEnhancers = storeEnhancers; _middlewares = middlewares || []; _initialState = initialState; }; @@ -79,7 +89,11 @@ export default function ngReduxProvider() { ? applyMiddleware(...resolvedMiddleware)(finalCreateStore)(_reducer, _initialState) : applyMiddleware(...resolvedMiddleware)(finalCreateStore)(_reducer); - return assign({}, store, { connect: Connector(store) }); + const mergedStore = assign({}, store, { connect: Connector(store) }); + + if (_providedStore) wrapStore(_providedStore, mergedStore); + + return mergedStore; }; this.$get.$inject = ['$injector']; diff --git a/src/components/providedStoreMiddleware.js b/src/components/providedStoreMiddleware.js new file mode 100644 index 0000000..3238513 --- /dev/null +++ b/src/components/providedStoreMiddleware.js @@ -0,0 +1,11 @@ +/** + * middleware for the empty store that ng-redux uses when a external store is provided + * Provides two cases: + * 1. NGREDUX_PASSTHROUGH, where data is coming IN to the "fake" store + * 2. all other, where actions are dispatched out, and proxied to the true store + */ +export default _providedStore => store => next => action => { + return action.type === '@@NGREDUX_PASSTHROUGH' + ? next(action) + : _providedStore.dispatch(action) +} diff --git a/src/components/storeWrapper.js b/src/components/storeWrapper.js new file mode 100644 index 0000000..ae03797 --- /dev/null +++ b/src/components/storeWrapper.js @@ -0,0 +1,10 @@ +export default function wrapStore(providedStore, ngReduxStore) { + providedStore.subscribe(() => { + let newState = providedStore.getState(); + ngReduxStore.dispatch({ + type: '@@NGREDUX_PASSTHROUGH', + payload: newState + }); + }); + providedStore.dispatch({ type: '@@NGREDUX_PASSTHROUGH_INIT' }) +}