index.js 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  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 = [];
  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 create (reset = false) {
  30. const store = createStore(
  31. composeReducers(...reducers),
  32. compose(
  33. autoRehydrate(),
  34. applyMiddleware(createActionBuffer(REHYDRATE), effectsMiddleware(effects))
  35. )
  36. );
  37. const persistor = persistStore(store, persistOptions, err => {
  38. if (err) ee.emit('error', err);
  39. else ee.emit('rehydrate', store);
  40. });
  41. if (reset) persistor.purge();
  42. return store;
  43. }
  44. return {withReducers, withEffects, withPersistence, on, create};
  45. }