song-ui-u
Version:
vue3 + js的PC前端组件库
88 lines (83 loc) • 2.16 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', { value: true });
var vue = require('vue');
var types = require('../../../utils/types.cjs');
require('song-ui-pro-icon');
var messageBox = require('./message-box.vue.cjs');
const messageInstances = vue.shallowReactive([]);
const messageTheme = ["info", "success", "warning", "danger"];
const messageDefaults = {
type: "info",
onClose: null
};
let onlyId = 0;
const initOptions = (params) => {
const options = !params || types.types().isString(params) ? { message: params } : params;
const config = {
...messageDefaults,
...options
};
return config;
};
const createMessage = (options = {}) => {
const container = document.createElement("div");
const appendTo = document.body;
const id = `message_${onlyId++}`;
const userOnClose = options.onClose;
const vnode = vue.createVNode(
messageBox,
{
...options,
id,
onClose() {
userOnClose?.();
closeMessage(instance);
},
onUnmount() {
vue.render(null, container);
}
}
);
vue.render(vnode, container);
appendTo.appendChild(container.firstElementChild);
const vm = vnode.component;
const instance = {
id,
vnode,
vm,
handler: {
close: () => {
vm.setupState.visible = false;
}
},
props: vm.props
};
return instance;
};
const closeMessage = (instance) => {
const idx = messageInstances.indexOf(instance);
if (idx === -1) return;
messageInstances.splice(idx, 1);
instance?.handler.close();
};
function closeAll() {
for (const instance of messageInstances) {
instance.handler.close();
}
}
const message = (params = {}) => {
const normalized = initOptions(params);
const message2 = createMessage(normalized);
messageInstances.push(message2);
};
messageTheme.forEach((theme) => {
message[theme] = (options = {}) => {
const config = initOptions(options);
return message({ ...config, type: theme });
};
});
message.closeAll = closeAll;
exports.closeAll = closeAll;
exports.default = message;
exports.messageInstances = messageInstances;
//# sourceMappingURL=method.cjs.map