Bin
2025-12-16 9e0b2ba2c317b1a86212f24cbae3195ad1f3dbfa
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import { observe } from "mobx";
import { debounce } from "../../../utils/debounce";
 
export const createPropertyWatcher = (props) => {
  return class {
    constructor(root, element, callback) {
      this.root = root;
      this.element = element;
      this.callback = callback;
 
      this.handleUpdate();
    }
 
    handleUpdate() {
      this.disposers = this._watchProperties(this.element, props, []);
    }
 
    onUpdate = debounce(() => {
      this.callback();
    }, 10);
 
    destroy() {
      this.disposers.forEach((dispose) => dispose());
    }
 
    _watchProperties(element, propsList, disposers) {
      return propsList.reduce((res, property) => {
        if (typeof property !== "string") {
          Object.keys(property).forEach((propertyName) => {
            this._watchProperties(element[propertyName], property[propertyName], disposers);
          });
        } else {
          if (Array.isArray(element)) {
            element.forEach((el) => this._watchProperties(el, propsList, disposers));
          } else {
            res.push(observe(element, property, this.onUpdate, true));
          }
        }
 
        return res;
      }, disposers);
    }
  };
};