52ded0bdc17003502ce3f2504ac62d640f751cfc5b7a46062dfcc237bbd3abe33dcd69a71ff0d81f5d272ba9f48d3127cb562730d4ed5e853d110d6a0cfdf4 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import {arrayEach} from './../helpers/array';
  2. import {defineGetter} from './../helpers/object';
  3. const MIXIN_NAME = 'stateSaver';
  4. const STATE_PREFIX = 'state_';
  5. const PROP_PREFIX = '_states';
  6. const getState = function(object, stateId) {
  7. return object[PROP_PREFIX][STATE_PREFIX + stateId];
  8. };
  9. const setState = function(object, stateId, value) {
  10. object[PROP_PREFIX][STATE_PREFIX + stateId] = value;
  11. };
  12. /**
  13. * Mixin object to extend functionality for save/restore object state.
  14. *
  15. * @type {Object}
  16. */
  17. const stateSaver = {
  18. /**
  19. * Internal states storage.
  20. */
  21. [PROP_PREFIX]: {},
  22. /**
  23. * Get cached state.
  24. *
  25. * @param {String|Number} stateId State identification.
  26. * @returns {*}
  27. */
  28. getCachedState(stateId) {
  29. return getState(this, stateId);
  30. },
  31. /**
  32. * Set state directly.
  33. *
  34. * @param {String|Number} stateId State identification.
  35. * @param {*} value
  36. */
  37. setCachedState(stateId, value) {
  38. setState(this, stateId, value);
  39. },
  40. /**
  41. * Save state object at given id.
  42. *
  43. * @param {String|Number} stateId State identification.
  44. */
  45. saveState(stateId) {
  46. setState(this, stateId, this.getState());
  47. },
  48. /**
  49. * Restore state object from given id.
  50. *
  51. * @param {String|Number} stateId State identification.
  52. */
  53. restoreState(stateId) {
  54. this.setState(getState(this, stateId));
  55. },
  56. /**
  57. * Returns `true` if state exists at given state id.
  58. *
  59. * @param {String|Number} stateId State identification.
  60. * @returns Boolean
  61. */
  62. hasSavedState(stateId) {
  63. return getState(this, stateId) !== void 0;
  64. },
  65. /**
  66. * Clear saved state.
  67. *
  68. * @param {String|Number} stateId State identification.
  69. */
  70. clearState(stateId) {
  71. setState(this, stateId);
  72. },
  73. /**
  74. * Clear all previously saved states of this object.
  75. */
  76. clearStates() {
  77. this[PROP_PREFIX] = {};
  78. }
  79. };
  80. defineGetter(stateSaver, 'MIXIN_NAME', MIXIN_NAME, {
  81. writable: false,
  82. enumerable: false,
  83. });
  84. export default stateSaver;