UNPKG

song-ui-u

Version:

vue3 + js的PC前端组件库

82 lines (79 loc) 2.06 kB
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