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/component-connector.js.es6
Osama Sayegh 6f52bbefb8
DEV: Use scheduleOnce correctly (#8865)
* DEV: Use scheduleOnce correctly

* remove jquery usage here
2020-02-05 21:21:00 +03:00

62 lines
1.7 KiB
JavaScript

import { scheduleOnce } from "@ember/runloop";
import { setOwner, getOwner } from "@ember/application";
export default class ComponentConnector {
constructor(widget, componentName, opts, trackedProperties) {
this.widget = widget;
this.opts = opts;
this.componentName = componentName;
this.trackedProperties = trackedProperties || [];
}
init() {
const elem = document.createElement("div");
elem.style.display = "inline-flex";
elem.className = "widget-component-connector";
this.elem = elem;
scheduleOnce("afterRender", this, this.connectComponent);
return this.elem;
}
update(prev) {
// mutated external properties might not correctly update the underlying component
// in this case we can define trackedProperties, if different from previous
// state we will re-init the whole component, be careful when using this
// to not track a property which would be updated too often (on scroll for example)
let shouldInit = false;
this.trackedProperties.forEach(prop => {
if (prev.opts[prop] !== this.opts[prop]) {
shouldInit = true;
}
});
if (shouldInit) return this.init();
return null;
}
connectComponent() {
const { elem, opts, widget, componentName } = this;
const mounted = widget._findView();
const view = widget.register
.lookupFactory(`component:${componentName}`)
.create(opts);
if (setOwner) {
setOwner(view, getOwner(mounted));
}
// component connector is not triggering didReceiveAttrs
// we force it for selectKit components
if (view.selectKit) {
view.didReceiveAttrs();
}
mounted._connected.push(view);
view.renderer.appendTo(view, elem);
}
}
ComponentConnector.prototype.type = "Widget";