{"version":3,"file":"messageBox.mjs","sources":["../../../../../packages/components/message-box/src/messageBox.ts"],"sourcesContent":["import { h, watch, render } from 'vue'\nimport { isClient } from '@vueuse/core'\nimport { isVNode, isString, hasOwn } from '@element-ultra/utils'\nimport MessageBoxConstructor from './index.vue'\n\nimport type { ComponentPublicInstance, VNode } from 'vue'\nimport type {\n  Action,\n  Callback,\n  MessageBoxState,\n  IElMessageBox,\n  ElMessageBoxOptions,\n  MessageBoxData,\n} from './message-box.type'\n\n// component default merge props & data\n\nconst messageInstance = new Map<\n  ComponentPublicInstance<{ doClose: () => void }>, // marking doClose as function\n  {\n    options: any\n    callback: Callback\n    resolve: (res: any) => void\n    reject: (reason?: any) => void\n  }\n>()\n\nconst initInstance = (props: any, container: HTMLElement) => {\n  const vnode = h(MessageBoxConstructor, props)\n  render(vnode, container)\n  document.body.appendChild(container.firstElementChild)\n  return vnode.component\n}\n\nconst genContainer = () => {\n  return document.createElement('div')\n}\n\nconst showMessage = (options: any) => {\n  const container = genContainer()\n  // Adding destruct method.\n  // when transition leaves emitting `vanish` evt. so that we can do the clean job.\n  options.onVanish = () => {\n    // not sure if this causes mem leak, need proof to verify that.\n    // maybe calling out like 1000 msg-box then close them all.\n    render(null, container)\n    messageInstance.delete(vm) // Remove vm to avoid mem leak.\n    // here we were suppose to call document.body.removeChild(container.firstElementChild)\n    // but render(null, container) did that job for us. so that we do not call that directly\n  }\n\n  options.onAction = (action: Action) => {\n    const currentMsg = messageInstance.get(vm)\n    let resolve: Action | { value: string; action: Action }\n    if (options.showInput) {\n      resolve = { value: vm.inputValue, action }\n    } else {\n      resolve = action\n    }\n    if (options.callback) {\n      options.callback(resolve, instance.proxy)\n    } else {\n      if (action === 'cancel' || action === 'close') {\n        if (options.distinguishCancelAndClose && action !== 'cancel') {\n          currentMsg.reject('close')\n        } else {\n          currentMsg.reject('cancel')\n        }\n      } else {\n        currentMsg.resolve(resolve)\n      }\n    }\n  }\n\n  const instance = initInstance(options, container)\n\n  // This is how we use message box programmably.\n  // Maybe consider releasing a template version?\n  // get component instance like v2.\n  const vm = instance.proxy as ComponentPublicInstance<\n    {\n      visible: boolean\n      doClose: () => void\n    } & MessageBoxState\n  >\n\n  for (const prop in options) {\n    if (hasOwn(options, prop) && !hasOwn(vm.$props, prop)) {\n      vm[prop as string] = options[prop]\n    }\n  }\n\n  watch(\n    () => vm.message,\n    (newVal, oldVal) => {\n      if (isVNode(newVal)) {\n        // Override slots since message is vnode type.\n        instance.slots.default = () => [newVal]\n      } else if (isVNode(oldVal) && !isVNode(newVal)) {\n        delete instance.slots.default\n      }\n    },\n    {\n      immediate: true,\n    }\n  )\n\n  // change visibility after everything is settled\n  vm.visible = true\n  return vm\n}\n\nasync function MessageBox(options: ElMessageBoxOptions): Promise<MessageBoxData>\nfunction MessageBox(\n  options: ElMessageBoxOptions | string | VNode\n): Promise<{ value: string; action: Action } | Action> {\n  if (!isClient) return\n  let callback\n  if (isString(options) || isVNode(options)) {\n    options = {\n      message: options,\n    }\n  } else {\n    callback = options.callback\n  }\n\n  return new Promise((resolve, reject) => {\n    const vm = showMessage(options)\n    // collect this vm in order to handle upcoming events.\n    messageInstance.set(vm, {\n      options,\n      callback,\n      resolve,\n      reject,\n    })\n  })\n}\n\nMessageBox.alert = (\n  message: string,\n  title: string,\n  options?: ElMessageBoxOptions\n) => {\n  if (typeof title === 'object') {\n    options = title\n    title = ''\n  } else if (title === undefined) {\n    title = ''\n  }\n\n  return MessageBox(\n    Object.assign(\n      {\n        title,\n        message,\n        type: '',\n        closeOnPressEscape: false,\n        closeOnClickModal: false,\n      },\n      options,\n      {\n        boxType: 'alert',\n      }\n    )\n  )\n}\n\nMessageBox.confirm = (\n  message: string,\n  title: string,\n  options?: ElMessageBoxOptions\n) => {\n  if (typeof title === 'object') {\n    options = title\n    title = ''\n  } else if (title === undefined) {\n    title = ''\n  }\n  return MessageBox(\n    Object.assign(\n      {\n        title,\n        message,\n        type: '',\n        showCancelButton: true,\n      },\n      options,\n      {\n        boxType: 'confirm',\n      }\n    )\n  )\n}\n\nMessageBox.prompt = (\n  message: string,\n  title: string,\n  options?: ElMessageBoxOptions\n) => {\n  if (typeof title === 'object') {\n    options = title\n    title = ''\n  } else if (title === undefined) {\n    title = ''\n  }\n  return MessageBox(\n    Object.assign(\n      {\n        title,\n        message,\n        showCancelButton: true,\n        showInput: true,\n        type: '',\n      },\n      options,\n      {\n        boxType: 'prompt',\n      }\n    )\n  )\n}\n\nMessageBox.close = () => {\n  // instance.setupInstall.doClose()\n  // instance.setupInstall.state.visible = false\n\n  messageInstance.forEach((_, vm) => {\n    vm.doClose()\n  })\n\n  messageInstance.clear()\n}\n\nexport default MessageBox as IElMessageBox\n"],"names":[],"mappings":"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"}