Skip to content

Instantly share code, notes, and snippets.

@ben196888
Last active June 26, 2017 00:07
Show Gist options
  • Save ben196888/cd9c1b2c80717df1b6d282cdd46a844c to your computer and use it in GitHub Desktop.
Save ben196888/cd9c1b2c80717df1b6d282cdd46a844c to your computer and use it in GitHub Desktop.
// Common part
// index.js
import { combineReducer } from 'redux';
import reducer from './reducer';
export default combineReducer({
deep: reducer,
});
// reducer.js
import { combineReducer } from 'redux';
const idsReducer = (state = EMPTY_LIST, action) => {
// store array of id
};
const byIdReducer = (state = EMPTY_MAP, action) => {
// store entities by id
};
export default combineReducer({
ids: idsReducer,
byId: byIdReducer,
});
// 1.1
// index.js
export const selector = (state, props) => innerSelector(state.deep, ...props);
// reducer.js
export const innerSelector = (state, id) => (
state.byId[id]
);
// 1.2
// index.js
export const selector = (state, props) => innerSelector(state.deep, props);
// reducer.js
export const innerSelector = (state, props) => (
state.byId[props.id]
);
// 2.1
// index.js
export const selector => innerSelector;
// reducer.js
const stateWrapper = (state) => (state.deep);
export const innerSeletor = (state, id) => (
stateWrapper(state).byId[id]
);
// 2.2
// index.js
export const selector => innerSelector;
// reducer.js
const stateWrapper = (state) => (state.deep);
export const innerSeletor = (state, props) => (
stateWrapper(state).byId[props.id]
);
// 3.1
// index.js
const selectorName = {
deep: innerSelector,
};
export const select = (name, state, props) => {
const selectorFunc = selectorName(name);
if (selectorFunc) {
return selectorFunc(state.deep, props);
}
return null;
};
// reducer.js
export const innerSelector = (state, props) => (
state.byId[props.id]
);
// 3.2
// index.js
const selectorName = {
innerSelector: innerSelector,
};
export const select = (name, state, ...props) => {
const selectorFunc = selectorName(name);
if (selectorFunc) {
return selectorFunc(state.deep, ...props);
}
return null;
};
// reducer.js
export const innerSelector = (state, id) => (
state.byId[id]
);
// 3.3
// index.js
const selectorName = {
deep: innerSelector,
};
export const select = (name, state, props) => {
const reducerName = name.split('__')[0];
const trimName = name.slice((reducerName + '__').length);
const deeperSelector = selectorName(reducerName);
if (deeperSelector) {
return deeperSelector(trimName, state[reducerName], props);
}
const selector = selectorName(trimName);
if (selector) {
return selector(state, props);
}
return null;
};
// reducer.js
export const innerSelector = (state, props) => (
state.byId[props.id]
);
// 4.
// index.js
const innerSelectors = [
selectorName: innerSelector, reducerName: 'deep'
];
export const selectors = innerSelectors.reduce((acc, { selectorName, reducerName }) => ({
...acc,
[selectorName]: (state, ...props) => selectorName(state[reducerName], ...props),
}), {});
// reducer.js
const innerSelector = (state, id) => (
state.byId[id]
);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment