song-ui-u
Version:
vue3 + js的PC前端组件库
82 lines (79 loc) • 2.06 kB
JavaScript
import { shallowReactive, createVNode, render } from 'vue';
import { types } from '../../../utils/types.mjs';
import 'song-ui-pro-icon';
import MessageBoxNode from './message-box.vue.mjs';
const messageInstances = shallowReactive([]);
const messageTheme = ["info", "success", "warning", "danger"];
const messageDefaults = {
type: "info",
onClose: null
};
let onlyId = 0;
const initOptions = (params) => {
const options = !params || 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 = createVNode(
MessageBoxNode,
{
...options,
id,
onClose() {
userOnClose?.();
closeMessage(instance);
},
onUnmount() {
render(null, container);
}
}
);
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;
export { closeAll, message as default, messageInstances };
//# sourceMappingURL=method.mjs.map