{"version":3,"file":"method.mjs","names":["MessageConstructor"],"sources":["../../../../../../packages/components/message/src/method.ts"],"sourcesContent":["import { createVNode, isVNode, render } from 'vue'\nimport {\n  debugWarn,\n  hasOwn,\n  isBoolean,\n  isClient,\n  isElement,\n  isFunction,\n  isNumber,\n  isString,\n} from '@element-plus/utils'\nimport { messageConfig } from '@element-plus/components/config-provider'\nimport MessageConstructor from './message.vue'\nimport {\n  MESSAGE_DEFAULT_PLACEMENT,\n  messageDefaults,\n  messagePlacement,\n  messageTypes,\n} from './message'\nimport { getOrCreatePlacementInstances, placementInstances } from './instance'\n\nimport type { MessageContext } from './instance'\nimport type { AppContext } from 'vue'\nimport type {\n  Message,\n  MessageFn,\n  MessageHandler,\n  MessageOptions,\n  MessageParams,\n  MessageParamsNormalized,\n  MessagePlacement,\n  MessageType,\n} from './message'\n\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 normalizeAppendTo = (normalized: MessageOptions) => {\n  const appendTo = normalized.appendTo\n  if (!appendTo) {\n    normalized.appendTo = document.body\n  } else if (isString(normalized.appendTo)) {\n    let appendTo = document.querySelector<HTMLElement>(normalized.appendTo)\n\n    // should fallback to default value with a warning\n    if (!isElement(appendTo)) {\n      debugWarn(\n        'ElMessage',\n        'the appendTo option is not an HTMLElement. Falling back to document.body.'\n      )\n      appendTo = document.body\n    }\n    normalized.appendTo = appendTo\n  }\n}\n\nconst normalizePlacement = (normalized: MessageOptions) => {\n  // if placement is not passed and global has config, use global config\n  if (\n    !normalized.placement &&\n    isString(messageConfig.placement) &&\n    messageConfig.placement\n  ) {\n    normalized.placement = messageConfig.placement as\n      | MessagePlacement\n      | undefined\n  }\n  // if placement is not passed and global has no config, use default config\n  if (!normalized.placement) {\n    normalized.placement = MESSAGE_DEFAULT_PLACEMENT\n  }\n  // if placement is not valid, use default config\n  if (!messagePlacement.includes(normalized.placement!)) {\n    debugWarn(\n      'ElMessage',\n      `Invalid placement: ${normalized.placement}. Falling back to '${MESSAGE_DEFAULT_PLACEMENT}'.`\n    )\n    normalized.placement = MESSAGE_DEFAULT_PLACEMENT\n  }\n}\n\nconst normalizeOptions = (params?: MessageParams) => {\n  const options: MessageOptions =\n    !params || isString(params) || isVNode(params) || isFunction(params)\n      ? { message: params }\n      : params\n\n  const normalized: MessageOptions = {\n    ...messageDefaults,\n    ...options,\n  }\n\n  normalizeAppendTo(normalized)\n  normalizePlacement(normalized)\n\n  // When grouping is configured globally,\n  // if grouping is manually set when calling message individually and it is not equal to the default value,\n  // the global configuration cannot override the current setting. default => false\n  if (isBoolean(messageConfig.grouping) && !normalized.grouping) {\n    normalized.grouping = messageConfig.grouping\n  }\n  if (isNumber(messageConfig.duration) && normalized.duration === 3000) {\n    normalized.duration = messageConfig.duration\n  }\n  if (isNumber(messageConfig.offset) && normalized.offset === 16) {\n    normalized.offset = messageConfig.offset\n  }\n  if (isBoolean(messageConfig.showClose) && !normalized.showClose) {\n    normalized.showClose = messageConfig.showClose\n  }\n  if (isBoolean(messageConfig.plain) && !normalized.plain) {\n    normalized.plain = messageConfig.plain\n  }\n\n  return normalized as MessageParamsNormalized\n}\n\nconst closeMessage = (instance: MessageContext) => {\n  const placement = instance.props.placement || MESSAGE_DEFAULT_PLACEMENT\n  const instances = placementInstances[placement]\n\n  const idx = instances.indexOf(instance)\n  if (idx === -1) return\n  instances.splice(idx, 1)\n  const { handler } = instance\n  handler.close()\n}\n\nconst createMessage = (\n  { appendTo, ...options }: MessageParamsNormalized,\n  context?: AppContext | null\n): MessageContext => {\n  const id = `message_${seed++}`\n  const userOnClose = options.onClose\n\n  const container = document.createElement('div')\n\n  const props = {\n    ...options,\n    // now the zIndex will be used inside the message.vue component instead of here.\n    // zIndex: nextIndex() + options.zIndex\n    id,\n    onClose: () => {\n      userOnClose?.()\n      closeMessage(instance)\n    },\n\n    // clean message element preventing mem leak\n    onDestroy: () => {\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      render(null, container)\n    },\n  }\n  const vnode = createVNode(\n    MessageConstructor,\n    props,\n    isFunction(props.message) || isVNode(props.message)\n      ? {\n          default: isFunction(props.message)\n            ? props.message\n            : () => props.message,\n        }\n      : null\n  )\n  vnode.appContext = context || message._context\n\n  render(vnode, container)\n  // instances will remove this item when close function gets called. So we do not need to worry about it.\n  appendTo.appendChild(container.firstElementChild!)\n\n  const vm = vnode.component!\n\n  const handler: MessageHandler = {\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      vm.exposed!.close()\n    },\n  }\n\n  const instance: MessageContext = {\n    id,\n    vnode,\n    vm,\n    handler,\n    props: (vnode.component as any).props,\n  }\n\n  return instance\n}\n\nconst message: MessageFn &\n  Partial<Message> & { _context: AppContext | null } = (\n  options = {},\n  context\n) => {\n  if (!isClient) return { close: () => undefined }\n\n  const normalized = normalizeOptions(options)\n  const instances = getOrCreatePlacementInstances(\n    normalized.placement || MESSAGE_DEFAULT_PLACEMENT\n  )\n\n  if (normalized.grouping && instances.length) {\n    const instance = instances.find(\n      ({ vnode: vm }) => vm.props?.message === normalized.message\n    )\n    if (instance) {\n      instance.props.repeatNum! += 1\n      instance.props.type = normalized.type\n      return instance.handler\n    }\n  }\n\n  if (isNumber(messageConfig.max) && instances.length >= messageConfig.max) {\n    return { close: () => undefined }\n  }\n\n  const instance = createMessage(normalized, context)\n\n  instances.push(instance)\n  return instance.handler\n}\n\nmessageTypes.forEach((type) => {\n  message[type] = (options = {}, appContext) => {\n    const normalized = normalizeOptions(options)\n    return message({ ...normalized, type }, appContext)\n  }\n})\n\nexport function closeAll(type?: MessageType): void {\n  for (const placement in placementInstances) {\n    if (hasOwn(placementInstances, placement)) {\n      // Create a copy of instances to avoid modification during iteration\n      const instances: MessageContext[] = [...placementInstances[placement]]\n      for (const instance of instances) {\n        if (!type || type === instance.props.type) {\n          instance.handler.close()\n        }\n      }\n    }\n  }\n}\n\nexport function closeAllByPlacement(placement: MessagePlacement) {\n  if (!placementInstances[placement]) return\n  // Create a copy of instances to avoid modification during iteration\n  const instances = [...placementInstances[placement]]\n  instances.forEach((instance) => instance.handler.close())\n}\n\nmessage.closeAll = closeAll\nmessage.closeAllByPlacement = closeAllByPlacement\nmessage._context = null\n\nexport default message as Message\n"],"mappings":"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"}