{"version":3,"file":"notify.mjs","sources":["../../../../../../../packages/components/notification/src/notify.ts"],"sourcesContent":["import { createVNode, isVNode, render } from 'vue'\nimport {\n  debugWarn,\n  isClient,\n  isElement,\n  isFunction,\n  isString,\n  isUndefined,\n} from '@hd-front-end/utils'\nimport NotificationConstructor from './notification.vue'\nimport { notificationTypes } from './notification'\n\nimport type { Ref, VNode } from 'vue'\nimport type {\n  NotificationOptions,\n  NotificationProps,\n  NotificationQueue,\n  Notify,\n  NotifyFn,\n} from './notification'\n\n// This should be a queue but considering there were `non-autoclosable` notifications.\nconst notifications: Record<\n  NotificationOptions['position'],\n  NotificationQueue\n> = {\n  'top-left': [],\n  'top-right': [],\n  'bottom-left': [],\n  'bottom-right': [],\n}\n\n// the gap size between each notification\nconst GAP_SIZE = 16\nlet seed = 1\n\nconst notify: NotifyFn & Partial<Notify> = function (options = {}, context) {\n  if (!isClient) return { close: () => undefined }\n\n  if (isString(options) || isVNode(options)) {\n    options = { message: options }\n  }\n\n  const position = options.position || 'top-right'\n\n  let verticalOffset = options.offset || 0\n  notifications[position].forEach(({ vm }) => {\n    verticalOffset += (vm.el?.offsetHeight || 0) + GAP_SIZE\n  })\n  verticalOffset += GAP_SIZE\n\n  const id = `notification_${seed++}`\n  const userOnClose = options.onClose\n  const props: Partial<NotificationProps> = {\n    ...options,\n    offset: verticalOffset,\n    id,\n    onClose: () => {\n      close(id, position, userOnClose)\n    },\n  }\n\n  let appendTo: HTMLElement | null = document.body\n  if (isElement(options.appendTo)) {\n    appendTo = options.appendTo\n  } else if (isString(options.appendTo)) {\n    appendTo = document.querySelector(options.appendTo)\n  }\n\n  // should fallback to default value with a warning\n  if (!isElement(appendTo)) {\n    debugWarn(\n      'ElNotification',\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  const vm = createVNode(\n    NotificationConstructor,\n    props,\n    isFunction(props.message)\n      ? props.message\n      : isVNode(props.message)\n      ? () => props.message\n      : null\n  )\n  vm.appContext = isUndefined(context) ? notify._context : context\n\n  // clean notification element preventing mem leak\n  vm.props!.onDestroy = () => {\n    render(null, container)\n  }\n\n  // instances will remove this item when close function gets called. So we do not need to worry about it.\n  render(vm, container)\n  notifications[position].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      ;(vm.component!.exposed as { visible: Ref<boolean> }).visible.value =\n        false\n    },\n  }\n}\nnotificationTypes.forEach((type) => {\n  notify[type] = (options = {}, appContext) => {\n    if (isString(options) || isVNode(options)) {\n      options = {\n        message: options,\n      }\n    }\n    return notify({ ...options, type }, appContext)\n  }\n})\n\n/**\n * This function gets called when user click `x` button or press `esc` or the time reached its limitation.\n * Emitted by transition@before-leave event so that we can fetch the current notification.offsetHeight, if this was called\n * by @after-leave the DOM element will be removed from the page thus we can no longer fetch the offsetHeight.\n * @param {String} id notification id to be closed\n * @param {Position} position the positioning strategy\n * @param {Function} userOnClose the callback called when close passed by user\n */\nexport function close(\n  id: string,\n  position: NotificationOptions['position'],\n  userOnClose?: (vm: VNode) => void\n): void {\n  // maybe we can store the index when inserting the vm to notification list.\n  const orientedNotifications = notifications[position]\n  const idx = orientedNotifications.findIndex(\n    ({ vm }) => vm.component?.props.id === id\n  )\n  if (idx === -1) return\n  const { vm } = orientedNotifications[idx]\n  if (!vm) return\n  // calling user's on close function before notification gets removed from DOM.\n  userOnClose?.(vm)\n\n  // note that this is called @before-leave, that's why we were able to fetch this property.\n  const removedHeight = vm.el!.offsetHeight\n  const verticalPos = position.split('-')[0]\n  orientedNotifications.splice(idx, 1)\n  const len = orientedNotifications.length\n  if (len < 1) return\n  // starting from the removing item.\n  for (let i = idx; i < len; i++) {\n    // new position equals the current offsetTop minus removed height plus 16px(the gap size between each item)\n    const { el, component } = orientedNotifications[i].vm\n    const pos =\n      Number.parseInt(el!.style[verticalPos], 10) - removedHeight - GAP_SIZE\n    component!.props.offset = pos\n  }\n}\n\nexport function closeAll(): void {\n  // loop through all directions, close them at once.\n  for (const orientedNotifications of Object.values(notifications)) {\n    orientedNotifications.forEach(({ vm }) => {\n      // same as the previous close method, we'd like to make sure lifecycle gets handle properly.\n      ;(vm.component!.exposed as { visible: Ref<boolean> }).visible.value =\n        false\n    })\n  }\n}\n\nexport function updateOffsets(\n  position: NotificationOptions['position'] = 'top-right'\n) {\n  let verticalOffset =\n    notifications[position][0]?.vm.component?.props?.offset || 0\n\n  for (const { vm } of notifications[position]) {\n    vm.component!.props.offset = verticalOffset\n    verticalOffset += (vm.el?.offsetHeight || 0) + GAP_SIZE\n  }\n}\n\nnotify.closeAll = closeAll\nnotify.updateOffsets = updateOffsets\nnotify._context = null\n\nexport default notify as Notify\n"],"names":["vm"],"mappings":"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"}