index.ts 614 B

12345678910111213141516171819202122232425
  1. import { watch } from 'vue'
  2. import { useEventListener } from '@vueuse/core'
  3. import type { Ref } from 'vue'
  4. export const usePreventGlobal = <E extends keyof DocumentEventMap>(
  5. indicator: Ref<boolean>,
  6. evt: E,
  7. cb: (e: DocumentEventMap[E]) => boolean
  8. ) => {
  9. const prevent = (e: DocumentEventMap[E]) => {
  10. if (cb(e)) e.stopImmediatePropagation()
  11. }
  12. let stop: (() => void) | undefined = undefined
  13. watch(
  14. () => indicator.value,
  15. (val) => {
  16. if (val) {
  17. stop = useEventListener(document, evt, prevent, true)
  18. } else {
  19. stop?.()
  20. }
  21. },
  22. { immediate: true }
  23. )
  24. }