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