X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/e91ef54cc9f8ce6b264bced8191275b6a33e594f..refs/pull/5429/head:/resources/js/components/notification.js diff --git a/resources/js/components/notification.js b/resources/js/components/notification.js index f7edb08aa..8a1ef922a 100644 --- a/resources/js/components/notification.js +++ b/resources/js/components/notification.js @@ -1,19 +1,21 @@ +import {Component} from './component'; -class Notification { +export class Notification extends Component { - constructor(elem) { - this.elem = elem; - this.type = elem.getAttribute('notification'); - this.textElem = elem.querySelector('span'); - this.autohide = this.elem.hasAttribute('data-autohide'); - this.elem.style.display = 'grid'; + setup() { + this.container = this.$el; + this.type = this.$opts.type; + this.textElem = this.container.querySelector('span'); + this.autoHide = this.$opts.autoHide === 'true'; + this.initialShow = this.$opts.show === 'true'; + this.container.style.display = 'grid'; window.$events.listen(this.type, text => { this.show(text); }); - elem.addEventListener('click', this.hide.bind(this)); + this.container.addEventListener('click', this.hide.bind(this)); - if (elem.hasAttribute('data-show')) { + if (this.initialShow) { setTimeout(() => this.show(this.textElem.textContent), 100); } @@ -21,26 +23,28 @@ class Notification { } show(textToShow = '') { - this.elem.removeEventListener('transitionend', this.hideCleanup); + this.container.removeEventListener('transitionend', this.hideCleanup); this.textElem.textContent = textToShow; - this.elem.style.display = 'grid'; + this.container.style.display = 'grid'; setTimeout(() => { - this.elem.classList.add('showing'); + this.container.classList.add('showing'); }, 1); - if (this.autohide) setTimeout(this.hide.bind(this), 2000); + if (this.autoHide) { + const words = textToShow.split(' ').length; + const timeToShow = Math.max(2000, 1000 + (250 * words)); + setTimeout(this.hide.bind(this), timeToShow); + } } hide() { - this.elem.classList.remove('showing'); - this.elem.addEventListener('transitionend', this.hideCleanup); + this.container.classList.remove('showing'); + this.container.addEventListener('transitionend', this.hideCleanup); } hideCleanup() { - this.elem.style.display = 'none'; - this.elem.removeEventListener('transitionend', this.hideCleanup); + this.container.style.display = 'none'; + this.container.removeEventListener('transitionend', this.hideCleanup); } } - -export default Notification; \ No newline at end of file