This repository has been archived on 2023-03-18. You can view files and clone it, but cannot push or open issues or pull requests.
osr-discourse-src/app/assets/javascripts/discourse/widgets/glue.js.es6
Joffrey JAFFEUX f9648de897
DEV: upgrades from Ember 2.13 to Ember 3.5.1 (#6808)
Co-Authored-By: Bianca Nenciu <nbianca@users.noreply.github.com>
Co-Authored-By: David Taylor <david@taylorhq.com>
2019-01-10 11:06:01 +01:00

57 lines
1.4 KiB
JavaScript

import { diff, patch } from "virtual-dom";
import { queryRegistry } from "discourse/widgets/widget";
import DirtyKeys from "discourse/lib/dirty-keys";
export default class WidgetGlue {
constructor(name, register, attrs) {
this._tree = null;
this._rootNode = null;
this.register = register;
this.attrs = attrs;
this._timeout = null;
this.dirtyKeys = new DirtyKeys(name);
this._widgetClass =
queryRegistry(name) || this.register.lookupFactory(`widget:${name}`);
if (!this._widgetClass) {
// eslint-disable-next-line no-console
console.error(`Error: Could not find widget: ${name}`);
}
}
appendTo(elem) {
this._rootNode = elem;
this.queueRerender();
}
queueRerender() {
this._timeout = Ember.run.scheduleOnce("render", this, this.rerenderWidget);
}
rerenderWidget() {
Ember.run.cancel(this._timeout);
// in test mode return early if store cannot be found
if (Ember.testing) {
try {
this.register.lookup("service:store");
} catch (e) {
return;
}
}
const newTree = new this._widgetClass(this.attrs, this.register, {
dirtyKeys: this.dirtyKeys
});
const patches = diff(this._tree || this._rootNode, newTree);
newTree._rerenderable = this;
this._rootNode = patch(this._rootNode, patches);
this._tree = newTree;
}
cleanUp() {
Ember.run.cancel(this._timeout);
}
}