7c412cd8110c58e56ee08c52da71267bc4a17fae68e5f6d37748a824583e75c9b52a3966687779adbb727c931cbac4cda490160f3e1bd33e431d07cde6d333 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. import jsonpatch from './../../../lib/jsonpatch/json-patch-duplex';
  2. import localHooks from '../../mixins/localHooks';
  3. import {mixin} from '../../helpers/object';
  4. import {cleanPatches} from './utils';
  5. /**
  6. * @class DataObserver
  7. * @plugin ObserveChanges
  8. */
  9. class DataObserver {
  10. constructor(observedData) {
  11. /**
  12. * Observed source data.
  13. *
  14. * @type {Array}
  15. */
  16. this.observedData = null;
  17. /**
  18. * JsonPatch observer.
  19. *
  20. * @type {Object}
  21. */
  22. this.observer = null;
  23. /**
  24. * Flag which determines if observer is paused or not. Paused observer doesn't emit `change` hooks.
  25. *
  26. * @type {Boolean}
  27. * @default false
  28. */
  29. this.paused = false;
  30. this.setObservedData(observedData);
  31. }
  32. /**
  33. * Set data to observe.
  34. *
  35. * @param {*} observedData
  36. */
  37. setObservedData(observedData) {
  38. if (this.observer) {
  39. jsonpatch.unobserve(this.observedData, this.observer);
  40. }
  41. this.observedData = observedData;
  42. this.observer = jsonpatch.observe(this.observedData, (patches) => this.onChange(patches));
  43. }
  44. /**
  45. * Check if observer was paused.
  46. *
  47. * @returns {Boolean}
  48. */
  49. isPaused() {
  50. return this.paused;
  51. }
  52. /**
  53. * Pause observer (stop emitting all detected changes).
  54. */
  55. pause() {
  56. this.paused = true;
  57. }
  58. /**
  59. * Resume observer (emit all detected changes).
  60. */
  61. resume() {
  62. this.paused = false;
  63. }
  64. /**
  65. * JsonPatch on change listener.
  66. *
  67. * @private
  68. * @param {Array} patches An array of object passed from jsonpatch.
  69. */
  70. onChange(patches) {
  71. this.runLocalHooks('change', cleanPatches(patches));
  72. }
  73. /**
  74. * Destroy observer instance.
  75. */
  76. destroy() {
  77. jsonpatch.unobserve(this.observedData, this.observer);
  78. this.observedData = null;
  79. this.observer = null;
  80. }
  81. }
  82. mixin(DataObserver, localHooks);
  83. export default DataObserver;