mirror of
https://github.com/vale981/Vulcan
synced 2025-03-08 19:11:38 -05:00
79 lines
2.4 KiB
JavaScript
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;
|