{"version":3,"file":"index.mjs","sources":["../../../../../../packages/hooks/use-lockscreen/index.ts"],"sourcesContent":["import {\n  computed,\n  isRef,\n  onBeforeUnmount,\n  onDeactivated,\n  onScopeDispose,\n  watch,\n} from 'vue'\nimport {\n  addClass,\n  getScrollBarWidth,\n  getStyle,\n  hasClass,\n  isClient,\n  preventDefault,\n  removeClass,\n  throwError,\n} from '@xzx-design/utils'\nimport {\n  getScrollParent,\n  onMountedOrActivated,\n  useNamespace,\n  useTouch,\n} from '../'\n\nimport type { Ref } from 'vue'\nimport type { UseNamespaceReturn } from '../use-namespace'\n\nexport type UseLockScreenOptions = {\n  ns?: UseNamespaceReturn\n  // shouldLock?: MaybeRef<boolean>\n}\n\n/**\n * Hook that monitoring the ref value to lock or unlock the screen.\n * When the trigger became true, it assumes modal is now opened and vice versa.\n * @param trigger {Ref<boolean>}\n */\nexport const useLockscreen = (\n  trigger: Ref<boolean>,\n  options: UseLockScreenOptions = {}\n) => {\n  if (!isRef(trigger)) {\n    throwError(\n      '[useLockscreen]',\n      'You need to pass a ref param to this function'\n    )\n  }\n\n  const ns = options.ns || useNamespace('popup')\n\n  const hiddenCls = computed(() => ns.bm('parent', 'hidden'))\n\n  if (!isClient || hasClass(document.body, hiddenCls.value)) {\n    return\n  }\n\n  let scrollBarWidth = 0\n  let withoutHiddenClass = false\n  let bodyWidth = '0'\n\n  const cleanup = () => {\n    setTimeout(() => {\n      removeClass(document?.body, hiddenCls.value)\n      if (withoutHiddenClass && document) {\n        document.body.style.width = bodyWidth\n      }\n    }, 200)\n  }\n  watch(trigger, (val) => {\n    if (!val) {\n      cleanup()\n      return\n    }\n\n    withoutHiddenClass = !hasClass(document.body, hiddenCls.value)\n    if (withoutHiddenClass) {\n      bodyWidth = document.body.style.width\n    }\n    scrollBarWidth = getScrollBarWidth(ns.namespace.value)\n    const bodyHasOverflow =\n      document.documentElement.clientHeight < document.body.scrollHeight\n    const bodyOverflowY = getStyle(document.body, 'overflowY')\n    if (\n      scrollBarWidth > 0 &&\n      (bodyHasOverflow || bodyOverflowY === 'scroll') &&\n      withoutHiddenClass\n    ) {\n      document.body.style.width = `calc(100% - ${scrollBarWidth}px)`\n    }\n    addClass(document.body, hiddenCls.value)\n  })\n  onScopeDispose(() => cleanup())\n}\n\nlet totalLockCount = 0\n\nconst BODY_LOCK_CLASS = 'van-overflow-hidden'\n\nexport function useLockScroll(\n  rootRef: Ref<HTMLElement | undefined>,\n  shouldLock: () => boolean\n) {\n  const touch = useTouch()\n  const DIRECTION_UP = '01'\n  const DIRECTION_DOWN = '10'\n\n  const onTouchMove = (event: TouchEvent) => {\n    touch.move(event)\n\n    const direction = touch.deltaY.value > 0 ? DIRECTION_DOWN : DIRECTION_UP\n    const el = getScrollParent(\n      event.target as Element,\n      rootRef.value\n    ) as HTMLElement\n    const { scrollHeight, offsetHeight, scrollTop } = el\n    let status = '11'\n\n    if (scrollTop === 0) {\n      status = offsetHeight >= scrollHeight ? '00' : '01'\n    } else if (scrollTop + offsetHeight >= scrollHeight) {\n      status = '10'\n    }\n\n    if (\n      status !== '11' &&\n      touch.isVertical() &&\n      !(Number.parseInt(status, 2) & Number.parseInt(direction, 2))\n    ) {\n      preventDefault(event, true)\n    }\n  }\n\n  const lock = () => {\n    document.addEventListener('touchstart', touch.start)\n    document.addEventListener('touchmove', onTouchMove, { passive: false })\n\n    if (!totalLockCount) {\n      document.body.classList.add(BODY_LOCK_CLASS)\n    }\n\n    totalLockCount++\n  }\n\n  const unlock = () => {\n    if (totalLockCount) {\n      document.removeEventListener('touchstart', touch.start)\n      document.removeEventListener('touchmove', onTouchMove)\n\n      totalLockCount--\n\n      if (!totalLockCount) {\n        document.body.classList.remove(BODY_LOCK_CLASS)\n      }\n    }\n  }\n\n  const init = () => shouldLock() && lock()\n\n  const destroy = () => shouldLock() && unlock()\n\n  onMountedOrActivated(init)\n  onDeactivated(destroy)\n  onBeforeUnmount(destroy)\n\n  watch(shouldLock, (value) => {\n    value ? lock() : unlock()\n  })\n}\n"],"names":[],"mappings":"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"}