Last active
March 26, 2021 15:05
Starting Point for a Promise-based class that returns its state
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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