@j2inn/app
Version:
J2 Innovations core application framework
97 lines (96 loc) • 4.6 kB
JavaScript
/*
* Copyright (c) 2021, J2 Innovations. All Rights Reserved
*/
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
if (kind === "m") throw new TypeError("Private method is not writable");
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
};
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
};
var _ResourceElement_resource, _ResourceElement_loadListeners, _ResourceElement_errorListeners;
/**
* Handles loading a resource DOM element and listening for when it's
* finished or failed to load.
*
* This is designed to handle race conditions whereby a resource
* added but not yet fully loaded. Event handlers can be registered
* even after a resource has loaded with event handlers being fired.
*/
export class ResourceElement {
constructor(resource) {
_ResourceElement_resource.set(this, void 0);
this.ready = false;
this.failed = false;
_ResourceElement_loadListeners.set(this, new Set());
_ResourceElement_errorListeners.set(this, new Set());
/**
* A callback made by the resource DOM element for
* when the resource has loaded successfully.
*/
this.onload = () => {
this.ready = true;
this.failed = false;
this.checkLoaded();
};
/**
* A callback made by the resource DOM element for
* when the resource fails to load.
*/
this.onerror = () => {
this.ready = false;
this.failed = true;
this.checkLoaded();
};
__classPrivateFieldSet(this, _ResourceElement_resource, resource, "f");
__classPrivateFieldGet(this, _ResourceElement_resource, "f").onload = this.onload;
__classPrivateFieldGet(this, _ResourceElement_resource, "f").onerror = this.onerror;
}
/**
* Add event listeners for when a resource has loaded or failed to load.
*
* @param onLoad A callback for when the resource has loaded successfully.
* @param onError A callback for when the resource has failed to load.
*/
addListeners(onLoad, onError) {
__classPrivateFieldGet(this, _ResourceElement_loadListeners, "f").add(onLoad);
__classPrivateFieldGet(this, _ResourceElement_errorListeners, "f").add(onError);
this.checkLoaded();
}
/**
* Removes load and error event listeners.
*
* @param onLoad A callback for when the resource has loaded successfully.
* @param onError A callback for when the resource has failed to load.
*/
removeListeners(onLoad, onError) {
__classPrivateFieldGet(this, _ResourceElement_loadListeners, "f").delete(onLoad);
__classPrivateFieldGet(this, _ResourceElement_errorListeners, "f").delete(onError);
}
/**
* Checks whether any callback handlers need to be invoked.
*/
checkLoaded() {
if (this.ready || this.failed) {
if (this.ready) {
for (const onLoad of __classPrivateFieldGet(this, _ResourceElement_loadListeners, "f")) {
onLoad();
}
}
else if (this.failed) {
for (const onError of __classPrivateFieldGet(this, _ResourceElement_errorListeners, "f")) {
onError();
}
}
// As all of the event handlers have fired remove them
// as they don't need to fire again.
__classPrivateFieldGet(this, _ResourceElement_loadListeners, "f").clear();
__classPrivateFieldGet(this, _ResourceElement_errorListeners, "f").clear();
}
}
}
_ResourceElement_resource = new WeakMap(), _ResourceElement_loadListeners = new WeakMap(), _ResourceElement_errorListeners = new WeakMap();