Skip to content

Instantly share code, notes, and snippets.

@raffaele-abramini
Last active October 16, 2017 14:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save raffaele-abramini/66403c90fa798ee05f4629996920c9b8 to your computer and use it in GitHub Desktop.
Save raffaele-abramini/66403c90fa798ee05f4629996920c9b8 to your computer and use it in GitHub Desktop.
testing example #2 - main
export default class MainNav {
static selectors = {
main: '[data-js-main-nav]',
trigger: '[data-main-nav-trigger]',
content: '[data-main-nav-content]'
};
static classes = {
isHidden: 'is-hidden',
};
static labels = {
open: 'Open menu',
close: 'Close menu',
};
constructor() {
this.elem = document.querySelector(MainNav.selectors.main);
if (!this.elem) return;
this.trigger = this.elem.querySelector(MainNav.selectors.trigger);
this.content = this.elem.querySelector(MainNav.selectors.content);
if (!this.trigger || !this.content) throw new Error(MainNav.errors.noElements);
this.isOpen = !this.elem.classList.contains(MainNav.classes.isHidden);
this.setOpeningState();
this.addListeners();
}
addListeners() {
this.trigger.addEventListener('click', this.handleTriggerClick.bind(this))
}
handleTriggerClick(e) {
e.preventDefault();
this.setOpeningState();
}
setOpeningState() {
this.isOpen
? this.close()
: this.open();
}
open() {
this.content.classList.remove(MainNav.classes.isHidden);
this.isOpen = true;
this.updateTriggerText(MainNav.labels.close);
}
close() {
this.content.classList.add(MainNav.classes.isHidden);
this.isOpen = false;
this.updateTriggerText(MainNav.labels.open);
}
updateTriggerText(newText) {
this.trigger.innerText = newText;
}
static errors = {
get noElements() {
return `${MainNav.name} requires a ${MainNav.selectors.trigger} and a ${MainNav.selectors.content} element.`
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment