Skip to content

Commit 745f3c7

Browse files
feat(lib): fixes bugs with proposed provided-store logic
1 parent 5bc1583 commit 745f3c7

File tree

3 files changed

+48
-49
lines changed

3 files changed

+48
-49
lines changed

Diff for: src/components/ngRedux.js

+33-40
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ 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';
56
import wrapStore from './storeWrapper';
67

78
import curry from 'lodash.curry';
@@ -25,6 +26,8 @@ export default function ngReduxProvider() {
2526

2627
this.provideStore = (store) => {
2728
_providedStore = store;
29+
_reducer = (state, action) => action.payload;
30+
_middlewares = [providedStoreMiddleware(_providedStore)];
2831
}
2932

3033
this.createStoreWith = (reducer, middlewares, storeEnhancers, initialState) => {
@@ -48,56 +51,46 @@ export default function ngReduxProvider() {
4851
};
4952

5053
this.$get = ($injector) => {
51-
if (_providedStore) {
52-
const emptyStore = createNgReduxStore($injector, [], [], state => state, undefined);
54+
const resolveMiddleware = middleware => isString(middleware)
55+
? $injector.get(middleware)
56+
: middleware;
5357

54-
return wrapStore(_providedStore, emptyStore);
55-
}
56-
57-
return createNgReduxStore($injector, _middlewares, _storeEnhancers, _reducer, _initialState);
58-
59-
};
60-
61-
this.$get.$inject = ['$injector'];
62-
}
58+
const resolvedMiddleware = map(_middlewares, resolveMiddleware);
6359

64-
function createNgReduxStore($injector, _middlewares, _storeEnhancers, _reducer, _initialState) {
65-
const resolveMiddleware = middleware => isString(middleware)
66-
? $injector.get(middleware)
67-
: middleware;
60+
const resolveStoreEnhancer = storeEnhancer => isString(storeEnhancer)
61+
? $injector.get(storeEnhancer)
62+
: storeEnhancer;
6863

69-
const resolvedMiddleware = map(_middlewares, resolveMiddleware);
64+
const resolvedStoreEnhancer = map(_storeEnhancers, resolveStoreEnhancer);
7065

71-
const resolveStoreEnhancer = storeEnhancer => isString(storeEnhancer)
72-
? $injector.get(storeEnhancer)
73-
: storeEnhancer;
66+
if(_reducerIsObject) {
67+
const getReducerKey = key => isString(_reducer[key])
68+
? $injector.get(_reducer[key])
69+
: _reducer[key];
7470

75-
const resolvedStoreEnhancer = map(_storeEnhancers, resolveStoreEnhancer);
71+
const resolveReducerKey = (result, key) => assign({}, result,
72+
{ [key]: getReducerKey(key) }
73+
);
7674

77-
if(_reducerIsObject) {
78-
const getReducerKey = key => isString(_reducer[key])
79-
? $injector.get(_reducer[key])
80-
: _reducer[key];
75+
const reducersObj = Object
76+
.keys(_reducer)
77+
.reduce(resolveReducerKey, {});
8178

82-
const resolveReducerKey = (result, key) => assign({}, result,
83-
{ [key]: getReducerKey(key) }
84-
);
85-
86-
const reducersObj = Object
87-
.keys(_reducer)
88-
.reduce(resolveReducerKey, {});
79+
_reducer = combineReducers(reducersObj);
80+
}
8981

90-
_reducer = combineReducers(reducersObj);
91-
}
82+
const finalCreateStore = resolvedStoreEnhancer ? compose(...resolvedStoreEnhancer)(createStore) : createStore;
9283

93-
const finalCreateStore = resolvedStoreEnhancer ? compose(...resolvedStoreEnhancer)(createStore) : createStore;
84+
//digestMiddleware needs to be the last one.
85+
resolvedMiddleware.push(digestMiddleware($injector.get('$rootScope')));
9486

95-
//digestMiddleware needs to be the last one.
96-
resolvedMiddleware.push(digestMiddleware($injector.get('$rootScope')));
87+
const store = applyMiddleware(...resolvedMiddleware)(finalCreateStore)(_reducer, _initialState || undefined)
88+
const mergedStore = assign({}, store, { connect: Connector(store) });
89+
90+
if (_providedStore) wrapStore(_providedStore, mergedStore)
9791

98-
const store = _initialState
99-
? applyMiddleware(...resolvedMiddleware)(finalCreateStore)(_reducer, _initialState)
100-
: applyMiddleware(...resolvedMiddleware)(finalCreateStore)(_reducer);
92+
return mergedStore;
93+
};
10194

102-
return assign({}, store, { connect: Connector(store) });
95+
this.$get.$inject = ['$injector'];
10396
}

Diff for: src/components/providedStoreMiddleware.js

+11
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+
}

Diff for: src/components/storeWrapper.js

+4-9
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,10 @@ export default function wrapStore(providedStore, ngReduxStore) {
22
const unsubscribe = providedStore
33
.subscribe(() => {
44
let newState = providedStore.getState();
5-
6-
ngReduxStore.dispatch(newState);
7-
})
8-
;
9-
10-
return Object.assign({},
11-
providedStore,
12-
{
13-
subscribe: ngReduxStore.subscribe
5+
ngReduxStore.dispatch({
6+
type: '@@NGREDUX_PASSTHROUGH',
7+
payload: newState
8+
});
149
})
1510
;
1611
}

0 commit comments

Comments
 (0)