diff --git a/src/components/ngRedux.js b/src/components/ngRedux.js index 4b86840..53683b1 100644 --- a/src/components/ngRedux.js +++ b/src/components/ngRedux.js @@ -2,6 +2,7 @@ import Connector from './connector'; import invariant from 'invariant'; import {createStore, applyMiddleware, compose, combineReducers} from 'redux'; import digestMiddleware from './digestMiddleware'; +import wrapStore from './storeWrapper'; import curry from 'lodash.curry'; import isFunction from 'lodash.isfunction'; @@ -20,6 +21,11 @@ export default function ngReduxProvider() { let _storeEnhancers = undefined; let _initialState = undefined; let _reducerIsObject = undefined; + let _providedStore = undefined; + + this.provideStore = (store) => { + _providedStore = store; + } this.createStoreWith = (reducer, middlewares, storeEnhancers, initialState) => { invariant( @@ -42,45 +48,56 @@ export default function ngReduxProvider() { }; this.$get = ($injector) => { - const resolveMiddleware = middleware => isString(middleware) - ? $injector.get(middleware) - : middleware; + if (_providedStore) { + const emptyStore = createNgReduxStore($injector, [], [], state => state, undefined); - const resolvedMiddleware = map(_middlewares, resolveMiddleware); + return wrapStore(_providedStore, emptyStore); + } - const resolveStoreEnhancer = storeEnhancer => isString(storeEnhancer) - ? $injector.get(storeEnhancer) - : storeEnhancer; + return createNgReduxStore($injector, _middlewares, _storeEnhancers, _reducer, _initialState); - const resolvedStoreEnhancer = map(_storeEnhancers, resolveStoreEnhancer); + }; - if(_reducerIsObject) { - const getReducerKey = key => isString(_reducer[key]) - ? $injector.get(_reducer[key]) - : _reducer[key]; + this.$get.$inject = ['$injector']; +} - const resolveReducerKey = (result, key) => assign({}, result, - { [key]: getReducerKey(key) } - ); +function createNgReduxStore($injector, _middlewares, _storeEnhancers, _reducer, _initialState) { + const resolveMiddleware = middleware => isString(middleware) + ? $injector.get(middleware) + : middleware; - const reducersObj = Object - .keys(_reducer) - .reduce(resolveReducerKey, {}); + const resolvedMiddleware = map(_middlewares, resolveMiddleware); - _reducer = combineReducers(reducersObj); - } + const resolveStoreEnhancer = storeEnhancer => isString(storeEnhancer) + ? $injector.get(storeEnhancer) + : storeEnhancer; - const finalCreateStore = resolvedStoreEnhancer ? compose(...resolvedStoreEnhancer)(createStore) : createStore; + const resolvedStoreEnhancer = map(_storeEnhancers, resolveStoreEnhancer); - //digestMiddleware needs to be the last one. - resolvedMiddleware.push(digestMiddleware($injector.get('$rootScope'))); + if(_reducerIsObject) { + const getReducerKey = key => isString(_reducer[key]) + ? $injector.get(_reducer[key]) + : _reducer[key]; - const store = _initialState - ? applyMiddleware(...resolvedMiddleware)(finalCreateStore)(_reducer, _initialState) - : applyMiddleware(...resolvedMiddleware)(finalCreateStore)(_reducer); + const resolveReducerKey = (result, key) => assign({}, result, + { [key]: getReducerKey(key) } + ); - return assign({}, store, { connect: Connector(store) }); - }; + const reducersObj = Object + .keys(_reducer) + .reduce(resolveReducerKey, {}); - this.$get.$inject = ['$injector']; + _reducer = combineReducers(reducersObj); + } + + const finalCreateStore = resolvedStoreEnhancer ? compose(...resolvedStoreEnhancer)(createStore) : createStore; + + //digestMiddleware needs to be the last one. + resolvedMiddleware.push(digestMiddleware($injector.get('$rootScope'))); + + const store = _initialState + ? applyMiddleware(...resolvedMiddleware)(finalCreateStore)(_reducer, _initialState) + : applyMiddleware(...resolvedMiddleware)(finalCreateStore)(_reducer); + + return assign({}, store, { connect: Connector(store) }); } diff --git a/src/components/storeWrapper.js b/src/components/storeWrapper.js new file mode 100644 index 0000000..ae6db57 --- /dev/null +++ b/src/components/storeWrapper.js @@ -0,0 +1,16 @@ +export default function wrapStore(providedStore, ngReduxStore) { + const unsubscribe = providedStore + .subscribe(() => { + let newState = providedStore.getState(); + + ngReduxStore.dispatch(newState); + }) + ; + + return Object.assign({}, + providedStore, + { + subscribe: ngReduxStore.subscribe + }) + ; +}