diff --git a/README.md b/README.md
index e837828..621fb8e 100644
--- a/README.md
+++ b/README.md
@@ -94,7 +94,17 @@ export default combineReducers({
})
```
-thats simpleset form of reducer and selectors
+## Selectors
+
+we recommend you follow example folder.
+
+- export default function from reducer.js file as your reducer
+- export named exports for selectors.
+- selectors you pass into provider has 2 cool features
+ - it automaticlly get store as first argument, so u dont have to pass store yourself everytime you use it
+ - avoid import hell !
+
+example folder contain simpleset form of reducer and selectors
## Actions
diff --git a/example/package.json b/example/package.json
index 7ea20f4..1a02b52 100644
--- a/example/package.json
+++ b/example/package.json
@@ -5,11 +5,12 @@
"license": "MIT",
"private": true,
"dependencies": {
+ "babel-polyfill": "^6.26.0",
"prop-types": "^15.6.2",
"react": "^16.4.1",
"react-dom": "^16.4.1",
- "react-scripts": "^1.1.4",
- "react-pubflux": "link:.."
+ "react-pubflux": "link:..",
+ "react-scripts": "^1.1.4"
},
"scripts": {
"start": "react-scripts start",
diff --git a/example/src/App.js b/example/src/App.js
index 8ef26f3..cbe2db2 100644
--- a/example/src/App.js
+++ b/example/src/App.js
@@ -1,10 +1,11 @@
import React, { Component } from 'react'
import { withFlux } from 'react-pubflux'
-import { LOGIN_START, LOGIN_END, ATTEMPT_LOGIN , CONFIG, CONFIG_RESET } from './sdk/events';
-
+import { LOGIN_START, LOGIN_END, ATTEMPT_LOGIN , LOGIN_RESET, CONFIG, CONFIG_RESET } from './sdk/events';
+import UserComponent from './UserComponent'
class App extends Component {
+ state = {loading: null};
componentDidMount(){
const { listen } = this.props;
@@ -19,7 +20,10 @@ class App extends Component {
}
setConfig = () => {
- this.props.emit(CONFIG, {value: Math.random()}, true) // 3rd param === true mean send this directly to reducer :)
+ // 3rd param === true mean send this directly to reducer :)
+ // i dont recommend this way because it will ignore all actions, yet it exsists for convience
+ // this will go --> rootReducer --> update store --> back
+ this.props.emit(CONFIG, {data:{randome: Math.random()}}, true)
}
clearConfig = () => {
@@ -28,20 +32,27 @@ class App extends Component {
login = () => {
this.props.emit(ATTEMPT_LOGIN, {
- username:'demo'+ parseInt( Math.random()*100 ),
+ username:'demo',
password:'demo'
});
}
+ resetAuth = () => this.props.emit(LOGIN_RESET)
+
render () {
+ const {loading} = this.state
+ const ids = Object.keys(this.props.appUsers);
return (
-
Hello world
+
{loading === true ? 'Loading...' : loading === null ? 'Hello' : 'Finished'}
+
-
+
{JSON.stringify(this.props,null, 2)}
)
diff --git a/example/src/UserComponent.js b/example/src/UserComponent.js
new file mode 100644
index 0000000..67726be
--- /dev/null
+++ b/example/src/UserComponent.js
@@ -0,0 +1,20 @@
+import React from 'react';
+import {withFlux} from 'react-pubflux';
+
+class UserComponent extends React.PureComponent{
+
+ render(){
+ const { data } = this.props;
+
+ return
+ : {data.username}
+
+ }
+}
+
+UserComponent.stateToProps = (store, select, props)=>({
+ // notice we dont need to pass store to getUserById.. its already bound
+ data: select.auth.getUserById(props.id)
+})
+
+export default withFlux(UserComponent)
diff --git a/example/src/index.js b/example/src/index.js
index 52866c0..30240f2 100644
--- a/example/src/index.js
+++ b/example/src/index.js
@@ -1,10 +1,10 @@
+import 'babel-polyfill'
import React from 'react'
import ReactDOM from 'react-dom'
import {
rootReducer,
selectors,
actions,
- Storage,
STORAGE_ADDR,
} from './sdk';
import { Provider } from 'react-pubflux';
@@ -13,6 +13,8 @@ import './index.css'
import App from './App'
const rootEl = document.getElementById('root');
+const persistState = state => localStorage.setItem(STORAGE_ADDR, JSON.stringify(state));
+const initialState = JSON.parse(localStorage.getItem(STORAGE_ADDR) || "{}")
ReactDOM.render({
// memic api call !
const user = {
- id: parseInt( Math.random()*100 ), // randome id
- username: data.username
+ id: parseInt( Math.random()*100 , 0), // randome id
+ username
}
const data = {
ok: true,
diff --git a/example/src/sdk/auth/const.js b/example/src/sdk/auth/const.js
index 698baca..0cc3eb8 100644
--- a/example/src/sdk/auth/const.js
+++ b/example/src/sdk/auth/const.js
@@ -1,3 +1,7 @@
// always name your leaf after folder name
export const leaf = 'auth';
-export const initalState = { }
+export const initialState = { }
+export const noobUser = {
+ id: '0',
+ username: 'N/A'
+}
diff --git a/example/src/sdk/auth/reducer.js b/example/src/sdk/auth/reducer.js
index f54b05b..77c6187 100644
--- a/example/src/sdk/auth/reducer.js
+++ b/example/src/sdk/auth/reducer.js
@@ -1,4 +1,4 @@
-import { leaf, initialState } from "./const";
+import { leaf, initialState, noobUser } from "./const";
import {LOGIN_SUCCESS, LOGIN_RESET} from '../events';
// path: store.auth
@@ -20,4 +20,5 @@ authReducer.initialState = initialState;
export default authReducer;
-export const getUsers = store => store[leaf] || initialState;
+export const getAuth = store => store[leaf] || initialState;
+export const getUserById = (store, id) => getAuth(store)[id] || noobUser;
diff --git a/example/src/sdk/config/actions.js b/example/src/sdk/config/actions.js
index 0137341..cd3b533 100644
--- a/example/src/sdk/config/actions.js
+++ b/example/src/sdk/config/actions.js
@@ -5,6 +5,7 @@ import {
// i'm a noob fn. i will just use this to pass along events to reducer
function noob(eventName, eventData){
+ console.log('noob runniung', eventName);
return {
type: eventName,
data: eventData
diff --git a/example/src/sdk/config/const.js b/example/src/sdk/config/const.js
index d000b03..e0444ec 100644
--- a/example/src/sdk/config/const.js
+++ b/example/src/sdk/config/const.js
@@ -1,5 +1,5 @@
export const leaf = 'config';
-export const initalState = {
- randome: Math.random()
+export const initialState = {
+ randome: 0
}
diff --git a/example/src/sdk/config/reducer.js b/example/src/sdk/config/reducer.js
index 45f1944..c022e9b 100644
--- a/example/src/sdk/config/reducer.js
+++ b/example/src/sdk/config/reducer.js
@@ -17,3 +17,5 @@ configReducer.initialState = initialState;
configReducer.eventName = [CONFIG, CONFIG_RESET];
export default configReducer;
+
+export const getConfig = store => store[leaf] || initialState;
diff --git a/example/src/sdk/index.js b/example/src/sdk/index.js
index 5d3353b..73b4f20 100644
--- a/example/src/sdk/index.js
+++ b/example/src/sdk/index.js
@@ -19,3 +19,5 @@ export const actions = [
...Config.actions,
...Auth.actions
];
+
+export const STORAGE_ADDR = '/APP/V1/'
diff --git a/example/yarn.lock b/example/yarn.lock
index dfc326b..652513f 100644
--- a/example/yarn.lock
+++ b/example/yarn.lock
@@ -346,6 +346,11 @@ async-each@^1.0.1:
resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf"
integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==
+async-limiter@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8"
+ integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==
+
async@^1.5.2:
version "1.5.2"
resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
@@ -1005,6 +1010,15 @@ babel-plugin-transform-strict-mode@^6.24.1:
babel-runtime "^6.22.0"
babel-types "^6.24.1"
+babel-polyfill@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153"
+ integrity sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=
+ dependencies:
+ babel-runtime "^6.26.0"
+ core-js "^2.5.0"
+ regenerator-runtime "^0.10.5"
+
babel-preset-env@1.6.1:
version "1.6.1"
resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.6.1.tgz#a18b564cc9b9afdf4aae57ae3c1b0d99188e6f48"
@@ -1158,6 +1172,11 @@ balanced-match@^1.0.0:
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
+base-64@0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/base-64/-/base-64-0.1.0.tgz#780a99c84e7d600260361511c4877613bf24f6bb"
+ integrity sha1-eAqZyE59YAJgNhURxId2E78k9rs=
+
base64-js@^1.0.2:
version "1.3.0"
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3"
@@ -1674,6 +1693,11 @@ cliui@^3.2.0:
strip-ansi "^3.0.1"
wrap-ansi "^2.0.0"
+clone@2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.1.tgz#d217d1e961118e3ac9a4b8bba3285553bf647cdb"
+ integrity sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=
+
clone@^1.0.2:
version "1.0.4"
resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
@@ -1778,6 +1802,11 @@ commondir@^1.0.1:
resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=
+component-emitter@1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
+ integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=
+
component-emitter@^1.2.1:
version "1.3.0"
resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0"
@@ -4533,6 +4562,11 @@ js-yaml@~3.7.0:
argparse "^1.0.7"
esprima "^2.6.0"
+jsan@^3.1.3:
+ version "3.1.13"
+ resolved "https://registry.yarnpkg.com/jsan/-/jsan-3.1.13.tgz#4de8c7bf8d1cfcd020c313d438f930cec4b91d86"
+ integrity sha512-9kGpCsGHifmw6oJet+y8HaCl14y7qgAsxVdV3pCHDySNR3BfDC30zgkssd7x5LRVAT22dnpbe9JdzzmXZnq9/g==
+
jsbn@~0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
@@ -4731,6 +4765,11 @@ levn@^0.3.0, levn@~0.3.0:
prelude-ls "~1.1.2"
type-check "~0.3.2"
+linked-list@0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/linked-list/-/linked-list-0.1.0.tgz#798b0ff97d1b92a4fd08480f55aea4e9d49d37bf"
+ integrity sha1-eYsP+X0bkqT9CEgPVa6k6dSdN78=
+
load-json-file@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
@@ -6252,7 +6291,7 @@ querystring-es3@^0.2.0:
resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=
-querystring@0.2.0:
+querystring@0.2.0, querystring@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=
@@ -6523,6 +6562,11 @@ regenerate@^1.2.1:
resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11"
integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==
+regenerator-runtime@^0.10.5:
+ version "0.10.5"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658"
+ integrity sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=
+
regenerator-runtime@^0.11.0:
version "0.11.1"
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
@@ -6602,6 +6646,16 @@ relateurl@0.2.x:
resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9"
integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=
+remotedev@^0.2.9:
+ version "0.2.9"
+ resolved "https://registry.yarnpkg.com/remotedev/-/remotedev-0.2.9.tgz#a5f148704bc6bf6e46e93640cabb7b4ed3f7fc12"
+ integrity sha512-W8dHOv9BcFnetFEd08yNb5O9Hd+zkTFFnf9FRjNCkb4u+JgQ/U152Aw4q83AmY3m34d6KZwhK5ip/Qc331+4vA==
+ dependencies:
+ jsan "^3.1.3"
+ querystring "^0.2.0"
+ rn-host-detect "^1.0.1"
+ socketcluster-client "^13.0.0"
+
remove-trailing-separator@^1.0.1:
version "1.1.0"
resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
@@ -6773,6 +6827,11 @@ ripemd160@^2.0.0, ripemd160@^2.0.1:
hash-base "^3.0.0"
inherits "^2.0.1"
+rn-host-detect@^1.0.1:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/rn-host-detect/-/rn-host-detect-1.1.5.tgz#fbecb982b73932f34529e97932b9a63e58d8deb6"
+ integrity sha512-ufk2dFT3QeP9HyZ/xTuMtW27KnFy815CYitJMqQm+pgG3ZAtHBsrU8nXizNKkqXGy3bQmhEoloVbrfbvMJMqkg==
+
run-async@^2.2.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0"
@@ -6827,6 +6886,23 @@ sax@^1.2.1, sax@^1.2.4, sax@~1.2.1:
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
+sc-channel@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/sc-channel/-/sc-channel-1.2.0.tgz#d9209f3a91e3fa694c66b011ce55c4ad8c3087d9"
+ integrity sha512-M3gdq8PlKg0zWJSisWqAsMmTVxYRTpVRqw4CWAdKBgAfVKumFcTjoCV0hYu7lgUXccCtCD8Wk9VkkE+IXCxmZA==
+ dependencies:
+ component-emitter "1.2.1"
+
+sc-errors@^1.4.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/sc-errors/-/sc-errors-1.4.1.tgz#53e80030fe647e133d73b51eaa7d2b0f7591fd5b"
+ integrity sha512-dBn92iIonpChTxYLgKkIT/PCApvmYT6EPIbRvbQKTgY6tbEbIy8XVUv4pGyKwEK4nCmvX4TKXcN0iXC6tNW6rQ==
+
+sc-formatter@^3.0.1:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/sc-formatter/-/sc-formatter-3.0.2.tgz#9abdb14e71873ce7157714d3002477bbdb33c4e6"
+ integrity sha512-9PbqYBpCq+OoEeRQ3QfFIGE6qwjjBcd2j7UjgDlhnZbtSnuGgHdcRklPKYGuYFH82V/dwd+AIpu8XvA1zqTd+A==
+
scheduler@^0.13.6:
version "0.13.6"
resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.13.6.tgz#466a4ec332467b31a91b9bf74e5347072e4cd889"
@@ -7035,6 +7111,22 @@ snapdragon@^0.8.1:
source-map-resolve "^0.5.0"
use "^3.1.0"
+socketcluster-client@^13.0.0:
+ version "13.0.1"
+ resolved "https://registry.yarnpkg.com/socketcluster-client/-/socketcluster-client-13.0.1.tgz#920e0a2437c228555e84f8ef0c9c5eb720e6067e"
+ integrity sha512-hxiE2xz6mgaBlhXbtBa4POgWVEvIcjCoHzf5LTUVhI9IL8V2ltV3Ze8pQsi9egqTjSz4RHPfyrJ7BiETe5Kthw==
+ dependencies:
+ base-64 "0.1.0"
+ clone "2.1.1"
+ component-emitter "1.2.1"
+ linked-list "0.1.0"
+ querystring "0.2.0"
+ sc-channel "^1.2.0"
+ sc-errors "^1.4.0"
+ sc-formatter "^3.0.1"
+ uuid "3.2.1"
+ ws "5.1.1"
+
sockjs-client@1.1.5:
version "1.1.5"
resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.1.5.tgz#1bb7c0f7222c40f42adf14f4442cbd1269771a83"
@@ -7795,6 +7887,11 @@ utils-merge@1.0.1:
resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=
+uuid@3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14"
+ integrity sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==
+
uuid@^3.0.1, uuid@^3.3.2:
version "3.3.2"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131"
@@ -8084,6 +8181,13 @@ write@^0.2.1:
dependencies:
mkdirp "^0.5.1"
+ws@5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-5.1.1.tgz#1d43704689711ac1942fd2f283e38f825c4b8b95"
+ integrity sha512-bOusvpCb09TOBLbpMKszd45WKC2KPtxiyiHanv+H2DE3Az+1db5a/L7sVJZVDPUC1Br8f0SKRr1KjLpD1U/IAw==
+ dependencies:
+ async-limiter "~1.0.0"
+
xdg-basedir@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4"
diff --git a/package.json b/package.json
index 1f99130..ea33c9c 100644
--- a/package.json
+++ b/package.json
@@ -58,5 +58,7 @@
"files": [
"dist"
],
- "dependencies": {}
+ "dependencies": {
+ "remotedev": "^0.2.9"
+ }
}
diff --git a/src/index.js b/src/index.js
index 47f37eb..29d9245 100644
--- a/src/index.js
+++ b/src/index.js
@@ -1,5 +1,4 @@
import * as React from 'react';
-import { connectViaExtension, extractState } from 'remotedev';
import t from 'prop-types';
import {
subscribe,
@@ -8,7 +7,31 @@ import {
isFunction,
INIT_ACTION } from './utils';
-const remotedev = connectViaExtension();
+function hasRemoteDev(){
+ return typeof window !== 'undefined' && !!window.__REDUX_DEVTOOLS_EXTENSION__;
+}
+
+function buildRemoteDev(){
+ if( !hasRemoteDev() )
+ return {
+ send: noob,
+ subscribe: noob,
+ init: noob,
+ }
+ return require('remotedev').connectViaExtension()
+}
+
+function extractStateFactory(){
+ if(hasRemoteDev())
+ return require('remotedev').extractState
+
+ return noob;
+}
+
+
+const remotedev = buildRemoteDev();
+const extractState = extractStateFactory();
+
const noob = () => null;
const Context = React.createContext({
listen: noob,
@@ -81,6 +104,7 @@ class ReactPubFlux extends React.Component {
if (newState && newState !== this.state) {
this.setState(newState, () => resolve(this.state));
} else {
+ console.log('state did not change')
return resolve(newState);
}
});
@@ -96,8 +120,6 @@ class ReactPubFlux extends React.Component {
actionCreators = actionCreators.concat(this.emitter[event]);
}
- remotedev.send({ type: `@@${event}`, ...data }, this.state);
-
const promises = actionCreators.map(
async fn => await fn(event, data, this.emit, this.getState),
);
@@ -194,4 +216,5 @@ export {
Connect,
ReactPubFlux as Provider,
};
+
export default ReactPubFlux;
diff --git a/src/utils.js b/src/utils.js
index e698642..608ce52 100644
--- a/src/utils.js
+++ b/src/utils.js
@@ -17,6 +17,15 @@ export function subscribe(name, fn, eventStore) {
export function combineReducers(reducers) {
const reducerKeys = Object.keys(reducers);
const emptyState = {};
+
+ const shouldProc = (eventName, type) =>{
+ if(!eventName)return true;
+ if(typeof eventName === 'string' && eventName === type) return true;
+ if(Array.isArray(eventName) && eventName.indexOf(type) > -1) return true;
+
+ return false;
+ }
+
return function combination(state = emptyState, action) {
let hasChanged = false;
const nextState = {};
@@ -32,12 +41,12 @@ export function combineReducers(reducers) {
reducerKeys.forEach((key) => {
const reducer = reducers[key];
const previousStateForKey = state[key];
- const { initalState } = reducer;
- let nextStateForKey = reducer(
- previousStateForKey,
- action,
- state || initalState,
- );
+ const { initalState, eventName } = reducer;
+ let nextStateForKey = shouldProc(eventName, action.type) ? reducer(
+ previousStateForKey,
+ action,
+ state || {},
+ ) : previousStateForKey || initalState;
if (typeof nextStateForKey === 'undefined') {
console.error(
diff --git a/yarn.lock b/yarn.lock
index 11e8024..1d9b927 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1211,7 +1211,7 @@ async-each@^1.0.1:
resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf"
integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==
-async-limiter@^1.0.0:
+async-limiter@^1.0.0, async-limiter@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8"
integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==
@@ -2236,6 +2236,11 @@ balanced-match@^1.0.0:
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
+base-64@0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/base-64/-/base-64-0.1.0.tgz#780a99c84e7d600260361511c4877613bf24f6bb"
+ integrity sha1-eAqZyE59YAJgNhURxId2E78k9rs=
+
base64-js@^1.0.2:
version "1.3.0"
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3"
@@ -2814,6 +2819,11 @@ clone-deep@^0.2.4:
lazy-cache "^1.0.3"
shallow-clone "^0.1.2"
+clone@2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.1.tgz#d217d1e961118e3ac9a4b8bba3285553bf647cdb"
+ integrity sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=
+
clone@^1.0.2:
version "1.0.4"
resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
@@ -2932,6 +2942,10 @@ commondir@^1.0.1:
resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=
+component-emitter@1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
+
component-emitter@^1.2.1:
version "1.3.0"
resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0"
@@ -6218,6 +6232,11 @@ js-yaml@~3.7.0:
argparse "^1.0.7"
esprima "^2.6.0"
+jsan@^3.1.3:
+ version "3.1.13"
+ resolved "https://registry.yarnpkg.com/jsan/-/jsan-3.1.13.tgz#4de8c7bf8d1cfcd020c313d438f930cec4b91d86"
+ integrity sha512-9kGpCsGHifmw6oJet+y8HaCl14y7qgAsxVdV3pCHDySNR3BfDC30zgkssd7x5LRVAT22dnpbe9JdzzmXZnq9/g==
+
jsbn@~0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
@@ -6489,6 +6508,11 @@ levn@^0.3.0, levn@~0.3.0:
prelude-ls "~1.1.2"
type-check "~0.3.2"
+linked-list@0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/linked-list/-/linked-list-0.1.0.tgz#798b0ff97d1b92a4fd08480f55aea4e9d49d37bf"
+ integrity sha1-eYsP+X0bkqT9CEgPVa6k6dSdN78=
+
load-json-file@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
@@ -8165,7 +8189,7 @@ querystring-es3@^0.2.0:
resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=
-querystring@0.2.0:
+querystring@0.2.0, querystring@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=
@@ -8559,6 +8583,16 @@ relateurl@0.2.x:
resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9"
integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=
+remotedev@^0.2.9:
+ version "0.2.9"
+ resolved "https://registry.yarnpkg.com/remotedev/-/remotedev-0.2.9.tgz#a5f148704bc6bf6e46e93640cabb7b4ed3f7fc12"
+ integrity sha512-W8dHOv9BcFnetFEd08yNb5O9Hd+zkTFFnf9FRjNCkb4u+JgQ/U152Aw4q83AmY3m34d6KZwhK5ip/Qc331+4vA==
+ dependencies:
+ jsan "^3.1.3"
+ querystring "^0.2.0"
+ rn-host-detect "^1.0.1"
+ socketcluster-client "^13.0.0"
+
remove-trailing-separator@^1.0.1:
version "1.1.0"
resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
@@ -8763,6 +8797,11 @@ ripemd160@^2.0.0, ripemd160@^2.0.1:
hash-base "^3.0.0"
inherits "^2.0.1"
+rn-host-detect@^1.0.1:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/rn-host-detect/-/rn-host-detect-1.1.5.tgz#fbecb982b73932f34529e97932b9a63e58d8deb6"
+ integrity sha512-ufk2dFT3QeP9HyZ/xTuMtW27KnFy815CYitJMqQm+pgG3ZAtHBsrU8nXizNKkqXGy3bQmhEoloVbrfbvMJMqkg==
+
rollup-plugin-babel@^3.0.7:
version "3.0.7"
resolved "https://registry.yarnpkg.com/rollup-plugin-babel/-/rollup-plugin-babel-3.0.7.tgz#5b13611f1ab8922497e9d15197ae5d8a23fe3b1e"
@@ -8914,6 +8953,23 @@ saxes@^3.1.9:
dependencies:
xmlchars "^1.3.1"
+sc-channel@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/sc-channel/-/sc-channel-1.2.0.tgz#d9209f3a91e3fa694c66b011ce55c4ad8c3087d9"
+ integrity sha512-M3gdq8PlKg0zWJSisWqAsMmTVxYRTpVRqw4CWAdKBgAfVKumFcTjoCV0hYu7lgUXccCtCD8Wk9VkkE+IXCxmZA==
+ dependencies:
+ component-emitter "1.2.1"
+
+sc-errors@^1.4.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/sc-errors/-/sc-errors-1.4.1.tgz#53e80030fe647e133d73b51eaa7d2b0f7591fd5b"
+ integrity sha512-dBn92iIonpChTxYLgKkIT/PCApvmYT6EPIbRvbQKTgY6tbEbIy8XVUv4pGyKwEK4nCmvX4TKXcN0iXC6tNW6rQ==
+
+sc-formatter@^3.0.1:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/sc-formatter/-/sc-formatter-3.0.2.tgz#9abdb14e71873ce7157714d3002477bbdb33c4e6"
+ integrity sha512-9PbqYBpCq+OoEeRQ3QfFIGE6qwjjBcd2j7UjgDlhnZbtSnuGgHdcRklPKYGuYFH82V/dwd+AIpu8XvA1zqTd+A==
+
scheduler@^0.13.6:
version "0.13.6"
resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.13.6.tgz#466a4ec332467b31a91b9bf74e5347072e4cd889"
@@ -9141,6 +9197,22 @@ snapdragon@^0.8.1:
source-map-resolve "^0.5.0"
use "^3.1.0"
+socketcluster-client@^13.0.0:
+ version "13.0.1"
+ resolved "https://registry.yarnpkg.com/socketcluster-client/-/socketcluster-client-13.0.1.tgz#920e0a2437c228555e84f8ef0c9c5eb720e6067e"
+ integrity sha512-hxiE2xz6mgaBlhXbtBa4POgWVEvIcjCoHzf5LTUVhI9IL8V2ltV3Ze8pQsi9egqTjSz4RHPfyrJ7BiETe5Kthw==
+ dependencies:
+ base-64 "0.1.0"
+ clone "2.1.1"
+ component-emitter "1.2.1"
+ linked-list "0.1.0"
+ querystring "0.2.0"
+ sc-channel "^1.2.0"
+ sc-errors "^1.4.0"
+ sc-formatter "^3.0.1"
+ uuid "3.2.1"
+ ws "5.1.1"
+
sockjs-client@1.1.5:
version "1.1.5"
resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.1.5.tgz#1bb7c0f7222c40f42adf14f4442cbd1269771a83"
@@ -10073,6 +10145,11 @@ utils-merge@1.0.1:
resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=
+uuid@3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14"
+ integrity sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==
+
uuid@^3.0.1, uuid@^3.3.2:
version "3.3.2"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131"
@@ -10400,6 +10477,13 @@ write@^0.2.1:
dependencies:
mkdirp "^0.5.1"
+ws@5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-5.1.1.tgz#1d43704689711ac1942fd2f283e38f825c4b8b95"
+ integrity sha512-bOusvpCb09TOBLbpMKszd45WKC2KPtxiyiHanv+H2DE3Az+1db5a/L7sVJZVDPUC1Br8f0SKRr1KjLpD1U/IAw==
+ dependencies:
+ async-limiter "~1.0.0"
+
ws@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/ws/-/ws-7.0.0.tgz#79351cbc3f784b3c20d0821baf4b4ff809ffbf51"