Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 9f855ae

Browse files
authoredJan 30, 2018
Merge pull request #187 from derrickpelletier/feature/provide-store
feat(lib): provide store functionality (resubmitted)
2 parents 1093489 + b94282b commit 9f855ae

File tree

3 files changed

+37
-2
lines changed

3 files changed

+37
-2
lines changed
 

‎src/components/ngRedux.js

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import Connector from './connector';
22
import invariant from 'invariant';
33
import {createStore, applyMiddleware, compose, combineReducers} from 'redux';
44
import digestMiddleware from './digestMiddleware';
5+
import providedStoreMiddleware from './providedStoreMiddleware';
6+
import wrapStore from './storeWrapper';
57

68
import curry from 'lodash.curry';
79
import isFunction from 'lodash.isfunction';
@@ -20,6 +22,14 @@ export default function ngReduxProvider() {
2022
let _storeEnhancers = undefined;
2123
let _initialState = undefined;
2224
let _reducerIsObject = undefined;
25+
let _providedStore = undefined;
26+
27+
this.provideStore = (store, middlewares = [], storeEnhancers) => {
28+
_providedStore = store;
29+
_reducer = (state, action) => action.payload;
30+
_storeEnhancers = storeEnhancers;
31+
_middlewares = [...middlewares, providedStoreMiddleware(store)];
32+
}
2333

2434
this.createStoreWith = (reducer, middlewares, storeEnhancers, initialState) => {
2535
invariant(
@@ -36,7 +46,7 @@ export default function ngReduxProvider() {
3646

3747
_reducer = reducer;
3848
_reducerIsObject = isObject(reducer);
39-
_storeEnhancers = storeEnhancers
49+
_storeEnhancers = storeEnhancers;
4050
_middlewares = middlewares || [];
4151
_initialState = initialState;
4252
};
@@ -79,7 +89,11 @@ export default function ngReduxProvider() {
7989
? applyMiddleware(...resolvedMiddleware)(finalCreateStore)(_reducer, _initialState)
8090
: applyMiddleware(...resolvedMiddleware)(finalCreateStore)(_reducer);
8191

82-
return assign({}, store, { connect: Connector(store) });
92+
const mergedStore = assign({}, store, { connect: Connector(store) });
93+
94+
if (_providedStore) wrapStore(_providedStore, mergedStore);
95+
96+
return mergedStore;
8397
};
8498

8599
this.$get.$inject = ['$injector'];
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
/**
2+
* middleware for the empty store that ng-redux uses when a external store is provided
3+
* Provides two cases:
4+
* 1. NGREDUX_PASSTHROUGH, where data is coming IN to the "fake" store
5+
* 2. all other, where actions are dispatched out, and proxied to the true store
6+
*/
7+
export default _providedStore => store => next => action => {
8+
return action.type === '@@NGREDUX_PASSTHROUGH'
9+
? next(action)
10+
: _providedStore.dispatch(action)
11+
}

‎src/components/storeWrapper.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
export default function wrapStore(providedStore, ngReduxStore) {
2+
providedStore.subscribe(() => {
3+
let newState = providedStore.getState();
4+
ngReduxStore.dispatch({
5+
type: '@@NGREDUX_PASSTHROUGH',
6+
payload: newState
7+
});
8+
});
9+
providedStore.dispatch({ type: '@@NGREDUX_PASSTHROUGH_INIT' })
10+
}

0 commit comments

Comments
 (0)
Please sign in to comment.