You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
92 lines
2.2 KiB
JavaScript
92 lines
2.2 KiB
JavaScript
class PluginWidget extends Widget {
|
|
widgetClass;
|
|
|
|
constructor(data, renderer) {
|
|
super(data, renderer);
|
|
this.update(data);
|
|
}
|
|
|
|
update(data) {
|
|
super.update(data);
|
|
|
|
if (!data.value) return;
|
|
if (data.value.endsWith('.js')) {
|
|
this.addFile(data.value, 'text', file => {
|
|
this.#apply(file);
|
|
});
|
|
} else {
|
|
this.#apply(data.value);
|
|
}
|
|
}
|
|
|
|
#apply(text) {
|
|
if (!this.renderer.device.info.trust) return;
|
|
|
|
const f = new Function('return (' + text + ');');
|
|
this.widgetClass = f();
|
|
this.renderer.dispatchEvent(new Event('pluginloaded'));
|
|
}
|
|
}
|
|
|
|
Renderer.register('plugin', PluginWidget);
|
|
|
|
|
|
class CustomWidget extends Widget {
|
|
$el;
|
|
#widget;
|
|
|
|
constructor(data, renderer) {
|
|
super(data, renderer);
|
|
this.$el = document.createElement('div');
|
|
this.$el.classList.add('widget_col');
|
|
this.$el.style.width = this.data.wwidth_t + '%';
|
|
this.$el.innerHTML = waiter();
|
|
|
|
const w = this.renderer._getPlugin(data.func);
|
|
if (w) this.#apply(w);
|
|
else this.renderer.addEventListener('pluginloaded', () => {
|
|
const w = this.renderer._getPlugin(data.func);
|
|
if (w) this.#apply(w);
|
|
});
|
|
|
|
this.update(data);
|
|
}
|
|
|
|
update(data) {
|
|
super.update(data);
|
|
|
|
if (this.#widget) this.#widget.update(data);
|
|
}
|
|
|
|
#apply(w) {
|
|
if (!this.renderer.device.info.trust) {
|
|
this.$el.innerHTML = '<p>Dangerous element blocked!</p>';
|
|
return;
|
|
}
|
|
if (this.#widget) this.#widget.close();
|
|
this.#widget = new w(this.data, this.renderer);
|
|
const $w = this.#widget.build();
|
|
if ($w) this.$el.replaceChildren($w);
|
|
else this.$el.replaceChildren();
|
|
}
|
|
|
|
build() {
|
|
return this.$el;
|
|
}
|
|
|
|
close() {
|
|
if (this.#widget) this.#widget.close();
|
|
this.#widget = undefined;
|
|
}
|
|
|
|
handleSetTimeout() {
|
|
if (this.#widget) this.#widget.handleSetTimeout();
|
|
}
|
|
|
|
handleAck() {
|
|
if (this.#widget) this.#widget.handleAck();
|
|
}
|
|
}
|
|
|
|
Renderer.register('custom', CustomWidget);
|