{"version":3,"file":"message-method.mjs","sources":["../../../../../../packages/components/message/src/message-method.ts"],"sourcesContent":["import { createVNode, render } from 'vue'\nimport { isVNode } from '@element-plus/utils/util'\nimport PopupManager from '@element-plus/utils/popup-manager'\nimport isServer from '@element-plus/utils/isServer'\nimport { debugWarn } from '@element-plus/utils/error'\nimport MessageConstructor from './message.vue'\nimport { messageTypes } from './message'\n\nimport type { Message, MessageFn, MessageQueue, MessageProps } from './message'\nimport type { ComponentPublicInstance, VNode } from 'vue'\n\nconst instances: MessageQueue = []\nlet seed = 1\n\n// TODO: Since Notify.ts is basically the same like this file. So we could do some encapsulation against them to reduce code duplication.\n\nconst message: MessageFn & Partial<Message> = function (options = {}) {\n  if (isServer) return { close: () => undefined }\n\n  if (\n    !isVNode(options) &&\n    typeof options === 'object' &&\n    options.grouping &&\n    !isVNode(options.message) &&\n    instances.length\n  ) {\n    const tempVm: any = instances.find(\n      (item) =>\n        `${item.vm.props?.message ?? ''}` ===\n        `${(options as any).message ?? ''}`\n    )\n    if (tempVm) {\n      tempVm.vm.component!.props.repeatNum += 1\n      tempVm.vm.component!.props.type = options?.type\n      return {\n        close: () =>\n          ((\n            vm.component!.proxy as ComponentPublicInstance<{ visible: boolean }>\n          ).visible = false),\n      }\n    }\n  }\n\n  if (typeof options === 'string' || isVNode(options)) {\n    options = { message: options }\n  }\n\n  let verticalOffset = options.offset || 20\n  instances.forEach(({ vm }) => {\n    verticalOffset += (vm.el?.offsetHeight || 0) + 16\n  })\n  verticalOffset += 16\n\n  const id = `message_${seed++}`\n  const userOnClose = options.onClose\n  const props: Partial<MessageProps> = {\n    zIndex: PopupManager.nextZIndex(),\n    offset: verticalOffset,\n    ...options,\n    id,\n    onClose: () => {\n      close(id, userOnClose)\n    },\n  }\n\n  let appendTo: HTMLElement | null = document.body\n  if (options.appendTo instanceof HTMLElement) {\n    appendTo = options.appendTo\n  } else if (typeof options.appendTo === 'string') {\n    appendTo = document.querySelector(options.appendTo)\n  }\n  // should fallback to default value with a warning\n  if (!(appendTo instanceof HTMLElement)) {\n    debugWarn(\n      'ElMessage',\n      'the appendTo option is not an HTMLElement. Falling back to document.body.'\n    )\n    appendTo = document.body\n  }\n\n  const container = document.createElement('div')\n\n  container.className = `container_${id}`\n\n  const message = props.message\n  const vm = createVNode(\n    MessageConstructor,\n    props,\n    isVNode(props.message) ? { default: () => message } : null\n  )\n\n  // clean message element preventing mem leak\n  vm.props!.onDestroy = () => {\n    render(null, container)\n    // since the element is destroy, then the VNode should be collected by GC as well\n    // we do not want cause any mem leak because we have returned vm as a reference to users\n    // so that we manually set it to false.\n  }\n\n  render(vm, container)\n  // instances will remove this item when close function gets called. So we do not need to worry about it.\n  instances.push({ vm })\n  appendTo.appendChild(container.firstElementChild!)\n\n  return {\n    // instead of calling the onClose function directly, setting this value so that we can have the full lifecycle\n    // for out component, so that all closing steps will not be skipped.\n    close: () =>\n      ((\n        vm.component!.proxy as ComponentPublicInstance<{ visible: boolean }>\n      ).visible = false),\n  }\n}\n\nmessageTypes.forEach((type) => {\n  message[type] = (options = {}) => {\n    if (typeof options === 'string' || isVNode(options)) {\n      options = {\n        message: options,\n      }\n    }\n    return message({\n      ...options,\n      type,\n    })\n  }\n})\n\nexport function close(id: string, userOnClose?: (vm: VNode) => void): void {\n  const idx = instances.findIndex(({ vm }) => id === vm.component!.props.id)\n  if (idx === -1) return\n\n  const { vm } = instances[idx]\n  if (!vm) return\n  userOnClose?.(vm)\n\n  const removedHeight = vm.el!.offsetHeight\n  instances.splice(idx, 1)\n\n  // adjust other instances vertical offset\n  const len = instances.length\n  if (len < 1) return\n  for (let i = idx; i < len; i++) {\n    const pos =\n      parseInt(instances[i].vm.el!.style['top'], 10) - removedHeight - 16\n\n    instances[i].vm.component!.props.offset = pos\n  }\n}\n\nexport function closeAll(): void {\n  for (let i = instances.length - 1; i >= 0; i--) {\n    const instance = instances[i].vm.component\n    ;(instance?.proxy as any)?.close()\n  }\n}\n\nmessage.closeAll = closeAll\n\nexport default message as Message\n"],"names":["MessageConstructor"],"mappings":"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"}