component-utils/state-controller.js

  1. import StateStore from './state-store';
  2. /**
  3. * A StateController manages state for an application or component
  4. * Subclasses extend this and expose methods that call the controller's _update method
  5. * Controller will default create its own state store unless one is passed.
  6. * StateController subclasses should only accept the dependencies they need via constructor
  7. * This means the dependencies can easily be mocked and unit tested
  8. */
  9. class StateController {
  10. // Create's a default store if one isn't given
  11. constructor({store = null} = {}) {
  12. this._store = store || new StateStore();
  13. this._update(this.defaultState);
  14. }
  15. get defaultState() {
  16. return {};
  17. }
  18. get state() {
  19. return this._store.state;
  20. }
  21. // Discourage external users from using state directly
  22. _update(props) {
  23. this._store.update(props);
  24. }
  25. subscribeUpdates(listener) {
  26. return this._store.subscribeUpdates(listener);
  27. }
  28. unsubscribeUpdates(listener) {
  29. return this._store.unsubscribeUpdates(listener);
  30. }
  31. }
  32. export default StateController;