{"version":3,"file":"message.mjs","sources":["../../../../../src/components/ivue-message/message.ts"],"sourcesContent":["import { createVNode, VNode, render, isVNode } from 'vue';\r\nimport { transferIndex, transferIncrease } from '../../utils/transfer-queue';\r\n\r\nimport Message from './index.vue';\r\n\r\n// type\r\nimport type { Type, Options } from './types/message';\r\n\r\n// 实例列表\r\nconst instances = [];\r\n\r\nlet name = 1;\r\nlet top;\r\nlet defaultDuration;\r\n\r\nconst prefixKey = 'ivue_message_key_';\r\n\r\n// 存储自定义的通知id列表\r\nconst notificationsId: Record<string, any> = {};\r\n\r\nconst message = (type: Type, options: Options) => {\r\n  // 自定义id\r\n  const customizeId = options.id;\r\n\r\n  // 每一个的id\r\n  const id = customizeId || `${prefixKey}${name++}`;\r\n\r\n  // 通知列表开启了自定义id,不重复创建\r\n  if (notificationsId[customizeId]) {\r\n    return;\r\n  }\r\n\r\n  // 用户设置的关闭回调\r\n  const userOnClose = options.onClose;\r\n\r\n  // 纯字符串\r\n  if (typeof options === 'string') {\r\n    options = {\r\n      content: options,\r\n    };\r\n  }\r\n\r\n  // 距离顶部位置\r\n  let verticalOffset = top || options.top || 20;\r\n\r\n  // 遍历实例累加位移位置\r\n  instances.forEach(({ vm }) => {\r\n    verticalOffset += (vm.el.offsetHeight || 0) + 16;\r\n  });\r\n\r\n  // 每一个累加\r\n  verticalOffset += 16;\r\n\r\n  // duration\r\n  options.duration = defaultDuration || options.duration;\r\n\r\n  // 获取Index\r\n  const handleGetIndex = () => {\r\n    transferIncrease();\r\n    return transferIndex;\r\n  };\r\n\r\n  // 当前index\r\n  const tIndex = handleGetIndex();\r\n\r\n  // 设置选项\r\n  options = {\r\n    // default options end\r\n    ...options,\r\n    type,\r\n    onClose: () => {\r\n      close(id, userOnClose);\r\n    },\r\n    top: verticalOffset,\r\n    id: id,\r\n    zIndex: 1010 + tIndex,\r\n  };\r\n\r\n  // 实例对象\r\n  const vm = createVNode(\r\n    Message,\r\n    options,\r\n    isVNode(options.content) ? { default: () => message } : null\r\n  );\r\n  const container = document.createElement('div') as HTMLElement;\r\n\r\n  // 有自定义id\r\n  if (customizeId) {\r\n    notificationsId[id] = { vm };\r\n  }\r\n\r\n  // 清除通知元素防止内存泄漏\r\n  vm.props.onDestroy = () => {\r\n    // 既然元素被销毁了，那么VNode也应该被GC回收\r\n    // 我们不想造成任何内存泄漏，因为我们已经返回 vm 作为对用户的引用\r\n    // 以便我们手动将其设置为 false。\r\n    render(null, container);\r\n  };\r\n\r\n  render(vm, container);\r\n\r\n  // 当 close 函数被调用时，实例将删除此项。 所以我们不需要担心。\r\n  instances.push({ vm });\r\n\r\n  document.body.appendChild(container.firstElementChild as HTMLElement);\r\n\r\n  // 返回关闭方法\r\n  return {\r\n    close,\r\n  };\r\n};\r\n\r\n/**\r\n * 当用户点击`x` 按钮 或时间达到其限制时，将调用此函数。\r\n * 由transition@before-leave 事件发出，以便我们可以获取当前的notification.offsetHeight，如果它被调用\r\n * 通过@after-leave DOM 元素将从页面中删除，因此我们无法再获取 offsetHeight。\r\n * @param {String} id 要关闭的通知 id\r\n * @param {Function} userOnClose 用户关闭时调用的回调\r\n */\r\nconst close = (id: string, userOnClose?: (vm: VNode) => void): void => {\r\n  // 将 vm 插入通知列表时存储索引\r\n  const orientedNotifications = instances;\r\n\r\n  // 当前的下标\r\n  const idx = orientedNotifications.findIndex(({ vm }) => {\r\n    if (!vm) {\r\n      return;\r\n    }\r\n\r\n    return vm.component.props.id === id;\r\n  });\r\n\r\n  if (idx === -1) {\r\n    return;\r\n  }\r\n\r\n  // vm\r\n  const { vm } = orientedNotifications[idx];\r\n\r\n  if (!vm) {\r\n    return;\r\n  }\r\n\r\n  // 在通知从 DOM 中移除之前调用用户的关闭函数。\r\n  userOnClose?.(vm);\r\n\r\n  // 请注意，这称为@before-leave，这就是我们能够获取此属性的原因。\r\n  const removedHeight = vm.el.offsetHeight;\r\n\r\n  // 有自定义id删除\r\n  if (notificationsId[id]) {\r\n    // 隐藏自定义的通知\r\n    orientedNotifications[idx].vm.component.proxy.data.visible = false;\r\n\r\n    delete notificationsId[id];\r\n  }\r\n\r\n  // 移除当前通知\r\n  orientedNotifications.splice(idx, 1);\r\n\r\n  const len = orientedNotifications.length;\r\n\r\n  if (len < 1) {\r\n    return;\r\n  }\r\n\r\n  // 开始移除项\r\n  for (let i = idx; i < len; i++) {\r\n    // 新位置等于当前的 offsetTop 减去移除的高度加上 16px（每个项目之间的间隙大小）\r\n    const { el, component } = orientedNotifications[i].vm;\r\n    const pos = parseInt(el.style['top'], 10) - removedHeight - 16;\r\n\r\n    // 修改偏移位置触发向上移动动画\r\n    component.props.top = pos;\r\n  }\r\n};\r\n\r\n// 关闭所有\r\nconst closeAll = (): void => {\r\n  // 遍历所有方向，立即关闭它们。\r\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n  for (const key in instances) {\r\n    instances.forEach(({ vm }) => {\r\n      // same as the previous close method, we'd like to make sure lifecycle gets handle properly.\r\n      vm.component.proxy.data.visible = false;\r\n    });\r\n  }\r\n};\r\n\r\nexport default {\r\n  info(options: Options) {\r\n    return message('info', options);\r\n  },\r\n  success(options: Options) {\r\n    return message('success', options);\r\n  },\r\n  warning(options: Options) {\r\n    return message('warning', options);\r\n  },\r\n  error(options: Options) {\r\n    return message('error', options);\r\n  },\r\n  loading(options: Options) {\r\n    return message('loading', options);\r\n  },\r\n  // 全局配置\r\n  config(options: Options) {\r\n    // 偏移位置\r\n    if (options.top) {\r\n      top = options.top;\r\n    }\r\n\r\n    // 延迟时间\r\n    if (options.duration && options.duration > 0) {\r\n      defaultDuration = options.duration;\r\n    }\r\n  },\r\n  close,\r\n  closeAll,\r\n};\r\n"],"names":["vm","Message"],"mappings":"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"}