FreeTube/src/renderer/components/ft-toast/ft-toast.js

53 lines
1.6 KiB
JavaScript
Raw Normal View History

2020-06-14 23:13:35 +02:00
import Vue from 'vue'
import FtToastEvents from './ft-toast-events.js'
2020-06-14 23:13:35 +02:00
export default Vue.extend({
name: 'FtToast',
data: function () {
return {
2020-06-27 12:41:34 +02:00
toasts: [
{isOpen: false, message: '', action: null, timeout: null},
{isOpen: false, message: '', action: null, timeout: null},
{isOpen: false, message: '', action: null, timeout: null},
{isOpen: false, message: '', action: null, timeout: null},
{isOpen: false, message: '', action: null, timeout: null}
],
queue: [],
2020-06-14 23:13:35 +02:00
}
},
mounted: function () {
FtToastEvents.$on('toast.open', this.open)
},
2020-06-14 23:13:35 +02:00
methods: {
2020-06-27 12:41:34 +02:00
performAction: function (index) {
this.toasts[index].action()
this.close(index)
2020-06-14 23:13:35 +02:00
},
2020-06-27 12:41:34 +02:00
close: function (index) {
clearTimeout(this.toasts[index].timeout);
this.toasts[index].isOpen = false
if(this.queue.length !== 0) {
const toast = this.queue.shift()
this.open(toast.message, toast.action)
}
2020-06-14 23:13:35 +02:00
},
open: function (message, action) {
2020-06-27 12:41:34 +02:00
for(let i = this.toasts.length - 1; i >= 0 ; i--){
if (!this.toasts[i].isOpen) {
return this.showToast(message, action, i)
}
}
2020-06-27 12:41:34 +02:00
this.queue.push({ message: message, action: action })
2020-06-14 23:13:35 +02:00
},
2020-06-27 12:41:34 +02:00
showToast: function(message, action, index) {
this.toasts[index].message = message
this.toasts[index].action = action || (() => {})
this.toasts[index].isOpen = true
this.toasts[index].timeout = setTimeout(this.close, 2000, index)
}
2020-06-14 23:13:35 +02:00
},
beforeDestroy: function () {
FtToastEvents.$off('toast.open', this.open)
},
2020-06-14 23:13:35 +02:00
})