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);
|
}
|
};
|
};
|