{"version":3,"file":"popup-manager.mjs","sources":["../../../../packages/utils/popup-manager.ts"],"sourcesContent":["import isServer from './isServer'\nimport * as configs from './config'\nimport { addClass, removeClass, on } from './dom'\nimport { EVENT_CODE } from './aria'\n\nimport type { Ref } from 'vue'\ninterface Instance {\n  closeOnClickModal: Ref<boolean>\n  closeOnPressEscape: Ref<boolean>\n  close: () => void\n  handleClose?: () => void\n  handleAction?: (action: string) => void\n}\n\ntype StackFrame = { id: string; zIndex: number; modalClass: string }\n\ninterface IPopupManager {\n  getInstance: (id: string) => Instance\n  zIndex: number\n  modalDom?: HTMLElement\n  modalFade: boolean\n  modalStack: StackFrame[]\n  nextZIndex: () => number\n  register: (id: string, instance: Instance) => void\n  deregister: (id: string) => void\n  doOnModalClick: () => void\n  openModal: (\n    id: string,\n    zIndex: number,\n    dom: HTMLElement,\n    modalClass: string,\n    modalFade: boolean\n  ) => void\n  closeModal: (id: string) => void\n}\n\nconst onTouchMove = (e: Event) => {\n  e.preventDefault()\n  e.stopPropagation()\n}\n\nconst onModalClick = () => {\n  PopupManager?.doOnModalClick()\n}\n\nlet hasModal = false\nlet zIndex: number\n\nconst getModal = function (): HTMLElement {\n  if (isServer) return\n  let modalDom = PopupManager.modalDom\n  if (modalDom) {\n    hasModal = true\n  } else {\n    hasModal = false\n    modalDom = document.createElement('div')\n    PopupManager.modalDom = modalDom\n\n    on(modalDom, 'touchmove', onTouchMove)\n    on(modalDom, 'click', onModalClick)\n  }\n\n  return modalDom\n}\n\nconst instances = {}\n\nconst PopupManager: IPopupManager = {\n  modalFade: true,\n  modalDom: undefined,\n  zIndex,\n\n  getInstance(id) {\n    return instances[id]\n  },\n\n  register(id, instance) {\n    if (id && instance) {\n      instances[id] = instance\n    }\n  },\n\n  deregister(id) {\n    if (id) {\n      instances[id] = null\n      delete instances[id]\n    }\n  },\n\n  nextZIndex() {\n    return ++PopupManager.zIndex\n  },\n\n  modalStack: [],\n\n  doOnModalClick() {\n    const topItem = PopupManager.modalStack[PopupManager.modalStack.length - 1]\n    if (!topItem) return\n\n    const instance = PopupManager.getInstance(topItem.id)\n    if (instance && instance.closeOnClickModal.value) {\n      instance.close()\n    }\n  },\n\n  openModal(id, zIndex, dom, modalClass, modalFade) {\n    if (isServer) return\n    if (!id || zIndex === undefined) return\n    this.modalFade = modalFade\n\n    const modalStack = this.modalStack\n\n    for (let i = 0, j = modalStack.length; i < j; i++) {\n      const item = modalStack[i]\n      if (item.id === id) {\n        return\n      }\n    }\n\n    const modalDom = getModal()\n\n    addClass(modalDom, 'v-modal')\n    if (this.modalFade && !hasModal) {\n      addClass(modalDom, 'v-modal-enter')\n    }\n    if (modalClass) {\n      const classArr = modalClass.trim().split(/\\s+/)\n      classArr.forEach((item) => addClass(modalDom, item))\n    }\n    setTimeout(() => {\n      removeClass(modalDom, 'v-modal-enter')\n    }, 200)\n\n    if (dom && dom.parentNode && dom.parentNode.nodeType !== 11) {\n      dom.parentNode.appendChild(modalDom)\n    } else {\n      document.body.appendChild(modalDom)\n    }\n\n    if (zIndex) {\n      modalDom.style.zIndex = String(zIndex)\n    }\n    modalDom.tabIndex = 0\n    modalDom.style.display = ''\n\n    this.modalStack.push({ id, zIndex, modalClass })\n  },\n\n  closeModal(id) {\n    const modalStack = this.modalStack\n    const modalDom = getModal()\n\n    if (modalStack.length > 0) {\n      const topItem = modalStack[modalStack.length - 1]\n      if (topItem.id === id) {\n        if (topItem.modalClass) {\n          const classArr = topItem.modalClass.trim().split(/\\s+/)\n          classArr.forEach((item) => removeClass(modalDom, item))\n        }\n\n        modalStack.pop()\n        if (modalStack.length > 0) {\n          modalDom.style.zIndex = modalStack[modalStack.length - 1].zIndex\n        }\n      } else {\n        for (let i = modalStack.length - 1; i >= 0; i--) {\n          if (modalStack[i].id === id) {\n            modalStack.splice(i, 1)\n            break\n          }\n        }\n      }\n    }\n\n    if (modalStack.length === 0) {\n      if (this.modalFade) {\n        addClass(modalDom, 'v-modal-leave')\n      }\n      setTimeout(() => {\n        if (modalStack.length === 0) {\n          if (modalDom.parentNode) modalDom.parentNode.removeChild(modalDom)\n          modalDom.style.display = 'none'\n          // off(modalDom, 'touchmove', onTouchMove)\n          // off(modalDom, 'click', onModalClick)\n          PopupManager.modalDom = undefined\n        }\n        removeClass(modalDom, 'v-modal-leave')\n      }, 200)\n    }\n  },\n}\n\nObject.defineProperty(PopupManager, 'zIndex', {\n  configurable: true,\n  get() {\n    if (zIndex === undefined) {\n      zIndex = (configs.getConfig('zIndex') as number) || 2000\n    }\n    return zIndex\n  },\n  set(value) {\n    zIndex = value\n  },\n})\n\nconst getTopPopup = function () {\n  if (isServer) return\n  if (PopupManager.modalStack.length > 0) {\n    const topPopup = PopupManager.modalStack[PopupManager.modalStack.length - 1]\n    if (!topPopup) return\n    const instance = PopupManager.getInstance(topPopup.id)\n\n    return instance\n  }\n}\n\nif (!isServer) {\n  // handle `esc` key when the popup is shown\n  on(window, 'keydown', function (event: KeyboardEvent) {\n    if (event.code === EVENT_CODE.esc) {\n      const topPopup = getTopPopup()\n\n      if (topPopup && topPopup.closeOnPressEscape.value) {\n        topPopup.handleClose\n          ? topPopup.handleClose()\n          : topPopup.handleAction\n          ? topPopup.handleAction('cancel')\n          : topPopup.close()\n      }\n    }\n  })\n}\n\nexport default PopupManager\n"],"names":["configs.getConfig"],"mappings":"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"}