index.js 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. "use strict";
  2. import EventEmitter from 'event-emitter';
  3. import {createStore, applyMiddleware} from 'redux';
  4. import {composeReducers} from 'redux-sac';
  5. import {effectsMiddleware} from 'redux-effex';
  6. import {persistStore} from 'redux-persist';
  7. export default () => {
  8. const ee = new EventEmitter();
  9. function on (event, handler) {
  10. ee.on(event, handler);
  11. return this;
  12. }
  13. let persistOptions = {};
  14. function withPersistence (_persistOptions) {
  15. persistOptions = _persistOptions;
  16. return this;
  17. }
  18. let reducers = [], effects = [], middlewares = [];
  19. function withReducers (..._reducers) {
  20. reducers.push(..._reducers);
  21. return this;
  22. }
  23. function withEffects (..._effects) {
  24. effects.push(..._effects);
  25. return this;
  26. }
  27. function withMiddlewares (..._middlewares) {
  28. middlewares.push(..._middlewares);
  29. return this;
  30. }
  31. function create (reset = false) {
  32. const store = createStore(
  33. composeReducers(...reducers),
  34. applyMiddleware(...middlewares, effectsMiddleware(effects))
  35. );
  36. const persistor = persistStore(store, persistOptions, () => ee.emit('rehydrate', store));
  37. if (reset) persistor.purge();
  38. return store;
  39. }
  40. return {withReducers, withMiddlewares, withEffects, withPersistence, on, create};
  41. }