index.js 1.7 KB

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