UNPKG

element-plus

Version:

A Component Library for Vue 3

127 lines (124 loc) 3.54 kB
import { h, render, watch, isVNode } from 'vue'; import { isClient } from '@vueuse/core'; import '../../../utils/index.mjs'; import MessageBoxConstructor from './index.mjs'; import { hasOwn, isString, isObject } from '@vue/shared'; import { isUndefined } from '../../../utils/types.mjs'; const messageInstance = /* @__PURE__ */ new Map(); const initInstance = (props, container, appContext = null) => { const vnode = h(MessageBoxConstructor, props); vnode.appContext = appContext; render(vnode, container); document.body.appendChild(container.firstElementChild); return vnode.component; }; const genContainer = () => { return document.createElement("div"); }; const showMessage = (options, appContext) => { const container = genContainer(); options.onVanish = () => { render(null, container); messageInstance.delete(vm); }; options.onAction = (action) => { const currentMsg = messageInstance.get(vm); let resolve; if (options.showInput) { resolve = { value: vm.inputValue, action }; } else { resolve = action; } if (options.callback) { options.callback(resolve, instance.proxy); } else { if (action === "cancel" || action === "close") { if (options.distinguishCancelAndClose && action !== "cancel") { currentMsg.reject("close"); } else { currentMsg.reject("cancel"); } } else { currentMsg.resolve(resolve); } } }; const instance = initInstance(options, container, appContext); const vm = instance.proxy; for (const prop in options) { if (hasOwn(options, prop) && !hasOwn(vm.$props, prop)) { vm[prop] = options[prop]; } } watch(() => vm.message, (newVal, oldVal) => { if (isVNode(newVal)) { instance.slots.default = () => [newVal]; } else if (isVNode(oldVal) && !isVNode(newVal)) { delete instance.slots.default; } }, { immediate: true }); vm.visible = true; return vm; }; function MessageBox(options, appContext = null) { if (!isClient) return Promise.reject(); let callback; if (isString(options) || isVNode(options)) { options = { message: options }; } else { callback = options.callback; } return new Promise((resolve, reject) => { const vm = showMessage(options, appContext != null ? appContext : MessageBox._context); messageInstance.set(vm, { options, callback, resolve, reject }); }); } const MESSAGE_BOX_VARIANTS = ["alert", "confirm", "prompt"]; const MESSAGE_BOX_DEFAULT_OPTS = { alert: { closeOnPressEscape: false, closeOnClickModal: false }, confirm: { showCancelButton: true }, prompt: { showCancelButton: true, showInput: true } }; MESSAGE_BOX_VARIANTS.forEach((boxType) => { MessageBox[boxType] = messageBoxFactory(boxType); }); function messageBoxFactory(boxType) { return (message, titleOrOpts, options, appContext) => { let title; if (isObject(titleOrOpts)) { options = titleOrOpts; title = ""; } else if (isUndefined(titleOrOpts)) { title = ""; } else { title = titleOrOpts; } return MessageBox(Object.assign({ title, message, type: "", ...MESSAGE_BOX_DEFAULT_OPTS[boxType] }, options, { boxType }), appContext); }; } MessageBox.close = () => { messageInstance.forEach((_, vm) => { vm.doClose(); }); messageInstance.clear(); }; MessageBox._context = null; export { MessageBox as default }; //# sourceMappingURL=messageBox.mjs.map