vue-uiv
Version:
Bootstrap 3 components implemented by Vue 2.
71 lines (65 loc) • 1.7 kB
JavaScript
import {removeFromDom} from '../../utils/domUtils'
import {spliceIfExist} from '../../utils/arrayUtils'
import {isFunction, isExist, isString, isPromiseSupported} from '../../utils/objectUtils'
import Notification from './Notification.vue'
import {PLACEMENTS} from './constants'
import Vue from 'vue'
const queues = {
[PLACEMENTS.TOP_LEFT]: [],
[PLACEMENTS.TOP_RIGHT]: [],
[PLACEMENTS.BOTTOM_LEFT]: [],
[PLACEMENTS.BOTTOM_RIGHT]: []
}
const destroy = (queue, instance) => {
// console.log('destroyNotification')
removeFromDom(instance.$el)
instance.$destroy()
spliceIfExist(queue, instance)
}
const init = (options, cb, resolve = null, reject = null) => {
const placement = options.placement
const queue = queues[placement]
// check if placement is valid
if (!isExist(queue)) {
return
}
let instance = new Vue({
extends: Notification,
propsData: {
queue,
placement,
...options,
cb (msg) {
destroy(queue, instance)
if (isFunction(cb)) {
cb(msg)
} else if (resolve && reject) {
resolve(msg)
}
}
}
})
instance.$mount()
document.body.appendChild(instance.$el)
queue.push(instance)
}
const notify = (options = {}, cb) => {
// simplify usage: pass string as option.content
if (isString(options)) {
options = {
content: options
}
}
// set default placement as top-right
if (!isExist(options.placement)) {
options.placement = PLACEMENTS.TOP_RIGHT
}
if (isPromiseSupported()) {
return new Promise((resolve, reject) => {
init(options, cb, resolve, reject)
})
} else {
init(options, cb)
}
}
export default {notify}