Skip to content

Instantly share code, notes, and snippets.

@zimaben
Last active March 26, 2021 15:05
Starting Point for a Promise-based class that returns its state
class PromiseClassStarter {
constructor(object) {
//element to attach state to
this.element = (object.hasOwnProperty('element')) ? object.element : false;
//HTML value of the current state of execution
this.state = (object.hasOwnProperty('state')) ? object.state : '';
//Type. message(default) = self-destructs after timeout,
// confirm = user has buttons to resolve or reject,
// dismiss = Dismissable Message (resolves true)
this.type = (object.hasOwnProperty('type')) ? object.type : 'message';
//time to self-destruct( if this is a "message", otherwise useless). Default 3 seconds
this.time = (object.hasOwnProperty('time')) ? object.time : 3000;
this.returned = true;
this.checkReturned = function(){
return this.returned;
}
this.isQuery = function(str){
let pattern = /^[.#\[]/;
return pattern.test(str);
};
this.addConfirmButtons = function(div){
return new Promise((resolve, reject ) => {
let confirm = document.createElement('SPAN');
let deny = document.createElement('SPAN');
confirm.classList.add('confirm');
deny.classList.add('deny');
div.appendChild(confirm);
div.appendChild(deny);
confirm.addEventListener('click', function(event){
let msg = event.target.closest('DIV');
msg.parentElement.removeChild(msg);
resolve(true)});
deny.addEventListener('click', function(e){
let msg = e.target.closest('DIV');
msg.parentElement.removeChild(msg);
reject(false)});
});
};
this.addDismiss = function(div){
return new Promise((resolve, reject ) => {
let dismiss = document.createElement('SPAN');
dismiss.classList.add('dismiss');
div.appendChild(dismiss);
dismiss.addEventListener('click', function(event){
let msg = event.target.closest('DIV');
msg.parentElement.removeChild(msg);
console.log('dismissed');
resolve(true);
});
});
}
this.render = async function(){
let renderstate = document.createElement('div');
renderstate.classList.add( 'system-dialog');
renderstate.innerHTML = this.state;
//check if we can insert the panel. element argument can be element or query syntax or element ID
let parentcontainer = this.element;
if(this.isQuery(parentcontainer)) {
parentcontainer = document.querySelector(parentcontainer);
} else if(typeof parentcontainer == 'string'){
parentcontainer = document.getElementById(parentcontainer);
} else if(typeof parentcontainer !== 'object'){
parentcontainer = false;
}
//end qualify container
if(parentcontainer){
parentcontainer.appendChild( renderstate );
}
if(this.type == 'message'){
setTimeout(function() {
parentcontainer.removeChild(renderstate);
this.returned = true;
}, this.time)
} else {
renderstate.classList.add(this.type);
if(this.type === 'confirm'){
this.returned = await this.addConfirmButtons(the_message);
} else if(this.type === 'dismiss'){
this.returned = await this.addDismiss(the_message);
}
}
return this.returned;
}
this.render();
}
then(prmise) {
//rejection will pass through the resolve and must be
//caught if you want to branch logic based on this class
resolve(prmise);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment