// @ts-ignore
import template from './menu.html';
import FilterButtons from './FilterButtons';
import ContentButtons from './ContentButtons';
import ToolButtons from '../../enum/TOOL_PRESETS';
import renderButtons from './renderButtons';
import toggle from '../../utils/toggle';
import adjustFontSize from '../../tools/adjustFontSize';
import renderTools from './renderTools';
import { getSettings, getState, saveSettings, saveState } from '../../storage';
import reset from './reset';
import renderFilter from './renderFilter';
import translateMenu from './translateMenu';
import { ILanguage, LANGUAGES } from '../../enum/Languages';
export interface IRenderMenuArgs {
container: HTMLElement;
position?: string;
lang?: string;
}
export function renderMenu({ container, position, ...options }: IRenderMenuArgs) {
const $container: HTMLElement = document.createElement('div');
$container.innerHTML = template;
const $menu: HTMLElement = $container.querySelector('.asw-menu');
if (position?.includes('right')) {
$menu.style.right = '0px';
$menu.style.left = 'auto';
}
$menu.querySelector('.content').innerHTML = renderButtons(ContentButtons);
$menu.querySelector('.tools').innerHTML = renderButtons(ToolButtons, 'asw-tools');
$menu.querySelector('.contrast').innerHTML = renderButtons(FilterButtons, 'asw-filter');
$container.querySelectorAll('.asw-menu-close, .asw-overlay').forEach((el: HTMLElement) => {
el.addEventListener('click', () => {
toggle($container, false);
});
});
$menu.querySelectorAll(".asw-adjust-font div[role='button']").forEach((el: HTMLElement) => {
el.addEventListener('click', () => {
const margin = 0.1;
let fontSize = getState('fontSize') ?? 1;
if (el.classList.contains('asw-minus')) {
fontSize -= margin;
} else {
fontSize += margin;
}
fontSize = Math.max(fontSize, 0.1);
fontSize = Math.min(fontSize, 2);
fontSize = Number(fontSize.toFixed(2));
adjustFontSize(fontSize || 1);
saveState({ fontSize });
});
});
$menu.querySelectorAll('.asw-btn').forEach((el: HTMLElement) => {
el.addEventListener('click', () => {
let key = el.dataset.key;
let isSelected = !el.classList.contains('asw-selected');
if (el.classList.contains('asw-filter')) {
$menu.querySelectorAll('.asw-filter').forEach((el: HTMLElement) => {
el.classList.remove('asw-selected');
});
saveState({
contrast: isSelected ? key : false
});
if (isSelected) {
el.classList.add('asw-selected');
}
renderFilter();
} else {
el.classList.toggle('asw-selected', isSelected);
saveState({
[key]: isSelected
});
renderTools();
}
});
});
$menu.querySelector('.asw-menu-reset')?.addEventListener('click', () => {
reset();
});
let settings = getSettings();
let fontSize = Number(settings?.states?.fontSize) || 1;
if (fontSize != 1) {
$menu.querySelector('.asw-amount').innerHTML = `${fontSize * 100}%`;
}
let $lang: HTMLSelectElement = $menu.querySelector('#asw-language');
$lang.innerHTML = LANGUAGES.map(
(lang: ILanguage) => ``
).join('');
if (settings.lang !== options.lang) {
saveSettings({
lang: options.lang
});
}
$lang.value = options?.lang || 'en';
$lang?.addEventListener('change', () => {
saveSettings({
lang: $lang.value
});
translateMenu(container);
});
translateMenu($menu);
if (settings.states) {
for (let key in settings.states) {
if (settings.states[key] && key !== 'fontSize') {
let selector = key === 'contrast' ? settings.states[key] : key;
$menu
.querySelector(`.asw-btn[data-key="${selector}"]`)
?.classList?.add('asw-selected');
}
}
}
container.appendChild($container);
return $container;
}