element-plus
Version:
A Component Library for Vue 3
1 lines • 4.11 kB
Source Map (JSON)
{"version":3,"file":"index.mjs","sources":["../../../../../packages/hooks/use-lockscreen/index.ts"],"sourcesContent":["import { computed, isRef, onScopeDispose, watch } from 'vue'\nimport {\n addClass,\n getScrollBarWidth,\n getStyle,\n hasClass,\n removeClass,\n throwError,\n} from '@element-plus/utils'\nimport { useNamespace } from '../use-namespace'\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 let scrollBarWidth = 0\n let withoutHiddenClass = false\n let bodyWidth = '0'\n let cleaned = false\n\n const cleanup = () => {\n if (cleaned) return\n\n cleaned = true\n setTimeout(() => {\n // When the test case is running, the context environment simulated by jsdom may have been destroyed,\n // and the document does not exist at this time.\n if (typeof document === 'undefined') return\n if (withoutHiddenClass && document) {\n document.body.style.width = bodyWidth\n removeClass(document.body, hiddenCls.value)\n }\n }, 200)\n }\n watch(trigger, (val) => {\n if (!val) {\n cleanup()\n return\n }\n\n cleaned = false\n withoutHiddenClass = !hasClass(document.body, hiddenCls.value)\n if (withoutHiddenClass) {\n bodyWidth = document.body.style.width\n addClass(document.body, hiddenCls.value)\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 })\n onScopeDispose(() => cleanup())\n}\n"],"names":[],"mappings":";;;;;;AAwBO,MAAM,aAAA,GAAgB,CAC3B,OAAA,EACA,OAAA,GAAgC,EAAC,KAC9B;AACH,EAAA,IAAI,CAAC,KAAA,CAAM,OAAO,CAAA,EAAG;AACnB,IAAA,UAAA;AAAA,MACE,iBAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,EAAA,IAAM,YAAA,CAAa,OAAO,CAAA;AAE7C,EAAA,MAAM,YAAY,QAAA,CAAS,MAAM,GAAG,EAAA,CAAG,QAAA,EAAU,QAAQ,CAAC,CAAA;AAE1D,EAAA,IAAI,cAAA,GAAiB,CAAA;AACrB,EAAA,IAAI,kBAAA,GAAqB,KAAA;AACzB,EAAA,IAAI,SAAA,GAAY,GAAA;AAChB,EAAA,IAAI,OAAA,GAAU,KAAA;AAEd,EAAA,MAAM,UAAU,MAAM;AACpB,IAAA,IAAI,OAAA,EAAS;AAEb,IAAA,OAAA,GAAU,IAAA;AACV,IAAA,UAAA,CAAW,MAAM;AAGf,MAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACrC,MAAA,IAAI,sBAAsB,QAAA,EAAU;AAClC,QAAA,QAAA,CAAS,IAAA,CAAK,MAAM,KAAA,GAAQ,SAAA;AAC5B,QAAA,WAAA,CAAY,QAAA,CAAS,IAAA,EAAM,SAAA,CAAU,KAAK,CAAA;AAAA,MAC5C;AAAA,IACF,GAAG,GAAG,CAAA;AAAA,EACR,CAAA;AACA,EAAA,KAAA,CAAM,OAAA,EAAS,CAAC,GAAA,KAAQ;AACtB,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,OAAA,EAAQ;AACR,MAAA;AAAA,IACF;AAEA,IAAA,OAAA,GAAU,KAAA;AACV,IAAA,kBAAA,GAAqB,CAAC,QAAA,CAAS,QAAA,CAAS,IAAA,EAAM,UAAU,KAAK,CAAA;AAC7D,IAAA,IAAI,kBAAA,EAAoB;AACtB,MAAA,SAAA,GAAY,QAAA,CAAS,KAAK,KAAA,CAAM,KAAA;AAChC,MAAA,QAAA,CAAS,QAAA,CAAS,IAAA,EAAM,SAAA,CAAU,KAAK,CAAA;AAAA,IACzC;AACA,IAAA,cAAA,GAAiB,iBAAA,CAAkB,EAAA,CAAG,SAAA,CAAU,KAAK,CAAA;AACrD,IAAA,MAAM,eAAA,GACJ,QAAA,CAAS,eAAA,CAAgB,YAAA,GAAe,SAAS,IAAA,CAAK,YAAA;AACxD,IAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,QAAA,CAAS,IAAA,EAAM,WAAW,CAAA;AACzD,IAAA,IACE,cAAA,GAAiB,CAAA,KAChB,eAAA,IAAmB,aAAA,KAAkB,aACtC,kBAAA,EACA;AACA,MAAA,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,CAAA,YAAA,EAAe,cAAc,CAAA,GAAA,CAAA;AAAA,IAC3D;AAAA,EACF,CAAC,CAAA;AACD,EAAA,cAAA,CAAe,MAAM,SAAS,CAAA;AAChC;;;;"}