dees-domtools/ts/domtools.classes.domtools.ts

73 lines
2.6 KiB
TypeScript
Raw Normal View History

2020-05-25 15:57:47 +00:00
import * as plugins from './domtools.plugins';
import { Stringmap, FastMap } from '@pushrocks/lik';
export class DomTools {
public static async setupDomTools() {
let domToolsInstance: DomTools;
if (!globalThis.deesDomTools) {
globalThis.deesDomTools = new DomTools();
domToolsInstance = globalThis.deesDomTools;
// lets make sure the dom is ready
const readyStateChangedFunc = () => {
if (document.readyState === 'interactive' || document.readyState === 'complete') {
2020-05-25 16:11:59 +00:00
domToolsInstance.elements.headElement = document.querySelector('head');
domToolsInstance.elements.bodyElement = document.querySelector('body');
2020-05-25 15:57:47 +00:00
domToolsInstance.domReady.resolve();
}
};
document.addEventListener('readystatechange', readyStateChangedFunc);
domToolsInstance.domToolsReady.resolve();
} else {
domToolsInstance = globalThis.deesDomTools;
}
await domToolsInstance.domToolsReady.promise;
return domToolsInstance;
2020-05-23 16:55:36 +00:00
}
2020-05-25 15:57:47 +00:00
2020-05-25 16:11:59 +00:00
public smartstate = new plugins.smartstate.Smartstate();
2020-05-25 15:57:47 +00:00
public domToolsReady = plugins.smartpromise.defer();
public domReady = plugins.smartpromise.defer();
public globalStylesReady = plugins.smartpromise.defer();
// elements
2020-05-25 16:11:59 +00:00
public elements: {
headElement: HTMLElement;
bodyElement: HTMLElement;
} = {
headElement: null,
bodyElement: null,
};
2020-05-25 15:57:47 +00:00
public async setGlobalStyles(stylesText: string) {
await this.domReady.promise;
const styleElement = document.createElement('style');
styleElement.type = 'text/css';
styleElement.appendChild(document.createTextNode(stylesText));
2020-05-25 16:11:59 +00:00
this.elements.headElement.appendChild(styleElement);
2020-05-25 15:57:47 +00:00
}
private runOnceTrackerStringMap = new Stringmap();
private runOnceResultMap = new FastMap();
2020-05-25 16:22:05 +00:00
/**
* run a function once and always get the Promise of the first execution
* @param identifierArg
* @param funcArg
*/
2020-05-25 15:57:47 +00:00
public async runOnce<T>(identifierArg: string, funcArg: () => Promise<T>) {
const runningId = `${identifierArg}+runningCheck`;
if(!this.runOnceTrackerStringMap.checkString(identifierArg)) {
this.runOnceTrackerStringMap.addString(identifierArg);
this.runOnceTrackerStringMap.addString(runningId);
const result = await funcArg();
this.runOnceResultMap.addToMap(identifierArg, result);
this.runOnceTrackerStringMap.removeString(runningId);
}
return await this.runOnceTrackerStringMap.registerUntilTrue(stringMap => {
return !stringMap.includes(runningId);
}, () => {
return this.runOnceResultMap.getByKey(identifierArg);
});
}
2020-05-23 16:55:36 +00:00
}