var notificationOpen = false; var notificationTimeout: NodeJS.Timeout; var UndeckedNotification: (message: string, type?: 'info' | 'error', time?: number) => void; window.addEventListener('DOMContentLoaded', () => { UndeckedNotification = (message: string, type: 'info' | 'error' = 'info', time: number = 2000) => { _UndeckedNotification.open(message, type, time); }; var _UndeckedNotification = { isOpen: false, timeout: null as NodeJS.Timeout, transitionDuration: 200, elements: { container: document.querySelector('.feedback').querySelector('.notificationcontainer') as HTMLDivElement, box: document.querySelector('.feedback').querySelector('.notification') as HTMLDivElement }, open: (message: string, type: 'info' | 'error' = 'info', time: number) => { var open = () => { _UndeckedNotification.elements.box.classList.remove('info', 'error'); _UndeckedNotification.elements.box.classList.add(type); _UndeckedNotification.elements.box.innerText = message; _UndeckedNotification.elements.container.style.transitionTimingFunction = 'ease-out'; _UndeckedNotification.elements.container.style.transitionDuration = `${_UndeckedNotification.transitionDuration}ms`; _UndeckedNotification.elements.container.style.bottom = '50px'; _UndeckedNotification.isOpen = true; _UndeckedNotification.timeout = setTimeout(_UndeckedNotification.close, time); _UndeckedNotification.elements.box.onclick = () => _UndeckedNotification.close(); }; if (_UndeckedNotification.isOpen == true) { _UndeckedNotification.close(open); } else open(); }, close: (callback?: Function) => { clearTimeout(_UndeckedNotification.timeout); _UndeckedNotification.elements.container.style.transitionTimingFunction = 'ease-in'; _UndeckedNotification.elements.container.style.bottom = '-50px'; setTimeout(() => { if (callback) callback(); _UndeckedNotification.isOpen = false; }, _UndeckedNotification.transitionDuration + 100); } }; }); // declare var UndeckedNotification: (message:string, type?:'info'|"error", time?:number) => void;