Vulcan/packages/vulcan-lib/lib/modules/redux.js

79 lines
2.4 KiB
JavaScript

import { createStore, applyMiddleware, compose, combineReducers } from 'redux';
// create store, and implement reload function
export const configureStore = (reducers, initialState = {}, middlewares) => {
let getReducers;
if (typeof reducers === 'function') {
getReducers = reducers;
reducers = getReducers();
}
reducers = typeof reducers === 'object' ? combineReducers(reducers) : reducers;
middlewares = Array.isArray(middlewares) ? middlewares : [middlewares];
const store = createStore(
// reducers
reducers,
// initial state
initialState,
// middlewares
compose(
applyMiddleware(...middlewares),
typeof window !== 'undefined' && window.devToolsExtension ? window.devToolsExtension() : f => f,
),
);
store.reload = function reload(options = {}) {
if (typeof options.reducers === 'function') {
getReducers = options.reducers;
options.reducers = undefined;
}
if (!options.reducers && getReducers) {
options.reducers = getReducers();
}
if (options.reducers) {
reducers = typeof options.reducers === 'object' ? combineReducers(options.reducers) : options.reducers;
}
this.replaceReducer(reducers);
return store;
};
return store;
};
// action
// **Notes: client side, addAction to browser**
// **Notes: server side, addAction to server share with every req**
let actions = {};
export const addAction = (addedAction) => {
actions = { ...actions, ...addedAction };
return actions;
};
export const getActions = () => actions;
// reducers
// **Notes: client side, addReducer to browser**
// **Notes: server side, addReducer to server share with every req**
let reducers = {};
export const addReducer = (addedReducer) => {
reducers = { ...reducers, ...addedReducer };
return reducers;
};
export const getReducers = () => reducers;
// middlewares
// **Notes: client side, addMiddleware to browser**
// **Notes: server side, addMiddleware to server share with every req**
let middlewares = [];
export const addMiddleware = (middlewareOrMiddlewareArray, options = {}) => {
const addedMiddleware = Array.isArray(middlewareOrMiddlewareArray) ? middlewareOrMiddlewareArray : [middlewareOrMiddlewareArray];
if (options.unshift) {
middlewares = [...addedMiddleware, ...middlewares];
} else {
middlewares = [...middlewares, ...addedMiddleware];
}
return middlewares;
};
export const getMiddlewares = () => middlewares;