uiv
Version:
Bootstrap 3 components implemented by Vue.
137 lines (129 loc) • 3.03 kB
JavaScript
import { spliceIfExist } from '../../utils/array.utils';
import {
isFunction,
isExist,
isString,
hasOwnProperty,
} from '../../utils/object.utils';
import Notification from '../../components/notification/Notification.vue';
import { PLACEMENTS } from '../../constants/notification.constants';
import { h, render, reactive } from 'vue';
const queues = reactive({
[PLACEMENTS.TOP_LEFT]: [],
[PLACEMENTS.TOP_RIGHT]: [],
[PLACEMENTS.BOTTOM_LEFT]: [],
[PLACEMENTS.BOTTOM_RIGHT]: [],
});
const destroy = (queue, { vNode, container }) => {
// console.log('destroyNotification')
render(null, container);
spliceIfExist(queue, vNode.component.ctx);
};
const init = (options, cb, resolve = null, reject = null) => {
const container = document.createElement('div');
const placement = options.placement;
const queue = queues[placement];
// check if placement is valid
if (!isExist(queue)) {
return;
}
/* istanbul ignore else */
// `error` alias of `danger`
if (options.type === 'error') {
options.type = 'danger';
}
const vNode = h(Notification, {
queue,
placement,
...options,
cb(msg) {
destroy(queue, { vNode, container });
if (isFunction(cb)) {
cb(msg);
} else if (resolve && reject) {
resolve(msg);
}
},
});
render(vNode, container);
document.body.appendChild(container.firstElementChild);
queue.push(vNode.component.ctx);
};
// eslint-disable-next-line default-param-last
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;
}
return new Promise((resolve, reject) => {
init(options, cb, resolve, reject);
});
};
function _notify2(type, args) {
if (isString(args)) {
_notify({
content: args,
type,
});
} else {
_notify({ ...args, type });
}
}
const notify = Object.defineProperties(_notify, {
success: {
configurable: false,
writable: false,
value(args) {
_notify2('success', args);
},
},
info: {
configurable: false,
writable: false,
value(args) {
_notify2('info', args);
},
},
warning: {
configurable: false,
writable: false,
value(args) {
_notify2('warning', args);
},
},
danger: {
configurable: false,
writable: false,
value(args) {
_notify2('danger', args);
},
},
error: {
configurable: false,
writable: false,
value(args) {
_notify2('danger', args);
},
},
dismissAll: {
configurable: false,
writable: false,
value() {
for (const key in queues) {
/* istanbul ignore else */
if (hasOwnProperty(queues, key)) {
queues[key].forEach((instance) => {
instance.onDismissed();
});
}
}
},
},
});
export default { notify };