import ModulePackageInfo from '../package.json';
import type { InitParams } from './types';
import './index.css';
const isClosed = localStorage.getItem(`${ModulePackageInfo.name}`);
function createPopUp(params: InitParams) {
const wrapper = document.createElement('div');
wrapper.id = 'one-button-wrapper';
wrapper.classList.add(
`pc-${params.direction?.pc}` || 'pc-cb',
`m-${params.direction?.m}` || 'm-b'
);
wrapper.style.fontFamily = params.fontFamily || 'var(--font-base)';
const popup = document.createElement('div');
popup.id = 'one-button-block';
popup.classList.add('animate');
popup.style.boxShadow = `0 0.15rem 5px 0 ${params.colors.accent}`;
popup.style.backgroundColor = params.colors.background;
popup.style.border = `${params.colors.accent} 1px solid`;
const text = document.createElement('p');
if (Array.isArray(params.baseText)) {
params.baseText.forEach((span) => {
const spanEl = document.createElement('span');
spanEl.textContent = span;
text.appendChild(spanEl);
});
} else text.textContent = params.baseText;
text.style.color = params.colors.text;
const link = document.createElement('a');
link.textContent = params.linkText;
link.href = params.linkHref;
link.addEventListener('click', () => togglePopUp(wrapper, popup, 'hide'));
link.style.color = params.colors.background;
link.style.backgroundColor = params.colors.accent;
const close = document.createElement('button');
close.innerHTML = ``;
close.addEventListener('click', () => {
localStorage.setItem(ModulePackageInfo.name, 'true');
togglePopUp(wrapper, popup, 'hide');
});
close.style.backgroundColor = params.colors.background;
close.classList.add('animate');
// Создаю структуру
popup.appendChild(close);
popup.appendChild(text);
popup.appendChild(link);
wrapper.appendChild(popup);
document.documentElement.appendChild(wrapper);
return { wrapper, popup, link, close };
}
function togglePopUp(
wrapper: HTMLElement,
popUp: HTMLElement,
forse: 'show' | 'hide'
) {
if (isClosed) return;
switch (forse) {
case 'show':
wrapper.classList.add('visible');
popUp.style.pointerEvents = 'all';
break;
case 'hide':
wrapper.classList.remove('visible');
popUp.style.pointerEvents = 'none';
break;
}
}
function popUpObserve(
observeTarget: string,
wrapper: HTMLElement,
popup: HTMLElement,
once?: boolean
) {
const target = document.querySelector(observeTarget);
if (!target) {
wrapper.style.display = 'none';
return;
}
const Observer = new IntersectionObserver(
(ent, obs) => {
ent.forEach((e) => {
if (isClosed)
return obs.disconnect(), togglePopUp(wrapper, popup, 'hide');
if (e.isIntersecting) togglePopUp(wrapper, popup, 'show');
else togglePopUp(wrapper, popup, 'hide');
if (once) obs.disconnect();
});
},
{ rootMargin: '-20% 0px -20% 0px' }
);
Observer.observe(target);
}
/**
* Инициализация попапа
* @param baseText - Основной текст
* @param linkText - Текст ссылки
* @param linkHref - Ссылка
* @param observeTarget - Класс (путь) элемента, при появлении которого сработает попап
*/
export default function Init(params: InitParams) {
if (isClosed) return;
const consoleStyle = `
background: #264653;
color: #fefae0;
display: inline-block;
border-radius: 4px;
padding: 4px 16px;
margin: 4px;
font-weight: 600;
font-size: 1.15rem;
font-family: 'Courier New', Tahoma, Geneva, Verdana, sans-serif;
`;
try {
const popUp = createPopUp(params);
if (params.observeTarget)
popUpObserve(
params.observeTarget,
popUp.wrapper,
popUp.popup,
params.observeOnce
);
else
window.addEventListener('load', () =>
togglePopUp(popUp.wrapper, popUp.popup, 'show')
);
console.log(
`%c[👍] ${ModulePackageInfo.name} v${ModulePackageInfo.version}`,
consoleStyle
);
} catch (e) {
console.log(
`%[👎] ${ModulePackageInfo.name}`,
consoleStyle + 'background: #A20021; color: #fff;'
);
console.warn(e);
}
}