Skip to content

Commit e226333

Browse files
authored
Merge pull request #16 from madmax983/multiple-stores
Multiple stores
2 parents 893ffb9 + fee6120 commit e226333

File tree

16 files changed

+860
-43
lines changed

16 files changed

+860
-43
lines changed

README.md

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,16 @@
1+
[![Deploy](https://deploy-to-sfdx.com/dist/assets/images/DeployToSFDX.svg)](https://deploy-to-sfdx.com)
2+
<a href="https://githubsfdeploy.herokuapp.com">
3+
<img alt="Deploy to Salesforce"
4+
src="https://raw.githubusercontent.com/afawcett/githubsfdeploy/master/deploy.png">
5+
</a>
6+
17
# Lightning-Redux [![Build Status](https://travis-ci.org/madmax983/lightning-redux.svg?branch=master)](https://travis-ci.org/madmax983/lightning-redux)
28

39
[Redux](http://redux.js.org/) bindings for the [Lightning Component Framework](https://developer.salesforce.com/docs/atlas.en-us.lightning.meta/lightning/intro_framework.htm)
410

511
## Usage
612
The new version of Lightning-Redux simplifies the previous iteration down to a single Redux component. It serves as a wrapper around Redux itself, along with a few helper methods specific to Lightning.
13+
It has one attribute to specify, which is the name of the store you would like to create. This name defaults to "redux" if no name is specified.
714

815
### Component Methods
916
####
@@ -30,11 +37,9 @@ middleware: You can include redux middleware like redux-thunk here. Lightning-Re
3037
**getState():** Retrieves the store state.
3138

3239
## Installation
33-
Lightning-Redux Unmanaged Packaged (Redux Component, redux, redux-thunk, and reselect static resource): https://login.salesforce.com/packaging/installPackage.apexp?p0=04t50000000M7R0
34-
35-
Lightning-Redux-Examples (Counter and Todo Examples unmanaged package): https://login.salesforce.com/packaging/installPackage.apexp?p0=04t50000000M7RA
40+
Use the deployment buttons above to deploy to either a scratch org, or a developer org.
3641

37-
Otherwise, you can use the SFDX CLI to convert the source and do a metadata deploy.
42+
Otherwise, you can use the SFDX CLI and do a metadata deploy.
3843

3944
## Resources
4045
Redux Documentation: http://redux.js.org/

force-app/main/default/aura/Redux/Redux.cmp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
<aura:component description="Redux">
22
<ltng:require scripts="{!$Resource.redux}"/>
3+
<aura:attribute name="name" type="string" default="redux" />
34
<aura:method name="createStore" action="{!c.createStore}">
45
<aura:attribute name="name" type="string" />
56
<aura:attribute name="rootReducer" type="Map" />

force-app/main/default/aura/Redux/ReduxController.js

Lines changed: 55 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
({
22
createStore: function(component, event) {
3+
var reduxName = component.get("v.name");
34
var params = event.getParam("arguments");
45

56
if(params && Redux) {
@@ -13,85 +14,98 @@
1314
var reducerObject = {};
1415
reducerObject[reducerName] = rootReducer;
1516

16-
if(window.reducerQueue) {
17-
combinedReducer = Redux.combineReducers(Object.assign({}, reducerObject, window.reducerQueue));
18-
window.reducerRegistry = Object.assign({}, window.reducerRegistry, reducerObject, window.reducerQueue);
17+
if(window.reducerQueue && window.reducerQueue[reduxName]) {
18+
combinedReducer = Redux.combineReducers(Object.assign({}, reducerObject, window.reducerQueue[reduxName]));
19+
window.reducerRegistry[reduxName] = Object.assign({}, window.reducerRegistry[reduxName], reducerObject, window.reducerQueue[reduxName]);
20+
} else if(window.reducerRegistry && window.reducerRegistry[reduxName]) {
21+
combinedReducer = Redux.combineReducers(reducerObject);
22+
window.reducerRegistry[reduxName] = Object.assign({}, window.reducerRegistry[reduxName], reducerObject);
1923
} else {
2024
combinedReducer = Redux.combineReducers(reducerObject);
21-
window.reducerRegistry = Object.assign({}, window.reducerRegistry, reducerObject);
25+
window.reducerRegistry = Object.assign({}, window.reducerRegistry, {
26+
[reduxName]: Object.assign({}, window.reducerRegistry ? window.reducerRegistry[reduxName] : {}, reducerObject)
27+
});
2228
}
2329

2430

25-
if(!window.reduxStore) {
31+
window.reduxStore = window.reduxStore || {};
32+
33+
if(!window.reduxStore[reduxName]) {
2634
if (rootReducer && initialState && middleware) {
27-
window.reduxStore = Redux.createStore(combinedReducer, initialState, Redux.compose(Redux.applyMiddleware(middleware)));
35+
window.reduxStore[reduxName] = Redux.createStore(combinedReducer, initialState, Redux.compose(Redux.applyMiddleware(middleware)));
2836
} else if (rootReducer && initialState && !middleware) {
29-
window.reduxStore = Redux.createStore(combinedReducer, initialState);
37+
window.reduxStore[reduxName] = Redux.createStore(combinedReducer, initialState);
3038
} else if (rootReducer && !initialState && !middleware) {
31-
window.reduxStore = Redux.createStore(combinedReducer);
39+
window.reduxStore[reduxName] = Redux.createStore(combinedReducer);
3240
}
3341
} else {
3442
component.registerReducer(reducerName, rootReducer)
3543
}
3644

37-
if(window.subscriberQueue) {
38-
window.subscriberQueue.map(function(subscriber) {
45+
if(window.subscriberQueue && window.subscriberQueue[reduxName]) {
46+
window.subscriberQueue[reduxName].map(function(subscriber) {
3947
component.connect(subscriber.mapStateToAttributes, subscriber.target);
4048
});
4149
}
4250

43-
if(window.dispatchQueue) {
44-
window.dispatchQueue.map(function(action) {
51+
if(window.dispatchQueue && window.dispatchQueue[reduxName]) {
52+
window.dispatchQueue[reduxName].map(function(action) {
4553
component.dispatch(action);
4654
});
4755
}
4856
}
4957
},
5058

51-
getState: function() {
52-
if(window.reduxStore) {
53-
return window.reduxStore.getState();
59+
getState: function(component) {
60+
var reduxName = component.get("v.name");
61+
if(window.reduxStore && window.reduxStore[reduxName]) {
62+
return window.reduxStore[reduxName].getState();
5463
} else {
5564
return null;
5665
}
5766
},
5867

5968
dispatch: function(component, event) {
69+
var reduxName = component.get("v.name");
6070
var params = event.getParam("arguments");
6171

6272
var action = params ? params.action : null;
6373
if(action) {
64-
if(window.reduxStore) {
65-
window.reduxStore.dispatch(action);
74+
if(window.reduxStore && window.reduxStore[reduxName]) {
75+
window.reduxStore[reduxName].dispatch(action);
6676
} else {
67-
if(window.dispatchQueue) {
68-
window.dispatchQueue.push(action);
77+
if(window.dispatchQueue && window.dispatchQueue[reduxName]) {
78+
window.dispatchQueue[reduxName].push(action);
6979
} else {
70-
window.dispatchQueue = [action];
80+
window.dispatchQueue = {};
81+
window.dispatchQueue[reduxName] = [action];
7182
}
7283
}
7384
}
7485
},
7586

7687
subscribe: function(component, event) {
88+
var reduxName = component.get("v.name");
7789
var params = event.getParam("arguments");
7890
var listener = params ? params.listener : null;
7991

80-
if(listener && window.reduxStore) {
81-
window.reduxStore.subscribe(listener);
92+
if(listener && window.reduxStore && window.reduxStore[reduxName]) {
93+
window.reduxStore[reduxName].subscribe(listener);
8294
}
8395
},
8496

8597
replaceReducer: function(component, event) {
98+
var reduxName = component.get("v.name");
8699
var params = event.getParam("arguments");
87100
var nextReducer = params ? params.nextReducer : null;
88101

89-
if(nextReducer && window.reduxStore) {
90-
window.reduxStore.replaceReducer(nextReducer);
102+
if(nextReducer && window.reduxStore && window.reduxStore[reduxName]) {
103+
window.reduxStore[reduxName].replaceReducer(nextReducer);
91104
}
92105
},
93106

94107
registerReducer: function(component, event) {
108+
var reduxName = component.get("v.name");
95109
var params = event.getParam("arguments");
96110
var name = params ? params.name : null;
97111
var reducer = params ? params.reducer : null;
@@ -100,21 +114,23 @@
100114
var reducerObject = {};
101115
reducerObject[name] = reducer;
102116

103-
if(window.reduxStore) {
104-
var newRootReducer = Redux.combineReducers(Object.assign({}, window.reducerRegistry, reducerObject));
105-
window.reducerRegistry = Object.assign({}, window.reducerRegistry, reducerObject);
106-
window.reduxStore.replaceReducer(newRootReducer);
117+
if(window.reduxStore && window.reduxStore[reduxName]) {
118+
var newRootReducer = Redux.combineReducers(Object.assign({}, window.reducerRegistry[reduxName], reducerObject));
119+
window.reducerRegistry[reduxName] = Object.assign({}, window.reducerRegistry[reduxName], reducerObject);
120+
window.reduxStore[reduxName].replaceReducer(newRootReducer);
107121
} else {
108-
if(window.reducerQueue){
109-
window.reducerQueue = Object.assign({}, window.reducerQueue, reducerObject);
122+
if(window.reducerQueue && window.reducerQueue[reduxName]){
123+
window.reducerQueue[reduxName] = Object.assign({}, window.reducerQueue[reduxName], reducerObject);
110124
} else {
111-
window.reducerQueue = reducerObject;
125+
window.reducerQueue = {};
126+
window.reducerQueue[reduxName] = reducerObject;
112127
}
113128
}
114129
}
115130
},
116131

117132
connect: function(component, event) {
133+
var reduxName = component.get("v.name");
118134
var params = event.getParam("arguments");
119135
var mapStateToAttributes = params ? params.mapStateToAttributes : null;
120136
var target = params && params.target ? params.target : event.getSource();
@@ -123,10 +139,10 @@
123139
mapStateToAttributes = mapStateToAttributes();
124140
}
125141

126-
if(window.reduxStore) {
142+
if(window.reduxStore && window.reduxStore[reduxName]) {
127143
function handleChanges(){
128144
if(target.isValid()) {
129-
var state = window.reduxStore.getState();
145+
var state = window.reduxStore[reduxName].getState();
130146

131147
for(var key in mapStateToAttributes) {
132148
if(mapStateToAttributes.hasOwnProperty(key)) {
@@ -147,16 +163,17 @@
147163

148164
handleChanges();
149165

150-
window.reduxStore.subscribe(handleChanges);
151-
target.dispatch = window.reduxStore.dispatch;
166+
window.reduxStore[reduxName].subscribe(handleChanges);
167+
target.dispatch = window.reduxStore[reduxName].dispatch;
152168
} else {
153-
if(window.subscriberQueue) {
154-
window.subscriberQueue.push({
169+
if(window.subscriberQueue && window.subscriberQueue[reduxName]) {
170+
window.subscriberQueue[reduxName].push({
155171
target: target,
156172
mapStateToAttributes: mapStateToAttributes
157173
});
158174
} else {
159-
window.subscriberQueue = [{
175+
window.subscriberQueue = {};
176+
window.subscriberQueue[reduxName] = [{
160177
target: target,
161178
mapStateToAttributes: mapStateToAttributes
162179
}];
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
<aura:component description="TestReduxContainer">
2+
<aura:attribute name="name" type="string" default="redux"/>
23
<aura:attribute name="message" type="string" />
3-
<c:Redux aura:id="store"/>
4+
<c:Redux aura:id="store" name="{!v.name}"/>
45
</aura:component>

0 commit comments

Comments
 (0)