class Menu {
constructor() {
this.menuElement = $id('account_menu');
this.icon = $id('account');
this.setupEvents();
}
setupEvents() {
let html = $(document.body.parentNode);
html.addEventListener('click', (e) => {
this.menuElement.style.visibility = 'hidden';
this.icon.classList.remove('active');
});
let homeLink = $(this.menuElement.querySelector('a[href="?"]'), HTMLLinkElement);
homeLink.href = location.origin + location.pathname;
this.icon.addEventListener('click', (e) => {
e.stopPropagation();
this.toggleAccountMenu();
});
this.menuElement.addEventListener('click', (e) => {
e.stopPropagation();
});
$(this.menuElement.querySelector('a[data-action=biohazard]')).addEventListener('click', (e) => {
e.preventDefault();
let hazards = document.querySelectorAll('p.hidden-replies, .content > .post.blocked, .blocked > .load-post');
if (window.biohazardEnabled === false) {
window.biohazardEnabled = true;
localStorage.setItem('biohazard', 'true');
this.toggleMenuButtonCheck('biohazard', true);
Array.from(hazards).forEach(p => { $(p).style.display = 'block' });
} else {
window.biohazardEnabled = false;
localStorage.setItem('biohazard', 'false');
this.toggleMenuButtonCheck('biohazard', false);
Array.from(hazards).forEach(p => { $(p).style.display = 'none' });
}
});
$(this.menuElement.querySelector('a[data-action=incognito]')).addEventListener('click', (e) => {
e.preventDefault();
if (window.isIncognito) {
localStorage.removeItem('incognito');
} else {
localStorage.setItem('incognito', '1');
}
location.reload();
});
$(this.menuElement.querySelector('a[data-action=login]')).addEventListener('click', (e) => {
e.preventDefault();
showDialog(loginDialog);
this.menuElement.style.visibility = 'hidden';
});
$(this.menuElement.querySelector('a[data-action=logout]')).addEventListener('click', (e) => {
e.preventDefault();
logOut();
});
}
toggleAccountMenu() {
let isVisible = (this.menuElement.style.visibility == 'visible');
this.menuElement.style.visibility = isVisible ? 'hidden' : 'visible';
this.icon.classList.toggle('active', !isVisible);
}
/** @param {string} buttonName */
showMenuButton(buttonName) {
let button = $(this.menuElement.querySelector(`a[data-action=${buttonName}]`));
let item = $(button.parentNode);
item.style.display = 'list-item';
}
/** @param {string} buttonName */
hideMenuButton(buttonName) {
let button = $(this.menuElement.querySelector(`a[data-action=${buttonName}]`));
let item = $(button.parentNode);
item.style.display = 'none';
}
/** @param {string} buttonName, @param {boolean} state */
toggleMenuButtonCheck(buttonName, state) {
let button = $(this.menuElement.querySelector(`a[data-action=${buttonName}]`));
let check = $(button.querySelector('.check'));
check.style.display = (state) ? 'inline' : 'none';
}
/** @param {boolean | 'incognito'} loggedIn, @param {string | undefined | null} [avatar] */
showLoggedInStatus(loggedIn, avatar) {
if (loggedIn === true && avatar) {
let button = $(this.icon.querySelector('i'));
let img = $tag('img.avatar', { src: avatar });
img.style.display = 'none';
img.addEventListener('load', () => {
button.remove();
img.style.display = 'inline';
});
img.addEventListener('error', () => {
this.showLoggedInStatus(true, null);
})
this.icon.append(img);
} else if (loggedIn === false) {
this.icon.innerHTML = ``;
} else if (loggedIn === 'incognito') {
this.icon.innerHTML = ``;
} else {
this.icon.innerHTML = ``;
}
}
/** @returns {Promise} */
async loadCurrentUserAvatar() {
try {
let url = await api.loadCurrentUserAvatar();
this.showLoggedInStatus(true, url);
} catch (error) {
console.log(error);
this.showLoggedInStatus(true, null);
}
}
}