Skip to content

Commit 5bc1583

Browse files
committed
feat(lib): provide store functionality
1 parent 1093489 commit 5bc1583

File tree

2 files changed

+62
-29
lines changed

2 files changed

+62
-29
lines changed

src/components/ngRedux.js

+46-29
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 wrapStore from './storeWrapper';
56

67
import curry from 'lodash.curry';
78
import isFunction from 'lodash.isfunction';
@@ -20,6 +21,11 @@ export default function ngReduxProvider() {
2021
let _storeEnhancers = undefined;
2122
let _initialState = undefined;
2223
let _reducerIsObject = undefined;
24+
let _providedStore = undefined;
25+
26+
this.provideStore = (store) => {
27+
_providedStore = store;
28+
}
2329

2430
this.createStoreWith = (reducer, middlewares, storeEnhancers, initialState) => {
2531
invariant(
@@ -42,45 +48,56 @@ export default function ngReduxProvider() {
4248
};
4349

4450
this.$get = ($injector) => {
45-
const resolveMiddleware = middleware => isString(middleware)
46-
? $injector.get(middleware)
47-
: middleware;
51+
if (_providedStore) {
52+
const emptyStore = createNgReduxStore($injector, [], [], state => state, undefined);
4853

49-
const resolvedMiddleware = map(_middlewares, resolveMiddleware);
54+
return wrapStore(_providedStore, emptyStore);
55+
}
5056

51-
const resolveStoreEnhancer = storeEnhancer => isString(storeEnhancer)
52-
? $injector.get(storeEnhancer)
53-
: storeEnhancer;
57+
return createNgReduxStore($injector, _middlewares, _storeEnhancers, _reducer, _initialState);
5458

55-
const resolvedStoreEnhancer = map(_storeEnhancers, resolveStoreEnhancer);
59+
};
5660

57-
if(_reducerIsObject) {
58-
const getReducerKey = key => isString(_reducer[key])
59-
? $injector.get(_reducer[key])
60-
: _reducer[key];
61+
this.$get.$inject = ['$injector'];
62+
}
6163

62-
const resolveReducerKey = (result, key) => assign({}, result,
63-
{ [key]: getReducerKey(key) }
64-
);
64+
function createNgReduxStore($injector, _middlewares, _storeEnhancers, _reducer, _initialState) {
65+
const resolveMiddleware = middleware => isString(middleware)
66+
? $injector.get(middleware)
67+
: middleware;
6568

66-
const reducersObj = Object
67-
.keys(_reducer)
68-
.reduce(resolveReducerKey, {});
69+
const resolvedMiddleware = map(_middlewares, resolveMiddleware);
6970

70-
_reducer = combineReducers(reducersObj);
71-
}
71+
const resolveStoreEnhancer = storeEnhancer => isString(storeEnhancer)
72+
? $injector.get(storeEnhancer)
73+
: storeEnhancer;
7274

73-
const finalCreateStore = resolvedStoreEnhancer ? compose(...resolvedStoreEnhancer)(createStore) : createStore;
75+
const resolvedStoreEnhancer = map(_storeEnhancers, resolveStoreEnhancer);
7476

75-
//digestMiddleware needs to be the last one.
76-
resolvedMiddleware.push(digestMiddleware($injector.get('$rootScope')));
77+
if(_reducerIsObject) {
78+
const getReducerKey = key => isString(_reducer[key])
79+
? $injector.get(_reducer[key])
80+
: _reducer[key];
7781

78-
const store = _initialState
79-
? applyMiddleware(...resolvedMiddleware)(finalCreateStore)(_reducer, _initialState)
80-
: applyMiddleware(...resolvedMiddleware)(finalCreateStore)(_reducer);
82+
const resolveReducerKey = (result, key) => assign({}, result,
83+
{ [key]: getReducerKey(key) }
84+
);
8185

82-
return assign({}, store, { connect: Connector(store) });
83-
};
86+
const reducersObj = Object
87+
.keys(_reducer)
88+
.reduce(resolveReducerKey, {});
8489

85-
this.$get.$inject = ['$injector'];
90+
_reducer = combineReducers(reducersObj);
91+
}
92+
93+
const finalCreateStore = resolvedStoreEnhancer ? compose(...resolvedStoreEnhancer)(createStore) : createStore;
94+
95+
//digestMiddleware needs to be the last one.
96+
resolvedMiddleware.push(digestMiddleware($injector.get('$rootScope')));
97+
98+
const store = _initialState
99+
? applyMiddleware(...resolvedMiddleware)(finalCreateStore)(_reducer, _initialState)
100+
: applyMiddleware(...resolvedMiddleware)(finalCreateStore)(_reducer);
101+
102+
return assign({}, store, { connect: Connector(store) });
86103
}

src/components/storeWrapper.js

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
export default function wrapStore(providedStore, ngReduxStore) {
2+
const unsubscribe = providedStore
3+
.subscribe(() => {
4+
let newState = providedStore.getState();
5+
6+
ngReduxStore.dispatch(newState);
7+
})
8+
;
9+
10+
return Object.assign({},
11+
providedStore,
12+
{
13+
subscribe: ngReduxStore.subscribe
14+
})
15+
;
16+
}

0 commit comments

Comments
 (0)