{"version":3,"file":"use-dialog.mjs","sources":["../../../../../../packages/components/dialog/src/use-dialog.ts"],"sourcesContent":["import {\n  computed,\n  getCurrentInstance,\n  nextTick,\n  onMounted,\n  ref,\n  watch,\n} from 'vue'\nimport { isClient, useTimeoutFn } from '@vueuse/core'\n\nimport {\n  defaultNamespace,\n  useGlobalConfig,\n  useId,\n  useLockscreen,\n  useZIndex,\n} from '@bigin/hooks'\nimport { UPDATE_MODEL_EVENT } from '@bigin/constants'\nimport { addUnit } from '@bigin/utils'\n\nimport type { CSSProperties, Ref, SetupContext } from 'vue'\nimport type { DialogEmits, DialogProps } from './dialog'\n\nexport const useDialog = (\n  props: DialogProps,\n  targetRef: Ref<HTMLElement | undefined>\n) => {\n  const instance = getCurrentInstance()!\n  const emit = instance.emit as SetupContext<DialogEmits>['emit']\n  const { nextZIndex } = useZIndex()\n\n  let lastPosition = ''\n  const titleId = useId()\n  const bodyId = useId()\n  const visible = ref(false)\n  const closed = ref(false)\n  const rendered = ref(false) // when desctroyOnClose is true, we initialize it as false vise versa\n  const zIndex = ref(props.zIndex || nextZIndex())\n\n  let openTimer: (() => void) | undefined = undefined\n  let closeTimer: (() => void) | undefined = undefined\n\n  const namespace = useGlobalConfig('namespace', defaultNamespace)\n\n  const style = computed<CSSProperties>(() => {\n    const style: CSSProperties = {}\n    const varPrefix = `--${namespace.value}-dialog` as const\n    if (!props.fullscreen) {\n      if (props.top) {\n        style[`${varPrefix}-margin-top`] = props.top\n      }\n      if (props.width) {\n        style[`${varPrefix}-width`] = addUnit(props.width)\n      } else {\n        style[`${varPrefix}-width` as any] =\n          ((props.xsmall || props.size === 'xsmall') && '400px') ||\n          ((props.small || props.size === 'small') && '560px') ||\n          ((props.large || props.size === 'large') && '880px') ||\n          ((props.xlarge || props.size === 'xlarge') && '1040px') ||\n          '720px'\n      }\n    }\n    return style\n  })\n\n  function afterEnter() {\n    emit('opened')\n  }\n\n  function afterLeave() {\n    emit('closed')\n    emit(UPDATE_MODEL_EVENT, false)\n    if (props.destroyOnClose) {\n      rendered.value = false\n    }\n  }\n\n  function beforeLeave() {\n    emit('close')\n  }\n\n  function open() {\n    closeTimer?.()\n    openTimer?.()\n\n    if (props.openDelay && props.openDelay > 0) {\n      ;({ stop: openTimer } = useTimeoutFn(() => doOpen(), props.openDelay))\n    } else {\n      doOpen()\n    }\n  }\n\n  function close() {\n    openTimer?.()\n    closeTimer?.()\n\n    if (props.closeDelay && props.closeDelay > 0) {\n      ;({ stop: closeTimer } = useTimeoutFn(() => doClose(), props.closeDelay))\n    } else {\n      doClose()\n    }\n  }\n\n  function handleClose() {\n    function hide(shouldCancel?: boolean) {\n      if (shouldCancel) return\n      closed.value = true\n      visible.value = false\n    }\n\n    if (props.beforeClose) {\n      props.beforeClose(hide)\n    } else {\n      close()\n    }\n  }\n\n  function onModalClick() {\n    if (props.closeOnClickModal) {\n      handleClose()\n    }\n  }\n\n  function doOpen() {\n    if (!isClient) return\n    visible.value = true\n  }\n\n  function doClose() {\n    visible.value = false\n  }\n\n  function onOpenAutoFocus() {\n    emit('openAutoFocus')\n  }\n\n  function onCloseAutoFocus() {\n    emit('closeAutoFocus')\n  }\n\n  if (props.lockScroll) {\n    useLockscreen(visible)\n  }\n\n  function onCloseRequested() {\n    if (props.closeOnPressEscape) {\n      handleClose()\n    }\n  }\n\n  watch(\n    () => props.modelValue,\n    (val) => {\n      if (val) {\n        closed.value = false\n        open()\n        rendered.value = true // enables lazy rendering\n        zIndex.value = props.zIndex ? zIndex.value++ : nextZIndex()\n        // this.$el.addEventListener('scroll', this.updatePopper)\n        nextTick(() => {\n          emit('open')\n          if (targetRef.value) {\n            targetRef.value.scrollTop = 0\n          }\n        })\n      } else {\n        // this.$el.removeEventListener('scroll', this.updatePopper\n        if (visible.value) {\n          close()\n        }\n      }\n    }\n  )\n\n  watch(\n    () => props.fullscreen,\n    (val) => {\n      if (!targetRef.value) return\n      if (val) {\n        lastPosition = targetRef.value.style.transform\n        targetRef.value.style.transform = ''\n      } else {\n        targetRef.value.style.transform = lastPosition\n      }\n    }\n  )\n\n  onMounted(() => {\n    if (props.modelValue) {\n      visible.value = true\n      rendered.value = true // enables lazy rendering\n      open()\n    }\n  })\n\n  return {\n    afterEnter,\n    afterLeave,\n    beforeLeave,\n    handleClose,\n    onModalClick,\n    close,\n    doClose,\n    onOpenAutoFocus,\n    onCloseAutoFocus,\n    onCloseRequested,\n    titleId,\n    bodyId,\n    closed,\n    style,\n    rendered,\n    visible,\n    zIndex,\n  }\n}\n"],"names":["style"],"mappings":"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"}